[PATCH v1 3/4] drm/xe/vram: Add initial support for PF-mem regions
Piórkowski, Piotr <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
From: Piotr Piórkowski <[email protected]> Add helpers to allocate and initialize such a region from a caller-provided parent, offset, and size, and assign the matching TTM placement. The helpers do not decide when the region is needed or how large it should be. A separate TTM VRAM manager is initialized when a caller installs the region as the tile kernel_vram. Signed-off-by: Piotr Piórkowski <[email protected]> --- drivers/gpu/drm/xe/xe_tile.c | 8 ++++++ drivers/gpu/drm/xe/xe_vram.c | 41 ++++++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_vram.h | 7 +++++ drivers/gpu/drm/xe/xe_vram_types.h | 2 ++ 4 files changed, 58 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_tile.c b/drivers/gpu/drm/xe/xe_tile.c index fd0c2e4cbdd2..e196f424fda4 100644 --- a/drivers/gpu/drm/xe/xe_tile.c +++ b/drivers/gpu/drm/xe/xe_tile.c @@ -198,6 +198,14 @@ int xe_tile_init_noalloc(struct xe_tile *tile) xe->info.mem_region_mask |= BIT(tile->mem.vram->id) << 1; } + if (IS_DGFX(xe) && tile->mem.kernel_vram && + tile->mem.kernel_vram != tile->mem.vram && + !ttm_resource_manager_used(&tile->mem.kernel_vram->ttm.manager)) { + err = xe_ttm_vram_mgr_init(xe, tile->mem.kernel_vram); + if (err) + return err; + } + return xe_tile_sysfs_init(tile); } diff --git a/drivers/gpu/drm/xe/xe_vram.c b/drivers/gpu/drm/xe/xe_vram.c index e5f83df98826..29c93e9aa5a7 100644 --- a/drivers/gpu/drm/xe/xe_vram.c +++ b/drivers/gpu/drm/xe/xe_vram.c @@ -29,6 +29,8 @@ static const char *stringify_vram_binding(enum xe_vram_binding binding) switch (binding) { case XE_VRAM_BINDING_TILE: return "Tile"; + case XE_VRAM_BINDING_PFMEM: + return "PF-mem"; } return "Unknown"; @@ -276,6 +278,45 @@ static int vram_region_init(struct xe_device *xe, struct xe_vram_region *vram, return 0; } +/** + * xe_vram_region_alloc_pfmem - Allocate a PF-mem VRAM region + * @xe: the &xe_device + * @id: tile id the region belongs to + * + * Return: the allocated VRAM region, or NULL on failure. + */ +struct xe_vram_region *xe_vram_region_alloc_pfmem(struct xe_device *xe, u8 id) +{ + return vram_region_alloc(xe, XE_VRAM_BINDING_PFMEM, id, XE_PL_VRAM0_PFMEM + id); +} + +/** + * xe_vram_region_init_pfmem - Initialize a PF-mem VRAM region + * @vram: pre-allocated VRAM region to initialize + * @parent: tile VRAM region that provides the address space context + * @offset: region offset relative to the parent + * @size: region size + * + * Return: 0 on success, negative error code on failure. + */ +int xe_vram_region_init_pfmem(struct xe_vram_region *vram, + struct xe_vram_region *parent, + u64 offset, u64 size) +{ + struct xe_device *xe = parent->xe; + resource_size_t remain_io_size; + + if (!size || offset > parent->usable_size || + size > parent->usable_size - offset) + return -EINVAL; + + remain_io_size = offset < parent->io_size ? parent->io_size - offset : 0; + if (!remain_io_size) + return -EINVAL; + + return vram_region_init(xe, vram, parent, offset, size, size, remain_io_size); +} + /** * xe_map_resource_to_region - Map ttm resource to vram memory region * @res: The ttm resource diff --git a/drivers/gpu/drm/xe/xe_vram.h b/drivers/gpu/drm/xe/xe_vram.h index 87088ffbfd5e..4c77d128e329 100644 --- a/drivers/gpu/drm/xe/xe_vram.h +++ b/drivers/gpu/drm/xe/xe_vram.h @@ -16,7 +16,14 @@ struct ttm_resource; struct xe_vram_region *xe_map_resource_to_region(struct ttm_resource *res); int xe_vram_probe(struct xe_device *xe); +struct xe_vram_region *xe_map_resource_to_region(struct ttm_resource *res); +int xe_vram_probe(struct xe_device *xe); + struct xe_vram_region *xe_vram_region_alloc_tile(struct xe_device *xe, u8 id); +struct xe_vram_region *xe_vram_region_alloc_pfmem(struct xe_device *xe, u8 id); +int xe_vram_region_init_pfmem(struct xe_vram_region *vram, + struct xe_vram_region *parent, + u64 offset, u64 size); resource_size_t xe_vram_region_io_start(const struct xe_vram_region *vram); resource_size_t xe_vram_region_io_size(const struct xe_vram_region *vram); resource_size_t xe_vram_region_dpa_base(const struct xe_vram_region *vram); diff --git a/drivers/gpu/drm/xe/xe_vram_types.h b/drivers/gpu/drm/xe/xe_vram_types.h index 51884e7a679d..01690bfbcce0 100644 --- a/drivers/gpu/drm/xe/xe_vram_types.h +++ b/drivers/gpu/drm/xe/xe_vram_types.h @@ -18,9 +18,11 @@ struct xe_migrate; /** * enum xe_vram_binding - VRAM binding types * @XE_VRAM_BINDING_TILE: general-purpose VRAM region bound to a tile + * @XE_VRAM_BINDING_PFMEM: VRAM region reserved solely for PF kernel allocations */ enum xe_vram_binding { XE_VRAM_BINDING_TILE = 0, + XE_VRAM_BINDING_PFMEM, }; /** -- 2.34.1