Re: [PATCH v5 1/7] drm/amdgpu: pass all the sdma scheds to amdgpu_mman

2026-04-08 Thread Pierre-Eric Pelloux-Prayer




Le 07/04/2026 à 10:07, Christian König a écrit :

On 4/3/26 17:08, Alex Deucher wrote:

On Fri, Apr 3, 2026 at 4:36 AM Pierre-Eric Pelloux-Prayer
 wrote:


This will allow the use of all of them for clear/fill buffer
operations.
Since drm_sched_entity_init requires a scheduler array, we
store schedulers rather than rings. For the few places that need
access to a ring, we can get it from the sched using container_of.

Since the code is the same for all sdma versions, add a new
helper amdgpu_sdma_set_buffer_funcs_scheds to set buffer_funcs_scheds
based on the number of sdma instances.

Note: the new sched array is identical to the amdgpu_vm_manager one.
These 2 could be merged.

Signed-off-by: Pierre-Eric Pelloux-Prayer 
Acked-by: Felix Kuehling 
---
  drivers/gpu/drm/amd/amdgpu/amdgpu.h|  2 ++
  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  2 +-
  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c|  4 ++-
  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c| 32 ++
  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h|  3 +-
  drivers/gpu/drm/amd/amdgpu/cik_sdma.c  |  3 +-
  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c |  3 +-
  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c |  3 +-
  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c |  8 ++
  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c   |  6 +---
  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c |  5 +---
  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c |  5 +---
  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c |  3 +-
  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c |  3 +-
  drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c |  3 +-
  drivers/gpu/drm/amd/amdgpu/si_dma.c|  3 +-
  drivers/gpu/drm/amd/amdkfd/kfd_migrate.c   |  3 +-
  17 files changed, 48 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 49e7881750fa..e3a8701f0b27 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1467,6 +1467,8 @@ ssize_t amdgpu_get_soft_full_reset_mask(struct 
amdgpu_ring *ring);
  ssize_t amdgpu_show_reset_mask(char *buf, uint32_t supported_reset);
  void amdgpu_sdma_set_vm_pte_scheds(struct amdgpu_device *adev,
const struct amdgpu_vm_pte_funcs 
*vm_pte_funcs);
+void amdgpu_sdma_set_buffer_funcs_scheds(struct amdgpu_device *adev,
+const struct amdgpu_buffer_funcs 
*buffer_funcs);

  /* atpx handler */
  #if defined(CONFIG_VGA_SWITCHEROO)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 0c0489395edf..4da8de34be3d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3700,7 +3700,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 adev->num_rings = 0;
 RCU_INIT_POINTER(adev->gang_submit, dma_fence_get_stub());
 adev->mman.buffer_funcs = NULL;
-   adev->mman.buffer_funcs_ring = NULL;
+   adev->mman.num_buffer_funcs_scheds = 0;
 adev->vm_manager.vm_pte_funcs = NULL;
 adev->vm_manager.vm_pte_num_scheds = 0;
 adev->gmc.gmc_funcs = NULL;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index e9e53c7c37d0..1a253e4257ff 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -708,12 +708,14 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device 
*adev)
  void amdgpu_gmc_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
   uint32_t vmhub, uint32_t flush_type)
  {
-   struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
+   struct amdgpu_ring *ring;
 struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];
 struct dma_fence *fence;
 struct amdgpu_job *job;
 int r;

