]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amdkfd: Make SDMA engine number an ASIC-dependent variable
authorYong Zhao <yong.zhao@amd.com>
Fri, 13 Jul 2018 20:17:44 +0000 (16:17 -0400)
committerOded Gabbay <oded.gabbay@gmail.com>
Fri, 13 Jul 2018 20:17:44 +0000 (16:17 -0400)
On Raven there is only one SDMA engine instead of previously assumed two,
so we need to adapt our code to this new scenario.

Signed-off-by: Yong Zhao <yong.zhao@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.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_device_queue_manager.h
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

index 8faa8db3eba52febf8785a68d1ecef07336231be..572235cdd061becfc314009e4d79b8660c57be70 100644 (file)
@@ -52,6 +52,7 @@ static const struct kfd_device_info kaveri_device_info = {
        .supports_cwsr = false,
        .needs_iommu_device = true,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info carrizo_device_info = {
@@ -67,6 +68,7 @@ static const struct kfd_device_info carrizo_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = true,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 #endif
 
@@ -83,6 +85,7 @@ static const struct kfd_device_info hawaii_device_info = {
        .supports_cwsr = false,
        .needs_iommu_device = false,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info tonga_device_info = {
@@ -97,6 +100,7 @@ static const struct kfd_device_info tonga_device_info = {
        .supports_cwsr = false,
        .needs_iommu_device = false,
        .needs_pci_atomics = true,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info tonga_vf_device_info = {
@@ -111,6 +115,7 @@ static const struct kfd_device_info tonga_vf_device_info = {
        .supports_cwsr = false,
        .needs_iommu_device = false,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info fiji_device_info = {
@@ -125,6 +130,7 @@ static const struct kfd_device_info fiji_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = true,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info fiji_vf_device_info = {
@@ -139,6 +145,7 @@ static const struct kfd_device_info fiji_vf_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 
@@ -154,6 +161,7 @@ static const struct kfd_device_info polaris10_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = true,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info polaris10_vf_device_info = {
@@ -168,6 +176,7 @@ static const struct kfd_device_info polaris10_vf_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info polaris11_device_info = {
@@ -182,6 +191,7 @@ static const struct kfd_device_info polaris11_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = true,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info vega10_device_info = {
@@ -196,6 +206,7 @@ static const struct kfd_device_info vega10_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 static const struct kfd_device_info vega10_vf_device_info = {
@@ -210,6 +221,7 @@ static const struct kfd_device_info vega10_vf_device_info = {
        .supports_cwsr = true,
        .needs_iommu_device = false,
        .needs_pci_atomics = false,
+       .num_sdma_engines = 2,
 };
 
 
index 97c9f10ff473af8e2c20615e794a29a8cedeba22..ace94d6e54cf2f9597a0b8747005f89915e02d7d 100644 (file)
@@ -101,6 +101,17 @@ 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;
+}
+
+unsigned int get_num_sdma_queues(struct device_queue_manager *dqm)
+{
+       return dqm->dev->device_info->num_sdma_engines
+                       * KFD_SDMA_QUEUES_PER_ENGINE;
+}
+
 void program_sh_mem_settings(struct device_queue_manager *dqm,
                                        struct qcm_process_device *qpd)
 {
@@ -855,7 +866,7 @@ static int initialize_nocpsch(struct device_queue_manager *dqm)
        }
 
        dqm->vmid_bitmap = (1 << dqm->dev->vm_info.vmid_num_kfd) - 1;
-       dqm->sdma_bitmap = (1 << CIK_SDMA_QUEUES) - 1;
+       dqm->sdma_bitmap = (1 << get_num_sdma_queues(dqm)) - 1;
 
        return 0;
 }
@@ -903,7 +914,7 @@ static int allocate_sdma_queue(struct device_queue_manager *dqm,
 static void deallocate_sdma_queue(struct device_queue_manager *dqm,
                                unsigned int sdma_queue_id)
 {
-       if (sdma_queue_id >= CIK_SDMA_QUEUES)
+       if (sdma_queue_id >= get_num_sdma_queues(dqm))
                return;
        dqm->sdma_bitmap |= (1 << sdma_queue_id);
 }
@@ -923,8 +934,8 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
        if (retval)
                return retval;
 
-       q->properties.sdma_queue_id = q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE;
-       q->properties.sdma_engine_id = q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE;
+       q->properties.sdma_queue_id = q->sdma_id / get_num_sdma_engines(dqm);
+       q->properties.sdma_engine_id = q->sdma_id % get_num_sdma_engines(dqm);
 
        retval = allocate_doorbell(qpd, q);
        if (retval)
@@ -1011,7 +1022,7 @@ static int initialize_cpsch(struct device_queue_manager *dqm)
        dqm->queue_count = dqm->processes_count = 0;
        dqm->sdma_queue_count = 0;
        dqm->active_runlist = false;
-       dqm->sdma_bitmap = (1 << CIK_SDMA_QUEUES) - 1;
+       dqm->sdma_bitmap = (1 << get_num_sdma_queues(dqm)) - 1;
 
        INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
 
@@ -1142,9 +1153,9 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
                if (retval)
                        goto out_unlock;
                q->properties.sdma_queue_id =
-                       q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE;
+                       q->sdma_id / get_num_sdma_engines(dqm);
                q->properties.sdma_engine_id =
-                       q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE;
+                       q->sdma_id % get_num_sdma_engines(dqm);
        }
 
        retval = allocate_doorbell(qpd, q);
@@ -1791,8 +1802,8 @@ int dqm_debugfs_hqds(struct seq_file *m, void *data)
                }
        }
 
-       for (pipe = 0; pipe < CIK_SDMA_ENGINE_NUM; pipe++) {
-               for (queue = 0; queue < CIK_SDMA_QUEUES_PER_ENGINE; queue++) {
+       for (pipe = 0; pipe < get_num_sdma_engines(dqm); pipe++) {
+               for (queue = 0; queue < KFD_SDMA_QUEUES_PER_ENGINE; queue++) {
                        r = dqm->dev->kfd2kgd->hqd_sdma_dump(
                                dqm->dev->kgd, pipe, queue, &dump, &n_regs);
                        if (r)
index 52e708c4f9a538dc21a384f396b4ba5983d37041..00da3169a0044ace318a8f0b19fde3e8dfab227b 100644 (file)
 
 #define KFD_UNMAP_LATENCY_MS                   (4000)
 #define QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS (2 * KFD_UNMAP_LATENCY_MS + 1000)
-
-#define CIK_SDMA_QUEUES                                (4)
-#define CIK_SDMA_QUEUES_PER_ENGINE             (2)
-#define CIK_SDMA_ENGINE_NUM                    (2)
+#define KFD_SDMA_QUEUES_PER_ENGINE             (2)
 
 struct device_process_node {
        struct qcm_process_device *qpd;
@@ -214,6 +211,7 @@ void program_sh_mem_settings(struct device_queue_manager *dqm,
 unsigned int get_queues_num(struct device_queue_manager *dqm);
 unsigned int get_queues_per_pipe(struct device_queue_manager *dqm);
 unsigned int get_pipes_per_mec(struct device_queue_manager *dqm);
+unsigned int get_num_sdma_queues(struct device_queue_manager *dqm);
 
 static inline unsigned int get_sh_mem_bases_32(struct kfd_process_device *pdd)
 {
index 37d179ed51dc10c01c515df19ae9dc8eecb74fd6..ca83254719fca9d837e15b132b48826dd82eb027 100644 (file)
@@ -203,6 +203,7 @@ struct kfd_device_info {
        bool supports_cwsr;
        bool needs_iommu_device;
        bool needs_pci_atomics;
+       unsigned int num_sdma_engines;
 };
 
 struct kfd_mem_obj {
index 1303b1457950c940fa400e28cc991af836972f7d..eb4e5fb4f2f24ca463dcbb27fa857ab793cfe789 100644 (file)
@@ -186,8 +186,7 @@ int pqm_create_queue(struct process_queue_manager *pqm,
 
        switch (type) {
        case KFD_QUEUE_TYPE_SDMA:
-               if (dev->dqm->queue_count >=
-                       CIK_SDMA_QUEUES_PER_ENGINE * CIK_SDMA_ENGINE_NUM) {
+               if (dev->dqm->queue_count >= get_num_sdma_queues(dev->dqm)) {
                        pr_err("Over-subscription is not allowed for SDMA.\n");
                        retval = -EPERM;
                        goto err_create_queue;