On Wed, Mar 25, 2026 at 10:24 AM Lijo Lazar <[email protected]> wrote:
>
> Add reserved regions and helper functions to memory manager.
>
> Signed-off-by: Lijo Lazar <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 58 +++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 31 +++++++++++++
>  2 files changed, 89 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 714fd8d12ca5..7f04e53983b5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1677,6 +1677,64 @@ static struct ttm_device_funcs amdgpu_bo_driver = {
>         .access_memory = &amdgpu_ttm_access_memory,
>  };
>
> +void amdgpu_ttm_init_vram_resv(struct amdgpu_device *adev,
> +                               enum amdgpu_resv_region_id id,
> +                               uint64_t offset, uint64_t size,
> +                               bool needs_cpu_map)
> +{
> +       struct amdgpu_vram_resv *resv;
> +
> +       if (id >= AMDGPU_RESV_MAX)
> +               return;
> +
> +       resv = &adev->mman.resv_region[id];
> +       resv->offset = offset;
> +       resv->size = size;
> +       resv->needs_cpu_map = needs_cpu_map;
> +}
> +
> +int amdgpu_ttm_reserve_vram(struct amdgpu_device *adev,
> +                           enum amdgpu_resv_region_id id)
> +{
> +       struct amdgpu_vram_resv *resv;
> +       int ret;
> +
> +       if (id >= AMDGPU_RESV_MAX)
> +               return -EINVAL;
> +
> +       resv = &adev->mman.resv_region[id];
> +       if (!resv->size)
> +               return 0;
> +
> +       ret = amdgpu_bo_create_kernel_at(adev, resv->offset, resv->size,
> +                                        &resv->bo,
> +                                        resv->needs_cpu_map ? 
> &resv->cpu_addr : NULL);
> +       if (ret) {
> +               dev_dbg(adev->dev, "reserve vram failed: id=%d offset=0x%llx 
> size=0x%llx ret=%d\n",
> +                       id, resv->offset, resv->size, ret);
> +               memset(resv, 0, sizeof(*resv));
> +       }
> +
> +       return ret;
> +}
> +
> +void amdgpu_ttm_unreserve_vram(struct amdgpu_device *adev,

Maybe use something other than reserve/unreserve in the names?  I feel
like that might cause confusion with amdgpu_bo_reserve/unreserve().

> +                              enum amdgpu_resv_region_id id)
> +{
> +       struct amdgpu_vram_resv *resv;
> +
> +       if (id >= AMDGPU_RESV_MAX)
> +               return;
> +
> +       resv = &adev->mman.resv_region[id];
> +       if (!resv->bo)
> +               return;
> +
> +       amdgpu_bo_free_kernel(&resv->bo, NULL,
> +                             resv->needs_cpu_map ? &resv->cpu_addr : NULL);
> +       memset(resv, 0, sizeof(*resv));
> +}
> +
>  /*
>   * Firmware Reservation functions
>   */
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index bf101215757e..b73f65a4bc0d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -59,6 +59,26 @@ struct amdgpu_ttm_buffer_entity {
>         u64                     gart_window_offs[2];
>  };
>
> +enum amdgpu_resv_region_id {
> +       AMDGPU_RESV_STOLEN_VGA,
> +       AMDGPU_RESV_STOLEN_EXTENDED,
> +       AMDGPU_RESV_STOLEN_RESERVED,
> +       AMDGPU_RESV_FW,
> +       AMDGPU_RESV_FW_EXTEND,
> +       AMDGPU_RESV_FW_VRAM_USAGE,
> +       AMDGPU_RESV_DRV_VRAM_USAGE,
> +       AMDGPU_RESV_MEM_TRAIN,
> +       AMDGPU_RESV_MAX
> +};
> +
> +struct amdgpu_vram_resv {
> +       uint64_t                offset;
> +       uint64_t                size;
> +       struct amdgpu_bo        *bo;
> +       void                    *cpu_addr;

Maybe cpu_ptr?

Other than those comments, the series is:
Reviewed-by: Alex Deucher <[email protected]>


> +       bool                    needs_cpu_map;
> +};
> +
>  struct amdgpu_mman {
>         struct ttm_device               bdev;
>         struct ttm_pool                 *ttm_pools;
> @@ -105,6 +125,8 @@ struct amdgpu_mman {
>         struct amdgpu_bo        *drv_vram_usage_reserved_bo;
>         void            *drv_vram_usage_va;
>
> +       struct amdgpu_vram_resv         resv_region[AMDGPU_RESV_MAX];
> +
>         /* PAGE_SIZE'd BO for process memory r/w over SDMA. */
>         struct amdgpu_bo        *sdma_access_bo;
>         void                    *sdma_access_ptr;
> @@ -171,6 +193,15 @@ void amdgpu_vram_mgr_clear_reset_blocks(struct 
> amdgpu_device *adev);
>  bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
>                             struct ttm_resource *res);
>
> +void amdgpu_ttm_init_vram_resv(struct amdgpu_device *adev,
> +                               enum amdgpu_resv_region_id id,
> +                               uint64_t offset, uint64_t size,
> +                               bool needs_cpu_map);
> +int amdgpu_ttm_reserve_vram(struct amdgpu_device *adev,
> +                           enum amdgpu_resv_region_id id);
> +void amdgpu_ttm_unreserve_vram(struct amdgpu_device *adev,
> +                              enum amdgpu_resv_region_id id);
> +
>  int amdgpu_ttm_init(struct amdgpu_device *adev);
>  void amdgpu_ttm_fini(struct amdgpu_device *adev);
>  void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev,
> --
> 2.49.0
>

Reply via email to