From: Maarten Lankhorst <dev@lankhorst.se>
To: intel-xe@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org, Maarten Lankhorst <dev@lankhorst.se>
Subject: [DO NOT REVIEW 01/11] drm/xe/ggtt: Add xe_ggtt_reserve_area
Date: Mon, 20 Jul 2026 18:14:53 +0200 [thread overview]
Message-ID: <20260720161451.384968-14-dev@lankhorst.se> (raw)
In-Reply-To: <20260720161451.384968-13-dev@lankhorst.se>
Create a new function xe_ggtt_reserve_area() which will be used
for reserving the part of GGTT where the initial framebuffer was
allocated, while ensuring the reservation fits within mappable
GGTT boundaries.
This will allow us to either take over the initial mapping, or
reserve it to have the newly allocated GGTT mapping not overwriting
the initial mapping, which would cause flickering.
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
drivers/gpu/drm/xe/xe_ggtt.c | 69 +++++++++++++++++++++++++++++++++---
drivers/gpu/drm/xe/xe_ggtt.h | 2 ++
2 files changed, 67 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 8ec23862477fc..50e5b174c7960 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -636,14 +636,17 @@ static struct xe_ggtt_node *ggtt_node_init(struct xe_ggtt *ggtt)
}
/**
- * xe_ggtt_insert_node - Insert a &xe_ggtt_node into the GGTT
+ * xe_ggtt_insert_node_at - Insert a &xe_ggtt_node into the GGTT
* @ggtt: the &xe_ggtt into which the node should be inserted.
* @size: size of the node
* @align: alignment constrain of the node
+ * @start: Starting offset of range to insert node
+ * @end: Last offset for node insertion
*
* Return: &xe_ggtt_node on success or a ERR_PTR on failure.
*/
-struct xe_ggtt_node *xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 align)
+static struct xe_ggtt_node *xe_ggtt_insert_node_at(struct xe_ggtt *ggtt, u32 size,
+ u32 align, u64 start, u64 end)
{
struct xe_ggtt_node *node;
int ret;
@@ -653,8 +656,19 @@ struct xe_ggtt_node *xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 ali
return node;
guard(mutex)(&ggtt->lock);
- ret = xe_ggtt_insert_node_locked(node, size, align,
- DRM_MM_INSERT_HIGH);
+ if (start >= ggtt->start)
+ start -= ggtt->start;
+ else
+ start = 0;
+
+ /* Should never happen, but since we handle start, fail graciously for end */
+ if (end >= ggtt->start)
+ end -= ggtt->start;
+ else
+ end = 0;
+
+ ret = drm_mm_insert_node_in_range(&ggtt->mm, &node->base, size, align,
+ 0, start, end, DRM_MM_INSERT_HIGH);
if (ret) {
ggtt_node_fini(node);
return ERR_PTR(ret);
@@ -663,6 +677,53 @@ struct xe_ggtt_node *xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 ali
return node;
}
+/**
+ * xe_ggtt_reserve_area - Ensure an area of the GGTT is reserved.
+ * @ggtt: the &xe_ggtt where the area should be reserved.
+ * @start: Starting offset of range to reserve
+ * @size: size of the reservation
+ *
+ * This function ensures the area of [start...start+size)
+ * is reserved, while taking care of any clipping due to start or start+size
+ * falling outside of the adressable GGTT. The size of the returned node may
+ * be smaller if part of the region falls outside the accessible GGTT, or a
+ * NULL node may be returned.
+ *
+ * Return: &xe_ggtt_node or NULL on success or a ERR_PTR on failure.
+ */
+struct xe_ggtt_node *xe_ggtt_reserve_area(struct xe_ggtt *ggtt, u32 base, u32 size)
+{
+ u64 ggtt_start = xe_ggtt_start(ggtt), ggtt_end = ggtt_start + xe_ggtt_size(ggtt);
+
+ /* Completely truncated? */
+ if (base + size <= ggtt_start || base >= ggtt_end)
+ return NULL;
+
+ /* Partially truncated? */
+ if (base <= ggtt_start) {
+ size -= ggtt_start - base;
+ base = ggtt_start;
+ }
+
+ if (base + size >= ggtt_end)
+ size = ggtt_end - base;
+
+ return xe_ggtt_insert_node_at(ggtt, size, XE_PAGE_SIZE, base, base + size);
+}
+
+/**
+ * xe_ggtt_insert_node - Insert a &xe_ggtt_node into the GGTT
+ * @ggtt: the &xe_ggtt into which the node should be inserted.
+ * @size: size of the node
+ * @align: alignment constrain of the node
+ *
+ * Return: &xe_ggtt_node on success or a ERR_PTR on failure.
+ */
+struct xe_ggtt_node *xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 align)
+{
+ return xe_ggtt_insert_node_at(ggtt, size, align, 0, ~0ULL);
+}
+
/**
* xe_ggtt_node_pt_size() - Get the size of page table entries needed to map a GGTT node.
* @node: the &xe_ggtt_node
diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
index c864cc975a695..15e62ecec2287 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.h
+++ b/drivers/gpu/drm/xe/xe_ggtt.h
@@ -22,6 +22,8 @@ void xe_ggtt_shift_nodes(struct xe_ggtt *ggtt, u64 new_base);
u64 xe_ggtt_start(struct xe_ggtt *ggtt);
u64 xe_ggtt_size(struct xe_ggtt *ggtt);
+struct xe_ggtt_node *
+xe_ggtt_reserve_area(struct xe_ggtt *ggtt, u32 base, u32 size);
struct xe_ggtt_node *
xe_ggtt_insert_node(struct xe_ggtt *ggtt, u32 size, u32 align);
struct xe_ggtt_node *
--
2.53.0
next prev parent reply other threads:[~2026-07-20 16:14 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-20 16:14 [PATCH 00/11] drm/xe/display: Transparant fallback from stolen to sysmem Maarten Lankhorst
2026-07-20 16:14 ` Maarten Lankhorst [this message]
2026-07-20 16:14 ` [DO NOT REVIEW 02/11] drm/xe/ggtt: Add xe_ggtt_node_remove_noclear Maarten Lankhorst
2026-07-20 16:14 ` [DO NOT REVIEW 03/11] drm/xe/display: Reserve the original GGTT space before creating a bo Maarten Lankhorst
2026-07-20 16:14 ` [DO NOT REVIEW 04/11] drm/xe/display: Use the correct calculation for phys_base on integrated Maarten Lankhorst
2026-07-20 16:14 ` [DO NOT REVIEW 05/11] drm/xe/display: Remove duplicated code Maarten Lankhorst
2026-07-20 16:14 ` [DO NOT REVIEW 06/11] drm/xe/ggtt: Remove xe_ggtt_insert_bo_at Maarten Lankhorst
2026-07-20 16:14 ` [PATCH 07/11] drm/xe/display: Avoid using stolen memory for framebuffer when media gt exists Maarten Lankhorst
2026-07-20 16:15 ` [PATCH 08/11] drm/xe/migrate: Support copying between sysmem and stolen Maarten Lankhorst
2026-07-20 19:09 ` Matthew Brost
2026-07-20 20:28 ` Maarten Lankhorst
2026-07-20 16:15 ` [PATCH 09/11] drm/xe: Raise gt frequency slightly earlier Maarten Lankhorst
2026-07-20 19:00 ` Matthew Brost
2026-07-20 16:15 ` [PATCH 10/11] HACK: Always fallback Maarten Lankhorst
2026-07-20 16:15 ` [PATCH 11/11] drm/i915: Introduce intel_bo_fbdev_bios_fb_takeover() Maarten Lankhorst
2026-07-20 22:44 ` ✓ i915.CI.BAT: success for drm/xe/display: Transparant fallback from stolen to sysmem Patchwork
2026-07-21 5:27 ` ✗ i915.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=20260720161451.384968-14-dev@lankhorst.se \
--to=dev@lankhorst.se \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
/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