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
>