From cba37c251cf4bac111b4ec7a1b941e92d8aa7139 Mon Sep 17 00:00:00 2001 From: Yong Zhao Date: Thu, 18 Aug 2016 16:30:55 -0400 Subject: [PATCH] Implement hsaKmtGetTileConfig in thunk Change-Id: Iba8d8efa46e3c268a03442d3db568e1b19230e94 [ROCm/ROCR-Runtime commit: 8351b3d2e844f46db3e9d1690123837b603a88f9] --- projects/rocr-runtime/include/hsakmt.h | 10 ++++++ projects/rocr-runtime/include/hsakmttypes.h | 15 ++++++++ .../rocr-runtime/include/linux/kfd_ioctl.h | 28 ++++++++++++++- projects/rocr-runtime/src/libhsakmt.ver | 1 + projects/rocr-runtime/src/memory.c | 36 +++++++++++++++++++ 5 files changed, 89 insertions(+), 1 deletion(-) diff --git a/projects/rocr-runtime/include/hsakmt.h b/projects/rocr-runtime/include/hsakmt.h index 9d8b9d5225..ceb939783c 100644 --- a/projects/rocr-runtime/include/hsakmt.h +++ b/projects/rocr-runtime/include/hsakmt.h @@ -651,6 +651,16 @@ hsaKmtSetTrapHandler( HSAuint64 TrapBufferSizeInBytes //IN ); +/** + Gets image tile configuration. + */ +HSAKMT_STATUS +HSAKMTAPI +hsaKmtGetTileConfig( + HSAuint32 NodeId, // IN + HsaGpuTileConfig* config // IN & OUT + ); + #ifdef __cplusplus } //extern "C" #endif diff --git a/projects/rocr-runtime/include/hsakmttypes.h b/projects/rocr-runtime/include/hsakmttypes.h index 6059f83c6b..4423b4f462 100644 --- a/projects/rocr-runtime/include/hsakmttypes.h +++ b/projects/rocr-runtime/include/hsakmttypes.h @@ -967,6 +967,21 @@ typedef struct _HsaPmcTraceRoot HSATraceId TraceId; } HsaPmcTraceRoot; +typedef struct _HsaGpuTileConfig +{ + const HSAuint32 *TileConfig; + const HSAuint32 *MacroTileConfig; + HSAuint32 NumTileConfigs; + HSAuint32 NumMacroTileConfigs; + + HSAuint32 GbAddrConfig; + + HSAuint32 NumBanks; + HSAuint32 NumRanks; + /* 9 dwords on 64-bit system */ + HSAuint32 Reserved[7]; /* Round up to 16 dwords for future extension */ +} HsaGpuTileConfig; + #pragma pack(pop, hsakmttypes_h) diff --git a/projects/rocr-runtime/include/linux/kfd_ioctl.h b/projects/rocr-runtime/include/linux/kfd_ioctl.h index b0d13cc3b7..a484756ef7 100644 --- a/projects/rocr-runtime/include/linux/kfd_ioctl.h +++ b/projects/rocr-runtime/include/linux/kfd_ioctl.h @@ -364,6 +364,29 @@ struct kfd_ioctl_import_dmabuf_args { uint32_t dmabuf_fd; /* to KFD */ }; +struct kfd_ioctl_get_tile_config_args { + /* to KFD: pointer to tile array */ + uint64_t tile_config_ptr; + /* to KFD: pointer to macro tile array */ + uint64_t macro_tile_config_ptr; + /* to KFD: array size allocated by user mode + * from KFD: array size filled by kernel + */ + uint32_t num_tile_configs; + /* to KFD: array size allocated by user mode + * from KFD: array size filled by kernel + */ + uint32_t num_macro_tile_configs; + + uint32_t gpu_id; /* to KFD */ + uint32_t gb_addr_config; /* from KFD */ + uint32_t num_banks; /* from KFD */ + uint32_t num_ranks; /* from KFD */ + /* struct size can be extended later if needed + * without breaking ABI compatibility + */ +}; + #define AMDKFD_IOCTL_BASE 'K' #define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr) #define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type) @@ -466,7 +489,10 @@ struct kfd_ioctl_import_dmabuf_args { #define AMDKFD_IOC_IMPORT_DMABUF \ AMDKFD_IOWR(0x20, struct kfd_ioctl_import_dmabuf_args) +#define AMDKFD_IOC_GET_TILE_CONFIG \ + AMDKFD_IOWR(0x21, struct kfd_ioctl_get_tile_config_args) + #define AMDKFD_COMMAND_START 0x01 -#define AMDKFD_COMMAND_END 0x21 +#define AMDKFD_COMMAND_END 0x22 #endif diff --git a/projects/rocr-runtime/src/libhsakmt.ver b/projects/rocr-runtime/src/libhsakmt.ver index 2d3d5db4f1..ce6ff028c2 100644 --- a/projects/rocr-runtime/src/libhsakmt.ver +++ b/projects/rocr-runtime/src/libhsakmt.ver @@ -47,6 +47,7 @@ hsaKmtPmcStopTrace; hsaKmtMapGraphicHandle; hsaKmtUnmapGraphicHandle; hsaKmtSetTrapHandler; +hsaKmtGetTileConfig; local: *; }; diff --git a/projects/rocr-runtime/src/memory.c b/projects/rocr-runtime/src/memory.c index 1ef6a83748..35e1c3d427 100644 --- a/projects/rocr-runtime/src/memory.c +++ b/projects/rocr-runtime/src/memory.c @@ -386,3 +386,39 @@ hsaKmtUnmapGraphicHandle( return hsaKmtUnmapMemoryToGPU(PORT_UINT64_TO_VPTR(FlatMemoryAddress)); } + +HSAKMT_STATUS +HSAKMTAPI +hsaKmtGetTileConfig( + HSAuint32 NodeId, /* IN */ + HsaGpuTileConfig *config /* IN & OUT */ +) +{ + struct kfd_ioctl_get_tile_config_args args; + uint32_t gpu_id; + HSAKMT_STATUS result; + + result = validate_nodeid(NodeId, &gpu_id); + if (result != HSAKMT_STATUS_SUCCESS) + return result; + + args.gpu_id = gpu_id; + args.tile_config_ptr = (uint64_t)config->TileConfig; + args.macro_tile_config_ptr = (uint64_t)config->MacroTileConfig; + args.num_tile_configs = config->NumTileConfigs; + args.num_macro_tile_configs = config->NumMacroTileConfigs; + + if (kmtIoctl(kfd_fd, AMDKFD_IOC_GET_TILE_CONFIG, &args) != 0) { + return HSAKMT_STATUS_ERROR; + } + + config->NumTileConfigs = args.num_tile_configs; + config->NumMacroTileConfigs = args.num_macro_tile_configs; + + config->GbAddrConfig = args.gb_addr_config; + + config->NumBanks = args.num_banks; + config->NumRanks = args.num_ranks; + + return HSAKMT_STATUS_SUCCESS; +}