diff options
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.patch | 233 |
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 + |