[PATCH] drm/amdgpu: Add stolen reserved memory for MI25 SRIOV.

Alex Deucher alexdeucher at gmail.com
Mon Mar 14 21:22:01 UTC 2022


On Mon, Mar 14, 2022 at 5:10 PM Yongqiang Sun <yongqiang.sun at amd.com> wrote:
>
> MI25 SRIOV guest driver loading failed due to allocate
> memory overlaps with private memory area.

maybe instead of "private memory area", say something like "firmware
reserved area".

> Add below change to fix the issue:
> 1. Allocate stolen reserved memory for MI25 SRIOV specifically to avoid
> the memory overlap.
> 2. Move allocate reserve allocation to vbios allocation since both the
> two functions are doing similar asic type check and no need to have
> separate functions.

These could be split into two patches, one to merge
amdgpu_gmc_get_reserved_allocation() into
amdgpu_gmc_get_vbios_allocations(), and one to add the
stolen_reserved_* for vega10.

>
> Signed-off-by: Yongqiang Sun <yongqiang.sun at amd.com>
> Change-Id: I142127513047a3e81573eb983c510d763b548a24

With the above changes addressed:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 38 ++++++++++++-------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |  1 -
>  drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c  |  1 -
>  3 files changed, 19 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index 7c2a9555b7cc..7e4d298e8df8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -626,6 +626,13 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
>  {
>         unsigned size;
>
> +       /*
> +        * Some ASICs need to reserve a region of video memory to avoid access
> +        * from driver
> +        */
> +       adev->mman.stolen_reserved_offset = 0;
> +       adev->mman.stolen_reserved_size = 0;
> +
>         /*
>          * TODO:
>          * Currently there is a bug where some memory client outside
> @@ -636,10 +643,22 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
>          */
>         switch (adev->asic_type) {
>         case CHIP_VEGA10:
> +               adev->mman.keep_stolen_vga_memory = true;
> +               if (amdgpu_sriov_vf(adev)) {
> +                       adev->mman.stolen_reserved_offset = 0x100000;
> +                       adev->mman.stolen_reserved_size = 0x600000;
> +               }
> +               break;
>         case CHIP_RAVEN:
>         case CHIP_RENOIR:
>                 adev->mman.keep_stolen_vga_memory = true;
>                 break;
> +       case CHIP_YELLOW_CARP:
> +               if (amdgpu_discovery == 0) {
> +                       adev->mman.stolen_reserved_offset = 0x1ffb0000;
> +                       adev->mman.stolen_reserved_size = 64 * PAGE_SIZE;
> +               }
> +               break;
>         default:
>                 adev->mman.keep_stolen_vga_memory = false;
>                 break;
> @@ -760,25 +779,6 @@ uint64_t amdgpu_gmc_vram_cpu_pa(struct amdgpu_device *adev, struct amdgpu_bo *bo
>         return amdgpu_bo_gpu_offset(bo) - adev->gmc.vram_start + adev->gmc.aper_base;
>  }
>
> -void amdgpu_gmc_get_reserved_allocation(struct amdgpu_device *adev)
> -{
> -       /* Some ASICs need to reserve a region of video memory to avoid access
> -        * from driver */
> -       adev->mman.stolen_reserved_offset = 0;
> -       adev->mman.stolen_reserved_size = 0;
> -
> -       switch (adev->asic_type) {
> -       case CHIP_YELLOW_CARP:
> -               if (amdgpu_discovery == 0) {
> -                       adev->mman.stolen_reserved_offset = 0x1ffb0000;
> -                       adev->mman.stolen_reserved_size = 64 * PAGE_SIZE;
> -               }
> -               break;
> -       default:
> -               break;
> -       }
> -}
> -
>  int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)
>  {
>         struct amdgpu_bo *vram_bo = NULL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> index 93505bb0a36c..032b0313f277 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> @@ -331,7 +331,6 @@ amdgpu_gmc_set_vm_fault_masks(struct amdgpu_device *adev, int hub_type,
>                               bool enable);
>
>  void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev);
> -void amdgpu_gmc_get_reserved_allocation(struct amdgpu_device *adev);
>
>  void amdgpu_gmc_init_pdb0(struct amdgpu_device *adev);
>  uint64_t amdgpu_gmc_vram_mc2pa(struct amdgpu_device *adev, uint64_t mc_addr);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> index f60b7bd4dbf5..3c1d440824a7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> @@ -948,7 +948,6 @@ static int gmc_v10_0_sw_init(void *handle)
>                 return r;
>
>         amdgpu_gmc_get_vbios_allocations(adev);
> -       amdgpu_gmc_get_reserved_allocation(adev);
>
>         /* Memory manager */
>         r = amdgpu_bo_init(adev);
> --
> 2.25.1
>


More information about the amd-gfx mailing list