[AMD Official Use Only - AMD Internal Distribution Only]

Thank you very much Christian.

-----Original Message-----
From: Koenig, Christian <christian.koe...@amd.com>
Sent: Tuesday, November 19, 2024 11:00 AM
To: Nirujogi, Pratap <pratap.niruj...@amd.com>; amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander <alexander.deuc...@amd.com>; Limonciello, Mario 
<mario.limoncie...@amd.com>; Chan, Benjamin (Koon Pan) <benjamin.c...@amd.com>; 
Li, King <king...@amd.com>; Du, Bin <bin...@amd.com>
Subject: Re: [PATCH 1/1] drm/amd/amdgpu: Add support for isp buffers

Am 19.11.24 um 16:51 schrieb Nirujogi, Pratap:
> [AMD Official Use Only - AMD Internal Distribution Only]
>
> Thanks Christian, please see inline comments for this question.
>
> RE: Where exactly is this DMA-buf coming from? E.g. can you guarantee that 
> this will ever be an amdgpu buffer object or could that also be something 
> else?
>>>> The DMA-buf handle passed to amdgpu in this case is coming from ISP driver 
>>>> for the buffer allocated in the system memory. I also would like to 
>>>> clarify that the dma-buf handle used here for import and obtain amdgpu BO 
>>>> is actually for the buffer allocated and owned by the ISP driver.

In that case feel free to add my Reviewed-by: Christian König 
<christian.koe...@amd.com>

Regards,
Christian.

