drm/amdkfd: Retrieve SDMA numbers from amdgpu
authorAmber Lin <Amber.Lin@amd.com>
Thu, 18 Nov 2021 05:38:59 +0000 (00:38 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 22 Nov 2021 19:46:03 +0000 (14:46 -0500)
Instead of hard coding the number of sdma engines and the number of
sdma_xgmi engines in the device_info table, get the number of toal SDMA
instances from amdgpu. The first two engines are sdma engines and the
rest are sdma-xgmi engines unless the ASIC doesn't support XGMI.

v2: add kfd_ prefix to non static function names

Signed-off-by: Amber Lin <Amber.Lin@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device.c
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_topology.c

index ce9f4e562bacb1ca42393d8b05dd4f31e8e4bf80..3fea47e37c17aed6460d40eefb33fab33940536c 100644 (file)
@@ -1516,6 +1516,26 @@ void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)
                kfd_smi_event_update_thermal_throttling(kfd, throttle_bitmask);
 }
 
+/* kfd_get_num_sdma_engines returns the number of PCIe optimized SDMA and
+ * kfd_get_num_xgmi_sdma_engines returns the number of XGMI SDMA.
+ * When the device has more than two engines, we reserve two for PCIe to enable
+ * full-duplex and the rest are used as XGMI.
+ */
+unsigned int kfd_get_num_sdma_engines(struct kfd_dev *kdev)
+{
+       /* If XGMI is not supported, all SDMA engines are PCIe */
+       if (!kdev->adev->gmc.xgmi.supported)
+               return kdev->adev->sdma.num_instances;
+
+       return min(kdev->adev->sdma.num_instances, 2);
+}
+
+unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_dev *kdev)
+{
+       /* After reserved for PCIe, the rest of engines are XGMI */
+       return kdev->adev->sdma.num_instances - kfd_get_num_sdma_engines(kdev);
+}
+
 #if defined(CONFIG_DEBUG_FS)
 
 /* This function will send a package to HIQ to hang the HWS
index 62fe28244a8059a540981e74f44f02a93ec4e9b6..2af2b3268171362617c0e3c4bc60c6116ea8803d 100644 (file)
@@ -99,31 +99,22 @@ unsigned int get_pipes_per_mec(struct device_queue_manager *dqm)
        return dqm->dev->shared_resources.num_pipe_per_mec;
 }
 
-static unsigned int get_num_sdma_engines(struct device_queue_manager *dqm)
-{
-       return dqm->dev->device_info->num_sdma_engines;
-}
-
-static unsigned int get_num_xgmi_sdma_engines(struct device_queue_manager *dqm)
-{
-       return dqm->dev->device_info->num_xgmi_sdma_engines;
-}
-
 static unsigned int get_num_all_sdma_engines(struct device_queue_manager *dqm)
 {
-       return get_num_sdma_engines(dqm) + get_num_xgmi_sdma_engines(dqm);
+       return kfd_get_num_sdma_engines(dqm->dev) +
+               kfd_get_num_xgmi_sdma_engines(dqm->dev);
 }
 
 unsigned int get_num_sdma_queues(struct device_queue_manager *dqm)
 {
-       return dqm->dev->device_info->num_sdma_engines
-                       * dqm->dev->device_info->num_sdma_queues_per_engine;
+       return kfd_get_num_sdma_engines(dqm->dev) *
+               dqm->dev->device_info->num_sdma_queues_per_engine;
 }
 
 unsigned int get_num_xgmi_sdma_queues(struct device_queue_manager *dqm)
 {
-       return dqm->dev->device_info->num_xgmi_sdma_engines
-                       * dqm->dev->device_info->num_sdma_queues_per_engine;
+       return kfd_get_num_xgmi_sdma_engines(dqm->dev) *
+               dqm->dev->device_info->num_sdma_queues_per_engine;
 }
 
 void program_sh_mem_settings(struct device_queue_manager *dqm,
@@ -1054,9 +1045,9 @@ static int allocate_sdma_queue(struct device_queue_manager *dqm,
                dqm->sdma_bitmap &= ~(1ULL << bit);
                q->sdma_id = bit;
                q->properties.sdma_engine_id = q->sdma_id %
-                               get_num_sdma_engines(dqm);
+                               kfd_get_num_sdma_engines(dqm->dev);
                q->properties.sdma_queue_id = q->sdma_id /
-                               get_num_sdma_engines(dqm);
+                               kfd_get_num_sdma_engines(dqm->dev);
        } else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {
                if (dqm->xgmi_sdma_bitmap == 0) {
                        pr_err("No more XGMI SDMA queue to allocate\n");
@@ -1071,10 +1062,11 @@ static int allocate_sdma_queue(struct device_queue_manager *dqm,
                 * assumes the first N engines are always
                 * PCIe-optimized ones
                 */
-               q->properties.sdma_engine_id = get_num_sdma_engines(dqm) +
-                               q->sdma_id % get_num_xgmi_sdma_engines(dqm);
+               q->properties.sdma_engine_id =
+                       kfd_get_num_sdma_engines(dqm->dev) +
+                       q->sdma_id % kfd_get_num_xgmi_sdma_engines(dqm->dev);
                q->properties.sdma_queue_id = q->sdma_id /
-                               get_num_xgmi_sdma_engines(dqm);
+                       kfd_get_num_xgmi_sdma_engines(dqm->dev);
        }
 
        pr_debug("SDMA engine id: %d\n", q->properties.sdma_engine_id);
index 1d3f012bcd2ae21800262e548c03a7f108afaf4a..1054fedd7b3c9a143fd04856a56c334f5c7c6ae4 100644 (file)
@@ -213,6 +213,9 @@ struct kfd_device_info {
        unsigned int num_sdma_queues_per_engine;
 };
 
+unsigned int kfd_get_num_sdma_engines(struct kfd_dev *kdev);
+unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_dev *kdev);
+
 struct kfd_mem_obj {
        uint32_t range_start;
        uint32_t range_end;
index a3f590e179730d2dbfa2ff1b4c001bf732defc64..2d44b26b66576fbbc83dfd3f5d0b386a089e6819 100644 (file)
@@ -1392,9 +1392,9 @@ int kfd_topology_add_device(struct kfd_dev *gpu)
                gpu->shared_resources.drm_render_minor;
 
        dev->node_props.hive_id = gpu->hive_id;
-       dev->node_props.num_sdma_engines = gpu->device_info->num_sdma_engines;
+       dev->node_props.num_sdma_engines = kfd_get_num_sdma_engines(gpu);
        dev->node_props.num_sdma_xgmi_engines =
-                               gpu->device_info->num_xgmi_sdma_engines;
+                                       kfd_get_num_xgmi_sdma_engines(gpu);
        dev->node_props.num_sdma_queues_per_engine =
                                gpu->device_info->num_sdma_queues_per_engine;
        dev->node_props.num_gws = (dev->gpu->gws &&