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

2026-04-08 Thread Christian König



On 4/8/26 12:03, 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| 36 ++
>  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, 52 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..63ec3938cd41 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

[PATCH v6 1/8] drm/amdgpu: pass all the sdma scheds to amdgpu_mman

2026-04-08 Thread Pierre-Eric Pelloux-Prayer
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| 36 ++
 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, 52 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..63ec3938cd41 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->mman.buffer_funcs_ring->sched.ready) {
+   if (!adev->mman.num_buffer_funcs_scheds ||
+   !adev->mman.buffer_funcs_scheds[0]->ready) {
dev_warn(adev->de