From 92e34fcda65cd68012fb69d962e4b14da2e0cb92 Mon Sep 17 00:00:00 2001 From: Amber Lin Date: Tue, 28 Jul 2015 12:22:57 -0400 Subject: [PATCH] Enable version info via thunk interface - Replace HSAuint32 with HSA_ENGINE_ID for EngineId type so it explicitely presents version information for ucode and GfxIP - Created a GfxIP lookup table to pass the version information. This lookup searches for matching device ID. Signed-off-by: Amber Lin Acked-by: John Bridgman Reviewed-by: Felix Kuehling [ROCm/ROCR-Runtime commit: a3925a3a19d6509f5d57428024387e2dd5bdbf8a] --- projects/rocr-runtime/include/hsakmttypes.h | 13 ++++- projects/rocr-runtime/src/topology.c | 63 +++++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/projects/rocr-runtime/include/hsakmttypes.h b/projects/rocr-runtime/include/hsakmttypes.h index a7e0a81ab5..0133fdfd9b 100644 --- a/projects/rocr-runtime/include/hsakmttypes.h +++ b/projects/rocr-runtime/include/hsakmttypes.h @@ -148,6 +148,17 @@ typedef struct _HsaSystemProperties HSAuint32 PlatformRev; // HSA platform revision, reflects Platform Table Revision ID } HsaSystemProperties; +typedef union +{ + HSAuint32 Value; + struct + { + unsigned int uCode : 10; // ucode packet processor version + unsigned int Major : 6; // GFXIP Major engine version + unsigned int Minor : 8; // GFXIP Minor engine version + unsigned int Stepping : 8; // GFXIP Stepping info + }; +} HSA_ENGINE_ID; typedef union { @@ -223,7 +234,7 @@ typedef struct _HsaNodeProperties HSAuint32 MaxSlotsScratchCU; // Number of temp. memory ("scratch") wave slots available to access, // may be 0 if HW has no restrictions - HSAuint32 EngineId; // Identifier (rev) of teh GPU uEngine or Firmware, may be 0 + HSA_ENGINE_ID EngineId; // Identifier (rev) of the GPU uEngine or Firmware, may be 0 HSAuint16 VendorId; // GPU vendor id; 0 on latency (= CPU)-only nodes HSAuint16 DeviceId; // GPU device id; 0 on latency (= CPU)-only nodes diff --git a/projects/rocr-runtime/src/topology.c b/projects/rocr-runtime/src/topology.c index bd2a5c2a1f..523df0d8da 100644 --- a/projects/rocr-runtime/src/topology.c +++ b/projects/rocr-runtime/src/topology.c @@ -52,7 +52,44 @@ static node_t *node = NULL; static HSAKMT_STATUS topology_take_snapshot(void); static HSAKMT_STATUS topology_drop_snapshot(void); -static int get_cpu_stepping(uint16_t* stepping); +//static int get_cpu_stepping(uint16_t* stepping); + +static struct hsa_gfxip_table { + unsigned short device_id; // Device ID + unsigned char major; // GFXIP Major engine version + unsigned char minor; // GFXIP Minor engine version + unsigned char stepping; // GFXIP Stepping info +} gfxip_lookup_table[] = { + /* Kaveri Family */ + { 0x1304, 7, 0, 0 }, + { 0x1305, 7, 0, 0 }, + { 0x1306, 7, 0, 0 }, + { 0x1307, 7, 0, 0 }, + { 0x1309, 7, 0, 0 }, + { 0x130A, 7, 0, 0 }, + { 0x130B, 7, 0, 0 }, + { 0x130C, 7, 0, 0 }, + { 0x130D, 7, 0, 0 }, + { 0x130E, 7, 0, 0 }, + { 0x130F, 7, 0, 0 }, + { 0x1310, 7, 0, 0 }, + { 0x1311, 7, 0, 0 }, + { 0x1312, 7, 0, 0 }, + { 0x1313, 7, 0, 0 }, + { 0x1315, 7, 0, 0 }, + { 0x1316, 7, 0, 0 }, + { 0x1317, 7, 0, 0 }, + { 0x1318, 7, 0, 0 }, + { 0x131B, 7, 0, 0 }, + { 0x131C, 7, 0, 0 }, + { 0x131D, 7, 0, 0 }, + /* Carrizo Family */ + { 0x9870, 8, 0, 1 }, + { 0x9874, 8, 0, 1 }, + { 0x9875, 8, 0, 1 }, + { 0x9876, 8, 0, 1 }, + { 0x9877, 8, 0, 1 } +}; static void free_node(node_t *n) @@ -192,8 +229,8 @@ topology_sysfs_get_node_props(uint32_t node_id, HsaNodeProperties *props, uint32 char prop_name[256]; char path[256]; long long unsigned int prop_val; - uint32_t i, prog; - uint16_t stepping = 0, fw_version = 0; + uint32_t i, prog, table_size; + uint16_t fw_version = 0; int read_size; HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS; @@ -309,8 +346,22 @@ topology_sysfs_get_node_props(uint32_t node_id, HsaNodeProperties *props, uint32 } - get_cpu_stepping(&stepping); - props->EngineId = ((stepping << 16) | fw_version); +// get_cpu_stepping(&stepping); + props->EngineId.uCode = fw_version & 0x3ff; + props->EngineId.Major = 0; + props->EngineId.Minor = 0; + props->EngineId.Stepping = 0; + table_size = sizeof(gfxip_lookup_table)/sizeof(struct hsa_gfxip_table); + for (i=0; iDeviceId) { + props->EngineId.Major = gfxip_lookup_table[i].major & 0x3f; + props->EngineId.Minor = gfxip_lookup_table[i].minor; + props->EngineId.Stepping = gfxip_lookup_table[i].stepping; + break; + } + } + assert(props->EngineId.Major); + //TODO: error handler when Device ID lookup fails err2: free(read_buf); @@ -960,6 +1011,7 @@ uint16_t get_device_id_by_node(HSAuint32 node_id) return node[node_id].node.DeviceId; } +#if 0 static int get_cpu_stepping(uint16_t* stepping) { int ret; @@ -997,3 +1049,4 @@ err1: return ret; } +#endif