FAILED: patch "[PATCH] drm/xe: Fix DPT allocation paths." failed to apply to 7.1-stable tree
[email protected]
maintainerThe patch below does not apply to the 7.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.1.y
git checkout FETCH_HEAD
git cherry-pick -x fc648757908304aedbad74f74bf58192aec383db
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026082003-mountain-flaccid-179a@gregkh' --subject-prefix 'PATCH 7.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From fc648757908304aedbad74f74bf58192aec383db Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <[email protected]>
Date: Tue, 30 Jun 2026 15:55:20 +0200
Subject: [PATCH] drm/xe: Fix DPT allocation paths.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Remove the fallback for VRAM to system memory, I tested it and that doesn't work at all, only a black screen with pipe fault errors were observed.
On systems with media GT, extra latency is added when accessing stolen memory when the GT is in MC6. Since we additionally aren't counting how much memory is used for stolen and we could in theory fill up the entire stolen area with DPT's, avoid using stolen and only use the default memory region.
Using stolen may also result in random system hangs under load.
drivers/gpu/drm/xe/display/xe_fb_pin.c +8 -25
@@ -164,31 +164,14 @@ static int __xe_pin_fb_vma_dpt(struct drm_gem_object *obj, dpt_size =ALIGN (intel_rotation_info_size (&view->rotated) *8 ,XE_PAGE_SIZE ); -if (IS_DGFX (xe)) - dpt =xe_bo_create_pin_map_at_novm (xe, tile0, - dpt_size, ~0ull , - ttm_bo_type_kernel, -XE_BO_FLAG_VRAM0 | -XE_BO_FLAG_GGTT | -XE_BO_FLAG_PAGETABLE , - pin_params->alignment, false); -else - dpt =xe_bo_create_pin_map_at_novm (xe, tile0, - dpt_size, ~0ull , - ttm_bo_type_kernel, -XE_BO_FLAG_STOLEN | -XE_BO_FLAG_GGTT | -XE_BO_FLAG_PAGETABLE , - pin_params->alignment, false); -if (IS_ERR (dpt)) - dpt =xe_bo_create_pin_map_at_novm (xe, tile0, - dpt_size, ~0ull , - ttm_bo_type_kernel, -XE_BO_FLAG_SYSTEM | -XE_BO_FLAG_GGTT | -XE_BO_FLAG_PAGETABLE | -XE_BO_FLAG_FORCE_WC , - pin_params->alignment, false); + dpt =xe_bo_create_pin_map_at_novm (xe, tile0, + dpt_size, ~0ull , + ttm_bo_type_kernel, +XE_BO_FLAG_VRAM_IF_DGFX (tile0) | +XE_BO_FLAG_GGTT | +XE_BO_FLAG_PAGETABLE | +XE_BO_FLAG_FORCE_WC , + pin_params->alignment, false);if (IS_ERR (dpt))return PTR_ERR (dpt);
Sasha Levin
maintainerPATCH 1/4 drm/i915/pin: s/dev_priv/i915/ and drop struct drm_device usage
From: Jani Nikula <[email protected]>
[ Upstream commit 3823bf019d3b31ccd3e79860b7a3e20c719a1db4 ]
Improve consistency within i915_fb_pin.c by replacing dev_priv naming with i915, and dropping struct drm_device usage.
Stable-dep-of: fc6487579083 ("drm/xe: Fix DPT allocation paths.")
--- drivers/gpu/drm/i915/display/intel_fb_pin.c | 24 ++++++++++----------- 1 file changed, 11 insertions(+), 13 deletions(-)
drivers/gpu/drm/i915/display/intel_fb_pin.c +11 -13
@@ -29,9 +29,8 @@ intel_fb_pin_to_dpt(const struct drm_framebuffer *fb,unsigned long *out_flags, struct intel_dpt *dpt) { - struct drm_device *dev = fb->dev; -struct intel_display *display =to_intel_display (dev); -struct drm_i915_private *dev_priv =to_i915 (dev); + struct intel_display *display = to_intel_display(fb->dev); +struct drm_i915_private *i915 =to_i915 (fb->dev);struct drm_gem_object *_obj =intel_fb_bo (fb);struct drm_i915_gem_object *obj =to_intel_bo (_obj);struct i915_address_space *vm =i915_dpt_to_vm (dpt);
@@ -43,7 +42,7 @@ intel_fb_pin_to_dpt(const struct drm_framebuffer *fb,* We are not syncing against the binding (and potential migrations) * below, so this vm must never be async. */ -if (drm_WARN_ON (&dev_priv->drm, vm->bind_async_flags)) +if (drm_WARN_ON (&i915->drm, vm->bind_async_flags))return ERR_PTR (-EINVAL );if (WARN_ON (!i915_gem_object_is_framebuffer (obj)))
@@ -56,7 +55,7 @@ intel_fb_pin_to_dpt(const struct drm_framebuffer *fb,if (ret)continue ; -if (HAS_LMEM (dev_priv)) { +if (HAS_LMEM (i915)) {unsigned int flags = obj->flags;/*
@@ -118,9 +117,8 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,bool uses_fence, unsigned long *out_flags) { - struct drm_device *dev = fb->dev; -struct intel_display *display =to_intel_display (dev); -struct drm_i915_private *dev_priv =to_i915 (dev); + struct intel_display *display = to_intel_display(fb->dev); +struct drm_i915_private *i915 =to_i915 (fb->dev);struct drm_gem_object *_obj =intel_fb_bo (fb);struct drm_i915_gem_object *obj =to_intel_bo (_obj);struct ref_tracker *wakeref;
@@ -129,10 +127,10 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,unsigned int pinctl;int ret; -if (drm_WARN_ON (dev, !i915_gem_object_is_framebuffer (obj))) +if (drm_WARN_ON (&i915->drm, !i915_gem_object_is_framebuffer (obj)))return ERR_PTR (-EINVAL ); -if (drm_WARN_ON (dev, alignment && !is_power_of_2 (alignment))) +if (drm_WARN_ON (&i915->drm, alignment && !is_power_of_2 (alignment)))return ERR_PTR (-EINVAL );/*
@@ -163,7 +161,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb, ret =i915_gem_object_lock (obj, &ww);if (!ret && phys_alignment) ret =i915_gem_object_attach_phys (obj, phys_alignment); -else if (!ret &&HAS_LMEM (dev_priv)) +else if (!ret &&HAS_LMEM (i915)) ret =i915_gem_object_migrate (obj, &ww,INTEL_REGION_LMEM_0 );if (!ret) ret =i915_gem_object_pin_pages (obj);
@@ -264,7 +262,7 @@ intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)int intel_plane_pin_fb (struct intel_plane_state *plane_state,const struct intel_plane_state *old_plane_state) { -struct intel_display *display =to_intel_display (plane_state); +struct drm_i915_private *i915 =to_i915 (plane_state->uapi.plane->dev);struct intel_plane *plane =to_intel_plane (plane_state->uapi.plane);const struct intel_framebuffer *fb =to_intel_framebuffer (plane_state->hw.fb);
@@ -308,7 +306,7 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,* The DPT object contains only one vma, and there is no VT-d * guard, so the VMA's offset within the DPT is always 0. */ -drm_WARN_ON (display->drm,i915_dpt_offset (plane_state->dpt_vma)); +drm_WARN_ON (&i915->drm,i915_dpt_offset (plane_state->dpt_vma)); }/*
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/4 drm/i915: Track fence region ID in plane state
From: Ville Syrjälä <[email protected]>
[ Upstream commit eb3dd9640731ae3ace871190f80474a8e7bae121 ]
Get rid of the needlessly complicated PLANE_HAS_FENCE + intel_parent_vma_fence_id() dance by simply tracking the fence_id directly in the plane state.
v2: Don't request the redundant fence for fbdev (Jani)
Assign *out_fence_id with '=' instead of '|=' (Sashiko,Jani)
Stable-dep-of: fc6487579083 ("drm/xe: Fix DPT allocation paths.")
--- .../drm/i915/display/intel_display_types.h | 5 +-- drivers/gpu/drm/i915/display/intel_fb_pin.c | 33 ++++++++++--------- drivers/gpu/drm/i915/display/intel_fb_pin.h | 5 ++- drivers/gpu/drm/i915/display/intel_fbc.c | 11 ++----- drivers/gpu/drm/i915/display/intel_fbdev.c | 9 ++--- drivers/gpu/drm/i915/display/intel_plane.c | 3 +- drivers/gpu/drm/i915/i915_initial_plane.c | 2 +- drivers/gpu/drm/xe/display/xe_fb_pin.c | 8 ++--- drivers/gpu/drm/xe/display/xe_initial_plane.c | 2 +- 9 files changed, 37 insertions(+), 41 deletions(-)
drivers/gpu/drm/i915/display/intel_display_types.h +3 -2
@@ -684,14 +684,15 @@ struct intel_plane_state {struct i915_vma *ggtt_vma;struct i915_vma *dpt_vma; -unsigned long flags; -#define PLANE_HAS_FENCE BIT(0)struct intel_fb_view view;/* for legacy cursor fb unpin */ struct drm_vblank_work unpin_work; +/* fenced region ID (-1 if none) */ +s8 fence_id; +/* Plane pxp decryption state */ bool decrypt;
drivers/gpu/drm/i915/display/intel_fb_pin.c +18 -15
@@ -26,7 +26,6 @@ static struct i915_vma * intel_fb_pin_to_dpt(const struct drm_framebuffer *fb, const struct i915_gtt_view *view, unsigned int alignment, - unsigned long *out_flags, struct intel_dpt *dpt) { struct intel_display *display = to_intel_display(fb->dev);
@@ -114,8 +113,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,unsigned int alignment, unsigned int phys_alignment, unsigned int vtd_guard, - bool uses_fence, - unsigned long *out_flags) + int *out_fence_id) { struct intel_display *display = to_intel_display(fb->dev);struct drm_i915_private *i915 =to_i915 (fb->dev);
@@ -175,7 +173,10 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb, goto err_unpin; } -if (uses_fence &&i915_vma_is_map_and_fenceable (vma)) { +if (out_fence_id) + *out_fence_id =-1 ; + +if (out_fence_id &&i915_vma_is_map_and_fenceable (vma)) {/* * Install a fence for tiled scan-out. Pre-i965 always needs a * fence, whereas 965+ only requires a fence if using
@@ -201,7 +202,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb, ret =0 ;if (vma->fence) - *out_flags |=PLANE_HAS_FENCE ; + *out_fence_id = vma->fence->id; }i915_vma_get (vma);
@@ -223,9 +224,9 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,return vma; } -void intel_fb_unpin_vma (struct i915_vma *vma,unsigned long flags) +void intel_fb_unpin_vma (struct i915_vma *vma,int fence_id) { -if (flags &PLANE_HAS_FENCE ) +if (fence_id >=0 )i915_vma_unpin_fence (vma);i915_vma_unpin (vma);i915_vma_put (vma);
@@ -269,17 +270,18 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,struct i915_vma *vma;if (!intel_fb_uses_dpt (&fb->base)) { +int fence_id =-1 ; + vma =intel_fb_pin_to_ggtt (&fb->base, &plane_state->view.gtt,intel_plane_fb_min_alignment (plane_state),intel_plane_fb_min_phys_alignment (plane_state),intel_plane_fb_vtd_guard (plane_state), -intel_plane_uses_fence (plane_state), - &plane_state->flags); +intel_plane_uses_fence (plane_state) ? &fence_id :NULL );if (IS_ERR (vma))return PTR_ERR (vma); plane_state->ggtt_vma = vma; - + plane_state->fence_id = fence_id; }else {unsigned int alignment =intel_plane_fb_min_alignment (plane_state);
@@ -290,8 +292,7 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state, plane_state->ggtt_vma = vma; vma =intel_fb_pin_to_dpt (&fb->base, &plane_state->view.gtt, - alignment, &plane_state->flags, - fb->dpt); + alignment, fb->dpt);if (IS_ERR (vma)) {i915_dpt_unpin_from_ggtt (fb->dpt); plane_state->ggtt_vma =NULL ;
@@ -336,12 +337,14 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)if (!intel_fb_uses_dpt (&fb->base)) { vma =fetch_and_zero (&old_plane_state->ggtt_vma); -if (vma) -intel_fb_unpin_vma (vma, old_plane_state->flags); +if (vma) { +intel_fb_unpin_vma (vma, old_plane_state->fence_id); + old_plane_state->fence_id =-1 ; + } }else { vma =fetch_and_zero (&old_plane_state->dpt_vma);if (vma) -intel_fb_unpin_vma (vma, old_plane_state->flags); +intel_fb_unpin_vma (vma,-1 ); vma =fetch_and_zero (&old_plane_state->ggtt_vma);if (vma)
drivers/gpu/drm/i915/display/intel_fb_pin.h +2 -3
@@ -20,10 +20,9 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,unsigned int alignment, unsigned int phys_alignment, unsigned int vtd_guard, - bool uses_fence, - unsigned long *out_flags); + int *out_fence_id); -void intel_fb_unpin_vma (struct i915_vma *vma,unsigned long flags); +void intel_fb_unpin_vma (struct i915_vma *vma,int fence_id);int intel_plane_pin_fb (struct intel_plane_state *new_plane_state,const struct intel_plane_state *old_plane_state);
drivers/gpu/drm/i915/display/intel_fbc.c +3 -8
@@ -1458,13 +1458,10 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, fbc_state->fence_y_offset =intel_plane_fence_y_offset (plane_state); -drm_WARN_ON (display->drm, plane_state->flags &PLANE_HAS_FENCE && +drm_WARN_ON (display->drm, plane_state->fence_id >=0 && !intel_fbc_has_fences (display)); -if (plane_state->flags &PLANE_HAS_FENCE ) - fbc_state->fence_id =intel_parent_vma_fence_id (display, plane_state->ggtt_vma); -else - fbc_state->fence_id =-1 ; + fbc_state->fence_id = plane_state->fence_id; fbc_state->cfb_stride =intel_fbc_cfb_stride (plane_state); fbc_state->cfb_size =intel_fbc_cfb_size (plane_state);
@@ -1487,9 +1484,7 @@ static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state)* so have no fence associated with it) due to aperture constraints * at the time of pinning. */ -return DISPLAY_VER (display) >=9 || - (plane_state->flags &PLANE_HAS_FENCE && -intel_parent_vma_fence_id (display, plane_state->ggtt_vma) !=-1 ); +return DISPLAY_VER (display) >=9 || plane_state->fence_id >=0 ; }static bool intel_fbc_is_cfb_ok (const struct intel_plane_state *plane_state)
drivers/gpu/drm/i915/display/intel_fbdev.c +3 -6
@@ -60,7 +60,6 @@struct intel_fbdev {struct intel_framebuffer *fb;struct i915_vma *vma; -unsigned long vma_flags; };static struct intel_fbdev *to_intel_fbdev (struct drm_fb_helper *fb_helper)
@@ -141,7 +140,7 @@ static void intel_fbdev_fb_destroy(struct fb_info *info)* the info->screen_base mmaping. Leaking the VMA is simpler than * trying to rectify all the possible error paths leading here. */ -intel_fb_unpin_vma (ifbdev->vma, ifbdev->vma_flags); +intel_fb_unpin_vma (ifbdev->vma,-1 );drm_framebuffer_remove (fb_helper->fb);drm_client_release (&fb_helper->client);
@@ -269,7 +268,6 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,struct fb_info *info = helper->info;struct ref_tracker *wakeref;struct i915_vma *vma; -unsigned long flags =0 ;bool prealloc = false;struct drm_gem_object *obj;int ret;
@@ -314,7 +312,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, fb->min_alignment,0 ,intel_fb_view_vtd_guard (&fb->base, &fb->normal_view,DRM_MODE_ROTATE_0 ), - false, &flags); + NULL);if (IS_ERR (vma)) { ret =PTR_ERR (vma); goto out_unlock;
@@ -345,14 +343,13 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,drm_dbg_kms (display->drm,"allocated %dx%d fb\n" , fb->base.width, fb->base.height); ifbdev->fb = fb; ifbdev->vma = vma; - ifbdev->vma_flags = flags;intel_display_rpm_put (display, wakeref);return 0 ; out_unpin: -intel_fb_unpin_vma (vma, flags); +intel_fb_unpin_vma (vma,-1 ); out_unlock:intel_display_rpm_put (display, wakeref);
drivers/gpu/drm/i915/display/intel_plane.c +2 -1
@@ -70,6 +70,7 @@ static void intel_plane_state_reset(struct intel_plane_state *plane_state,__drm_atomic_helper_plane_state_reset (&plane_state->uapi, &plane->base); plane_state->scaler_id =-1 ; + plane_state->fence_id =-1 ; }struct intel_plane *intel_plane_alloc (void )
@@ -137,7 +138,7 @@ intel_plane_duplicate_state(struct drm_plane *plane) intel_state->ggtt_vma =NULL ; intel_state->dpt_vma =NULL ; - intel_state->flags =0 ; + intel_state->fence_id =-1 ; intel_state->damage =DRM_RECT_INIT (0 ,0 ,0 ,0 );/* add reference to fb */
drivers/gpu/drm/i915/i915_initial_plane.c +1 -1
@@ -268,7 +268,7 @@ i915_initial_plane_setup(struct drm_plane_state *_plane_state, plane_state->ggtt_vma =i915_vma_get (vma);if (intel_plane_uses_fence (plane_state) &&i915_vma_pin_fence (vma) ==0 && vma->fence) - plane_state->flags |=PLANE_HAS_FENCE ; + plane_state->fence_id = vma->fence->id; plane_state->surf =i915_ggtt_offset (plane_state->ggtt_vma);
drivers/gpu/drm/xe/display/xe_fb_pin.c +4 -4
@@ -418,15 +418,15 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,unsigned int alignment, unsigned int phys_alignment, unsigned int vtd_guard, - bool uses_fence, - unsigned long *out_flags) + int *out_fence_id) { - *out_flags =0 ; + if (out_fence_id) + *out_fence_id =-1 ;return __xe_pin_fb_vma (to_intel_framebuffer (fb), view, alignment); } -void intel_fb_unpin_vma (struct i915_vma *vma,unsigned long flags) +void intel_fb_unpin_vma (struct i915_vma *vma,int fence_id) {__xe_unpin_fb_vma (vma); }
drivers/gpu/drm/xe/display/xe_initial_plane.c +1 -1
@@ -153,7 +153,7 @@ xe_initial_plane_setup(struct drm_plane_state *_plane_state,struct i915_vma *vma; vma =intel_fb_pin_to_ggtt (fb, &plane_state->view.gtt, -0 ,0 ,0 , false, &plane_state->flags); +0 ,0 ,0 ,NULL );if (IS_ERR (vma))return PTR_ERR (vma);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/4 drm/i915: Introduce struct intel_fb_pin_params
In reply to Sasha LevinFrom: Ville Syrjälä <[email protected]>
[ Upstream commit a89b7f72f20db1ae1a65e97881e785639db4480a ]
We need to pass a lot of information between the display driver and the core driver to get framebuffers mapped into GGTT/DPT correctly. Rather than passing around a swarm of integers and boolean as function arguments, let's collect it all into a structure (struct intel_fb_pin_params).
Start by moving the gtt view, alignment, phys_alignment, and vtd_guard there. Going forward additional things need to added as well (mainly various boolean flags).
Stable-dep-of: fc6487579083 ("drm/xe: Fix DPT allocation paths.")
--- drivers/gpu/drm/i915/display/intel_fb_pin.c | 54 ++++++++++--------- drivers/gpu/drm/i915/display/intel_fb_pin.h | 12 +++-- drivers/gpu/drm/i915/display/intel_fbdev.c | 13 +++-- drivers/gpu/drm/xe/display/xe_fb_pin.c | 39 +++++++------- drivers/gpu/drm/xe/display/xe_initial_plane.c | 6 ++- 5 files changed, 69 insertions(+), 55 deletions(-)
drivers/gpu/drm/i915/display/intel_fb_pin.c +30 -24
@@ -24,9 +24,8 @@static struct i915_vma *intel_fb_pin_to_dpt (const struct drm_framebuffer *fb, -const struct i915_gtt_view *view, -unsigned int alignment, -struct intel_dpt *dpt) +struct intel_dpt *dpt, +const struct intel_fb_pin_params *pin_params) {struct intel_display *display =to_intel_display (fb->dev);struct drm_i915_private *i915 =to_i915 (fb->dev);
@@ -75,19 +74,20 @@ intel_fb_pin_to_dpt(const struct drm_framebuffer *fb,if (ret)continue ; - vma =i915_vma_instance (obj, vm, view); + vma =i915_vma_instance (obj, vm, pin_params->view);if (IS_ERR (vma)) { ret =PTR_ERR (vma);continue ; } -if (i915_vma_misplaced (vma,0 , alignment,0 )) { +if (i915_vma_misplaced (vma,0 , pin_params->alignment,0 )) { ret =i915_vma_unbind (vma);if (ret)continue ; } - ret =i915_vma_pin_ww (vma, &ww,0 , alignment,PIN_GLOBAL ); + ret =i915_vma_pin_ww (vma, &ww,0 , pin_params->alignment, +PIN_GLOBAL );if (ret)continue ; }
@@ -96,7 +96,8 @@ intel_fb_pin_to_dpt(const struct drm_framebuffer *fb, goto err; } - vma->display_alignment =max (vma->display_alignment, alignment); + vma->display_alignment =max (vma->display_alignment, + pin_params->alignment);i915_gem_object_flush_if_display (obj);
@@ -109,10 +110,7 @@ intel_fb_pin_to_dpt(const struct drm_framebuffer *fb,struct i915_vma *intel_fb_pin_to_ggtt (const struct drm_framebuffer *fb, -const struct i915_gtt_view *view, -unsigned int alignment, -unsigned int phys_alignment, -unsigned int vtd_guard, +const struct intel_fb_pin_params *pin_params,int *out_fence_id) {struct intel_display *display =to_intel_display (fb->dev);
@@ -128,7 +126,8 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,if (drm_WARN_ON (&i915->drm, !i915_gem_object_is_framebuffer (obj)))return ERR_PTR (-EINVAL ); -if (drm_WARN_ON (&i915->drm, alignment && !is_power_of_2 (alignment))) +if (drm_WARN_ON (&i915->drm, pin_params->alignment && + !is_power_of_2 (pin_params->alignment)))return ERR_PTR (-EINVAL );/*
@@ -157,8 +156,8 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,i915_gem_ww_ctx_init (&ww, true); retry: ret =i915_gem_object_lock (obj, &ww); -if (!ret && phys_alignment) - ret =i915_gem_object_attach_phys (obj, phys_alignment); +if (!ret && pin_params->phys_alignment) + ret =i915_gem_object_attach_phys (obj, pin_params->phys_alignment);else if (!ret &&HAS_LMEM (i915)) ret =i915_gem_object_migrate (obj, &ww,INTEL_REGION_LMEM_0 );if (!ret)
@@ -166,8 +165,10 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,if (ret) goto err; - vma =i915_gem_object_pin_to_display_plane (obj, &ww, alignment, - vtd_guard, view, pinctl); + vma =i915_gem_object_pin_to_display_plane (obj, &ww, + pin_params->alignment, + pin_params->vtd_guard, + pin_params->view, pinctl);if (IS_ERR (vma)) { ret =PTR_ERR (vma); goto err_unpin;
@@ -270,12 +271,15 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,struct i915_vma *vma;if (!intel_fb_uses_dpt (&fb->base)) { +struct intel_fb_pin_params pin_params = { + .view = &plane_state->view.gtt, + .alignment =intel_plane_fb_min_alignment (plane_state), + .phys_alignment =intel_plane_fb_min_phys_alignment (plane_state), + .vtd_guard =intel_plane_fb_vtd_guard (plane_state), + };int fence_id =-1 ; - vma =intel_fb_pin_to_ggtt (&fb->base, &plane_state->view.gtt, -intel_plane_fb_min_alignment (plane_state), -intel_plane_fb_min_phys_alignment (plane_state), -intel_plane_fb_vtd_guard (plane_state), + vma =intel_fb_pin_to_ggtt (&fb->base, &pin_params,intel_plane_uses_fence (plane_state) ? &fence_id :NULL );if (IS_ERR (vma))return PTR_ERR (vma);
@@ -283,16 +287,18 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state, plane_state->ggtt_vma = vma; plane_state->fence_id = fence_id; }else { -unsigned int alignment =intel_plane_fb_min_alignment (plane_state); +struct intel_fb_pin_params pin_params = { + .view = &plane_state->view.gtt, + .alignment =intel_plane_fb_min_alignment (plane_state), + }; - vma =i915_dpt_pin_to_ggtt (fb->dpt, alignment /512 ); + vma =i915_dpt_pin_to_ggtt (fb->dpt, pin_params.alignment /512 );if (IS_ERR (vma))return PTR_ERR (vma); plane_state->ggtt_vma = vma; - vma =intel_fb_pin_to_dpt (&fb->base, &plane_state->view.gtt, - alignment, fb->dpt); + vma =intel_fb_pin_to_dpt (&fb->base, fb->dpt, &pin_params);if (IS_ERR (vma)) {i915_dpt_unpin_from_ggtt (fb->dpt); plane_state->ggtt_vma =NULL ;
drivers/gpu/drm/i915/display/intel_fb_pin.h +8 -4
@@ -14,12 +14,16 @@ struct intel_plane_state;struct i915_gtt_view ;struct iosys_map ; +struct intel_fb_pin_params { +const struct i915_gtt_view *view; +unsigned int alignment; +unsigned int phys_alignment; +unsigned int vtd_guard; +}; +struct i915_vma *intel_fb_pin_to_ggtt (const struct drm_framebuffer *fb, -const struct i915_gtt_view *view, -unsigned int alignment, -unsigned int phys_alignment, -unsigned int vtd_guard, +const struct intel_fb_pin_params *pin_params,int *out_fence_id);void intel_fb_unpin_vma (struct i915_vma *vma,int fence_id);
drivers/gpu/drm/i915/display/intel_fbdev.c +8 -5
@@ -264,6 +264,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, {struct intel_display *display =to_intel_display (helper->dev);struct intel_fbdev *ifbdev =to_intel_fbdev (helper); +struct intel_fb_pin_params pin_params = {};struct intel_framebuffer *fb = ifbdev->fb;struct fb_info *info = helper->info;struct ref_tracker *wakeref;
@@ -308,11 +309,13 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,* This also validates that any existing fb inherited from the * BIOS is suitable for own access. */ - vma =intel_fb_pin_to_ggtt (&fb->base, &fb->normal_view.gtt, - fb->min_alignment,0 , -intel_fb_view_vtd_guard (&fb->base, &fb->normal_view, -DRM_MODE_ROTATE_0 ), -NULL ); + pin_params.view = &fb->normal_view.gtt; + pin_params.alignment = fb->min_alignment; + pin_params.vtd_guard =intel_fb_view_vtd_guard (&fb->base, + &fb->normal_view, +DRM_MODE_ROTATE_0 ); + + vma =intel_fb_pin_to_ggtt (&fb->base, &pin_params,NULL );if (IS_ERR (vma)) { ret =PTR_ERR (vma); goto out_unlock;
drivers/gpu/drm/xe/display/xe_fb_pin.c +19 -20
@@ -140,14 +140,14 @@ write_dpt_remapped(struct xe_bo *bo, }static int __xe_pin_fb_vma_dpt (const struct intel_framebuffer *fb, -const struct i915_gtt_view *view, -struct i915_vma *vma, -unsigned int alignment) +const struct intel_fb_pin_params *pin_params, +struct i915_vma *vma) {struct xe_device *xe =to_xe_device (fb->base.dev);struct xe_tile *tile0 =xe_device_get_root_tile (xe);struct xe_ggtt *ggtt = tile0->mem.ggtt;struct drm_gem_object *obj =intel_fb_bo (&fb->base); +const struct i915_gtt_view *view = pin_params->view;struct xe_bo *bo =gem_to_xe_bo (obj), *dpt;u32 dpt_size, size = bo->ttm.base.size;
@@ -168,7 +168,7 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,XE_BO_FLAG_VRAM0 |XE_BO_FLAG_GGTT |XE_BO_FLAG_PAGETABLE , - alignment, false); + pin_params->alignment, false); else dpt = xe_bo_create_pin_map_at_novm(xe, tile0, dpt_size, ~0ull,
@@ -176,7 +176,7 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,XE_BO_FLAG_STOLEN |XE_BO_FLAG_GGTT |XE_BO_FLAG_PAGETABLE , - alignment, false); + pin_params->alignment, false);if (IS_ERR (dpt)) dpt = xe_bo_create_pin_map_at_novm(xe, tile0, dpt_size, ~0ull,
@@ -185,7 +185,7 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,XE_BO_FLAG_GGTT |XE_BO_FLAG_PAGETABLE |XE_BO_FLAG_FORCE_WC , - alignment, false); + pin_params->alignment, false);if (IS_ERR (dpt))return PTR_ERR (dpt);
@@ -269,11 +269,11 @@ static void write_ggtt_rotated_node(struct xe_ggtt *ggtt, struct xe_ggtt_node *n }static int __xe_pin_fb_vma_ggtt (const struct intel_framebuffer *fb, -const struct i915_gtt_view *view, -struct i915_vma *vma, -unsigned int alignment) +const struct intel_fb_pin_params *pin_params, +struct i915_vma *vma) {struct drm_gem_object *obj =intel_fb_bo (&fb->base); +const struct i915_gtt_view *view = pin_params->view;struct xe_bo *bo =gem_to_xe_bo (obj);struct xe_device *xe =to_xe_device (fb->base.dev);struct xe_tile *tile0 =xe_device_get_root_tile (xe);
@@ -319,8 +319,7 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb, }static struct i915_vma *__xe_pin_fb_vma (const struct intel_framebuffer *fb, -const struct i915_gtt_view *view, -unsigned int alignment) +const struct intel_fb_pin_params *pin_params) {struct drm_device *dev = fb->base.dev;struct xe_device *xe =to_xe_device (dev);
@@ -377,9 +376,9 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb, vma->bo = bo;if (intel_fb_uses_dpt (&fb->base)) - ret =__xe_pin_fb_vma_dpt (fb, view, vma, alignment); + ret =__xe_pin_fb_vma_dpt (fb, pin_params, vma);else - ret =__xe_pin_fb_vma_ggtt (fb, view, vma, alignment); + ret =__xe_pin_fb_vma_ggtt (fb, pin_params, vma);if (ret) goto err_unpin;
@@ -414,16 +413,13 @@ static void __xe_unpin_fb_vma(struct i915_vma *vma)struct i915_vma *intel_fb_pin_to_ggtt (const struct drm_framebuffer *fb, -const struct i915_gtt_view *view, -unsigned int alignment, -unsigned int phys_alignment, -unsigned int vtd_guard, +const struct intel_fb_pin_params *pin_params,int *out_fence_id) {if (out_fence_id) *out_fence_id =-1 ; -return __xe_pin_fb_vma (to_intel_framebuffer (fb), view, alignment); +return __xe_pin_fb_vma (to_intel_framebuffer (fb), pin_params); }void intel_fb_unpin_vma (struct i915_vma *vma,int fence_id)
@@ -475,7 +471,10 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,struct i915_vma *vma;struct intel_framebuffer *intel_fb =to_intel_framebuffer (fb);struct intel_plane *plane =to_intel_plane (new_plane_state->uapi.plane); -unsigned int alignment = plane->min_alignment (plane, fb,0 ); +struct intel_fb_pin_params pin_params = { + .view = &new_plane_state->view.gtt, + .alignment = plane->min_alignment (plane, fb,0 ), + };if (reuse_vma (new_plane_state, old_plane_state))return 0 ;
@@ -484,7 +483,7 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,drm_WARN_ON (bo->ttm.base.dev, !(bo->flags &XE_BO_FLAG_FORCE_WC ) && bo->ttm.type != ttm_bo_type_sg); - vma =__xe_pin_fb_vma (intel_fb, &new_plane_state->view.gtt, alignment); + vma =__xe_pin_fb_vma (intel_fb, &pin_params);if (IS_ERR (vma))return PTR_ERR (vma);
drivers/gpu/drm/xe/display/xe_initial_plane.c +4 -2
@@ -151,9 +151,11 @@ xe_initial_plane_setup(struct drm_plane_state *_plane_state, {struct intel_plane_state *plane_state =to_intel_plane_state (_plane_state);struct i915_vma *vma; +struct intel_fb_pin_params pin_params = { + .view = &plane_state->view.gtt, + }; - vma =intel_fb_pin_to_ggtt (fb, &plane_state->view.gtt, -0 ,0 ,0 ,NULL ); + vma =intel_fb_pin_to_ggtt (fb, &pin_params,NULL );if (IS_ERR (vma))return PTR_ERR (vma);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/4 drm/xe: Fix DPT allocation paths.
In reply to Sasha LevinFrom: Maarten Lankhorst <[email protected]>
[ Upstream commit fc648757908304aedbad74f74bf58192aec383db ]
Remove the fallback for VRAM to system memory, I tested it and that doesn't work at all, only a black screen with pipe fault errors were observed.
On systems with media GT, extra latency is added when accessing stolen memory when the GT is in MC6. Since we additionally aren't counting how much memory is used for stolen and we could in theory fill up the entire stolen area with DPT's, avoid using stolen and only use the default memory region.
Using stolen may also result in random system hangs under load.
--- drivers/gpu/drm/xe/display/xe_fb_pin.c | 33 +++++++------------------- 1 file changed, 8 insertions(+), 25 deletions(-)
drivers/gpu/drm/xe/display/xe_fb_pin.c +8 -25
@@ -161,31 +161,14 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb, dpt_size =ALIGN (intel_rotation_info_size (&view->rotated) *8 ,XE_PAGE_SIZE ); -if (IS_DGFX (xe)) - dpt =xe_bo_create_pin_map_at_novm (xe, tile0, - dpt_size, ~0ull , - ttm_bo_type_kernel, -XE_BO_FLAG_VRAM0 | -XE_BO_FLAG_GGTT | -XE_BO_FLAG_PAGETABLE , - pin_params->alignment, false); -else - dpt =xe_bo_create_pin_map_at_novm (xe, tile0, - dpt_size, ~0ull , - ttm_bo_type_kernel, -XE_BO_FLAG_STOLEN | -XE_BO_FLAG_GGTT | -XE_BO_FLAG_PAGETABLE , - pin_params->alignment, false); -if (IS_ERR (dpt)) - dpt =xe_bo_create_pin_map_at_novm (xe, tile0, - dpt_size, ~0ull , - ttm_bo_type_kernel, -XE_BO_FLAG_SYSTEM | -XE_BO_FLAG_GGTT | -XE_BO_FLAG_PAGETABLE | -XE_BO_FLAG_FORCE_WC , - pin_params->alignment, false); + dpt =xe_bo_create_pin_map_at_novm (xe, tile0, + dpt_size, ~0ull , + ttm_bo_type_kernel, +XE_BO_FLAG_VRAM_IF_DGFX (tile0) | +XE_BO_FLAG_GGTT | +XE_BO_FLAG_PAGETABLE | +XE_BO_FLAG_FORCE_WC , + pin_params->alignment, false);if (IS_ERR (dpt))return PTR_ERR (dpt);
Signature · 1 line
2.53.0