aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2811-drm-amdkfd-update-gfx10-support-for-latest-kfd-chang.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2811-drm-amdkfd-update-gfx10-support-for-latest-kfd-chang.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2811-drm-amdkfd-update-gfx10-support-for-latest-kfd-chang.patch233
1 files changed, 233 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2811-drm-amdkfd-update-gfx10-support-for-latest-kfd-chang.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2811-drm-amdkfd-update-gfx10-support-for-latest-kfd-chang.patch
new file mode 100644
index 00000000..0ef8546c
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2811-drm-amdkfd-update-gfx10-support-for-latest-kfd-chang.patch
@@ -0,0 +1,233 @@
+From 9c7eb622b45054e2be35b8173908c68a48b44669 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Mon, 17 Jun 2019 13:35:53 -0500
+Subject: [PATCH 2811/2940] drm/amdkfd: update gfx10 support for latest kfd
+ changes
+
+Separate mqd allocation and initialization
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c | 82 ++++++-------------
+ 1 file changed, 26 insertions(+), 56 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
+index 0650999c15f4..0b68a17eb902 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
+@@ -72,9 +72,6 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
+ int retval;
+ struct kfd_mem_obj *mqd_mem_obj = NULL;
+
+- if (q->type == KFD_QUEUE_TYPE_HIQ)
+- return allocate_hiq_mqd(kfd);
+-
+ /* From V9, for CWSR, the control stack is located on the next page
+ * boundary after the mqd, we will use the gtt allocation function
+ * instead of sub-allocation function.
+@@ -103,21 +100,15 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
+
+ }
+
+-static int init_mqd(struct mqd_manager *mm, void **mqd,
+- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
++static void init_mqd(struct mqd_manager *mm, void **mqd,
++ struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
+ struct queue_properties *q)
+ {
+- int retval;
+ uint64_t addr;
+ struct v10_compute_mqd *m;
+- struct kfd_dev *kfd = mm->dev;
+
+- *mqd_mem_obj = allocate_mqd(kfd, q);
+- if (!*mqd_mem_obj)
+- return -ENOMEM;
+-
+- m = (struct v10_compute_mqd *) (*mqd_mem_obj)->cpu_ptr;
+- addr = (*mqd_mem_obj)->gpu_addr;
++ m = (struct v10_compute_mqd *) mqd_mem_obj->cpu_ptr;
++ addr = mqd_mem_obj->gpu_addr;
+
+ memset(m, 0, sizeof(struct v10_compute_mqd));
+
+@@ -164,9 +155,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
+ *mqd = m;
+ if (gart_addr)
+ *gart_addr = addr;
+- retval = mm->update_mqd(mm, m, q);
+-
+- return retval;
++ mm->update_mqd(mm, m, q);
+ }
+
+ static int load_mqd(struct mqd_manager *mm, void *mqd,
+@@ -183,7 +172,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,
+ return r;
+ }
+
+-static int update_mqd(struct mqd_manager *mm, void *mqd,
++static void update_mqd(struct mqd_manager *mm, void *mqd,
+ struct queue_properties *q)
+ {
+ struct v10_compute_mqd *m;
+@@ -246,8 +235,6 @@ static int update_mqd(struct mqd_manager *mm, void *mqd,
+ q->queue_address != 0 &&
+ q->queue_percent > 0 &&
+ !q->is_evicted);
+-
+- return 0;
+ }
+
+ static int destroy_mqd(struct mqd_manager *mm, void *mqd,
+@@ -260,7 +247,7 @@ static int destroy_mqd(struct mqd_manager *mm, void *mqd,
+ pipe_id, queue_id);
+ }
+
+-static void uninit_mqd(struct mqd_manager *mm, void *mqd,
++static void free_mqd(struct mqd_manager *mm, void *mqd,
+ struct kfd_mem_obj *mqd_mem_obj)
+ {
+ struct kfd_dev *kfd = mm->dev;
+@@ -305,67 +292,47 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,
+ return 0;
+ }
+
+-static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
+- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
++static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
++ struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
+ struct queue_properties *q)
+ {
+ struct v10_compute_mqd *m;
+- int retval;
+-
+
+- retval = init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
+-
+- if (retval != 0)
+- return retval;
++ init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
+
+ m = get_mqd(*mqd);
+
+ m->cp_hqd_pq_control |= 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT |
+ 1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT;
+-
+- return retval;
+ }
+
+-static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
++static void update_mqd_hiq(struct mqd_manager *mm, void *mqd,
+ struct queue_properties *q)
+ {
+ struct v10_compute_mqd *m;
+- int retval;
+-
+- retval = update_mqd(mm, mqd, q);
+
+- if (retval != 0)
+- return retval;
++ update_mqd(mm, mqd, q);
+
+ /* TODO: what's the point? update_mqd already does this. */
+ m = get_mqd(mqd);
+ m->cp_hqd_vmid = q->vmid;
+- return retval;
+ }
+
+-static int init_mqd_sdma(struct mqd_manager *mm, void **mqd,
+- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
++static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
++ struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
+ struct queue_properties *q)
+ {
+- int retval;
+ struct v10_sdma_mqd *m;
+- struct kfd_dev *dev = mm->dev;
+-
+- *mqd_mem_obj = allocate_sdma_mqd(dev, q);
+- if (!*mqd_mem_obj)
+- return -ENOMEM;
+
+- m = (struct v10_sdma_mqd *) (*mqd_mem_obj)->cpu_ptr;
++ m = (struct v10_sdma_mqd *) mqd_mem_obj->cpu_ptr;
+
+ memset(m, 0, sizeof(struct v10_sdma_mqd));
+
+ *mqd = m;
+ if (gart_addr)
+- *gart_addr = (*mqd_mem_obj)->gpu_addr;
++ *gart_addr = mqd_mem_obj->gpu_addr;
+
+- retval = mm->update_mqd(mm, m, q);
+-
+- return retval;
++ mm->update_mqd(mm, m, q);
+ }
+
+ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
+@@ -379,7 +346,7 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
+
+ #define SDMA_RLC_DUMMY_DEFAULT 0xf
+
+-static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
++static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
+ struct queue_properties *q)
+ {
+ struct v10_sdma_mqd *m;
+@@ -407,7 +374,6 @@ static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
+ q->queue_address != 0 &&
+ q->queue_percent > 0 &&
+ !q->is_evicted);
+- return 0;
+ }
+
+ /*
+@@ -466,8 +432,9 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,
+ pr_debug("%s@%i\n", __func__, __LINE__);
+ case KFD_MQD_TYPE_COMPUTE:
+ pr_debug("%s@%i\n", __func__, __LINE__);
++ mqd->allocate_mqd = allocate_mqd;
+ mqd->init_mqd = init_mqd;
+- mqd->uninit_mqd = uninit_mqd;
++ mqd->free_mqd = free_mqd;
+ mqd->load_mqd = load_mqd;
+ mqd->update_mqd = update_mqd;
+ mqd->destroy_mqd = destroy_mqd;
+@@ -481,8 +448,9 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,
+ break;
+ case KFD_MQD_TYPE_HIQ:
+ pr_debug("%s@%i\n", __func__, __LINE__);
++ mqd->allocate_mqd = allocate_hiq_mqd;
+ mqd->init_mqd = init_mqd_hiq;
+- mqd->uninit_mqd = uninit_mqd_hiq_sdma;
++ mqd->free_mqd = free_mqd_hiq_sdma;
+ mqd->load_mqd = load_mqd;
+ mqd->update_mqd = update_mqd_hiq;
+ mqd->destroy_mqd = destroy_mqd;
+@@ -494,8 +462,9 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,
+ pr_debug("%s@%i\n", __func__, __LINE__);
+ break;
+ case KFD_MQD_TYPE_DIQ:
++ mqd->allocate_mqd = allocate_hiq_mqd;
+ mqd->init_mqd = init_mqd_hiq;
+- mqd->uninit_mqd = uninit_mqd;
++ mqd->free_mqd = free_mqd;
+ mqd->load_mqd = load_mqd;
+ mqd->update_mqd = update_mqd_hiq;
+ mqd->destroy_mqd = destroy_mqd;
+@@ -507,8 +476,9 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,
+ break;
+ case KFD_MQD_TYPE_SDMA:
+ pr_debug("%s@%i\n", __func__, __LINE__);
++ mqd->allocate_mqd = allocate_sdma_mqd;
+ mqd->init_mqd = init_mqd_sdma;
+- mqd->uninit_mqd = uninit_mqd_hiq_sdma;
++ mqd->free_mqd = free_mqd_hiq_sdma;
+ mqd->load_mqd = load_mqd_sdma;
+ mqd->update_mqd = update_mqd_sdma;
+ mqd->destroy_mqd = destroy_mqd_sdma;
+--
+2.17.1
+