From: Shashank Sharma <shashank.sharma@amd.com>
To: Alex Deucher <alexdeucher@gmail.com>
Cc: Alex Deucher <alexander.deucher@amd.com>,
Mukul Joshi <mukul.joshi@amd.com>,
Felix Kuehling <felix.kuehling@amd.com>,
Christian Koenig <christian.koenig@amd.com>,
amd-gfx@lists.freedesktop.org
Subject: Re: [PATCH 12/16] drm/amdgpu: use doorbell manager for kfd kernel doorbells
Date: Fri, 31 Mar 2023 10:27:35 +0200 [thread overview]
Message-ID: <4bbcd7fb-1dcf-3cdf-3602-9d831998a30e@amd.com> (raw)
In-Reply-To: <CADnq5_Pg8+m+VqfravXf_4xxRFKKw+FaNYSMqF=PWSjk7CmVLg@mail.gmail.com>
On 30/03/2023 22:46, Alex Deucher wrote:
> On Wed, Mar 29, 2023 at 11:48 AM Shashank Sharma
> <shashank.sharma@amd.com> wrote:
>> This patch:
>> - adds a doorbell manager structure in kfd device structure.
>> - plugs-in doorbell manager APIs for KFD kernel doorbell allocations
>> an free functions.
>> - removes the doorbell bitmap, uses the one into the doorbell manager
>> structure for all the allocations.
>> - updates the get_kernel_doorbell and free_kernel_doorbell functions
>> accordingly
>>
>> Cc: Alex Deucher <alexander.deucher@amd.com>
>> Cc: Christian Koenig <christian.koenig@amd.com>
>> Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
>> ---
>> drivers/gpu/drm/amd/amdkfd/kfd_device.c | 4 +-
>> drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c | 109 ++++++----------------
>> drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 3 +
>> 3 files changed, 35 insertions(+), 81 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> index b8936340742b..a2e4cbddba26 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> @@ -435,8 +435,8 @@ struct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)
>> atomic_set(&kfd->compute_profile, 0);
>>
>> mutex_init(&kfd->doorbell_mutex);
>> - memset(&kfd->doorbell_available_index, 0,
>> - sizeof(kfd->doorbell_available_index));
>> + memset(kfd->kernel_doorbells.doorbell_bitmap, 0,
>> + kfd->kernel_doorbells.size / BITS_PER_LONG);
>>
>> atomic_set(&kfd->sram_ecc_flag, 0);
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
>> index cd4e61bf0493..df259f2cc58a 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
>> @@ -61,81 +61,37 @@ size_t kfd_doorbell_process_slice(struct kfd_dev *kfd)
>> /* Doorbell calculations for device init. */
>> int kfd_doorbell_init(struct kfd_dev *kfd)
>> {
>> - size_t doorbell_start_offset;
>> - size_t doorbell_aperture_size;
>> - size_t doorbell_process_limit;
>> + int r;
>> + struct amdgpu_doorbell_obj *kernel_doorbells = &kfd->kernel_doorbells;
>>
>> - /*
>> - * With MES enabled, just set the doorbell base as it is needed
>> - * to calculate doorbell physical address.
>> - */
>> - if (kfd->shared_resources.enable_mes) {
>> - kfd->doorbell_base =
>> - kfd->shared_resources.doorbell_physical_address;
>> - return 0;
>> - }
>> -
>> - /*
>> - * We start with calculations in bytes because the input data might
>> - * only be byte-aligned.
>> - * Only after we have done the rounding can we assume any alignment.
>> - */
>> -
>> - doorbell_start_offset =
>> - roundup(kfd->shared_resources.doorbell_start_offset,
>> - kfd_doorbell_process_slice(kfd));
>> -
>> - doorbell_aperture_size =
>> - rounddown(kfd->shared_resources.doorbell_aperture_size,
>> - kfd_doorbell_process_slice(kfd));
>> -
>> - if (doorbell_aperture_size > doorbell_start_offset)
>> - doorbell_process_limit =
>> - (doorbell_aperture_size - doorbell_start_offset) /
>> - kfd_doorbell_process_slice(kfd);
>> - else
>> - return -ENOSPC;
>> -
>> - if (!kfd->max_doorbell_slices ||
>> - doorbell_process_limit < kfd->max_doorbell_slices)
>> - kfd->max_doorbell_slices = doorbell_process_limit;
>> -
>> - kfd->doorbell_base = kfd->shared_resources.doorbell_physical_address +
>> - doorbell_start_offset;
>> -
>> - kfd->doorbell_base_dw_offset = doorbell_start_offset / sizeof(u32);
>> -
>> - kfd->doorbell_kernel_ptr = ioremap(kfd->doorbell_base,
>> - kfd_doorbell_process_slice(kfd));
>> -
>> - if (!kfd->doorbell_kernel_ptr)
>> + /* Bitmap to dynamically allocate doorbells from kernel page */
>> + kernel_doorbells->doorbell_bitmap = bitmap_zalloc(PAGE_SIZE, GFP_KERNEL);
>> + if (!kernel_doorbells->doorbell_bitmap) {
>> + DRM_ERROR("Failed to allocate kernel doorbell bitmap\n");
>> return -ENOMEM;
>> + }
>>
>> - pr_debug("Doorbell initialization:\n");
>> - pr_debug("doorbell base == 0x%08lX\n",
>> - (uintptr_t)kfd->doorbell_base);
>> -
>> - pr_debug("doorbell_base_dw_offset == 0x%08lX\n",
>> - kfd->doorbell_base_dw_offset);
>> -
>> - pr_debug("doorbell_process_limit == 0x%08lX\n",
>> - doorbell_process_limit);
>> -
>> - pr_debug("doorbell_kernel_offset == 0x%08lX\n",
>> - (uintptr_t)kfd->doorbell_base);
>> -
>> - pr_debug("doorbell aperture size == 0x%08lX\n",
>> - kfd->shared_resources.doorbell_aperture_size);
>> + /* Alloc and reserve doorbells for KFD kernel usages */
>> + kernel_doorbells->size = PAGE_SIZE;
>> + r = amdgpu_doorbell_alloc_page(kfd->adev, kernel_doorbells);
>
> Just do something like:
> r = amdgpu_bo_create_kernel(kfd->adev, PAGE_SIZE, PAGE_SIZE,
> AMDGPU_GEM_DOMAIN_DOORBELL,
>
> &kfd->doorbell_kernel_bo, NULL, &kfd->doorbell_kernel_ptr);
>
> Then you have your KFD pointer to its doorbell memory and no need to
> track the ranges.
Noted,
- Shashank
>
> Alex
>
>
>> + if (r) {
>> + pr_err("failed to allocate kernel doorbells\n");
>> + bitmap_free(kernel_doorbells->doorbell_bitmap);
>> + return r;
>> + }
>>
>> - pr_debug("doorbell kernel address == %p\n", kfd->doorbell_kernel_ptr);
>> + kfd->doorbell_kernel_ptr = kernel_doorbells->cpu_addr;
>> + pr_debug("Doorbell kernel address == %p\n", kfd->doorbell_kernel_ptr);
>>
>> return 0;
>> }
>>
>> void kfd_doorbell_fini(struct kfd_dev *kfd)
>> {
>> - if (kfd->doorbell_kernel_ptr)
>> - iounmap(kfd->doorbell_kernel_ptr);
>> + struct amdgpu_doorbell_obj *kernel_doorbells = &kfd->kernel_doorbells;
>> +
>> + bitmap_free(kernel_doorbells->doorbell_bitmap);
>> + amdgpu_doorbell_free_page(kfd->adev, kernel_doorbells);
>> }
>>
>> int kfd_doorbell_mmap(struct kfd_dev *dev, struct kfd_process *process,
>> @@ -186,24 +142,19 @@ void __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,
>> unsigned int *doorbell_off)
>> {
>> u32 inx;
>> + struct amdgpu_doorbell_obj *kernel_doorbells = &kfd->kernel_doorbells;
>>
>> mutex_lock(&kfd->doorbell_mutex);
>> - inx = find_first_zero_bit(kfd->doorbell_available_index,
>> - KFD_MAX_NUM_OF_QUEUES_PER_PROCESS);
>> + inx = find_first_zero_bit(kernel_doorbells->doorbell_bitmap,
>> + kernel_doorbells->size);
>>
>> - __set_bit(inx, kfd->doorbell_available_index);
>> + __set_bit(inx, kernel_doorbells->doorbell_bitmap);
>> mutex_unlock(&kfd->doorbell_mutex);
>>
>> if (inx >= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS)
>> return NULL;
>>
>> - inx *= kfd->device_info.doorbell_size / sizeof(u32);
>> -
>> - /*
>> - * Calculating the kernel doorbell offset using the first
>> - * doorbell page.
>> - */
>> - *doorbell_off = kfd->doorbell_base_dw_offset + inx;
>> + *doorbell_off = amdgpu_doorbell_index_on_bar(kfd->adev, kernel_doorbells->bo, inx);
>>
>> pr_debug("Get kernel queue doorbell\n"
>> " doorbell offset == 0x%08X\n"
>> @@ -216,12 +167,12 @@ void __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,
>> void kfd_release_kernel_doorbell(struct kfd_dev *kfd, u32 __iomem *db_addr)
>> {
>> unsigned int inx;
>> + struct amdgpu_doorbell_obj *kernel_doorbells = &kfd->kernel_doorbells;
>>
>> - inx = (unsigned int)(db_addr - kfd->doorbell_kernel_ptr)
>> - * sizeof(u32) / kfd->device_info.doorbell_size;
>> + inx = (unsigned int)(db_addr - kfd->doorbell_kernel_ptr);
>>
>> mutex_lock(&kfd->doorbell_mutex);
>> - __clear_bit(inx, kfd->doorbell_available_index);
>> + __clear_bit(inx, kernel_doorbells->doorbell_bitmap);
>> mutex_unlock(&kfd->doorbell_mutex);
>> }
>>
>> @@ -280,7 +231,7 @@ phys_addr_t kfd_get_process_doorbells(struct kfd_process_device *pdd)
>> if (!pdd->doorbell_index) {
>> int r = kfd_alloc_process_doorbells(pdd->dev,
>> &pdd->doorbell_index);
>> - if (r)
>> + if (r < 0)
>> return 0;
>> }
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>> index 552c3ac85a13..0ed33416c35f 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>> @@ -346,6 +346,9 @@ struct kfd_dev {
>>
>> /* HMM page migration MEMORY_DEVICE_PRIVATE mapping */
>> struct dev_pagemap pgmap;
>> +
>> + /* Kernel doorbells for KFD device */
>> + struct amdgpu_doorbell_obj kernel_doorbells;
>> };
>>
>> enum kfd_mempool {
>> --
>> 2.40.0
>>
next prev parent reply other threads:[~2023-03-31 8:27 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-29 15:47 [PATCH 00/16] AMDGPU Doorbell manager Shashank Sharma
2023-03-29 15:47 ` [PATCH 01/16] drm/amdgpu: rename num_doorbells Shashank Sharma
2023-03-30 11:04 ` Christian König
2023-03-30 13:11 ` Luben Tuikov
2023-03-30 13:13 ` Shashank Sharma
2023-03-30 14:19 ` Alex Deucher
2023-04-04 16:13 ` Luben Tuikov
2023-03-29 15:47 ` [PATCH 02/16] drm/amdgpu: include protection for doobell.h Shashank Sharma
2023-03-30 11:05 ` Christian König
2023-03-30 11:07 ` Shashank Sharma
2023-03-30 14:20 ` Alex Deucher
2023-03-29 15:47 ` [PATCH 03/16] drm/amdgpu: create a new file for doorbell manager Shashank Sharma
2023-03-30 11:09 ` Christian König
2023-03-30 13:29 ` Luben Tuikov
2023-03-30 13:42 ` Shashank Sharma
2023-03-30 14:23 ` Alex Deucher
2023-03-30 14:49 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 04/16] drm/amdgpu: don't modify num_doorbells for mes Shashank Sharma
2023-03-30 11:10 ` Christian König
2023-03-30 14:24 ` Alex Deucher
2023-03-29 15:47 ` [PATCH 05/16] drm/amdgpu: add UAPI for allocating doorbell memory Shashank Sharma
2023-03-30 11:11 ` Christian König
2023-03-29 15:47 ` [PATCH 06/16] drm/amdgpu: accommodate DOMAIN/PL_DOORBELL Shashank Sharma
2023-03-30 11:14 ` Christian König
2023-03-30 13:33 ` Luben Tuikov
2023-03-30 13:43 ` Shashank Sharma
2023-03-30 13:45 ` Luben Tuikov
2023-03-30 13:48 ` Shashank Sharma
2023-03-30 14:12 ` Luben Tuikov
2023-03-30 15:32 ` Shashank Sharma
2023-03-30 19:59 ` Alex Deucher
2023-03-29 15:47 ` [PATCH 07/16] drm/amdgpu: add helper to create doorbell pages Shashank Sharma
2023-03-30 11:29 ` Christian König
2023-03-30 11:46 ` Shashank Sharma
2023-03-30 13:42 ` Luben Tuikov
2023-03-30 13:44 ` Luben Tuikov
2023-03-30 14:04 ` Shashank Sharma
2023-03-30 14:15 ` Luben Tuikov
2023-03-30 14:34 ` Shashank Sharma
2023-03-30 14:37 ` Luben Tuikov
2023-03-30 14:55 ` Alex Deucher
2023-03-30 15:21 ` Shashank Sharma
2023-03-30 20:35 ` Alex Deucher
2023-03-31 8:26 ` Shashank Sharma
2023-03-30 14:28 ` Alex Deucher
2023-03-30 14:38 ` Luben Tuikov
2023-03-29 15:47 ` [PATCH 08/16] drm/amdgpu: initialize ttm for doorbells Shashank Sharma
2023-03-30 11:22 ` Christian König
2023-03-30 14:33 ` Alex Deucher
2023-03-30 14:54 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 09/16] drm/amdgpu: create kernel doorbell page Shashank Sharma
2023-03-30 11:30 ` Christian König
2023-03-30 11:48 ` Shashank Sharma
2023-03-30 14:39 ` Alex Deucher
2023-03-30 14:42 ` Christian König
2023-03-30 14:48 ` Shashank Sharma
2023-03-30 14:53 ` Christian König
2023-03-30 15:04 ` Alex Deucher
2023-03-31 8:25 ` Shashank Sharma
2023-03-30 14:24 ` Luben Tuikov
2023-03-30 14:40 ` Shashank Sharma
2023-03-30 14:49 ` Christian König
2023-03-30 14:52 ` Luben Tuikov
2023-03-30 14:53 ` Shashank Sharma
2023-03-30 14:59 ` Luben Tuikov
2023-03-30 15:09 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 10/16] drm/amdgpu: validate doorbell read/write Shashank Sharma
2023-03-30 14:34 ` Luben Tuikov
2023-03-30 14:37 ` Shashank Sharma
2023-03-30 14:49 ` Luben Tuikov
2023-03-30 15:02 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 11/16] drm/amdgpu: get absolute offset from doorbell index Shashank Sharma
2023-03-30 17:18 ` Luben Tuikov
2023-03-30 17:25 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 12/16] drm/amdgpu: use doorbell manager for kfd kernel doorbells Shashank Sharma
2023-03-30 20:46 ` Alex Deucher
2023-03-31 8:27 ` Shashank Sharma [this message]
2023-03-29 15:47 ` [PATCH 13/16] drm/amdgpu: use doorbell manager for kfd process doorbells Shashank Sharma
2023-03-30 20:54 ` Alex Deucher
2023-03-31 8:28 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 14/16] drm/amdgpu: remove ununsed functions and variables Shashank Sharma
2023-03-29 15:47 ` [PATCH 15/16] drm/amdgpu: use doorbell mgr for MES kernel doorbells Shashank Sharma
2023-03-30 20:58 ` Alex Deucher
2023-03-31 8:29 ` Shashank Sharma
2023-03-29 15:47 ` [PATCH 16/16] drm/amdgpu: user doorbell mgr for MES process doorbells Shashank Sharma
2023-03-30 13:49 ` [PATCH 00/16] AMDGPU Doorbell manager Luben Tuikov
2023-03-30 13:56 ` Sharma, Shashank
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4bbcd7fb-1dcf-3cdf-3602-9d831998a30e@amd.com \
--to=shashank.sharma@amd.com \
--cc=alexander.deucher@amd.com \
--cc=alexdeucher@gmail.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=felix.kuehling@amd.com \
--cc=mukul.joshi@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.