OSDN Git Service

drm/amdkfd: Put ASIC revision into HSA capability
authorJoseph Greathouse <Joseph.Greathouse@amd.com>
Thu, 16 Apr 2020 19:08:59 +0000 (14:08 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Apr 2020 15:04:56 +0000 (11:04 -0400)
In order to surface the ASIC revision to user level, we want
to put it into the HSA topology. This can be because different
ASIC revisions may require user-level software to do different
things (e.g. patch code for things that are changed in later
hardware revisions).

The ASIC revision from the hardware is maximum of 4 bits at this
time, so put it into 4 of the open bits in the HSA capability.
Then user-level software can use this capability information to
know -- for each ASIC -- what revision-based things must be done.

Signed-off-by: Joseph Greathouse <Joseph.Greathouse@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdkfd/kfd_topology.c
drivers/gpu/drm/amd/amdkfd/kfd_topology.h

index abfbe89..ad59ac4 100644 (file)
@@ -564,6 +564,13 @@ uint32_t amdgpu_amdkfd_get_num_gws(struct kgd_dev *kgd)
        return adev->gds.gws_size;
 }
 
+uint32_t amdgpu_amdkfd_get_asic_rev_id(struct kgd_dev *kgd)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
+
+       return adev->rev_id;
+}
+
 int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,
                                uint32_t vmid, uint64_t gpu_addr,
                                uint32_t *ib_cmd, uint32_t ib_len)
index 13feb31..d065c50 100644 (file)
@@ -175,6 +175,7 @@ uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd);
 uint64_t amdgpu_amdkfd_get_unique_id(struct kgd_dev *kgd);
 uint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd);
 uint32_t amdgpu_amdkfd_get_num_gws(struct kgd_dev *kgd);
+uint32_t amdgpu_amdkfd_get_asic_rev_id(struct kgd_dev *kgd);
 uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev *dst, struct kgd_dev *src);
 
 /* Read user wptr from a specified user address space with page fault
index 8e6409b..1c09082 100644 (file)
@@ -1301,6 +1301,10 @@ int kfd_topology_add_device(struct kfd_dev *gpu)
 
        dev->node_props.vendor_id = gpu->pdev->vendor;
        dev->node_props.device_id = gpu->pdev->device;
+       dev->node_props.capability |=
+               ((amdgpu_amdkfd_get_asic_rev_id(dev->gpu->kgd) <<
+                       HSA_CAP_ASIC_REVISION_SHIFT) &
+                       HSA_CAP_ASIC_REVISION_MASK);
        dev->node_props.location_id = pci_dev_id(gpu->pdev);
        dev->node_props.max_engine_clk_fcompute =
                amdgpu_amdkfd_get_max_engine_clock_in_mhz(dev->gpu->kgd);
index 46eeeca..0c51bd3 100644 (file)
@@ -41,7 +41,6 @@
 #define HSA_CAP_WATCH_POINTS_TOTALBITS_SHIFT   8
 #define HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK   0x00003000
 #define HSA_CAP_DOORBELL_TYPE_TOTALBITS_SHIFT  12
-#define HSA_CAP_RESERVED                       0xffffc000
 
 #define HSA_CAP_DOORBELL_TYPE_PRE_1_0          0x0
 #define HSA_CAP_DOORBELL_TYPE_1_0              0x1
 #define HSA_CAP_SRAM_EDCSUPPORTED              0x00080000
 #define HSA_CAP_MEM_EDCSUPPORTED               0x00100000
 #define HSA_CAP_RASEVENTNOTIFY                 0x00200000
+#define HSA_CAP_ASIC_REVISION_MASK             0x03c00000
+#define HSA_CAP_ASIC_REVISION_SHIFT            22
+
+#define HSA_CAP_RESERVED                       0xfc078000
 
 struct kfd_node_properties {
        uint64_t hive_id;