On Wed, Feb 11, 2026 at 8:32 AM Christian König
<[email protected]> wrote:
>
> It turned that using 4 level page tables on GMC generations which support
> 57bit VAs actually doesn't work at all.
>
> Background is that the GMC actually can't switch between 4 and 5 levels,
> but rather just uses a subset of address space when less than 5 levels are
> selected.
>
> Philip already removed the automatically switch to 4levels, now fix it as
> well should it be enabled by module parameters.
>
> Signed-off-by: Christian König <[email protected]>

Acked-by: Alex Deucher <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 4 ++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  | 1 +
>  3 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> index e8e8bfa098c3..3b9ca5667de4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> @@ -33,9 +33,9 @@
>  #include "amdgpu_ras.h"
>
>  /* VA hole for 48bit and 57bit addresses */
> -#define AMDGPU_GMC_HOLE_START  (adev->vm_manager.root_level == 
> AMDGPU_VM_PDB3 ?\
> +#define AMDGPU_GMC_HOLE_START  (adev->vm_manager.max_level == 5 ?\
>                                 0x0100000000000000ULL : 0x0000800000000000ULL)
> -#define AMDGPU_GMC_HOLE_END    (adev->vm_manager.root_level == 
> AMDGPU_VM_PDB3 ?\
> +#define AMDGPU_GMC_HOLE_END    (adev->vm_manager.max_level == 5 ?\
>                                 0xff00000000000000ULL : 0xffff800000000000ULL)
>
>  /*
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index dfad7d11826c..c6fd3a091613 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -2409,6 +2409,7 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, 
> uint32_t min_vm_size,
>         }
>
>         adev->vm_manager.max_pfn = (uint64_t)vm_size << 18;
> +       adev->vm_manager.max_level = max_level;
>
>         tmp = roundup_pow_of_two(adev->vm_manager.max_pfn);
>         if (amdgpu_vm_block_size != -1)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index 139642eacdd0..806d62ed61ef 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -456,6 +456,7 @@ struct amdgpu_vm_manager {
>         bool                                    concurrent_flush;
>
>         uint64_t                                max_pfn;
> +       uint32_t                                max_level;
>         uint32_t                                num_level;
>         uint32_t                                block_size;
>         uint32_t                                fragment_size;
> --
> 2.43.0
>

Reply via email to