+   ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
+
 if (!hub->sdma_invalidation_workaround || vmid ||
 !adev->mman.buffer_funcs_enabled || !adev->ib_pool_ready ||
 !ring->sched.ready) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 3c63f87832e4..4ba7321b75e3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -168,7 +168,7 @@ amdgpu_ttm_job_submit(struct amdgpu_device *adev, struct 
amdgpu_ttm_buffer_entit
  {
 struct amdgpu_ring *ring;

-   ring = adev->mman.buffer_funcs_ring;
+   ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
 amdgpu_ring_pad_ib(ring, &job->ibs[0]);
 WARN_ON(job->ibs[0].length_dw > num_dw);

@@ -2349,18 +2349,17 @@ void amdgpu_ttm_set_buffer_funcs_status(struct 
amdgpu_device *adev, bool enable)
 return;

 if (enable) {
-   struct amdgpu_ring *ring;
 struct drm_gpu_scheduler *sched;

-   if (!adev->mman.buffer_funcs_ring || 
!adev->m

Re: [PATCH v5 1/7] drm/amdgpu: pass all the sdma scheds to amdgpu_mman

2026-04-07 Thread Christian König
On 4/3/26 17:08, Alex Deucher wrote:
> On Fri, Apr 3, 2026 at 4:36 AM Pierre-Eric Pelloux-Prayer
>  wrote:
>>
>> This will allow the use of all of them for clear/fill buffer
>> operations.
>> Since drm_sched_entity_init requires a scheduler array, we
>> store schedulers rather than rings. For the few places that need
>> access to a ring, we can get it from the sched using container_of.
>>
>> Since the code is the same for all sdma versions, add a new
>> helper amdgpu_sdma_set_buffer_funcs_scheds to set buffer_funcs_scheds
>> based on the number of sdma instances.
>>
>> Note: the new sched array is identical to the amdgpu_vm_manager one.
>> These 2 could be merged.
>>
>> Signed-off-by: Pierre-Eric Pelloux-Prayer 
>> 
>> Acked-by: Felix Kuehling 
>> ---
>>  drivers/gpu/drm/amd/amdgpu/amdgpu.h|  2 ++
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  2 +-
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c|  4 ++-
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c| 32 ++
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h|  3 +-
>>  drivers/gpu/drm/amd/amdgpu/cik_sdma.c  |  3 +-
>>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c |  3 +-
>>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c |  3 +-
>>  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c |  8 ++
>>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c   |  6 +---
>>  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c |  5 +---
>>  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c |  5 +---
>>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c |  3 +-
>>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c |  3 +-
>>  drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c |  3 +-
>>  drivers/gpu/drm/amd/amdgpu/si_dma.c|  3 +-
>>  drivers/gpu/drm/amd/amdkfd/kfd_migrate.c   |  3 +-
>>  17 files changed, 48 insertions(+), 43 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> index 49e7881750fa..e3a8701f0b27 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> @@ -1467,6 +1467,8 @@ ssize_t amdgpu_get_soft_full_reset_mask(struct 
>> amdgpu_ring *ring);
>>  ssize_t amdgpu_show_reset_mask(char *buf, uint32_t supported_reset);
>>  void amdgpu_sdma_set_vm_pte_scheds(struct amdgpu_device *adev,
>>const struct amdgpu_vm_pte_funcs 
>> *vm_pte_funcs);
>> +void amdgpu_sdma_set_buffer_funcs_scheds(struct amdgpu_device *adev,
>> +const struct amdgpu_buffer_funcs 
>> *buffer_funcs);
>>
>>  /* atpx handler */
>>  #if defined(CONFIG_VGA_SWITCHEROO)
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> index 0c0489395edf..4da8de34be3d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> @@ -3700,7 +3700,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
>> adev->num_rings = 0;
>> RCU_INIT_POINTER(adev->gang_submit, dma_fence_get_stub());
>> adev->mman.buffer_funcs = NULL;
>> -   adev->mman.buffer_funcs_ring = NULL;
>> +   adev->mman.num_buffer_funcs_scheds = 0;
>> adev->vm_manager.vm_pte_funcs = NULL;
>> adev->vm_manager.vm_pte_num_scheds = 0;
>> adev->gmc.gmc_funcs = NULL;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
>> index e9e53c7c37d0..1a253e4257ff 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
>> @@ -708,12 +708,14 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct 
>> amdgpu_device *adev)
>>  void amdgpu_gmc_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
>>   uint32_t vmhub, uint32_t flush_type)
>>  {
>> -   struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
>> +   struct amdgpu_ring *ring;
>> struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];
>> struct dma_fence *fence;
>> struct amdgpu_job *job;
>> int r;
>>
>> +   ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
>> +
>> if (!hub->sdma_invalidation_workaround || vmid ||
>> !adev->mman.buffer_funcs_enabled || !adev->ib_pool_ready ||
>> !ring->sched.ready) {
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> index 3c63f87832e4..4ba7321b75e3 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> @@ -168,7 +168,7 @@ amdgpu_ttm_job_submit(struct amdgpu_device *adev, struct 
>> amdgpu_ttm_buffer_entit
>>  {
>> struct amdgpu_ring *ring;
>>
>> -   ring = adev->mman.buffer_funcs_ring;
>> +   ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
>> amdgpu_ring_pad_ib(ring, &job->ibs[0]);
>> WARN_ON(job->ibs[0].length_dw > num_dw);
>>
>> @@ -2349,18 +2349,17 @@ void amdgpu_ttm_set_buffer_funcs_status(struct 
>> amdgpu_device *adev,

Re: [PATCH v5 1/7] drm/amdgpu: pass all the sdma scheds to amdgpu_mman

2026-04-03 Thread Alex Deucher
On Fri, Apr 3, 2026 at 4:36 AM Pierre-Eric Pelloux-Prayer
 wrote:
>
> This will allow the use of all of them for clear/fill buffer
> operations.
> Since drm_sched_entity_init requires a scheduler array, we
> store schedulers rather than rings. For the few places that need
> access to a ring, we can get it from the sched using container_of.
>
> Since the code is the same for all sdma versions, add a new
> helper amdgpu_sdma_set_buffer_funcs_scheds to set buffer_funcs_scheds
> based on the number of sdma instances.
>
> Note: the new sched array is identical to the amdgpu_vm_manager one.
> These 2 could be merged.
>
> Signed-off-by: Pierre-Eric Pelloux-Prayer 
> Acked-by: Felix Kuehling 
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h|  2 ++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c|  4 ++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c| 32 ++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h|  3 +-
>  drivers/gpu/drm/amd/amdgpu/cik_sdma.c  |  3 +-
>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c |  3 +-
>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c |  3 +-
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c |  8 ++
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c   |  6 +---
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c |  5 +---
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c |  5 +---
>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c |  3 +-
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c |  3 +-
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c |  3 +-
>  drivers/gpu/drm/amd/amdgpu/si_dma.c|  3 +-
>  drivers/gpu/drm/amd/amdkfd/kfd_migrate.c   |  3 +-
>  17 files changed, 48 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 49e7881750fa..e3a8701f0b27 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -1467,6 +1467,8 @@ ssize_t amdgpu_get_soft_full_reset_mask(struct 
> amdgpu_ring *ring);
>  ssize_t amdgpu_show_reset_mask(char *buf, uint32_t supported_reset);
>  void amdgpu_sdma_set_vm_pte_scheds(struct amdgpu_device *adev,
>const struct amdgpu_vm_pte_funcs 
> *vm_pte_funcs);
> +void amdgpu_sdma_set_buffer_funcs_scheds(struct amdgpu_device *adev,
> +const struct amdgpu_buffer_funcs 
> *buffer_funcs);
>
>  /* atpx handler */
>  #if defined(CONFIG_VGA_SWITCHEROO)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 0c0489395edf..4da8de34be3d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -3700,7 +3700,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
> adev->num_rings = 0;
> RCU_INIT_POINTER(adev->gang_submit, dma_fence_get_stub());
> adev->mman.buffer_funcs = NULL;
> -   adev->mman.buffer_funcs_ring = NULL;
> +   adev->mman.num_buffer_funcs_scheds = 0;
> adev->vm_manager.vm_pte_funcs = NULL;
> adev->vm_manager.vm_pte_num_scheds = 0;
> adev->gmc.gmc_funcs = NULL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index e9e53c7c37d0..1a253e4257ff 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -708,12 +708,14 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device 
> *adev)
>  void amdgpu_gmc_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
>   uint32_t vmhub, uint32_t flush_type)
>  {
> -   struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
> +   struct amdgpu_ring *ring;
> struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];
> struct dma_fence *fence;
> struct amdgpu_job *job;
> int r;
>
> +   ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
> +
> if (!hub->sdma_invalidation_workaround || vmid ||
> !adev->mman.buffer_funcs_enabled || !adev->ib_pool_ready ||
> !ring->sched.ready) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 3c63f87832e4..4ba7321b75e3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -168,7 +168,7 @@ amdgpu_ttm_job_submit(struct amdgpu_device *adev, struct 
> amdgpu_ttm_buffer_entit
>  {
> struct amdgpu_ring *ring;
>
> -   ring = adev->mman.buffer_funcs_ring;
> +   ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
> amdgpu_ring_pad_ib(ring, &job->ibs[0]);
> WARN_ON(job->ibs[0].length_dw > num_dw);
>
> @@ -2349,18 +2349,17 @@ void amdgpu_ttm_set_buffer_funcs_status(struct 
> amdgpu_device *adev, bool enable)
> return;
>
> if (enable) {
> -   struct amdgpu_ring *ring;
> struct drm_gpu_schedule