diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4436-drm-amdkfd-Eliminate-ops_asic_specific-in-kernel-que.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4436-drm-amdkfd-Eliminate-ops_asic_specific-in-kernel-que.patch | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4436-drm-amdkfd-Eliminate-ops_asic_specific-in-kernel-que.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4436-drm-amdkfd-Eliminate-ops_asic_specific-in-kernel-que.patch new file mode 100644 index 00000000..55d6d9ff --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4436-drm-amdkfd-Eliminate-ops_asic_specific-in-kernel-que.patch @@ -0,0 +1,248 @@ +From 2aaa285d69d0e973d7da89cae6d77232cae25267 Mon Sep 17 00:00:00 2001 +From: Yong Zhao <Yong.Zhao@amd.com> +Date: Thu, 7 Nov 2019 23:59:43 -0500 +Subject: [PATCH 4436/4736] drm/amdkfd: Eliminate ops_asic_specific in kernel + queue + +The ops_asic_specific function pointers are actually quite generic after +using a simple if condition. Eliminate it by code refactoring. + +Change-Id: Icb891289cca31acdbe2d2eea76a426f1738b9c08 +Signed-off-by: Yong Zhao <Yong.Zhao@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 63 ++++++++----------- + drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h | 4 -- + .../gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c | 36 ----------- + .../gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c | 48 -------------- + 4 files changed, 26 insertions(+), 125 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +index f3a08145d067..ca7e8d299c8b 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +@@ -87,9 +87,17 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev, + kq->pq_kernel_addr = kq->pq->cpu_ptr; + kq->pq_gpu_addr = kq->pq->gpu_addr; + +- retval = kq->ops_asic_specific.initialize(kq, dev, type, queue_size); +- if (!retval) +- goto err_eop_allocate_vidmem; ++ /* For CIK family asics, kq->eop_mem is not needed */ ++ if (dev->device_info->asic_family > CHIP_HAWAII) { ++ retval = kfd_gtt_sa_allocate(dev, PAGE_SIZE, &kq->eop_mem); ++ if (retval != 0) ++ goto err_eop_allocate_vidmem; ++ ++ kq->eop_gpu_addr = kq->eop_mem->gpu_addr; ++ kq->eop_kernel_addr = kq->eop_mem->cpu_ptr; ++ ++ memset(kq->eop_kernel_addr, 0, PAGE_SIZE); ++ } + + retval = kfd_gtt_sa_allocate(dev, sizeof(*kq->rptr_kernel), + &kq->rptr_mem); +@@ -201,7 +209,12 @@ static void uninitialize(struct kernel_queue *kq) + + kfd_gtt_sa_free(kq->dev, kq->rptr_mem); + kfd_gtt_sa_free(kq->dev, kq->wptr_mem); +- kq->ops_asic_specific.uninitialize(kq); ++ ++ /* For CIK family asics, kq->eop_mem is Null, kfd_gtt_sa_free() ++ * is able to handle NULL properly. ++ */ ++ kfd_gtt_sa_free(kq->dev, kq->eop_mem); ++ + kfd_gtt_sa_free(kq->dev, kq->pq); + kfd_release_kernel_doorbell(kq->dev, + kq->queue->properties.doorbell_ptr); +@@ -314,8 +327,15 @@ static void submit_packet(struct kernel_queue *kq) + } + pr_debug("\n"); + #endif +- +- kq->ops_asic_specific.submit_packet(kq); ++ if (kq->dev->device_info->doorbell_size == 8) { ++ *kq->wptr64_kernel = kq->pending_wptr64; ++ write_kernel_doorbell64(kq->queue->properties.doorbell_ptr, ++ kq->pending_wptr64); ++ } else { ++ *kq->wptr_kernel = kq->pending_wptr; ++ write_kernel_doorbell(kq->queue->properties.doorbell_ptr, ++ kq->pending_wptr); ++ } + } + + static void rollback_packet(struct kernel_queue *kq) +@@ -345,42 +365,11 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, + kq->ops.submit_packet = submit_packet; + kq->ops.rollback_packet = rollback_packet; + +- switch (dev->device_info->asic_family) { +- case CHIP_KAVERI: +- case CHIP_HAWAII: +- case CHIP_CARRIZO: +- case CHIP_TONGA: +- case CHIP_FIJI: +- case CHIP_POLARIS10: +- case CHIP_POLARIS11: +- case CHIP_POLARIS12: +- case CHIP_VEGAM: +- kernel_queue_init_vi(&kq->ops_asic_specific); +- break; +- +- case CHIP_VEGA10: +- case CHIP_VEGA12: +- case CHIP_VEGA20: +- case CHIP_RAVEN: +- case CHIP_RENOIR: +- case CHIP_ARCTURUS: +- case CHIP_NAVI10: +- case CHIP_NAVI12: +- case CHIP_NAVI14: +- kernel_queue_init_v9(&kq->ops_asic_specific); +- break; +- default: +- WARN(1, "Unexpected ASIC family %u", +- dev->device_info->asic_family); +- goto out_free; +- } +- + if (kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE)) + return kq; + + pr_err("Failed to init kernel queue\n"); + +-out_free: + kfree(kq); + return NULL; + } +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h +index b22ff0fb40fe..852de7466cc4 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h +@@ -76,7 +76,6 @@ struct kernel_queue_ops { + + struct kernel_queue { + struct kernel_queue_ops ops; +- struct kernel_queue_ops ops_asic_specific; + + /* data */ + struct kfd_dev *dev; +@@ -109,7 +108,4 @@ struct kernel_queue { + struct list_head list; + }; + +-void kernel_queue_init_vi(struct kernel_queue_ops *ops); +-void kernel_queue_init_v9(struct kernel_queue_ops *ops); +- + #endif /* KFD_KERNEL_QUEUE_H_ */ +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c +index a3d0b4cf16c6..11c2d85fd614 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c +@@ -27,42 +27,6 @@ + #include "kfd_pm4_opcodes.h" + #include "gc/gc_10_1_0_sh_mask.h" + +-static bool initialize_v9(struct kernel_queue *kq, struct kfd_dev *dev, +- enum kfd_queue_type type, unsigned int queue_size) +-{ +- int retval; +- +- retval = kfd_gtt_sa_allocate(dev, PAGE_SIZE, &kq->eop_mem); +- if (retval) +- return false; +- +- kq->eop_gpu_addr = kq->eop_mem->gpu_addr; +- kq->eop_kernel_addr = kq->eop_mem->cpu_ptr; +- +- memset(kq->eop_kernel_addr, 0, PAGE_SIZE); +- +- return true; +-} +- +-static void uninitialize_v9(struct kernel_queue *kq) +-{ +- kfd_gtt_sa_free(kq->dev, kq->eop_mem); +-} +- +-static void submit_packet_v9(struct kernel_queue *kq) +-{ +- *kq->wptr64_kernel = kq->pending_wptr64; +- write_kernel_doorbell64(kq->queue->properties.doorbell_ptr, +- kq->pending_wptr64); +-} +- +-void kernel_queue_init_v9(struct kernel_queue_ops *ops) +-{ +- ops->initialize = initialize_v9; +- ops->uninitialize = uninitialize_v9; +- ops->submit_packet = submit_packet_v9; +-} +- + static int pm_map_process_v9(struct packet_manager *pm, + uint32_t *buffer, struct qcm_process_device *qpd) + { +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c +index 9b0380d91bfb..faf0bae8223b 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c +@@ -26,54 +26,6 @@ + #include "kfd_pm4_headers_vi.h" + #include "kfd_pm4_opcodes.h" + +-static bool initialize_vi(struct kernel_queue *kq, struct kfd_dev *dev, +- enum kfd_queue_type type, unsigned int queue_size); +-static void uninitialize_vi(struct kernel_queue *kq); +-static void submit_packet_vi(struct kernel_queue *kq); +- +-void kernel_queue_init_vi(struct kernel_queue_ops *ops) +-{ +- ops->initialize = initialize_vi; +- ops->uninitialize = uninitialize_vi; +- ops->submit_packet = submit_packet_vi; +-} +- +-static bool initialize_vi(struct kernel_queue *kq, struct kfd_dev *dev, +- enum kfd_queue_type type, unsigned int queue_size) +-{ +- int retval; +- +- /*For CIK family asics, kq->eop_mem is not needed */ +- if (dev->device_info->asic_family <= CHIP_MULLINS) +- return true; +- +- retval = kfd_gtt_sa_allocate(dev, PAGE_SIZE, &kq->eop_mem); +- if (retval != 0) +- return false; +- +- kq->eop_gpu_addr = kq->eop_mem->gpu_addr; +- kq->eop_kernel_addr = kq->eop_mem->cpu_ptr; +- +- memset(kq->eop_kernel_addr, 0, PAGE_SIZE); +- +- return true; +-} +- +-static void uninitialize_vi(struct kernel_queue *kq) +-{ +- /* For CIK family asics, kq->eop_mem is Null, kfd_gtt_sa_free() +- * is able to handle NULL properly. +- */ +- kfd_gtt_sa_free(kq->dev, kq->eop_mem); +-} +- +-static void submit_packet_vi(struct kernel_queue *kq) +-{ +- *kq->wptr_kernel = kq->pending_wptr; +- write_kernel_doorbell(kq->queue->properties.doorbell_ptr, +- kq->pending_wptr); +-} +- + unsigned int pm_build_pm4_header(unsigned int opcode, size_t packet_size) + { + union PM4_MES_TYPE_3_HEADER header; +-- +2.17.1 + |