Re: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue
I will change it to CHIP_MULLINS. Yes , I also spotted the kq->ops cleanup, will send it out shortly. Regards, Yong On 2019-11-13 2:31 p.m., Felix Kuehling wrote: See one comment inline. With that fixed, the series is Reviewed-by: Felix Kuehling I could think of more follow-up cleanup while you're at it: 1. Can you see any reason why the kq->ops need to be function pointers. Looks to me like they are the same for all kernel queues, so those functions could be called without the pointer indirection. 2. The only think left in the ASIC-specific kfd_kernel_queue_*.c files is the PM4 packet writer functions that are called by the kfd_packet_manager. It may make sense to rename them to reflect that. Maybe kfd_packet_manager_*.c Regards, Felix On 2019-11-12 5:18 p.m., Yong Zhao wrote: 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 --- 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 a750b1d110eb..59ee9053498c 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) { This is not the correct condition to distinguish GFXv7 (CIK) vs v8 (VI). CHIP_MULLINS comes after Hawaii, but it is also GFXv7 (CIK), even though KFD current doesn't support it. + retval = kfd_gtt_sa_allocate(dev, PAGE_SIZE, >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), >rptr_mem); @@ -200,7 +208,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); @@ -280,8 +293,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) @@ -310,42 +330,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(>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(>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 a9a35897d8b7..475e9499c0af
Re: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue
See one comment inline. With that fixed, the series is Reviewed-by: Felix Kuehling I could think of more follow-up cleanup while you're at it: 1. Can you see any reason why the kq->ops need to be function pointers. Looks to me like they are the same for all kernel queues, so those functions could be called without the pointer indirection. 2. The only think left in the ASIC-specific kfd_kernel_queue_*.c files is the PM4 packet writer functions that are called by the kfd_packet_manager. It may make sense to rename them to reflect that. Maybe kfd_packet_manager_*.c Regards, Felix On 2019-11-12 5:18 p.m., Yong Zhao wrote: 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 --- 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 a750b1d110eb..59ee9053498c 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) { This is not the correct condition to distinguish GFXv7 (CIK) vs v8 (VI). CHIP_MULLINS comes after Hawaii, but it is also GFXv7 (CIK), even though KFD current doesn't support it. + retval = kfd_gtt_sa_allocate(dev, PAGE_SIZE, >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), >rptr_mem); @@ -200,7 +208,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); @@ -280,8 +293,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) @@ -310,42 +330,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(>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(>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);
RE: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue
Thanks Alex, I appreciate the explanation! Kent From: Deucher, Alexander Sent: Wednesday, November 13, 2019 1:31 PM To: Russell, Kent ; Zhao, Yong ; amd-gfx@lists.freedesktop.org Subject: Re: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue CI just refers to the dGPUs (bonaire and hawaii), the CIK refers to the whole family (CI dGPUs, Indus (kaveri platform), and Kerala (kabini/mullins platform). Alex From: amd-gfx mailto:amd-gfx-boun...@lists.freedesktop.org>> on behalf of Russell, Kent mailto:kent.russ...@amd.com>> Sent: Wednesday, November 13, 2019 8:28 AM To: Zhao, Yong mailto:yong.z...@amd.com>>; amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> mailto:amd-gfx@lists.freedesktop.org>> Cc: Zhao, Yong mailto:yong.z...@amd.com>> Subject: RE: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue Should we use "CI" instead of "CIK" in the comments? I thought CIK was a short form for CI kickers, while CI encompasses all CI ASICs. Even though we had _cik as the suffix for most of the CI stuff. Just wondering about accuracy. Kent -Original Message- From: amd-gfx mailto:amd-gfx-boun...@lists.freedesktop.org>> On Behalf Of Yong Zhao Sent: Tuesday, November 12, 2019 5:19 PM To: amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> Cc: Zhao, Yong mailto:yong.z...@amd.com>> Subject: [PATCH 2/2] 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 mailto:yong.z...@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 a750b1d110eb..59ee9053498c 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, >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), >rptr_mem); @@ -200,7 +208,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); @@ -280,8 +293,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) @@ -310,42 +330,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: -
Re: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue
CI just refers to the dGPUs (bonaire and hawaii), the CIK refers to the whole family (CI dGPUs, Indus (kaveri platform), and Kerala (kabini/mullins platform). Alex From: amd-gfx on behalf of Russell, Kent Sent: Wednesday, November 13, 2019 8:28 AM To: Zhao, Yong ; amd-gfx@lists.freedesktop.org Cc: Zhao, Yong Subject: RE: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue Should we use "CI" instead of "CIK" in the comments? I thought CIK was a short form for CI kickers, while CI encompasses all CI ASICs. Even though we had _cik as the suffix for most of the CI stuff. Just wondering about accuracy. Kent -Original Message- From: amd-gfx On Behalf Of Yong Zhao Sent: Tuesday, November 12, 2019 5:19 PM To: amd-gfx@lists.freedesktop.org Cc: Zhao, Yong Subject: [PATCH 2/2] 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 --- 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 a750b1d110eb..59ee9053498c 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, >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), >rptr_mem); @@ -200,7 +208,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); @@ -280,8 +293,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) @@ -310,42 +330,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(>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(>ops_asic_specific); - break; - default: - WARN(1, &
RE: [PATCH 2/2] drm/amdkfd: Eliminate ops_asic_specific in kernel queue
Should we use "CI" instead of "CIK" in the comments? I thought CIK was a short form for CI kickers, while CI encompasses all CI ASICs. Even though we had _cik as the suffix for most of the CI stuff. Just wondering about accuracy. Kent -Original Message- From: amd-gfx On Behalf Of Yong Zhao Sent: Tuesday, November 12, 2019 5:19 PM To: amd-gfx@lists.freedesktop.org Cc: Zhao, Yong Subject: [PATCH 2/2] 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 --- 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 a750b1d110eb..59ee9053498c 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, >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), >rptr_mem); @@ -200,7 +208,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); @@ -280,8 +293,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) @@ -310,42 +330,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(>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(>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 a9a35897d8b7..475e9499c0af 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h @@ -66,7 +66,6 @@ struct kernel_queue_ops { struct kernel_queue {