[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.