>
> -----Original Message-----
> From: Koenig, Christian <christian.koe...@amd.com>
> Sent: Tuesday, November 19, 2024 10:30 AM
> To: Nirujogi, Pratap <pratap.niruj...@amd.com>;
> amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <alexander.deuc...@amd.com>; Limonciello, Mario
> <mario.limoncie...@amd.com>; Chan, Benjamin (Koon Pan)
> <benjamin.c...@amd.com>; Li, King <king...@amd.com>; Du, Bin
> <bin...@amd.com>
> Subject: Re: [PATCH 1/1] drm/amd/amdgpu: Add support for isp buffers
>
> Am 15.07.24 um 16:42 schrieb Pratap Nirujogi:
>> Add support to create user BOs with MC address for isp using the
>> dma-buf handle exported for the buffers allocated from system memory in isp 
>> driver.
>>
>> Export amdgpu_bo_create_kernel() and amdgpu_bo_free_kernel() as well
>> for isp to allocate GTT internal buffers required for fw to run.
>>
>> Signed-off-by: Pratap Nirujogi <pratap.niruj...@amd.com>
>> ---
>>    drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 103 +++++++++++++++++++++
>>    drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |   4 +
>>    2 files changed, 107 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> index 6faeb9e4a572..517c9567a332 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> @@ -39,6 +39,7 @@
>>    #include "amdgpu.h"
>>    #include "amdgpu_trace.h"
>>    #include "amdgpu_amdkfd.h"
>> +#include "amdgpu_dma_buf.h"
>>
>>    /**
>>     * DOC: amdgpu_object
>> @@ -334,6 +335,9 @@ int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
>>     *
>>     * Allocates and pins a BO for kernel internal use.
>>     *
>> + * This function is exported to allow the V4L2 isp device
>> + * external to drm device to create and access the kernel BO.
>> + *
>>     * Note: For bo_ptr new BO is only created if bo_ptr points to NULL.
>>     *
>>     * Returns:
>> @@ -357,6 +361,77 @@ int amdgpu_bo_create_kernel(struct amdgpu_device
>> *adev,
>>
>>        return 0;
>>    }
>> +EXPORT_SYMBOL(amdgpu_bo_create_kernel);
>> +
>> +/**
>> + * amdgpu_bo_create_isp_user - create user BO for isp
>> + *
>> + * @adev: amdgpu device object
>> + * @dma_buf: DMABUF handle for isp buffer
>> + * @domain: where to place it
>> + * @bo:  used to initialize BOs in structures
>> + * @gpu_addr: GPU addr of the pinned BO
>> + *
>> + * Imports isp DMABUF to allocate and pin a user BO for isp internal
>> +use. It does
>> + * GART alloc to generate gpu_addr for BO to make it accessible
>> +through the
>> + * GART aperture for ISP HW.
> Where exactly is this DMA-buf coming from? E.g. can you guarantee that this 
> will ever be an amdgpu buffer object or could that also be something else?
>
> Apart from that the patch looks good to me.
>
> Regards,
> Christian.
>
>> + *
>> + * This function is exported to allow the V4L2 isp device external
>> +to drm device
>> + * to create and access the isp user BO.
>> + *
>> + * Returns:
>> + * 0 on success, negative error code otherwise.
>> + */
>> +int amdgpu_bo_create_isp_user(struct amdgpu_device *adev,
>> +                        struct dma_buf *dbuf, u32 domain, struct amdgpu_bo 
>> **bo,
>> +                        u64 *gpu_addr)
>> +
>> +{
>> +     struct drm_gem_object *gem_obj;
>> +     int r;
>> +
>> +     gem_obj = amdgpu_gem_prime_import(&adev->ddev, dbuf);
>> +     *bo = gem_to_amdgpu_bo(gem_obj);
>> +     if (!(*bo)) {
>> +             dev_err(adev->dev, "failed to get valid isp user bo\n");
>> +             return -EINVAL;
>> +     }
>> +
>> +     r = amdgpu_bo_reserve(*bo, false);
>> +     if (r) {
>> +             dev_err(adev->dev, "(%d) failed to reserve isp user bo\n", r);
>> +             return r;
>> +     }
>> +
>> +     r = amdgpu_bo_pin(*bo, domain);
>> +     if (r) {
>> +             dev_err(adev->dev, "(%d) isp user bo pin failed\n", r);
>> +             goto error_unreserve;
>> +     }
>> +
>> +     r = amdgpu_ttm_alloc_gart(&(*bo)->tbo);
>> +     if (r) {
>> +             dev_err(adev->dev, "%p bind failed\n", *bo);
>> +             goto error_unpin;
>> +     }
>> +
>> +     if (!WARN_ON(!gpu_addr))
>> +             *gpu_addr = amdgpu_bo_gpu_offset(*bo);
>> +
>> +     amdgpu_bo_unreserve(*bo);
>> +
>> +     return 0;
>> +
>> +error_unpin:
>> +     amdgpu_bo_unpin(*bo);
>> +error_unreserve:
>> +     amdgpu_bo_unreserve(*bo);
>> +     amdgpu_bo_unref(bo);
>> +
>> +     return r;
>> +}
>> +EXPORT_SYMBOL(amdgpu_bo_create_isp_user);
>> +
>>
>>    /**
>>     * amdgpu_bo_create_kernel_at - create BO for kernel use at
>> specific location @@ -433,6 +508,9 @@ int amdgpu_bo_create_kernel_at(struct 
>> amdgpu_device *adev,
>>     * @cpu_addr: pointer to where the BO's CPU memory space address was 
>> stored
>>     *
>>     * unmaps and unpin a BO for kernel internal use.
>> + *
>> + * This function is exported to allow the V4L2 isp device
>> + * external to drm device to free the kernel BO.
>>     */
>>    void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
>>                           void **cpu_addr) @@ -457,6 +535,31 @@ void
>> amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
>>        if (cpu_addr)
>>                *cpu_addr = NULL;
>>    }
>> +EXPORT_SYMBOL(amdgpu_bo_free_kernel);
>> +
>> +
>> +/**
>> + * amdgpu_bo_free_isp_user - free BO for isp use
>> + *
>> + * @bo: amdgpu isp user BO to free
>> + *
>> + * unpin and unref BO for isp internal use.
>> + *
>> + * This function is exported to allow the V4L2 isp device
>> + * external to drm device to free the isp user BO.
>> + */
>> +void amdgpu_bo_free_isp_user(struct amdgpu_bo *bo) {
>> +     if (bo == NULL)
>> +             return;
>> +
>> +     if (amdgpu_bo_reserve(bo, true) == 0) {
>> +             amdgpu_bo_unpin(bo);
>> +             amdgpu_bo_unreserve(bo);
>> +     }
>> +     amdgpu_bo_unref(&bo);
>> +}
>> +EXPORT_SYMBOL(amdgpu_bo_free_isp_user);
>>
>>    /* Validate bo size is bit bigger than the request domain */
>>    static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>> index bc42ccbde659..17aa99b8311d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>> @@ -299,6 +299,9 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
>>                            unsigned long size, int align,
>>                            u32 domain, struct amdgpu_bo **bo_ptr,
>>                            u64 *gpu_addr, void **cpu_addr);
>> +int amdgpu_bo_create_isp_user(struct amdgpu_device *adev,
>> +                        struct dma_buf *dbuf, u32 domain, struct amdgpu_bo 
>> **bo,
>> +                        u64 *gpu_addr);
>>    int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev,
>>                               uint64_t offset, uint64_t size,
>>                               struct amdgpu_bo **bo_ptr, void
>> **cpu_addr); @@ -310,6
>> +313,7 @@ int amdgpu_bo_create_vm(struct amdgpu_device *adev,
>>                        struct amdgpu_bo_vm **ubo_ptr);
>>    void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
>>                           void **cpu_addr);
>> +void amdgpu_bo_free_isp_user(struct amdgpu_bo *bo);
>>    int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr);
>>    void *amdgpu_bo_kptr(struct amdgpu_bo *bo);
>>    void amdgpu_bo_kunmap(struct amdgpu_bo *bo);

Reply via email to