* [PATCH v2 2/5] drm/amdgpu: introduce struct amdgpu_bo_user
2021-03-09 8:46 [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Nirmoy Das
@ 2021-03-09 8:46 ` Nirmoy Das
2021-03-09 12:37 ` Christian König
2021-03-09 8:46 ` [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device Nirmoy Das
` (4 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Nirmoy Das @ 2021-03-09 8:46 UTC (permalink / raw)
To: Christian.Koenig; +Cc: Nirmoy Das, amd-gfx
Implement a new struct amdgpu_bo_user as subclass of
struct amdgpu_bo and a function to created amdgpu_bo_user
bo with a flag to identify the owner.
v2: amdgpu_bo_to_amdgpu_bo_user -> to_amdgpu_bo_user()
Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 28 ++++++++++++++++++++++
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 14 +++++++++++
2 files changed, 42 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index c30f10f931fc..bd89d44a1f2f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -694,6 +694,34 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
return r;
}
+/**
+ * amdgpu_bo_create_user - create an &amdgpu_bo_user buffer object
+ * @adev: amdgpu device object
+ * @bp: parameters to be used for the buffer object
+ * @ubo_ptr: pointer to the buffer object pointer
+ *
+ * Create a BO to be used by user application;
+ *
+ * Returns:
+ * 0 for success or a negative error code on failure.
+ */
+
+int amdgpu_bo_create_user(struct amdgpu_device *adev,
+ struct amdgpu_bo_param *bp,
+ struct amdgpu_bo_user **ubo_ptr)
+{
+ struct amdgpu_bo *bo_ptr;
+ int r;
+
+ bp->flags = bp->flags & ~AMDGPU_GEM_CREATE_SHADOW;
+ bp->bo_ptr_size = sizeof(struct amdgpu_bo_user);
+ r = amdgpu_bo_do_create(adev, bp, &bo_ptr);
+ if (r)
+ return r;
+
+ *ubo_ptr = to_amdgpu_bo_user(bo_ptr);
+ return r;
+}
/**
* amdgpu_bo_validate - validate an &amdgpu_bo buffer object
* @bo: pointer to the buffer object
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 8e2b556f0b7b..06b6fa35db99 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -37,6 +37,8 @@
#define AMDGPU_BO_INVALID_OFFSET LONG_MAX
#define AMDGPU_BO_MAX_PLACEMENTS 3
+#define to_amdgpu_bo_user(abo) container_of((abo), struct amdgpu_bo_user, bo)
+
struct amdgpu_bo_param {
unsigned long size;
int byte_align;
@@ -112,6 +114,15 @@ struct amdgpu_bo {
struct kgd_mem *kfd_bo;
};
+struct amdgpu_bo_user {
+ struct amdgpu_bo bo;
+ u64 tiling_flags;
+ u64 metadata_flags;
+ void *metadata;
+ u32 metadata_size;
+
+};
+
static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
{
return container_of(tbo, struct amdgpu_bo, tbo);
@@ -255,6 +266,9 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev,
uint64_t offset, uint64_t size, uint32_t domain,
struct amdgpu_bo **bo_ptr, void **cpu_addr);
+int amdgpu_bo_create_user(struct amdgpu_device *adev,
+ struct amdgpu_bo_param *bp,
+ struct amdgpu_bo_user **ubo_ptr);
void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
void **cpu_addr);
int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr);
--
2.30.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/5] drm/amdgpu: introduce struct amdgpu_bo_user
2021-03-09 8:46 ` [PATCH v2 2/5] drm/amdgpu: introduce struct amdgpu_bo_user Nirmoy Das
@ 2021-03-09 12:37 ` Christian König
0 siblings, 0 replies; 17+ messages in thread
From: Christian König @ 2021-03-09 12:37 UTC (permalink / raw)
To: Nirmoy Das; +Cc: amd-gfx
Am 09.03.21 um 09:46 schrieb Nirmoy Das:
> Implement a new struct amdgpu_bo_user as subclass of
> struct amdgpu_bo and a function to created amdgpu_bo_user
> bo with a flag to identify the owner.
>
> v2: amdgpu_bo_to_amdgpu_bo_user -> to_amdgpu_bo_user()
>
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 28 ++++++++++++++++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 14 +++++++++++
> 2 files changed, 42 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index c30f10f931fc..bd89d44a1f2f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -694,6 +694,34 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
> return r;
> }
>
> +/**
> + * amdgpu_bo_create_user - create an &amdgpu_bo_user buffer object
> + * @adev: amdgpu device object
> + * @bp: parameters to be used for the buffer object
> + * @ubo_ptr: pointer to the buffer object pointer
> + *
> + * Create a BO to be used by user application;
> + *
> + * Returns:
> + * 0 for success or a negative error code on failure.
> + */
> +
> +int amdgpu_bo_create_user(struct amdgpu_device *adev,
> + struct amdgpu_bo_param *bp,
> + struct amdgpu_bo_user **ubo_ptr)
> +{
> + struct amdgpu_bo *bo_ptr;
> + int r;
> +
> + bp->flags = bp->flags & ~AMDGPU_GEM_CREATE_SHADOW;
> + bp->bo_ptr_size = sizeof(struct amdgpu_bo_user);
> + r = amdgpu_bo_do_create(adev, bp, &bo_ptr);
> + if (r)
> + return r;
> +
> + *ubo_ptr = to_amdgpu_bo_user(bo_ptr);
> + return r;
> +}
> /**
> * amdgpu_bo_validate - validate an &amdgpu_bo buffer object
> * @bo: pointer to the buffer object
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 8e2b556f0b7b..06b6fa35db99 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -37,6 +37,8 @@
> #define AMDGPU_BO_INVALID_OFFSET LONG_MAX
> #define AMDGPU_BO_MAX_PLACEMENTS 3
>
> +#define to_amdgpu_bo_user(abo) container_of((abo), struct amdgpu_bo_user, bo)
> +
> struct amdgpu_bo_param {
> unsigned long size;
> int byte_align;
> @@ -112,6 +114,15 @@ struct amdgpu_bo {
> struct kgd_mem *kfd_bo;
> };
>
> +struct amdgpu_bo_user {
> + struct amdgpu_bo bo;
> + u64 tiling_flags;
> + u64 metadata_flags;
> + void *metadata;
> + u32 metadata_size;
> +
> +};
> +
> static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
> {
> return container_of(tbo, struct amdgpu_bo, tbo);
> @@ -255,6 +266,9 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
> int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev,
> uint64_t offset, uint64_t size, uint32_t domain,
> struct amdgpu_bo **bo_ptr, void **cpu_addr);
> +int amdgpu_bo_create_user(struct amdgpu_device *adev,
> + struct amdgpu_bo_param *bp,
> + struct amdgpu_bo_user **ubo_ptr);
> void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
> void **cpu_addr);
> int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr);
> --
> 2.30.1
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device
2021-03-09 8:46 [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Nirmoy Das
2021-03-09 8:46 ` [PATCH v2 2/5] drm/amdgpu: introduce struct amdgpu_bo_user Nirmoy Das
@ 2021-03-09 8:46 ` Nirmoy Das
2021-03-09 12:39 ` Christian König
2021-03-09 8:46 ` [PATCH 4/5] drm/amdgpu: use amdgpu_bo_create_user() for when possible Nirmoy Das
` (3 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Nirmoy Das @ 2021-03-09 8:46 UTC (permalink / raw)
To: Christian.Koenig; +Cc: Nirmoy Das, Christian König, amd-gfx
FB BO should not be ttm_bo_type_kernel type and
amdgpufb_create_pinned_object() pins the FB BO anyway.
Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 51cd49c6f38f..24010cacf7d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -146,7 +146,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
size = mode_cmd->pitches[0] * height;
aligned_size = ALIGN(size, PAGE_SIZE);
ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain, flags,
- ttm_bo_type_kernel, NULL, &gobj);
+ ttm_bo_type_device, NULL, &gobj);
if (ret) {
pr_err("failed to allocate framebuffer (%d)\n", aligned_size);
return -ENOMEM;
--
2.30.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device
2021-03-09 8:46 ` [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device Nirmoy Das
@ 2021-03-09 12:39 ` Christian König
2021-03-09 14:33 ` Nirmoy
0 siblings, 1 reply; 17+ messages in thread
From: Christian König @ 2021-03-09 12:39 UTC (permalink / raw)
To: Nirmoy Das, Christian.Koenig; +Cc: amd-gfx
Am 09.03.21 um 09:46 schrieb Nirmoy Das:
> FB BO should not be ttm_bo_type_kernel type and
> amdgpufb_create_pinned_object() pins the FB BO anyway.
>
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
> Acked-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> index 51cd49c6f38f..24010cacf7d0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> @@ -146,7 +146,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
> size = mode_cmd->pitches[0] * height;
> aligned_size = ALIGN(size, PAGE_SIZE);
> ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain, flags,
> - ttm_bo_type_kernel, NULL, &gobj);
> + ttm_bo_type_device, NULL, &gobj);
Can you double check if we still need the ttm_bo_type_* parameter to
amdgpu_gem_object_create() after aligning this?
Thanks,
Christian.
> if (ret) {
> pr_err("failed to allocate framebuffer (%d)\n", aligned_size);
> return -ENOMEM;
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device
2021-03-09 12:39 ` Christian König
@ 2021-03-09 14:33 ` Nirmoy
2021-03-09 15:08 ` Christian König
0 siblings, 1 reply; 17+ messages in thread
From: Nirmoy @ 2021-03-09 14:33 UTC (permalink / raw)
To: Christian König, Nirmoy Das, Christian.Koenig; +Cc: amd-gfx
On 3/9/21 1:39 PM, Christian König wrote:
> Am 09.03.21 um 09:46 schrieb Nirmoy Das:
>> FB BO should not be ttm_bo_type_kernel type and
>> amdgpufb_create_pinned_object() pins the FB BO anyway.
>>
>> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
>> Acked-by: Christian König <christian.koenig@amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>> index 51cd49c6f38f..24010cacf7d0 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>> @@ -146,7 +146,7 @@ static int amdgpufb_create_pinned_object(struct
>> amdgpu_fbdev *rfbdev,
>> size = mode_cmd->pitches[0] * height;
>> aligned_size = ALIGN(size, PAGE_SIZE);
>> ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
>> flags,
>> - ttm_bo_type_kernel, NULL, &gobj);
>> + ttm_bo_type_device, NULL, &gobj);
>
> Can you double check if we still need the ttm_bo_type_* parameter to
> amdgpu_gem_object_create() after aligning this?
We need that in only one place:
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c --> amdgpu_dma_buf_create_obj()
445: ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
446- AMDGPU_GEM_DOMAIN_CPU, flags,
447- ttm_bo_type_sg, resv, &gobj);
Nirmoy
>
> Thanks,
> Christian.
>
>> if (ret) {
>> pr_err("failed to allocate framebuffer (%d)\n", aligned_size);
>> return -ENOMEM;
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device
2021-03-09 14:33 ` Nirmoy
@ 2021-03-09 15:08 ` Christian König
0 siblings, 0 replies; 17+ messages in thread
From: Christian König @ 2021-03-09 15:08 UTC (permalink / raw)
To: Nirmoy, Nirmoy Das, Christian.Koenig; +Cc: amd-gfx
Am 09.03.21 um 15:33 schrieb Nirmoy:
>
> On 3/9/21 1:39 PM, Christian König wrote:
>> Am 09.03.21 um 09:46 schrieb Nirmoy Das:
>>> FB BO should not be ttm_bo_type_kernel type and
>>> amdgpufb_create_pinned_object() pins the FB BO anyway.
>>>
>>> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
>>> Acked-by: Christian König <christian.koenig@amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>> index 51cd49c6f38f..24010cacf7d0 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>> @@ -146,7 +146,7 @@ static int amdgpufb_create_pinned_object(struct
>>> amdgpu_fbdev *rfbdev,
>>> size = mode_cmd->pitches[0] * height;
>>> aligned_size = ALIGN(size, PAGE_SIZE);
>>> ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
>>> flags,
>>> - ttm_bo_type_kernel, NULL, &gobj);
>>> + ttm_bo_type_device, NULL, &gobj);
>>
>> Can you double check if we still need the ttm_bo_type_* parameter to
>> amdgpu_gem_object_create() after aligning this?
>
>
> We need that in only one place:
>
> drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c -->
> amdgpu_dma_buf_create_obj()
>
> 445: ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
>
> 446- AMDGPU_GEM_DOMAIN_CPU, flags,
>
> 447- ttm_bo_type_sg, resv, &gobj);
Ah, of course that makese sense.
Thanks,
Christian.
>
>
>
> Nirmoy
>
>>
>> Thanks,
>> Christian.
>>
>>> if (ret) {
>>> pr_err("failed to allocate framebuffer (%d)\n",
>>> aligned_size);
>>> return -ENOMEM;
>>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 4/5] drm/amdgpu: use amdgpu_bo_create_user() for when possible
2021-03-09 8:46 [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Nirmoy Das
2021-03-09 8:46 ` [PATCH v2 2/5] drm/amdgpu: introduce struct amdgpu_bo_user Nirmoy Das
2021-03-09 8:46 ` [PATCH 3/5] drm/amdgpu: fb BO should be ttm_bo_type_device Nirmoy Das
@ 2021-03-09 8:46 ` Nirmoy Das
2021-03-09 12:40 ` Christian König
2021-03-09 8:46 ` [PATCH v3 5/5] drm/amdgpu: use amdgpu_bo_user bo for metadata and tiling flag Nirmoy Das
` (2 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Nirmoy Das @ 2021-03-09 8:46 UTC (permalink / raw)
To: Christian.Koenig; +Cc: felix.kuehling, Nirmoy Das, amd-gfx
Use amdgpu_bo_create_user() for all the BO allocations for
ttm_bo_type_device type.
v2: include amdgpu_amdkfd_alloc_gws() as well it calls amdgpu_bo_create()
for ttm_bo_type_device
CC: felix.kuehling@amd.com
Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 4 +++-
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 4 +++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 2151fcb1e19d..de6b3ca64b45 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -317,6 +317,7 @@ int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size,
{
struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
struct amdgpu_bo *bo = NULL;
+ struct amdgpu_bo_user *ubo;
struct amdgpu_bo_param bp;
int r;
@@ -329,13 +330,14 @@ int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size,
bp.resv = NULL;
bp.bo_ptr_size = sizeof(struct amdgpu_bo);
- r = amdgpu_bo_create(adev, &bp, &bo);
+ r = amdgpu_bo_create_user(adev, &bp, &ubo);
if (r) {
dev_err(adev->dev,
"failed to allocate gws BO for amdkfd (%d)\n", r);
return r;
}
+ bo = &ubo->bo;
*mem_obj = bo;
return 0;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index bca260d56f76..311bcdc59eda 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -58,6 +58,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
struct drm_gem_object **obj)
{
struct amdgpu_bo *bo;
+ struct amdgpu_bo_user *ubo;
struct amdgpu_bo_param bp;
int r;
@@ -73,10 +74,11 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
bp.domain = initial_domain;
bp.bo_ptr_size = sizeof(struct amdgpu_bo);
- r = amdgpu_bo_create(adev, &bp, &bo);
+ r = amdgpu_bo_create_user(adev, &bp, &ubo);
if (r)
return r;
+ bo = &ubo->bo;
*obj = &bo->tbo.base;
(*obj)->funcs = &amdgpu_gem_object_funcs;
--
2.30.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 4/5] drm/amdgpu: use amdgpu_bo_create_user() for when possible
2021-03-09 8:46 ` [PATCH 4/5] drm/amdgpu: use amdgpu_bo_create_user() for when possible Nirmoy Das
@ 2021-03-09 12:40 ` Christian König
0 siblings, 0 replies; 17+ messages in thread
From: Christian König @ 2021-03-09 12:40 UTC (permalink / raw)
To: Nirmoy Das; +Cc: felix.kuehling, amd-gfx
Am 09.03.21 um 09:46 schrieb Nirmoy Das:
> Use amdgpu_bo_create_user() for all the BO allocations for
> ttm_bo_type_device type.
>
> v2: include amdgpu_amdkfd_alloc_gws() as well it calls amdgpu_bo_create()
> for ttm_bo_type_device
>
> CC: felix.kuehling@amd.com
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 4 +++-
> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 4 +++-
> 2 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index 2151fcb1e19d..de6b3ca64b45 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -317,6 +317,7 @@ int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size,
> {
> struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
> struct amdgpu_bo *bo = NULL;
> + struct amdgpu_bo_user *ubo;
> struct amdgpu_bo_param bp;
> int r;
>
> @@ -329,13 +330,14 @@ int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size,
> bp.resv = NULL;
> bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> - r = amdgpu_bo_create(adev, &bp, &bo);
> + r = amdgpu_bo_create_user(adev, &bp, &ubo);
> if (r) {
> dev_err(adev->dev,
> "failed to allocate gws BO for amdkfd (%d)\n", r);
> return r;
> }
>
> + bo = &ubo->bo;
> *mem_obj = bo;
> return 0;
> }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index bca260d56f76..311bcdc59eda 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -58,6 +58,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> struct drm_gem_object **obj)
> {
> struct amdgpu_bo *bo;
> + struct amdgpu_bo_user *ubo;
> struct amdgpu_bo_param bp;
> int r;
>
> @@ -73,10 +74,11 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> bp.domain = initial_domain;
> bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> - r = amdgpu_bo_create(adev, &bp, &bo);
> + r = amdgpu_bo_create_user(adev, &bp, &ubo);
> if (r)
> return r;
>
> + bo = &ubo->bo;
> *obj = &bo->tbo.base;
> (*obj)->funcs = &amdgpu_gem_object_funcs;
>
> --
> 2.30.1
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v3 5/5] drm/amdgpu: use amdgpu_bo_user bo for metadata and tiling flag
2021-03-09 8:46 [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Nirmoy Das
` (2 preceding siblings ...)
2021-03-09 8:46 ` [PATCH 4/5] drm/amdgpu: use amdgpu_bo_create_user() for when possible Nirmoy Das
@ 2021-03-09 8:46 ` Nirmoy Das
2021-03-09 12:42 ` Christian König
2021-03-09 12:36 ` [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Christian König
2021-03-10 22:17 ` Felix Kuehling
5 siblings, 1 reply; 17+ messages in thread
From: Nirmoy Das @ 2021-03-09 8:46 UTC (permalink / raw)
To: Christian.Koenig; +Cc: felix.kuehling, Nirmoy Das, amd-gfx
Tiling flag and metadata are only needed for BOs created by
amdgpu_gem_object_create(), so we can remove those from the
base class.
v2: * squash tiling_flags and metadata relared patches into one
* use BUG_ON for non ttm_bo_type_device type when accessing
tiling_flags and metadata._
v3: *include to_amdgpu_bo_user
CC: felix.kuehling@amd.com
Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 2 -
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 51 +++++++++++++++-------
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 4 --
3 files changed, 35 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index de6b3ca64b45..efa79719d453 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -498,8 +498,6 @@ int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd,
*dma_buf_kgd = (struct kgd_dev *)adev;
if (bo_size)
*bo_size = amdgpu_bo_size(bo);
- if (metadata_size)
- *metadata_size = bo->metadata_size;
if (metadata_buffer)
r = amdgpu_bo_get_metadata(bo, metadata_buffer, buffer_size,
metadata_size, &metadata_flags);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index bd89d44a1f2f..ac0e1cd83858 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -77,6 +77,7 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
{
struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
+ struct amdgpu_bo_user *ubo;
if (bo->tbo.pin_count > 0)
amdgpu_bo_subtract_pin_size(bo);
@@ -94,7 +95,11 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
}
amdgpu_bo_unref(&bo->parent);
- kfree(bo->metadata);
+ if (bo->tbo.type == ttm_bo_type_device) {
+ ubo = to_amdgpu_bo_user(bo);
+ kfree(ubo->metadata);
+ }
+
kfree(bo);
}
@@ -1160,12 +1165,15 @@ int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
{
struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
+ struct amdgpu_bo_user *ubo;
+ BUG_ON(bo->tbo.type != ttm_bo_type_device);
if (adev->family <= AMDGPU_FAMILY_CZ &&
AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT) > 6)
return -EINVAL;
- bo->tiling_flags = tiling_flags;
+ ubo = to_amdgpu_bo_user(bo);
+ ubo->tiling_flags = tiling_flags;
return 0;
}
@@ -1179,10 +1187,14 @@ int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
*/
void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)
{
+ struct amdgpu_bo_user *ubo;
+
+ BUG_ON(bo->tbo.type != ttm_bo_type_device);
dma_resv_assert_held(bo->tbo.base.resv);
+ ubo = to_amdgpu_bo_user(bo);
if (tiling_flags)
- *tiling_flags = bo->tiling_flags;
+ *tiling_flags = ubo->tiling_flags;
}
/**
@@ -1201,13 +1213,16 @@ void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)
int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
uint32_t metadata_size, uint64_t flags)
{
+ struct amdgpu_bo_user *ubo;
void *buffer;
+ BUG_ON(bo->tbo.type != ttm_bo_type_device);
+ ubo = to_amdgpu_bo_user(bo);
if (!metadata_size) {
- if (bo->metadata_size) {
- kfree(bo->metadata);
- bo->metadata = NULL;
- bo->metadata_size = 0;
+ if (ubo->metadata_size) {
+ kfree(ubo->metadata);
+ ubo->metadata = NULL;
+ ubo->metadata_size = 0;
}
return 0;
}
@@ -1219,10 +1234,10 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
if (buffer == NULL)
return -ENOMEM;
- kfree(bo->metadata);
- bo->metadata_flags = flags;
- bo->metadata = buffer;
- bo->metadata_size = metadata_size;
+ kfree(ubo->metadata);
+ ubo->metadata_flags = flags;
+ ubo->metadata = buffer;
+ ubo->metadata_size = metadata_size;
return 0;
}
@@ -1246,21 +1261,25 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
size_t buffer_size, uint32_t *metadata_size,
uint64_t *flags)
{
+ struct amdgpu_bo_user *ubo;
+
if (!buffer && !metadata_size)
return -EINVAL;
+ BUG_ON(bo->tbo.type != ttm_bo_type_device);
+ ubo = to_amdgpu_bo_user(bo);
if (buffer) {
- if (buffer_size < bo->metadata_size)
+ if (buffer_size < ubo->metadata_size)
return -EINVAL;
- if (bo->metadata_size)
- memcpy(buffer, bo->metadata, bo->metadata_size);
+ if (ubo->metadata_size)
+ memcpy(buffer, ubo->metadata, ubo->metadata_size);
}
if (metadata_size)
- *metadata_size = bo->metadata_size;
+ *metadata_size = ubo->metadata_size;
if (flags)
- *flags = bo->metadata_flags;
+ *flags = ubo->metadata_flags;
return 0;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 06b6fa35db99..25411b2c4dd9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -92,10 +92,6 @@ struct amdgpu_bo {
struct ttm_buffer_object tbo;
struct ttm_bo_kmap_obj kmap;
u64 flags;
- u64 tiling_flags;
- u64 metadata_flags;
- void *metadata;
- u32 metadata_size;
unsigned prime_shared_count;
/* per VM structure for page tables and with virtual addresses */
struct amdgpu_vm_bo_base *vm_bo;
--
2.30.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v3 5/5] drm/amdgpu: use amdgpu_bo_user bo for metadata and tiling flag
2021-03-09 8:46 ` [PATCH v3 5/5] drm/amdgpu: use amdgpu_bo_user bo for metadata and tiling flag Nirmoy Das
@ 2021-03-09 12:42 ` Christian König
0 siblings, 0 replies; 17+ messages in thread
From: Christian König @ 2021-03-09 12:42 UTC (permalink / raw)
To: Nirmoy Das; +Cc: felix.kuehling, amd-gfx
Am 09.03.21 um 09:46 schrieb Nirmoy Das:
> Tiling flag and metadata are only needed for BOs created by
> amdgpu_gem_object_create(), so we can remove those from the
> base class.
>
> v2: * squash tiling_flags and metadata relared patches into one
> * use BUG_ON for non ttm_bo_type_device type when accessing
> tiling_flags and metadata._
> v3: *include to_amdgpu_bo_user
>
> CC: felix.kuehling@amd.com
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 2 -
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 51 +++++++++++++++-------
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 4 --
> 3 files changed, 35 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index de6b3ca64b45..efa79719d453 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -498,8 +498,6 @@ int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd,
> *dma_buf_kgd = (struct kgd_dev *)adev;
> if (bo_size)
> *bo_size = amdgpu_bo_size(bo);
> - if (metadata_size)
> - *metadata_size = bo->metadata_size;
> if (metadata_buffer)
> r = amdgpu_bo_get_metadata(bo, metadata_buffer, buffer_size,
> metadata_size, &metadata_flags);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index bd89d44a1f2f..ac0e1cd83858 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -77,6 +77,7 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
> {
> struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
> struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
> + struct amdgpu_bo_user *ubo;
>
> if (bo->tbo.pin_count > 0)
> amdgpu_bo_subtract_pin_size(bo);
> @@ -94,7 +95,11 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
> }
> amdgpu_bo_unref(&bo->parent);
>
> - kfree(bo->metadata);
> + if (bo->tbo.type == ttm_bo_type_device) {
> + ubo = to_amdgpu_bo_user(bo);
> + kfree(ubo->metadata);
> + }
> +
At some point we might need to improve this and use something like
amdgpu_bo_destroy_user(), but for now the patch is Reviewed-by:
Christian König <christian.koenig@amd.com>.
Thanks,
Christian.
> kfree(bo);
> }
>
> @@ -1160,12 +1165,15 @@ int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
> int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
> {
> struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> + struct amdgpu_bo_user *ubo;
>
> + BUG_ON(bo->tbo.type != ttm_bo_type_device);
> if (adev->family <= AMDGPU_FAMILY_CZ &&
> AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT) > 6)
> return -EINVAL;
>
> - bo->tiling_flags = tiling_flags;
> + ubo = to_amdgpu_bo_user(bo);
> + ubo->tiling_flags = tiling_flags;
> return 0;
> }
>
> @@ -1179,10 +1187,14 @@ int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
> */
> void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)
> {
> + struct amdgpu_bo_user *ubo;
> +
> + BUG_ON(bo->tbo.type != ttm_bo_type_device);
> dma_resv_assert_held(bo->tbo.base.resv);
> + ubo = to_amdgpu_bo_user(bo);
>
> if (tiling_flags)
> - *tiling_flags = bo->tiling_flags;
> + *tiling_flags = ubo->tiling_flags;
> }
>
> /**
> @@ -1201,13 +1213,16 @@ void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)
> int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
> uint32_t metadata_size, uint64_t flags)
> {
> + struct amdgpu_bo_user *ubo;
> void *buffer;
>
> + BUG_ON(bo->tbo.type != ttm_bo_type_device);
> + ubo = to_amdgpu_bo_user(bo);
> if (!metadata_size) {
> - if (bo->metadata_size) {
> - kfree(bo->metadata);
> - bo->metadata = NULL;
> - bo->metadata_size = 0;
> + if (ubo->metadata_size) {
> + kfree(ubo->metadata);
> + ubo->metadata = NULL;
> + ubo->metadata_size = 0;
> }
> return 0;
> }
> @@ -1219,10 +1234,10 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
> if (buffer == NULL)
> return -ENOMEM;
>
> - kfree(bo->metadata);
> - bo->metadata_flags = flags;
> - bo->metadata = buffer;
> - bo->metadata_size = metadata_size;
> + kfree(ubo->metadata);
> + ubo->metadata_flags = flags;
> + ubo->metadata = buffer;
> + ubo->metadata_size = metadata_size;
>
> return 0;
> }
> @@ -1246,21 +1261,25 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
> size_t buffer_size, uint32_t *metadata_size,
> uint64_t *flags)
> {
> + struct amdgpu_bo_user *ubo;
> +
> if (!buffer && !metadata_size)
> return -EINVAL;
>
> + BUG_ON(bo->tbo.type != ttm_bo_type_device);
> + ubo = to_amdgpu_bo_user(bo);
> if (buffer) {
> - if (buffer_size < bo->metadata_size)
> + if (buffer_size < ubo->metadata_size)
> return -EINVAL;
>
> - if (bo->metadata_size)
> - memcpy(buffer, bo->metadata, bo->metadata_size);
> + if (ubo->metadata_size)
> + memcpy(buffer, ubo->metadata, ubo->metadata_size);
> }
>
> if (metadata_size)
> - *metadata_size = bo->metadata_size;
> + *metadata_size = ubo->metadata_size;
> if (flags)
> - *flags = bo->metadata_flags;
> + *flags = ubo->metadata_flags;
>
> return 0;
> }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 06b6fa35db99..25411b2c4dd9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -92,10 +92,6 @@ struct amdgpu_bo {
> struct ttm_buffer_object tbo;
> struct ttm_bo_kmap_obj kmap;
> u64 flags;
> - u64 tiling_flags;
> - u64 metadata_flags;
> - void *metadata;
> - u32 metadata_size;
> unsigned prime_shared_count;
> /* per VM structure for page tables and with virtual addresses */
> struct amdgpu_vm_bo_base *vm_bo;
> --
> 2.30.1
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation
2021-03-09 8:46 [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Nirmoy Das
` (3 preceding siblings ...)
2021-03-09 8:46 ` [PATCH v3 5/5] drm/amdgpu: use amdgpu_bo_user bo for metadata and tiling flag Nirmoy Das
@ 2021-03-09 12:36 ` Christian König
2021-03-10 22:17 ` Felix Kuehling
5 siblings, 0 replies; 17+ messages in thread
From: Christian König @ 2021-03-09 12:36 UTC (permalink / raw)
To: Nirmoy Das, Christian.Koenig; +Cc: felix.kuehling, amd-gfx
Am 09.03.21 um 09:46 schrieb Nirmoy Das:
> Allow allocating BO structures with different structure size
> than struct amdgpu_bo.
>
> v2: Check bo_ptr_size in all amdgpu_bo_create() caller.
>
> CC: felix.kuehling@amd.com
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 8 ++++++--
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 +
> drivers/gpu/drm/amd/amdgpu/amdgpu_test.c | 1 +
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 1 +
> 9 files changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index f44185f512de..2151fcb1e19d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -245,6 +245,7 @@ int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
> bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> if (cp_mqd_gfx9)
> bp.flags |= AMDGPU_GEM_CREATE_CP_MQD_GFX9;
> @@ -326,6 +327,7 @@ int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size,
> bp.flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
> bp.type = ttm_bo_type_device;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> r = amdgpu_bo_create(adev, &bp, &bo);
> if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> index d9b35df33806..313517f7cf10 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> @@ -85,6 +85,8 @@ static void amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size,
> bp.flags = 0;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> n = AMDGPU_BENCHMARK_ITERATIONS;
> r = amdgpu_bo_create(adev, &bp, &sobj);
> if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> index 5807cad833d3..c5a9a4fb10d2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> @@ -126,6 +126,8 @@ int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev)
> AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> r = amdgpu_bo_create(adev, &bp, &adev->gart.bo);
> if (r) {
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index fb7171e5507c..bca260d56f76 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -71,6 +71,8 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> bp.preferred_domain = initial_domain;
> bp.flags = flags;
> bp.domain = initial_domain;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> r = amdgpu_bo_create(adev, &bp, &bo);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index 6f7995293a1e..1e07c66676c2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -55,6 +55,8 @@ int amdgpu_gmc_pdb0_alloc(struct amdgpu_device *adev)
> AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> r = amdgpu_bo_create(adev, &bp, &adev->gmc.pdb0_bo);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index ac1bb5089260..c30f10f931fc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -248,6 +248,7 @@ int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
> bp.flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> if (!*bo_ptr) {
> r = amdgpu_bo_create(adev, &bp, bo_ptr);
> @@ -543,9 +544,10 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
> if (!amdgpu_bo_validate_size(adev, size, bp->domain))
> return -ENOMEM;
>
> - *bo_ptr = NULL;
> + BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo));
>
> - bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL);
> + *bo_ptr = NULL;
> + bo = kzalloc(bp->bo_ptr_size, GFP_KERNEL);
> if (bo == NULL)
> return -ENOMEM;
> drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
> @@ -635,6 +637,7 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
> AMDGPU_GEM_CREATE_SHADOW;
> bp.type = ttm_bo_type_kernel;
> bp.resv = bo->tbo.base.resv;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
> if (!r) {
> @@ -669,6 +672,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
> int r;
>
> bp->flags = bp->flags & ~AMDGPU_GEM_CREATE_SHADOW;
> +
> r = amdgpu_bo_do_create(adev, bp, bo_ptr);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 54ceb065e546..8e2b556f0b7b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -40,6 +40,7 @@
> struct amdgpu_bo_param {
> unsigned long size;
> int byte_align;
> + u32 bo_ptr_size;
> u32 domain;
> u32 preferred_domain;
> u64 flags;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
> index 7b230bcbf2c6..909d830b513e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
> @@ -62,6 +62,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
> bp.flags = 0;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> r = amdgpu_bo_create(adev, &bp, &vram_obj);
> if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 9d19078246c8..a8f8b9a06899 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -869,6 +869,7 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> bp->domain = amdgpu_bo_get_preferred_pin_domain(adev, bp->domain);
> bp->flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
> AMDGPU_GEM_CREATE_CPU_GTT_USWC;
> + bp->bo_ptr_size = sizeof(struct amdgpu_bo);
> if (vm->use_cpu_for_update)
> bp->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> else if (!vm->root.base.bo || vm->root.base.bo->shadow)
> --
> 2.30.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation
2021-03-09 8:46 [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Nirmoy Das
` (4 preceding siblings ...)
2021-03-09 12:36 ` [PATCH v2 1/5] drm/amdgpu: allow variable BO struct creation Christian König
@ 2021-03-10 22:17 ` Felix Kuehling
5 siblings, 0 replies; 17+ messages in thread
From: Felix Kuehling @ 2021-03-10 22:17 UTC (permalink / raw)
To: Nirmoy Das, Christian.Koenig; +Cc: amd-gfx
On 2021-03-09 3:46 a.m., Nirmoy Das wrote:
> Allow allocating BO structures with different structure size
> than struct amdgpu_bo.
>
> v2: Check bo_ptr_size in all amdgpu_bo_create() caller.
>
> CC: felix.kuehling@amd.com
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
The series is
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 8 ++++++--
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 +
> drivers/gpu/drm/amd/amdgpu/amdgpu_test.c | 1 +
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 1 +
> 9 files changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index f44185f512de..2151fcb1e19d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -245,6 +245,7 @@ int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
> bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> if (cp_mqd_gfx9)
> bp.flags |= AMDGPU_GEM_CREATE_CP_MQD_GFX9;
> @@ -326,6 +327,7 @@ int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size,
> bp.flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
> bp.type = ttm_bo_type_device;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> r = amdgpu_bo_create(adev, &bp, &bo);
> if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> index d9b35df33806..313517f7cf10 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
> @@ -85,6 +85,8 @@ static void amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size,
> bp.flags = 0;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> n = AMDGPU_BENCHMARK_ITERATIONS;
> r = amdgpu_bo_create(adev, &bp, &sobj);
> if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> index 5807cad833d3..c5a9a4fb10d2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> @@ -126,6 +126,8 @@ int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev)
> AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> r = amdgpu_bo_create(adev, &bp, &adev->gart.bo);
> if (r) {
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index fb7171e5507c..bca260d56f76 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -71,6 +71,8 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> bp.preferred_domain = initial_domain;
> bp.flags = flags;
> bp.domain = initial_domain;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> r = amdgpu_bo_create(adev, &bp, &bo);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index 6f7995293a1e..1e07c66676c2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -55,6 +55,8 @@ int amdgpu_gmc_pdb0_alloc(struct amdgpu_device *adev)
> AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> +
> r = amdgpu_bo_create(adev, &bp, &adev->gmc.pdb0_bo);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index ac1bb5089260..c30f10f931fc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -248,6 +248,7 @@ int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
> bp.flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> if (!*bo_ptr) {
> r = amdgpu_bo_create(adev, &bp, bo_ptr);
> @@ -543,9 +544,10 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
> if (!amdgpu_bo_validate_size(adev, size, bp->domain))
> return -ENOMEM;
>
> - *bo_ptr = NULL;
> + BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo));
>
> - bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL);
> + *bo_ptr = NULL;
> + bo = kzalloc(bp->bo_ptr_size, GFP_KERNEL);
> if (bo == NULL)
> return -ENOMEM;
> drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
> @@ -635,6 +637,7 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
> AMDGPU_GEM_CREATE_SHADOW;
> bp.type = ttm_bo_type_kernel;
> bp.resv = bo->tbo.base.resv;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
> if (!r) {
> @@ -669,6 +672,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
> int r;
>
> bp->flags = bp->flags & ~AMDGPU_GEM_CREATE_SHADOW;
> +
> r = amdgpu_bo_do_create(adev, bp, bo_ptr);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 54ceb065e546..8e2b556f0b7b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -40,6 +40,7 @@
> struct amdgpu_bo_param {
> unsigned long size;
> int byte_align;
> + u32 bo_ptr_size;
> u32 domain;
> u32 preferred_domain;
> u64 flags;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
> index 7b230bcbf2c6..909d830b513e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
> @@ -62,6 +62,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
> bp.flags = 0;
> bp.type = ttm_bo_type_kernel;
> bp.resv = NULL;
> + bp.bo_ptr_size = sizeof(struct amdgpu_bo);
>
> r = amdgpu_bo_create(adev, &bp, &vram_obj);
> if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 9d19078246c8..a8f8b9a06899 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -869,6 +869,7 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> bp->domain = amdgpu_bo_get_preferred_pin_domain(adev, bp->domain);
> bp->flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
> AMDGPU_GEM_CREATE_CPU_GTT_USWC;
> + bp->bo_ptr_size = sizeof(struct amdgpu_bo);
> if (vm->use_cpu_for_update)
> bp->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> else if (!vm->root.base.bo || vm->root.base.bo->shadow)
> --
> 2.30.1
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread