From: Matthew Brost <matthew.brost@intel.com>
To: intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: mika.kuoppala@intel.com, matthew.auld@intel.com,
thomas.hellstrom@linux.intel.com
Subject: [PATCH v5 3/9] drm/xe: Add xe_ttm_access_memory
Date: Mon, 21 Oct 2024 14:18:29 -0700 [thread overview]
Message-ID: <20241021211835.1675640-4-matthew.brost@intel.com> (raw)
In-Reply-To: <20241021211835.1675640-1-matthew.brost@intel.com>
Non-contiguous VRAM cannot easily be mapped in TTM nor can non-visible
VRAM easily be accessed. Add xe_ttm_access_memory which hooks into
ttm_bo_access to access such memory.
v4:
- Assert memory access rather than taking RPM ref (Thomas / Auld)
- Fix warning on xe_res_cursor.h for non-zero offset (Mika)
Reported-by: Christoph Manszewski <christoph.manszewski@intel.com>
Suggested-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
---
drivers/gpu/drm/xe/xe_bo.c | 59 ++++++++++++++++++++++++++++++++++++--
1 file changed, 56 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 0261a8b29351..04bc042f3bc7 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -442,6 +442,14 @@ static void xe_ttm_tt_destroy(struct ttm_device *ttm_dev, struct ttm_tt *tt)
kfree(tt);
}
+static bool xe_ttm_resource_visible(struct ttm_resource *mem)
+{
+ struct xe_ttm_vram_mgr_resource *vres =
+ to_xe_ttm_vram_mgr_resource(mem);
+
+ return vres->used_visible_size == mem->size;
+}
+
static int xe_ttm_io_mem_reserve(struct ttm_device *bdev,
struct ttm_resource *mem)
{
@@ -453,11 +461,9 @@ static int xe_ttm_io_mem_reserve(struct ttm_device *bdev,
return 0;
case XE_PL_VRAM0:
case XE_PL_VRAM1: {
- struct xe_ttm_vram_mgr_resource *vres =
- to_xe_ttm_vram_mgr_resource(mem);
struct xe_mem_region *vram = res_to_mem_region(mem);
- if (vres->used_visible_size < mem->size)
+ if (!xe_ttm_resource_visible(mem))
return -EINVAL;
mem->bus.offset = mem->start << PAGE_SHIFT;
@@ -1111,6 +1117,52 @@ static void xe_ttm_bo_swap_notify(struct ttm_buffer_object *ttm_bo)
}
}
+static int xe_ttm_access_memory(struct ttm_buffer_object *ttm_bo,
+ unsigned long offset, void *buf, int len,
+ int write)
+{
+ struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
+ struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
+ struct iosys_map vmap;
+ struct xe_res_cursor cursor;
+ struct xe_mem_region *vram;
+ int bytes_left = len;
+
+ xe_bo_assert_held(bo);
+ xe_device_assert_mem_access(xe);
+
+ if (!mem_type_is_vram(ttm_bo->resource->mem_type))
+ return -EIO;
+
+ /* FIXME: Use GPU for non-visible VRAM */
+ if (!xe_ttm_resource_visible(ttm_bo->resource))
+ return -EIO;
+
+ vram = res_to_mem_region(ttm_bo->resource);
+ xe_res_first(ttm_bo->resource, offset & PAGE_MASK,
+ bo->size - (offset & PAGE_MASK), &cursor);
+
+ do {
+ unsigned long page_offset = (offset & ~PAGE_MASK);
+ int byte_count = min((int)(PAGE_SIZE - page_offset), bytes_left);
+
+ iosys_map_set_vaddr_iomem(&vmap, (u8 __iomem *)vram->mapping +
+ cursor.start);
+ if (write)
+ xe_map_memcpy_to(xe, &vmap, page_offset, buf, byte_count);
+ else
+ xe_map_memcpy_from(xe, buf, &vmap, page_offset, byte_count);
+
+ offset += byte_count;
+ buf += byte_count;
+ bytes_left -= byte_count;
+ if (bytes_left)
+ xe_res_next(&cursor, PAGE_SIZE);
+ } while (bytes_left);
+
+ return len;
+}
+
const struct ttm_device_funcs xe_ttm_funcs = {
.ttm_tt_create = xe_ttm_tt_create,
.ttm_tt_populate = xe_ttm_tt_populate,
@@ -1120,6 +1172,7 @@ const struct ttm_device_funcs xe_ttm_funcs = {
.move = xe_bo_move,
.io_mem_reserve = xe_ttm_io_mem_reserve,
.io_mem_pfn = xe_ttm_io_mem_pfn,
+ .access_memory = xe_ttm_access_memory,
.release_notify = xe_ttm_bo_release_notify,
.eviction_valuable = ttm_bo_eviction_valuable,
.delete_mem_notify = xe_ttm_bo_delete_mem_notify,
--
2.34.1
next prev parent reply other threads:[~2024-10-21 21:18 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-21 21:18 [PATCH v5 0/9] Fix non-contiguous VRAM BO access in Xe Matthew Brost
2024-10-21 21:18 ` [PATCH v5 1/9] drm/xe: Add xe_bo_vm_access Matthew Brost
2024-10-24 8:13 ` Matthew Auld
2024-10-21 21:18 ` [PATCH v5 2/9] drm/ttm: Add ttm_bo_access Matthew Brost
2024-10-22 9:18 ` Mika Kuoppala
2024-10-23 22:34 ` Matthew Brost
2024-10-24 7:42 ` Mika Kuoppala
2024-10-24 9:20 ` Matthew Auld
2024-10-21 21:18 ` Matthew Brost [this message]
2024-10-24 8:52 ` [PATCH v5 3/9] drm/xe: Add xe_ttm_access_memory Matthew Auld
2024-10-21 21:18 ` [PATCH v5 4/9] drm/xe: Take PM ref in delayed snapshot capture worker Matthew Brost
2024-10-22 14:35 ` Matthew Auld
2024-10-21 21:18 ` [PATCH v5 5/9] drm/xe: Update xe_ttm_access_memory to use GPU for non-visible access Matthew Brost
2024-10-21 21:45 ` Matthew Brost
2024-10-21 21:18 ` [PATCH v5 6/9] drm/xe/display: Update intel_bo_read_from_page to use ttm_bo_access Matthew Brost
2024-10-22 8:43 ` Matthew Auld
2024-10-22 18:02 ` Matthew Brost
2024-10-21 21:18 ` [PATCH v5 7/9] drm/xe: Use ttm_bo_access in xe_vm_snapshot_capture_delayed Matthew Brost
2024-10-22 8:54 ` Matthew Auld
2024-10-21 21:18 ` [PATCH v5 8/9] drm/xe: Set XE_BO_FLAG_PINNED in migrate selftest BOs Matthew Brost
2024-10-21 21:18 ` [PATCH v5 9/9] drm/xe: Only allow contiguous BOs to use xe_bo_vmap Matthew Brost
2024-10-21 21:39 ` ✓ CI.Patch_applied: success for Fix non-contiguous VRAM BO access in Xe (rev5) Patchwork
2024-10-21 21:39 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-21 21:40 ` ✓ CI.KUnit: success " Patchwork
2024-10-21 21:52 ` ✓ CI.Build: " Patchwork
2024-10-21 21:54 ` ✓ CI.Hooks: " Patchwork
2024-10-21 21:56 ` ✗ CI.checksparse: warning " Patchwork
2024-10-21 22:21 ` ✓ CI.BAT: success " Patchwork
2024-10-22 4:51 ` ✗ CI.FULL: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241021211835.1675640-4-matthew.brost@intel.com \
--to=matthew.brost@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=matthew.auld@intel.com \
--cc=mika.kuoppala@intel.com \
--cc=thomas.hellstrom@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox