* [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface
@ 2026-03-18 13:29 Jani Nikula
2026-03-18 13:29 ` [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) Jani Nikula
` (8 more replies)
0 siblings, 9 replies; 18+ messages in thread
From: Jani Nikula @ 2026-03-18 13:29 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Jani Nikula (5):
drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind
IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
drm/{i915,xe}/fbdev: drop drm device parameter from
intel_fbdev_fb_fill_info()
drm/{i915,xe}: move fbdev fb calls to parent interface
drm/i915: pass struct drm_i915_private to
i915_bo_fbdev_prefer_stolen()
drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen()
drivers/gpu/drm/i915/Makefile | 3 +-
drivers/gpu/drm/i915/display/intel_bo.c | 27 ++++
drivers/gpu/drm/i915/display/intel_bo.h | 8 ++
drivers/gpu/drm/i915/display/intel_fbdev.c | 14 +--
drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 118 ------------------
drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 24 ----
drivers/gpu/drm/i915/i915_bo.c | 114 +++++++++++++++++
drivers/gpu/drm/i915/i915_bo.h | 6 +
drivers/gpu/drm/i915/i915_initial_plane.c | 4 +-
drivers/gpu/drm/xe/Makefile | 1 -
drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 116 -----------------
drivers/gpu/drm/xe/display/xe_display_bo.c | 116 +++++++++++++++++
drivers/gpu/drm/xe/display/xe_display_bo.h | 6 +
drivers/gpu/drm/xe/display/xe_initial_plane.c | 5 +-
include/drm/intel/display_parent_interface.h | 7 ++
15 files changed, 297 insertions(+), 272 deletions(-)
delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.c
delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.h
delete mode 100644 drivers/gpu/drm/xe/display/intel_fbdev_fb.c
--
2.47.3
^ permalink raw reply [flat|nested] 18+ messages in thread* [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula @ 2026-03-18 13:29 ` Jani Nikula 2026-03-24 23:33 ` Michał Grzelak 2026-03-18 13:29 ` [PATCH 2/5] drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() Jani Nikula ` (7 subsequent siblings) 8 siblings, 1 reply; 18+ messages in thread From: Jani Nikula @ 2026-03-18 13:29 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: jani.nikula Unify the behaviour with i915. Similar to commit b63c6b9b7f5e ("drm/i915/fbdev: fix link failure without FBDEV emulation"). The difference is that unlike i915, xe doesn't build display/intel_fbdev_fb.c conditional to CONFIG_DRM_FBDEV_EMULATION. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/xe/display/xe_initial_plane.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 65cc0b0c934b..730c6dc49522 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -86,6 +86,7 @@ initial_plane_bo(struct xe_device *xe, flags |= XE_BO_FLAG_STOLEN; if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && + IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && !intel_fbdev_fb_prefer_stolen(&xe->drm, plane_config->size)) { drm_info(&xe->drm, "Initial FB size exceeds half of stolen, discarding\n"); return NULL; -- 2.47.3 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) 2026-03-18 13:29 ` [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) Jani Nikula @ 2026-03-24 23:33 ` Michał Grzelak 0 siblings, 0 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-24 23:33 UTC (permalink / raw) To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 415 bytes --] On Wed, 18 Mar 2026, Jani Nikula wrote: > Unify the behaviour with i915. Similar to commit b63c6b9b7f5e > ("drm/i915/fbdev: fix link failure without FBDEV emulation"). The > difference is that unlike i915, xe doesn't build > display/intel_fbdev_fb.c conditional to CONFIG_DRM_FBDEV_EMULATION. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Michał Grzelak <michal.grzelak@intel.com> BR, Michał ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 2/5] drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula 2026-03-18 13:29 ` [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) Jani Nikula @ 2026-03-18 13:29 ` Jani Nikula 2026-03-24 23:34 ` Michał Grzelak 2026-03-18 13:29 ` [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (6 subsequent siblings) 8 siblings, 1 reply; 18+ messages in thread From: Jani Nikula @ 2026-03-18 13:29 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: jani.nikula The struct drm_device *drm parameter of intel_fbdev_fb_fill_info() is redundant, as you can obtain the same information via obj->dev. Drop the drm parameter, and move obj as first (or the context) parameter. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/i915/display/intel_fbdev.c | 2 +- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 8 ++++---- drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 4 ++-- drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index bdaaf3edba0c..6401aaaba199 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -327,7 +327,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, obj = intel_fb_bo(&fb->base); - ret = intel_fbdev_fb_fill_info(display->drm, info, obj, vma); + ret = intel_fbdev_fb_fill_info(obj, info, vma); if (ret) goto out_unpin; diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c index 6f84eb6355de..a696ce42d10b 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c @@ -66,10 +66,10 @@ void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) drm_gem_object_put(obj); } -int intel_fbdev_fb_fill_info(struct drm_device *drm, struct fb_info *info, - struct drm_gem_object *_obj, struct i915_vma *vma) +int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, + struct i915_vma *vma) { - struct drm_i915_private *i915 = to_i915(drm); + struct drm_i915_private *i915 = to_i915(_obj->dev); struct drm_i915_gem_object *obj = to_intel_bo(_obj); struct i915_gem_ww_ctx ww; void __iomem *vaddr; @@ -101,7 +101,7 @@ int intel_fbdev_fb_fill_info(struct drm_device *drm, struct fb_info *info, vaddr = i915_vma_pin_iomap(vma); if (IS_ERR(vaddr)) { - drm_err(drm, + drm_err(&i915->drm, "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); ret = PTR_ERR(vaddr); continue; diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h index 34ed2b9c2b4f..ddba45e9839d 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h @@ -17,8 +17,8 @@ struct i915_vma; u32 intel_fbdev_fb_pitch_align(u32 stride); struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size); void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj); -int intel_fbdev_fb_fill_info(struct drm_device *drm, struct fb_info *info, - struct drm_gem_object *obj, struct i915_vma *vma); +int intel_fbdev_fb_fill_info(struct drm_gem_object *obj, struct fb_info *info, + struct i915_vma *vma); bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size); #endif diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c index 87af5646c938..2ad5e5a79287 100644 --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c +++ b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c @@ -87,11 +87,11 @@ void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); } -int intel_fbdev_fb_fill_info(struct drm_device *drm, struct fb_info *info, - struct drm_gem_object *_obj, struct i915_vma *vma) +int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, + struct i915_vma *vma) { struct xe_bo *obj = gem_to_xe_bo(_obj); - struct pci_dev *pdev = to_pci_dev(drm->dev); + struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { if (obj->flags & XE_BO_FLAG_STOLEN) -- 2.47.3 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 2/5] drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() 2026-03-18 13:29 ` [PATCH 2/5] drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() Jani Nikula @ 2026-03-24 23:34 ` Michał Grzelak 0 siblings, 0 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-24 23:34 UTC (permalink / raw) To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 376 bytes --] On Wed, 18 Mar 2026, Jani Nikula wrote: > The struct drm_device *drm parameter of intel_fbdev_fb_fill_info() is > redundant, as you can obtain the same information via obj->dev. Drop the > drm parameter, and move obj as first (or the context) parameter. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Michał Grzelak <michal.grzelak@intel.com> BR, Michał ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula 2026-03-18 13:29 ` [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) Jani Nikula 2026-03-18 13:29 ` [PATCH 2/5] drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() Jani Nikula @ 2026-03-18 13:29 ` Jani Nikula 2026-03-24 23:42 ` Michał Grzelak 2026-03-18 13:29 ` [PATCH 4/5] drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() Jani Nikula ` (5 subsequent siblings) 8 siblings, 1 reply; 18+ messages in thread From: Jani Nikula @ 2026-03-18 13:29 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: jani.nikula Move the driver specific fbdev fb calls to the display parent interface. Reuse the existing struct intel_display_bo_interface, as this is mostly about gem objects. Put everything behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) to catch configuration issues at build or link time. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/i915/Makefile | 3 +- drivers/gpu/drm/i915/display/intel_bo.c | 27 ++++ drivers/gpu/drm/i915/display/intel_bo.h | 8 ++ drivers/gpu/drm/i915/display/intel_fbdev.c | 14 +-- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 118 ------------------ drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 24 ---- drivers/gpu/drm/i915/i915_bo.c | 116 +++++++++++++++++ drivers/gpu/drm/i915/i915_bo.h | 6 + drivers/gpu/drm/i915/i915_initial_plane.c | 4 +- drivers/gpu/drm/xe/Makefile | 1 - drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 116 ----------------- drivers/gpu/drm/xe/display/xe_display_bo.c | 117 +++++++++++++++++ drivers/gpu/drm/xe/display/xe_display_bo.h | 6 + drivers/gpu/drm/xe/display/xe_initial_plane.c | 4 +- include/drm/intel/display_parent_interface.h | 7 ++ 15 files changed, 299 insertions(+), 272 deletions(-) delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.c delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.h delete mode 100644 drivers/gpu/drm/xe/display/intel_fbdev_fb.c diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index be976a90c5a6..026614d74cc4 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -324,8 +324,7 @@ i915-$(CONFIG_ACPI) += \ display/intel_acpi.o \ display/intel_opregion.o i915-$(CONFIG_DRM_FBDEV_EMULATION) += \ - display/intel_fbdev.o \ - display/intel_fbdev_fb.o + display/intel_fbdev.o i915-$(CONFIG_DEBUG_FS) += \ display/intel_display_debugfs.o \ display/intel_display_debugfs_params.o \ diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c index 3b82d38a0504..8ecdbb7e39f3 100644 --- a/drivers/gpu/drm/i915/display/intel_bo.c +++ b/drivers/gpu/drm/i915/display/intel_bo.c @@ -85,3 +85,30 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display { return display->parent->bo->framebuffer_lookup(display->drm, filp, user_mode_cmd); } + +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride) +{ + return display->parent->bo->fbdev_pitch_align(stride); +} + +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size) +{ + return display->parent->bo->fbdev_create(display->drm, size); +} + +void intel_bo_fbdev_destroy(struct drm_gem_object *obj) +{ + struct intel_display *display = to_intel_display(obj->dev); + + display->parent->bo->fbdev_destroy(obj); +} + +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, + struct i915_vma *vma) +{ + struct intel_display *display = to_intel_display(obj->dev); + + return display->parent->bo->fbdev_fill_info(obj, info, vma); +} +#endif diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h index aec188c706c2..348f7fa66960 100644 --- a/drivers/gpu/drm/i915/display/intel_bo.h +++ b/drivers/gpu/drm/i915/display/intel_bo.h @@ -10,6 +10,8 @@ struct drm_file; struct drm_gem_object; struct drm_mode_fb_cmd2; struct drm_scanout_buffer; +struct fb_info; +struct i915_vma; struct intel_display; struct intel_framebuffer; struct seq_file; @@ -31,4 +33,10 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display struct drm_file *filp, const struct drm_mode_fb_cmd2 *user_mode_cmd); +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride); +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size); +void intel_bo_fbdev_destroy(struct drm_gem_object *obj); +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, + struct i915_vma *vma); + #endif /* __INTEL_BO__ */ diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index 6401aaaba199..14ac01c1b3eb 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -54,7 +54,6 @@ #include "intel_fb.h" #include "intel_fb_pin.h" #include "intel_fbdev.h" -#include "intel_fbdev_fb.h" #include "intel_frontbuffer.h" struct intel_fbdev { @@ -204,7 +203,8 @@ static const struct drm_fb_helper_funcs intel_fb_helper_funcs = { .fb_set_suspend = intelfb_set_suspend, }; -static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, +static void intel_fbdev_fill_mode_cmd(struct intel_display *display, + struct drm_fb_helper_surface_size *sizes, struct drm_mode_fb_cmd2 *mode_cmd) { /* we don't do packed 24bpp */ @@ -215,7 +215,7 @@ static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, mode_cmd->width = sizes->surface_width; mode_cmd->height = sizes->surface_height; - mode_cmd->pitches[0] = intel_fbdev_fb_pitch_align(mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); + mode_cmd->pitches[0] = intel_bo_fbdev_pitch_align(display, mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); mode_cmd->pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, sizes->surface_depth); mode_cmd->modifier[0] = DRM_FORMAT_MOD_LINEAR; @@ -230,12 +230,12 @@ __intel_fbdev_fb_alloc(struct intel_display *display, struct drm_gem_object *obj; int size; - intel_fbdev_fill_mode_cmd(sizes, &mode_cmd); + intel_fbdev_fill_mode_cmd(display, sizes, &mode_cmd); size = mode_cmd.pitches[0] * mode_cmd.height; size = PAGE_ALIGN(size); - obj = intel_fbdev_fb_bo_create(display->drm, size); + obj = intel_bo_fbdev_create(display, size); if (IS_ERR(obj)) { fb = ERR_CAST(obj); goto err; @@ -247,7 +247,7 @@ __intel_fbdev_fb_alloc(struct intel_display *display, mode_cmd.modifier[0]), &mode_cmd); if (IS_ERR(fb)) { - intel_fbdev_fb_bo_destroy(obj); + intel_bo_fbdev_destroy(obj); goto err; } @@ -327,7 +327,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, obj = intel_fb_bo(&fb->base); - ret = intel_fbdev_fb_fill_info(obj, info, vma); + ret = intel_bo_fbdev_fill_info(obj, info, vma); if (ret) goto out_unpin; diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c deleted file mode 100644 index a696ce42d10b..000000000000 --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c +++ /dev/null @@ -1,118 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2023 Intel Corporation - */ - -#include <linux/fb.h> - -#include <drm/drm_print.h> - -#include "gem/i915_gem_lmem.h" - -#include "i915_drv.h" -#include "intel_fbdev_fb.h" - -u32 intel_fbdev_fb_pitch_align(u32 stride) -{ - return ALIGN(stride, 64); -} - -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) -{ - struct drm_i915_private *i915 = to_i915(drm); - - /* Skip stolen on MTL as Wa_22018444074 mitigation. */ - if (IS_METEORLAKE(i915)) - return false; - - /* - * If the FB is too big, just don't use it since fbdev is not very - * important and we should probably use that space with FBC or other - * features. - */ - return i915->dsm.usable_size >= size * 2; -} - -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) -{ - struct drm_i915_private *i915 = to_i915(drm); - struct drm_i915_gem_object *obj; - - obj = ERR_PTR(-ENODEV); - if (HAS_LMEM(i915)) { - obj = i915_gem_object_create_lmem(i915, size, - I915_BO_ALLOC_CONTIGUOUS | - I915_BO_ALLOC_USER); - } else { - if (intel_fbdev_fb_prefer_stolen(drm, size)) - obj = i915_gem_object_create_stolen(i915, size); - else - drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); - - if (IS_ERR(obj)) - obj = i915_gem_object_create_shmem(i915, size); - } - - if (IS_ERR(obj)) { - drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); - return ERR_PTR(-ENOMEM); - } - - return &obj->base; -} - -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) -{ - drm_gem_object_put(obj); -} - -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, - struct i915_vma *vma) -{ - struct drm_i915_private *i915 = to_i915(_obj->dev); - struct drm_i915_gem_object *obj = to_intel_bo(_obj); - struct i915_gem_ww_ctx ww; - void __iomem *vaddr; - int ret; - - if (i915_gem_object_is_lmem(obj)) { - struct intel_memory_region *mem = obj->mm.region; - - /* Use fbdev's framebuffer from lmem for discrete */ - info->fix.smem_start = - (unsigned long)(mem->io.start + - i915_gem_object_get_dma_address(obj, 0) - - mem->region.start); - info->fix.smem_len = obj->base.size; - } else { - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; - - /* Our framebuffer is the entirety of fbdev's system memory */ - info->fix.smem_start = - (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); - info->fix.smem_len = vma->size; - } - - for_i915_gem_ww(&ww, ret, false) { - ret = i915_gem_object_lock(vma->obj, &ww); - - if (ret) - continue; - - vaddr = i915_vma_pin_iomap(vma); - if (IS_ERR(vaddr)) { - drm_err(&i915->drm, - "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); - ret = PTR_ERR(vaddr); - continue; - } - } - - if (ret) - return ret; - - info->screen_base = vaddr; - info->screen_size = intel_bo_to_drm_bo(obj)->size; - - return 0; -} diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h deleted file mode 100644 index ddba45e9839d..000000000000 --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2023 Intel Corporation - */ - -#ifndef __INTEL_FBDEV_FB_H__ -#define __INTEL_FBDEV_FB_H__ - -#include <linux/types.h> - -struct drm_device; -struct drm_gem_object; -struct drm_mode_fb_cmd2; -struct fb_info; -struct i915_vma; - -u32 intel_fbdev_fb_pitch_align(u32 stride); -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size); -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj); -int intel_fbdev_fb_fill_info(struct drm_gem_object *obj, struct fb_info *info, - struct i915_vma *vma); -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size); - -#endif diff --git a/drivers/gpu/drm/i915/i915_bo.c b/drivers/gpu/drm/i915/i915_bo.c index 1789f7cab05c..7e38d002478e 100644 --- a/drivers/gpu/drm/i915/i915_bo.c +++ b/drivers/gpu/drm/i915/i915_bo.c @@ -1,11 +1,14 @@ // SPDX-License-Identifier: MIT /* Copyright © 2024 Intel Corporation */ +#include <linux/fb.h> + #include <drm/drm_panic.h> #include <drm/drm_print.h> #include <drm/intel/display_parent_interface.h> #include "display/intel_fb.h" +#include "gem/i915_gem_lmem.h" #include "gem/i915_gem_mman.h" #include "gem/i915_gem_object.h" #include "gem/i915_gem_object_frontbuffer.h" @@ -141,6 +144,113 @@ i915_bo_framebuffer_lookup(struct drm_device *drm, return intel_bo_to_drm_bo(obj); } +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) +static u32 i915_bo_fbdev_pitch_align(u32 stride) +{ + return ALIGN(stride, 64); +} + +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) +{ + struct drm_i915_private *i915 = to_i915(drm); + + /* Skip stolen on MTL as Wa_22018444074 mitigation. */ + if (IS_METEORLAKE(i915)) + return false; + + /* + * If the FB is too big, just don't use it since fbdev is not very + * important and we should probably use that space with FBC or other + * features. + */ + return i915->dsm.usable_size >= size * 2; +} + +static struct drm_gem_object *i915_bo_fbdev_create(struct drm_device *drm, int size) +{ + struct drm_i915_private *i915 = to_i915(drm); + struct drm_i915_gem_object *obj; + + obj = ERR_PTR(-ENODEV); + if (HAS_LMEM(i915)) { + obj = i915_gem_object_create_lmem(i915, size, + I915_BO_ALLOC_CONTIGUOUS | + I915_BO_ALLOC_USER); + } else { + if (i915_bo_fbdev_prefer_stolen(drm, size)) + obj = i915_gem_object_create_stolen(i915, size); + else + drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); + + if (IS_ERR(obj)) + obj = i915_gem_object_create_shmem(i915, size); + } + + if (IS_ERR(obj)) { + drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); + return ERR_PTR(-ENOMEM); + } + + return &obj->base; +} + +static void i915_bo_fbdev_destroy(struct drm_gem_object *obj) +{ + drm_gem_object_put(obj); +} + +static int i915_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, + struct i915_vma *vma) +{ + struct drm_i915_private *i915 = to_i915(_obj->dev); + struct drm_i915_gem_object *obj = to_intel_bo(_obj); + struct i915_gem_ww_ctx ww; + void __iomem *vaddr; + int ret; + + if (i915_gem_object_is_lmem(obj)) { + struct intel_memory_region *mem = obj->mm.region; + + /* Use fbdev's framebuffer from lmem for discrete */ + info->fix.smem_start = + (unsigned long)(mem->io.start + + i915_gem_object_get_dma_address(obj, 0) - + mem->region.start); + info->fix.smem_len = obj->base.size; + } else { + struct i915_ggtt *ggtt = to_gt(i915)->ggtt; + + /* Our framebuffer is the entirety of fbdev's system memory */ + info->fix.smem_start = + (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); + info->fix.smem_len = vma->size; + } + + for_i915_gem_ww(&ww, ret, false) { + ret = i915_gem_object_lock(vma->obj, &ww); + + if (ret) + continue; + + vaddr = i915_vma_pin_iomap(vma); + if (IS_ERR(vaddr)) { + drm_err(&i915->drm, + "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); + ret = PTR_ERR(vaddr); + continue; + } + } + + if (ret) + return ret; + + info->screen_base = vaddr; + info->screen_size = intel_bo_to_drm_bo(obj)->size; + + return 0; +} +#endif + const struct intel_display_bo_interface i915_display_bo_interface = { .is_tiled = i915_bo_is_tiled, .is_userptr = i915_bo_is_userptr, @@ -153,4 +263,10 @@ const struct intel_display_bo_interface i915_display_bo_interface = { .framebuffer_init = i915_bo_framebuffer_init, .framebuffer_fini = i915_bo_framebuffer_fini, .framebuffer_lookup = i915_bo_framebuffer_lookup, +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) + .fbdev_create = i915_bo_fbdev_create, + .fbdev_destroy = i915_bo_fbdev_destroy, + .fbdev_fill_info = i915_bo_fbdev_fill_info, + .fbdev_pitch_align = i915_bo_fbdev_pitch_align, +#endif }; diff --git a/drivers/gpu/drm/i915/i915_bo.h b/drivers/gpu/drm/i915/i915_bo.h index 57255d052dd9..2a0f3050dd42 100644 --- a/drivers/gpu/drm/i915/i915_bo.h +++ b/drivers/gpu/drm/i915/i915_bo.h @@ -4,6 +4,12 @@ #ifndef __I915_BO_H__ #define __I915_BO_H__ +#include <linux/types.h> + +struct drm_device; + +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); + extern const struct intel_display_bo_interface i915_display_bo_interface; #endif /* __I915_BO_H__ */ diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index 390a9248d631..f4d631a395d0 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -9,10 +9,10 @@ #include "display/intel_crtc.h" #include "display/intel_display_types.h" #include "display/intel_fb.h" -#include "display/intel_fbdev_fb.h" #include "gem/i915_gem_lmem.h" #include "gem/i915_gem_region.h" +#include "i915_bo.h" #include "i915_drv.h" #include "i915_initial_plane.h" @@ -118,7 +118,7 @@ initial_plane_vma(struct drm_i915_private *i915, if (IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && mem == i915->mm.stolen_region && - !intel_fbdev_fb_prefer_stolen(&i915->drm, size)) { + !i915_bo_fbdev_prefer_stolen(&i915->drm, size)) { drm_dbg_kms(&i915->drm, "Initial FB size exceeds half of stolen, discarding\n"); return NULL; } diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile index dab979287a96..936eb79e9269 100644 --- a/drivers/gpu/drm/xe/Makefile +++ b/drivers/gpu/drm/xe/Makefile @@ -211,7 +211,6 @@ $(obj)/i915-display/%.o: $(srctree)/drivers/gpu/drm/i915/display/%.c FORCE # Display code specific to xe xe-$(CONFIG_DRM_XE_DISPLAY) += \ - display/intel_fbdev_fb.o \ display/xe_display.o \ display/xe_display_bo.o \ display/xe_display_pcode.o \ diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c deleted file mode 100644 index 2ad5e5a79287..000000000000 --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c +++ /dev/null @@ -1,116 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2023 Intel Corporation - */ - -#include <linux/fb.h> - -#include "intel_fbdev_fb.h" -#include "xe_bo.h" -#include "xe_ttm_stolen_mgr.h" -#include "xe_wa.h" - -#include <generated/xe_device_wa_oob.h> - -/* - * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride - * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to - * have driver specific values. However, dropping the stride alignment to 64 - * leads to underflowing the bo pin count in the atomic cleanup work. - */ -u32 intel_fbdev_fb_pitch_align(u32 stride) -{ - return ALIGN(stride, XE_PAGE_SIZE); -} - -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) -{ - struct xe_device *xe = to_xe_device(drm); - struct ttm_resource_manager *stolen; - - stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); - if (!stolen) - return false; - - if (IS_DGFX(xe)) - return false; - - if (XE_DEVICE_WA(xe, 22019338487_display)) - return false; - - /* - * If the FB is too big, just don't use it since fbdev is not very - * important and we should probably use that space with FBC or other - * features. - */ - return stolen->size >= size * 2; -} - -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) -{ - struct xe_device *xe = to_xe_device(drm); - struct xe_bo *obj; - - obj = ERR_PTR(-ENODEV); - - if (intel_fbdev_fb_prefer_stolen(drm, size)) { - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), - size, - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | - XE_BO_FLAG_STOLEN | - XE_BO_FLAG_GGTT, false); - if (!IS_ERR(obj)) - drm_info(&xe->drm, "Allocated fbdev into stolen\n"); - else - drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); - } else { - drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); - } - - if (IS_ERR(obj)) { - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | - XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | - XE_BO_FLAG_GGTT, false); - } - - if (IS_ERR(obj)) { - drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); - return ERR_PTR(-ENOMEM); - } - - return &obj->ttm.base; -} - -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) -{ - xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); -} - -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, - struct i915_vma *vma) -{ - struct xe_bo *obj = gem_to_xe_bo(_obj); - struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); - - if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { - if (obj->flags & XE_BO_FLAG_STOLEN) - info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); - else - info->fix.smem_start = - pci_resource_start(pdev, 2) + - xe_bo_addr(obj, 0, XE_PAGE_SIZE); - - info->fix.smem_len = obj->ttm.base.size; - } else { - /* XXX: Pure fiction, as the BO may not be physically accessible.. */ - info->fix.smem_start = 0; - info->fix.smem_len = obj->ttm.base.size; - } - XE_WARN_ON(iosys_map_is_null(&obj->vmap)); - - info->screen_base = obj->vmap.vaddr_iomem; - info->screen_size = obj->ttm.base.size; - - return 0; -} diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c b/drivers/gpu/drm/xe/display/xe_display_bo.c index a689f71e7b14..10436edecc35 100644 --- a/drivers/gpu/drm/xe/display/xe_display_bo.c +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT /* Copyright © 2024 Intel Corporation */ +#include <linux/fb.h> + #include <drm/drm_gem.h> #include <drm/intel/display_parent_interface.h> @@ -8,6 +10,10 @@ #include "xe_bo.h" #include "xe_display_bo.h" #include "xe_pxp.h" +#include "xe_ttm_stolen_mgr.h" +#include "xe_wa.h" + +#include <generated/xe_device_wa_oob.h> static bool xe_display_bo_is_protected(struct drm_gem_object *obj) { @@ -101,6 +107,111 @@ xe_display_bo_framebuffer_lookup(struct drm_device *drm, return gem; } +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) +/* + * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride + * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to + * have driver specific values. However, dropping the stride alignment to 64 + * leads to underflowing the bo pin count in the atomic cleanup work. + */ +static u32 xe_display_bo_fbdev_pitch_align(u32 stride) +{ + return ALIGN(stride, XE_PAGE_SIZE); +} + +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) +{ + struct xe_device *xe = to_xe_device(drm); + struct ttm_resource_manager *stolen; + + stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); + if (!stolen) + return false; + + if (IS_DGFX(xe)) + return false; + + if (XE_DEVICE_WA(xe, 22019338487_display)) + return false; + + /* + * If the FB is too big, just don't use it since fbdev is not very + * important and we should probably use that space with FBC or other + * features. + */ + return stolen->size >= size * 2; +} + +static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device *drm, int size) +{ + struct xe_device *xe = to_xe_device(drm); + struct xe_bo *obj; + + obj = ERR_PTR(-ENODEV); + + if (xe_display_bo_fbdev_prefer_stolen(drm, size)) { + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), + size, + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | + XE_BO_FLAG_STOLEN | + XE_BO_FLAG_GGTT, false); + if (!IS_ERR(obj)) + drm_info(&xe->drm, "Allocated fbdev into stolen\n"); + else + drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); + } else { + drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); + } + + if (IS_ERR(obj)) { + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | + XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | + XE_BO_FLAG_GGTT, false); + } + + if (IS_ERR(obj)) { + drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); + return ERR_PTR(-ENOMEM); + } + + return &obj->ttm.base; +} + +static void xe_display_bo_fbdev_destroy(struct drm_gem_object *obj) +{ + xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); +} + +static int xe_display_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, + struct i915_vma *vma) +{ + struct xe_bo *obj = gem_to_xe_bo(_obj); + struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); + + if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { + if (obj->flags & XE_BO_FLAG_STOLEN) + info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); + else + info->fix.smem_start = + pci_resource_start(pdev, 2) + + xe_bo_addr(obj, 0, XE_PAGE_SIZE); + + info->fix.smem_len = obj->ttm.base.size; + } else { + /* XXX: Pure fiction, as the BO may not be physically accessible.. */ + info->fix.smem_start = 0; + info->fix.smem_len = obj->ttm.base.size; + } + XE_WARN_ON(iosys_map_is_null(&obj->vmap)); + + info->screen_base = obj->vmap.vaddr_iomem; + info->screen_size = obj->ttm.base.size; + + return 0; +} +#endif + const struct intel_display_bo_interface xe_display_bo_interface = { .is_protected = xe_display_bo_is_protected, .key_check = xe_pxp_obj_key_check, @@ -109,4 +220,10 @@ const struct intel_display_bo_interface xe_display_bo_interface = { .framebuffer_init = xe_display_bo_framebuffer_init, .framebuffer_fini = xe_display_bo_framebuffer_fini, .framebuffer_lookup = xe_display_bo_framebuffer_lookup, +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) + .fbdev_create = xe_display_bo_fbdev_create, + .fbdev_destroy = xe_display_bo_fbdev_destroy, + .fbdev_fill_info = xe_display_bo_fbdev_fill_info, + .fbdev_pitch_align = xe_display_bo_fbdev_pitch_align, +#endif }; diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.h b/drivers/gpu/drm/xe/display/xe_display_bo.h index 6879c104b0b1..8980e6ecf54a 100644 --- a/drivers/gpu/drm/xe/display/xe_display_bo.h +++ b/drivers/gpu/drm/xe/display/xe_display_bo.h @@ -4,6 +4,12 @@ #ifndef __XE_DISPLAY_BO_H__ #define __XE_DISPLAY_BO_H__ +#include <linux/types.h> + +struct drm_device; + +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); + extern const struct intel_display_bo_interface xe_display_bo_interface; #endif diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 730c6dc49522..6e0a22429184 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -12,8 +12,8 @@ #include "intel_display_types.h" #include "intel_fb.h" #include "intel_fb_pin.h" -#include "intel_fbdev_fb.h" #include "xe_bo.h" +#include "xe_display_bo.h" #include "xe_display_vma.h" #include "xe_ggtt.h" #include "xe_mmio.h" @@ -87,7 +87,7 @@ initial_plane_bo(struct xe_device *xe, if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && - !intel_fbdev_fb_prefer_stolen(&xe->drm, plane_config->size)) { + !xe_display_bo_fbdev_prefer_stolen(&xe->drm, plane_config->size)) { drm_info(&xe->drm, "Initial FB size exceeds half of stolen, discarding\n"); return NULL; } diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 97ec94a2e749..2fc1794a3da4 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -15,6 +15,7 @@ struct drm_gem_object; struct drm_mode_fb_cmd2; struct drm_plane_state; struct drm_scanout_buffer; +struct fb_info; struct i915_vma; struct intel_dpt; struct intel_dsb_buffer; @@ -43,6 +44,12 @@ struct intel_display_bo_interface { struct drm_gem_object *(*framebuffer_lookup)(struct drm_device *drm, struct drm_file *filp, const struct drm_mode_fb_cmd2 *user_mode_cmd); +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) + struct drm_gem_object *(*fbdev_create)(struct drm_device *drm, int size); + void (*fbdev_destroy)(struct drm_gem_object *obj); + int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info *info, struct i915_vma *vma); + u32 (*fbdev_pitch_align)(u32 stride); +#endif }; struct intel_display_dpt_interface { -- 2.47.3 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-18 13:29 ` [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula @ 2026-03-24 23:42 ` Michał Grzelak 2026-03-24 23:51 ` Michał Grzelak 2026-03-25 8:13 ` [PATCH 3/5] drm/{i915, xe}: " Jani Nikula 0 siblings, 2 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-24 23:42 UTC (permalink / raw) To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 28963 bytes --] On Wed, 18 Mar 2026, Jani Nikula wrote: > Move the driver specific fbdev fb calls to the display parent > interface. Reuse the existing struct intel_display_bo_interface, as this > is mostly about gem objects. > > Put everything behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) to catch > configuration issues at build or link time. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> > --- > drivers/gpu/drm/i915/Makefile | 3 +- > drivers/gpu/drm/i915/display/intel_bo.c | 27 ++++ > drivers/gpu/drm/i915/display/intel_bo.h | 8 ++ > drivers/gpu/drm/i915/display/intel_fbdev.c | 14 +-- > drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 118 ------------------ > drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 24 ---- > drivers/gpu/drm/i915/i915_bo.c | 116 +++++++++++++++++ > drivers/gpu/drm/i915/i915_bo.h | 6 + > drivers/gpu/drm/i915/i915_initial_plane.c | 4 +- > drivers/gpu/drm/xe/Makefile | 1 - > drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 116 ----------------- > drivers/gpu/drm/xe/display/xe_display_bo.c | 117 +++++++++++++++++ > drivers/gpu/drm/xe/display/xe_display_bo.h | 6 + > drivers/gpu/drm/xe/display/xe_initial_plane.c | 4 +- > include/drm/intel/display_parent_interface.h | 7 ++ > 15 files changed, 299 insertions(+), 272 deletions(-) > delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.c > delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.h > delete mode 100644 drivers/gpu/drm/xe/display/intel_fbdev_fb.c > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index be976a90c5a6..026614d74cc4 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -324,8 +324,7 @@ i915-$(CONFIG_ACPI) += \ > display/intel_acpi.o \ > display/intel_opregion.o > i915-$(CONFIG_DRM_FBDEV_EMULATION) += \ > - display/intel_fbdev.o \ > - display/intel_fbdev_fb.o > + display/intel_fbdev.o > i915-$(CONFIG_DEBUG_FS) += \ > display/intel_display_debugfs.o \ > display/intel_display_debugfs_params.o \ > diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c > index 3b82d38a0504..8ecdbb7e39f3 100644 > --- a/drivers/gpu/drm/i915/display/intel_bo.c > +++ b/drivers/gpu/drm/i915/display/intel_bo.c > @@ -85,3 +85,30 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display > { > return display->parent->bo->framebuffer_lookup(display->drm, filp, user_mode_cmd); > } > + > +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) > +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride) > +{ > + return display->parent->bo->fbdev_pitch_align(stride); > +} > + > +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size) > +{ > + return display->parent->bo->fbdev_create(display->drm, size); > +} > + > +void intel_bo_fbdev_destroy(struct drm_gem_object *obj) > +{ > + struct intel_display *display = to_intel_display(obj->dev); > + > + display->parent->bo->fbdev_destroy(obj); > +} > + > +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, > + struct i915_vma *vma) > +{ > + struct intel_display *display = to_intel_display(obj->dev); > + > + return display->parent->bo->fbdev_fill_info(obj, info, vma); > +} > +#endif > diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h > index aec188c706c2..348f7fa66960 100644 > --- a/drivers/gpu/drm/i915/display/intel_bo.h > +++ b/drivers/gpu/drm/i915/display/intel_bo.h > @@ -10,6 +10,8 @@ struct drm_file; > struct drm_gem_object; > struct drm_mode_fb_cmd2; > struct drm_scanout_buffer; > +struct fb_info; > +struct i915_vma; > struct intel_display; > struct intel_framebuffer; > struct seq_file; > @@ -31,4 +33,10 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display > struct drm_file *filp, > const struct drm_mode_fb_cmd2 *user_mode_cmd); > > +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride); > +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size); > +void intel_bo_fbdev_destroy(struct drm_gem_object *obj); > +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, > + struct i915_vma *vma); > + > #endif /* __INTEL_BO__ */ > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c > index 6401aaaba199..14ac01c1b3eb 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c > @@ -54,7 +54,6 @@ > #include "intel_fb.h" > #include "intel_fb_pin.h" > #include "intel_fbdev.h" > -#include "intel_fbdev_fb.h" > #include "intel_frontbuffer.h" > > struct intel_fbdev { > @@ -204,7 +203,8 @@ static const struct drm_fb_helper_funcs intel_fb_helper_funcs = { > .fb_set_suspend = intelfb_set_suspend, > }; > > -static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, > +static void intel_fbdev_fill_mode_cmd(struct intel_display *display, > + struct drm_fb_helper_surface_size *sizes, > struct drm_mode_fb_cmd2 *mode_cmd) > { > /* we don't do packed 24bpp */ > @@ -215,7 +215,7 @@ static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, > mode_cmd->width = sizes->surface_width; > mode_cmd->height = sizes->surface_height; > > - mode_cmd->pitches[0] = intel_fbdev_fb_pitch_align(mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); > + mode_cmd->pitches[0] = intel_bo_fbdev_pitch_align(display, mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); > mode_cmd->pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, > sizes->surface_depth); > mode_cmd->modifier[0] = DRM_FORMAT_MOD_LINEAR; > @@ -230,12 +230,12 @@ __intel_fbdev_fb_alloc(struct intel_display *display, > struct drm_gem_object *obj; > int size; > > - intel_fbdev_fill_mode_cmd(sizes, &mode_cmd); > + intel_fbdev_fill_mode_cmd(display, sizes, &mode_cmd); > > size = mode_cmd.pitches[0] * mode_cmd.height; > size = PAGE_ALIGN(size); > > - obj = intel_fbdev_fb_bo_create(display->drm, size); > + obj = intel_bo_fbdev_create(display, size); > if (IS_ERR(obj)) { > fb = ERR_CAST(obj); > goto err; > @@ -247,7 +247,7 @@ __intel_fbdev_fb_alloc(struct intel_display *display, > mode_cmd.modifier[0]), > &mode_cmd); > if (IS_ERR(fb)) { > - intel_fbdev_fb_bo_destroy(obj); > + intel_bo_fbdev_destroy(obj); > goto err; > } > > @@ -327,7 +327,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, > > obj = intel_fb_bo(&fb->base); > > - ret = intel_fbdev_fb_fill_info(obj, info, vma); > + ret = intel_bo_fbdev_fill_info(obj, info, vma); > if (ret) > goto out_unpin; > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > deleted file mode 100644 > index a696ce42d10b..000000000000 > --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > +++ /dev/null > @@ -1,118 +0,0 @@ > -/* SPDX-License-Identifier: MIT */ > -/* > - * Copyright © 2023 Intel Corporation > - */ > - > -#include <linux/fb.h> > - > -#include <drm/drm_print.h> > - > -#include "gem/i915_gem_lmem.h" > - > -#include "i915_drv.h" > -#include "intel_fbdev_fb.h" > - > -u32 intel_fbdev_fb_pitch_align(u32 stride) > -{ > - return ALIGN(stride, 64); > -} > - > -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) > -{ > - struct drm_i915_private *i915 = to_i915(drm); > - > - /* Skip stolen on MTL as Wa_22018444074 mitigation. */ > - if (IS_METEORLAKE(i915)) > - return false; > - > - /* > - * If the FB is too big, just don't use it since fbdev is not very > - * important and we should probably use that space with FBC or other > - * features. > - */ > - return i915->dsm.usable_size >= size * 2; > -} > - > -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) > -{ > - struct drm_i915_private *i915 = to_i915(drm); > - struct drm_i915_gem_object *obj; > - > - obj = ERR_PTR(-ENODEV); > - if (HAS_LMEM(i915)) { > - obj = i915_gem_object_create_lmem(i915, size, > - I915_BO_ALLOC_CONTIGUOUS | > - I915_BO_ALLOC_USER); > - } else { > - if (intel_fbdev_fb_prefer_stolen(drm, size)) > - obj = i915_gem_object_create_stolen(i915, size); > - else > - drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); > - > - if (IS_ERR(obj)) > - obj = i915_gem_object_create_shmem(i915, size); > - } > - > - if (IS_ERR(obj)) { > - drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); > - return ERR_PTR(-ENOMEM); > - } > - > - return &obj->base; > -} > - > -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) > -{ > - drm_gem_object_put(obj); > -} > - > -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, > - struct i915_vma *vma) > -{ > - struct drm_i915_private *i915 = to_i915(_obj->dev); > - struct drm_i915_gem_object *obj = to_intel_bo(_obj); > - struct i915_gem_ww_ctx ww; > - void __iomem *vaddr; > - int ret; > - > - if (i915_gem_object_is_lmem(obj)) { > - struct intel_memory_region *mem = obj->mm.region; > - > - /* Use fbdev's framebuffer from lmem for discrete */ > - info->fix.smem_start = > - (unsigned long)(mem->io.start + > - i915_gem_object_get_dma_address(obj, 0) - > - mem->region.start); > - info->fix.smem_len = obj->base.size; > - } else { > - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; > - > - /* Our framebuffer is the entirety of fbdev's system memory */ > - info->fix.smem_start = > - (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); > - info->fix.smem_len = vma->size; > - } > - > - for_i915_gem_ww(&ww, ret, false) { > - ret = i915_gem_object_lock(vma->obj, &ww); > - > - if (ret) > - continue; > - > - vaddr = i915_vma_pin_iomap(vma); > - if (IS_ERR(vaddr)) { > - drm_err(&i915->drm, > - "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); > - ret = PTR_ERR(vaddr); > - continue; > - } > - } > - > - if (ret) > - return ret; > - > - info->screen_base = vaddr; > - info->screen_size = intel_bo_to_drm_bo(obj)->size; > - > - return 0; > -} > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h > deleted file mode 100644 > index ddba45e9839d..000000000000 > --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h > +++ /dev/null > @@ -1,24 +0,0 @@ > -/* SPDX-License-Identifier: MIT */ > -/* > - * Copyright © 2023 Intel Corporation > - */ > - > -#ifndef __INTEL_FBDEV_FB_H__ > -#define __INTEL_FBDEV_FB_H__ > - > -#include <linux/types.h> > - > -struct drm_device; > -struct drm_gem_object; > -struct drm_mode_fb_cmd2; > -struct fb_info; > -struct i915_vma; > - > -u32 intel_fbdev_fb_pitch_align(u32 stride); > -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size); > -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj); > -int intel_fbdev_fb_fill_info(struct drm_gem_object *obj, struct fb_info *info, > - struct i915_vma *vma); > -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size); > - > -#endif > diff --git a/drivers/gpu/drm/i915/i915_bo.c b/drivers/gpu/drm/i915/i915_bo.c > index 1789f7cab05c..7e38d002478e 100644 > --- a/drivers/gpu/drm/i915/i915_bo.c > +++ b/drivers/gpu/drm/i915/i915_bo.c > @@ -1,11 +1,14 @@ > // SPDX-License-Identifier: MIT > /* Copyright © 2024 Intel Corporation */ > > +#include <linux/fb.h> > + > #include <drm/drm_panic.h> > #include <drm/drm_print.h> > #include <drm/intel/display_parent_interface.h> > > #include "display/intel_fb.h" > +#include "gem/i915_gem_lmem.h" > #include "gem/i915_gem_mman.h" > #include "gem/i915_gem_object.h" > #include "gem/i915_gem_object_frontbuffer.h" > @@ -141,6 +144,113 @@ i915_bo_framebuffer_lookup(struct drm_device *drm, > return intel_bo_to_drm_bo(obj); > } > > +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) > +static u32 i915_bo_fbdev_pitch_align(u32 stride) > +{ > + return ALIGN(stride, 64); > +} > + > +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) > +{ > + struct drm_i915_private *i915 = to_i915(drm); > + > + /* Skip stolen on MTL as Wa_22018444074 mitigation. */ > + if (IS_METEORLAKE(i915)) > + return false; > + > + /* > + * If the FB is too big, just don't use it since fbdev is not very > + * important and we should probably use that space with FBC or other > + * features. > + */ > + return i915->dsm.usable_size >= size * 2; > +} > + > +static struct drm_gem_object *i915_bo_fbdev_create(struct drm_device *drm, int size) > +{ > + struct drm_i915_private *i915 = to_i915(drm); Can we add same trick for i915_bo_fbdev_create() as we are doing with i915_bo_fbdev_prefer_stolen() in patch [4/5]? Or e.g. add a separate 6th patch for that? Up to patch reordering, of course. > + struct drm_i915_gem_object *obj; > + > + obj = ERR_PTR(-ENODEV); > + if (HAS_LMEM(i915)) { > + obj = i915_gem_object_create_lmem(i915, size, > + I915_BO_ALLOC_CONTIGUOUS | > + I915_BO_ALLOC_USER); > + } else { > + if (i915_bo_fbdev_prefer_stolen(drm, size)) > + obj = i915_gem_object_create_stolen(i915, size); > + else > + drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); > + > + if (IS_ERR(obj)) > + obj = i915_gem_object_create_shmem(i915, size); > + } > + > + if (IS_ERR(obj)) { > + drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); > + return ERR_PTR(-ENOMEM); > + } > + > + return &obj->base; > +} > + > +static void i915_bo_fbdev_destroy(struct drm_gem_object *obj) > +{ > + drm_gem_object_put(obj); > +} > + > +static int i915_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, > + struct i915_vma *vma) > +{ > + struct drm_i915_private *i915 = to_i915(_obj->dev); > + struct drm_i915_gem_object *obj = to_intel_bo(_obj); > + struct i915_gem_ww_ctx ww; > + void __iomem *vaddr; > + int ret; > + > + if (i915_gem_object_is_lmem(obj)) { > + struct intel_memory_region *mem = obj->mm.region; > + > + /* Use fbdev's framebuffer from lmem for discrete */ > + info->fix.smem_start = > + (unsigned long)(mem->io.start + > + i915_gem_object_get_dma_address(obj, 0) - > + mem->region.start); > + info->fix.smem_len = obj->base.size; > + } else { > + struct i915_ggtt *ggtt = to_gt(i915)->ggtt; > + > + /* Our framebuffer is the entirety of fbdev's system memory */ > + info->fix.smem_start = > + (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); > + info->fix.smem_len = vma->size; > + } > + > + for_i915_gem_ww(&ww, ret, false) { > + ret = i915_gem_object_lock(vma->obj, &ww); > + > + if (ret) > + continue; > + > + vaddr = i915_vma_pin_iomap(vma); > + if (IS_ERR(vaddr)) { > + drm_err(&i915->drm, > + "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); > + ret = PTR_ERR(vaddr); > + continue; > + } > + } > + > + if (ret) > + return ret; > + > + info->screen_base = vaddr; > + info->screen_size = intel_bo_to_drm_bo(obj)->size; > + > + return 0; > +} > +#endif > + > const struct intel_display_bo_interface i915_display_bo_interface = { > .is_tiled = i915_bo_is_tiled, > .is_userptr = i915_bo_is_userptr, > @@ -153,4 +263,10 @@ const struct intel_display_bo_interface i915_display_bo_interface = { > .framebuffer_init = i915_bo_framebuffer_init, > .framebuffer_fini = i915_bo_framebuffer_fini, > .framebuffer_lookup = i915_bo_framebuffer_lookup, > +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) > + .fbdev_create = i915_bo_fbdev_create, > + .fbdev_destroy = i915_bo_fbdev_destroy, > + .fbdev_fill_info = i915_bo_fbdev_fill_info, > + .fbdev_pitch_align = i915_bo_fbdev_pitch_align, > +#endif > }; > diff --git a/drivers/gpu/drm/i915/i915_bo.h b/drivers/gpu/drm/i915/i915_bo.h > index 57255d052dd9..2a0f3050dd42 100644 > --- a/drivers/gpu/drm/i915/i915_bo.h > +++ b/drivers/gpu/drm/i915/i915_bo.h > @@ -4,6 +4,12 @@ > #ifndef __I915_BO_H__ > #define __I915_BO_H__ > > +#include <linux/types.h> > + > +struct drm_device; > + > +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); > + > extern const struct intel_display_bo_interface i915_display_bo_interface; > > #endif /* __I915_BO_H__ */ > diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c > index 390a9248d631..f4d631a395d0 100644 > --- a/drivers/gpu/drm/i915/i915_initial_plane.c > +++ b/drivers/gpu/drm/i915/i915_initial_plane.c > @@ -9,10 +9,10 @@ > #include "display/intel_crtc.h" > #include "display/intel_display_types.h" > #include "display/intel_fb.h" > -#include "display/intel_fbdev_fb.h" > #include "gem/i915_gem_lmem.h" > #include "gem/i915_gem_region.h" > > +#include "i915_bo.h" > #include "i915_drv.h" > #include "i915_initial_plane.h" > > @@ -118,7 +118,7 @@ initial_plane_vma(struct drm_i915_private *i915, > if (IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && > IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && > mem == i915->mm.stolen_region && > - !intel_fbdev_fb_prefer_stolen(&i915->drm, size)) { > + !i915_bo_fbdev_prefer_stolen(&i915->drm, size)) { > drm_dbg_kms(&i915->drm, "Initial FB size exceeds half of stolen, discarding\n"); > return NULL; > } > diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile > index dab979287a96..936eb79e9269 100644 > --- a/drivers/gpu/drm/xe/Makefile > +++ b/drivers/gpu/drm/xe/Makefile > @@ -211,7 +211,6 @@ $(obj)/i915-display/%.o: $(srctree)/drivers/gpu/drm/i915/display/%.c FORCE > > # Display code specific to xe > xe-$(CONFIG_DRM_XE_DISPLAY) += \ > - display/intel_fbdev_fb.o \ > display/xe_display.o \ > display/xe_display_bo.o \ > display/xe_display_pcode.o \ > diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c > deleted file mode 100644 > index 2ad5e5a79287..000000000000 > --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c > +++ /dev/null > @@ -1,116 +0,0 @@ > -/* SPDX-License-Identifier: MIT */ > -/* > - * Copyright © 2023 Intel Corporation > - */ > - > -#include <linux/fb.h> > - > -#include "intel_fbdev_fb.h" > -#include "xe_bo.h" > -#include "xe_ttm_stolen_mgr.h" > -#include "xe_wa.h" > - > -#include <generated/xe_device_wa_oob.h> > - > -/* > - * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride > - * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to > - * have driver specific values. However, dropping the stride alignment to 64 > - * leads to underflowing the bo pin count in the atomic cleanup work. > - */ > -u32 intel_fbdev_fb_pitch_align(u32 stride) > -{ > - return ALIGN(stride, XE_PAGE_SIZE); > -} > - > -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) > -{ > - struct xe_device *xe = to_xe_device(drm); > - struct ttm_resource_manager *stolen; > - > - stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); > - if (!stolen) > - return false; > - > - if (IS_DGFX(xe)) > - return false; > - > - if (XE_DEVICE_WA(xe, 22019338487_display)) > - return false; > - > - /* > - * If the FB is too big, just don't use it since fbdev is not very > - * important and we should probably use that space with FBC or other > - * features. > - */ > - return stolen->size >= size * 2; > -} > - > -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) > -{ > - struct xe_device *xe = to_xe_device(drm); > - struct xe_bo *obj; > - > - obj = ERR_PTR(-ENODEV); > - > - if (intel_fbdev_fb_prefer_stolen(drm, size)) { > - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), > - size, > - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | > - XE_BO_FLAG_STOLEN | > - XE_BO_FLAG_GGTT, false); > - if (!IS_ERR(obj)) > - drm_info(&xe->drm, "Allocated fbdev into stolen\n"); > - else > - drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); > - } else { > - drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); > - } > - > - if (IS_ERR(obj)) { > - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, > - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | > - XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | > - XE_BO_FLAG_GGTT, false); > - } > - > - if (IS_ERR(obj)) { > - drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); > - return ERR_PTR(-ENOMEM); > - } > - > - return &obj->ttm.base; > -} > - > -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) > -{ > - xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); > -} > - > -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, > - struct i915_vma *vma) > -{ > - struct xe_bo *obj = gem_to_xe_bo(_obj); > - struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); > - > - if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { > - if (obj->flags & XE_BO_FLAG_STOLEN) > - info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); > - else > - info->fix.smem_start = > - pci_resource_start(pdev, 2) + > - xe_bo_addr(obj, 0, XE_PAGE_SIZE); > - > - info->fix.smem_len = obj->ttm.base.size; > - } else { > - /* XXX: Pure fiction, as the BO may not be physically accessible.. */ > - info->fix.smem_start = 0; > - info->fix.smem_len = obj->ttm.base.size; > - } > - XE_WARN_ON(iosys_map_is_null(&obj->vmap)); > - > - info->screen_base = obj->vmap.vaddr_iomem; > - info->screen_size = obj->ttm.base.size; > - > - return 0; > -} > diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c b/drivers/gpu/drm/xe/display/xe_display_bo.c > index a689f71e7b14..10436edecc35 100644 > --- a/drivers/gpu/drm/xe/display/xe_display_bo.c > +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c > @@ -1,6 +1,8 @@ > // SPDX-License-Identifier: MIT > /* Copyright © 2024 Intel Corporation */ > > +#include <linux/fb.h> > + > #include <drm/drm_gem.h> > #include <drm/intel/display_parent_interface.h> > > @@ -8,6 +10,10 @@ > #include "xe_bo.h" > #include "xe_display_bo.h" > #include "xe_pxp.h" > +#include "xe_ttm_stolen_mgr.h" > +#include "xe_wa.h" > + > +#include <generated/xe_device_wa_oob.h> > > static bool xe_display_bo_is_protected(struct drm_gem_object *obj) > { > @@ -101,6 +107,111 @@ xe_display_bo_framebuffer_lookup(struct drm_device *drm, > return gem; > } > > +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) > +/* > + * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride > + * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to > + * have driver specific values. However, dropping the stride alignment to 64 > + * leads to underflowing the bo pin count in the atomic cleanup work. > + */ > +static u32 xe_display_bo_fbdev_pitch_align(u32 stride) > +{ > + return ALIGN(stride, XE_PAGE_SIZE); > +} > + > +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) > +{ > + struct xe_device *xe = to_xe_device(drm); > + struct ttm_resource_manager *stolen; > + > + stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); > + if (!stolen) > + return false; > + > + if (IS_DGFX(xe)) > + return false; > + > + if (XE_DEVICE_WA(xe, 22019338487_display)) > + return false; > + > + /* > + * If the FB is too big, just don't use it since fbdev is not very > + * important and we should probably use that space with FBC or other > + * features. > + */ > + return stolen->size >= size * 2; > +} > + > +static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device *drm, int size) > +{ > + struct xe_device *xe = to_xe_device(drm); Same question here, but adding it in patch [5/5] or as new 7th patch. Up to patch reordering of course. BR, Michał > + struct xe_bo *obj; > + > + obj = ERR_PTR(-ENODEV); > + > + if (xe_display_bo_fbdev_prefer_stolen(drm, size)) { > + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), > + size, > + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | > + XE_BO_FLAG_STOLEN | > + XE_BO_FLAG_GGTT, false); > + if (!IS_ERR(obj)) > + drm_info(&xe->drm, "Allocated fbdev into stolen\n"); > + else > + drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); > + } else { > + drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); > + } > + > + if (IS_ERR(obj)) { > + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, > + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | > + XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | > + XE_BO_FLAG_GGTT, false); > + } > + > + if (IS_ERR(obj)) { > + drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); > + return ERR_PTR(-ENOMEM); > + } > + > + return &obj->ttm.base; > +} > + > +static void xe_display_bo_fbdev_destroy(struct drm_gem_object *obj) > +{ > + xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); > +} > + > +static int xe_display_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, > + struct i915_vma *vma) > +{ > + struct xe_bo *obj = gem_to_xe_bo(_obj); > + struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); > + > + if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { > + if (obj->flags & XE_BO_FLAG_STOLEN) > + info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); > + else > + info->fix.smem_start = > + pci_resource_start(pdev, 2) + > + xe_bo_addr(obj, 0, XE_PAGE_SIZE); > + > + info->fix.smem_len = obj->ttm.base.size; > + } else { > + /* XXX: Pure fiction, as the BO may not be physically accessible.. */ > + info->fix.smem_start = 0; > + info->fix.smem_len = obj->ttm.base.size; > + } > + XE_WARN_ON(iosys_map_is_null(&obj->vmap)); > + > + info->screen_base = obj->vmap.vaddr_iomem; > + info->screen_size = obj->ttm.base.size; > + > + return 0; > +} > +#endif > + > const struct intel_display_bo_interface xe_display_bo_interface = { > .is_protected = xe_display_bo_is_protected, > .key_check = xe_pxp_obj_key_check, > @@ -109,4 +220,10 @@ const struct intel_display_bo_interface xe_display_bo_interface = { > .framebuffer_init = xe_display_bo_framebuffer_init, > .framebuffer_fini = xe_display_bo_framebuffer_fini, > .framebuffer_lookup = xe_display_bo_framebuffer_lookup, > +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) > + .fbdev_create = xe_display_bo_fbdev_create, > + .fbdev_destroy = xe_display_bo_fbdev_destroy, > + .fbdev_fill_info = xe_display_bo_fbdev_fill_info, > + .fbdev_pitch_align = xe_display_bo_fbdev_pitch_align, > +#endif > }; > diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.h b/drivers/gpu/drm/xe/display/xe_display_bo.h > index 6879c104b0b1..8980e6ecf54a 100644 > --- a/drivers/gpu/drm/xe/display/xe_display_bo.h > +++ b/drivers/gpu/drm/xe/display/xe_display_bo.h > @@ -4,6 +4,12 @@ > #ifndef __XE_DISPLAY_BO_H__ > #define __XE_DISPLAY_BO_H__ > > +#include <linux/types.h> > + > +struct drm_device; > + > +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); > + > extern const struct intel_display_bo_interface xe_display_bo_interface; > > #endif > diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c > index 730c6dc49522..6e0a22429184 100644 > --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c > +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c > @@ -12,8 +12,8 @@ > #include "intel_display_types.h" > #include "intel_fb.h" > #include "intel_fb_pin.h" > -#include "intel_fbdev_fb.h" > #include "xe_bo.h" > +#include "xe_display_bo.h" > #include "xe_display_vma.h" > #include "xe_ggtt.h" > #include "xe_mmio.h" > @@ -87,7 +87,7 @@ initial_plane_bo(struct xe_device *xe, > > if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && > IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && > - !intel_fbdev_fb_prefer_stolen(&xe->drm, plane_config->size)) { > + !xe_display_bo_fbdev_prefer_stolen(&xe->drm, plane_config->size)) { > drm_info(&xe->drm, "Initial FB size exceeds half of stolen, discarding\n"); > return NULL; > } > diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h > index 97ec94a2e749..2fc1794a3da4 100644 > --- a/include/drm/intel/display_parent_interface.h > +++ b/include/drm/intel/display_parent_interface.h > @@ -15,6 +15,7 @@ struct drm_gem_object; > struct drm_mode_fb_cmd2; > struct drm_plane_state; > struct drm_scanout_buffer; > +struct fb_info; > struct i915_vma; > struct intel_dpt; > struct intel_dsb_buffer; > @@ -43,6 +44,12 @@ struct intel_display_bo_interface { > struct drm_gem_object *(*framebuffer_lookup)(struct drm_device *drm, > struct drm_file *filp, > const struct drm_mode_fb_cmd2 *user_mode_cmd); > +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) > + struct drm_gem_object *(*fbdev_create)(struct drm_device *drm, int size); > + void (*fbdev_destroy)(struct drm_gem_object *obj); > + int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info *info, struct i915_vma *vma); > + u32 (*fbdev_pitch_align)(u32 stride); > +#endif > }; > > struct intel_display_dpt_interface { > -- > 2.47.3 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-24 23:42 ` Michał Grzelak @ 2026-03-24 23:51 ` Michał Grzelak 2026-03-25 8:13 ` [PATCH 3/5] drm/{i915, xe}: " Jani Nikula 1 sibling, 0 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-24 23:51 UTC (permalink / raw) To: Michał Grzelak Cc: Jani Nikula, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 30357 bytes --] On Tue, 24 Mar 2026, Michał Grzelak wrote: > On Wed, 18 Mar 2026, Jani Nikula wrote: >> Move the driver specific fbdev fb calls to the display parent >> interface. Reuse the existing struct intel_display_bo_interface, as this >> is mostly about gem objects. >> >> Put everything behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) to catch >> configuration issues at build or link time. >> >> Signed-off-by: Jani Nikula <jani.nikula@intel.com> >> --- >> drivers/gpu/drm/i915/Makefile | 3 +- >> drivers/gpu/drm/i915/display/intel_bo.c | 27 ++++ >> drivers/gpu/drm/i915/display/intel_bo.h | 8 ++ >> drivers/gpu/drm/i915/display/intel_fbdev.c | 14 +-- >> drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 118 ------------------ >> drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 24 ---- >> drivers/gpu/drm/i915/i915_bo.c | 116 +++++++++++++++++ >> drivers/gpu/drm/i915/i915_bo.h | 6 + >> drivers/gpu/drm/i915/i915_initial_plane.c | 4 +- >> drivers/gpu/drm/xe/Makefile | 1 - >> drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 116 ----------------- >> drivers/gpu/drm/xe/display/xe_display_bo.c | 117 +++++++++++++++++ >> drivers/gpu/drm/xe/display/xe_display_bo.h | 6 + >> drivers/gpu/drm/xe/display/xe_initial_plane.c | 4 +- >> include/drm/intel/display_parent_interface.h | 7 ++ >> 15 files changed, 299 insertions(+), 272 deletions(-) >> delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> delete mode 100644 drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> >> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile >> index be976a90c5a6..026614d74cc4 100644 >> --- a/drivers/gpu/drm/i915/Makefile >> +++ b/drivers/gpu/drm/i915/Makefile >> @@ -324,8 +324,7 @@ i915-$(CONFIG_ACPI) += \ >> display/intel_acpi.o \ >> display/intel_opregion.o >> i915-$(CONFIG_DRM_FBDEV_EMULATION) += \ >> - display/intel_fbdev.o \ >> - display/intel_fbdev_fb.o >> + display/intel_fbdev.o >> i915-$(CONFIG_DEBUG_FS) += \ >> display/intel_display_debugfs.o \ >> display/intel_display_debugfs_params.o \ >> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c >> b/drivers/gpu/drm/i915/display/intel_bo.c >> index 3b82d38a0504..8ecdbb7e39f3 100644 >> --- a/drivers/gpu/drm/i915/display/intel_bo.c >> +++ b/drivers/gpu/drm/i915/display/intel_bo.c >> @@ -85,3 +85,30 @@ struct drm_gem_object >> *intel_bo_framebuffer_lookup(struct intel_display *display >> { >> return display->parent->bo->framebuffer_lookup(display->drm, filp, >> user_mode_cmd); >> } >> + >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride) >> +{ >> + return display->parent->bo->fbdev_pitch_align(stride); >> +} >> + >> +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display >> *display, int size) >> +{ >> + return display->parent->bo->fbdev_create(display->drm, size); >> +} >> + >> +void intel_bo_fbdev_destroy(struct drm_gem_object *obj) >> +{ >> + struct intel_display *display = to_intel_display(obj->dev); >> + >> + display->parent->bo->fbdev_destroy(obj); >> +} >> + >> +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info >> *info, >> + struct i915_vma *vma) >> +{ >> + struct intel_display *display = to_intel_display(obj->dev); >> + >> + return display->parent->bo->fbdev_fill_info(obj, info, vma); >> +} >> +#endif >> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h >> b/drivers/gpu/drm/i915/display/intel_bo.h >> index aec188c706c2..348f7fa66960 100644 >> --- a/drivers/gpu/drm/i915/display/intel_bo.h >> +++ b/drivers/gpu/drm/i915/display/intel_bo.h >> @@ -10,6 +10,8 @@ struct drm_file; >> struct drm_gem_object; >> struct drm_mode_fb_cmd2; >> struct drm_scanout_buffer; >> +struct fb_info; >> +struct i915_vma; >> struct intel_display; >> struct intel_framebuffer; >> struct seq_file; >> @@ -31,4 +33,10 @@ struct drm_gem_object >> *intel_bo_framebuffer_lookup(struct intel_display *display >> struct drm_file *filp, >> const struct >> drm_mode_fb_cmd2 *user_mode_cmd); >> >> +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride); >> +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display >> *display, int size); >> +void intel_bo_fbdev_destroy(struct drm_gem_object *obj); >> +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info >> *info, >> + struct i915_vma *vma); >> + >> #endif /* __INTEL_BO__ */ >> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c >> b/drivers/gpu/drm/i915/display/intel_fbdev.c >> index 6401aaaba199..14ac01c1b3eb 100644 >> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c >> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c >> @@ -54,7 +54,6 @@ >> #include "intel_fb.h" >> #include "intel_fb_pin.h" >> #include "intel_fbdev.h" >> -#include "intel_fbdev_fb.h" >> #include "intel_frontbuffer.h" >> >> struct intel_fbdev { >> @@ -204,7 +203,8 @@ static const struct drm_fb_helper_funcs >> intel_fb_helper_funcs = { >> .fb_set_suspend = intelfb_set_suspend, >> }; >> >> -static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size >> *sizes, >> +static void intel_fbdev_fill_mode_cmd(struct intel_display *display, >> + struct drm_fb_helper_surface_size >> *sizes, >> struct drm_mode_fb_cmd2 *mode_cmd) >> { >> /* we don't do packed 24bpp */ >> @@ -215,7 +215,7 @@ static void intel_fbdev_fill_mode_cmd(struct >> drm_fb_helper_surface_size *sizes, >> mode_cmd->width = sizes->surface_width; >> mode_cmd->height = sizes->surface_height; >> >> - mode_cmd->pitches[0] = intel_fbdev_fb_pitch_align(mode_cmd->width * >> DIV_ROUND_UP(sizes->surface_bpp, 8)); >> + mode_cmd->pitches[0] = intel_bo_fbdev_pitch_align(display, >> mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); >> mode_cmd->pixel_format = >> drm_mode_legacy_fb_format(sizes->surface_bpp, >> sizes->surface_depth); >> mode_cmd->modifier[0] = DRM_FORMAT_MOD_LINEAR; >> @@ -230,12 +230,12 @@ __intel_fbdev_fb_alloc(struct intel_display *display, >> struct drm_gem_object *obj; >> int size; >> >> - intel_fbdev_fill_mode_cmd(sizes, &mode_cmd); >> + intel_fbdev_fill_mode_cmd(display, sizes, &mode_cmd); >> >> size = mode_cmd.pitches[0] * mode_cmd.height; >> size = PAGE_ALIGN(size); >> >> - obj = intel_fbdev_fb_bo_create(display->drm, size); >> + obj = intel_bo_fbdev_create(display, size); >> if (IS_ERR(obj)) { >> fb = ERR_CAST(obj); >> goto err; >> @@ -247,7 +247,7 @@ __intel_fbdev_fb_alloc(struct intel_display *display, >> mode_cmd.modifier[0]), >> &mode_cmd); >> if (IS_ERR(fb)) { >> - intel_fbdev_fb_bo_destroy(obj); >> + intel_bo_fbdev_destroy(obj); >> goto err; >> } >> >> @@ -327,7 +327,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper >> *helper, >> >> obj = intel_fb_bo(&fb->base); >> >> - ret = intel_fbdev_fb_fill_info(obj, info, vma); >> + ret = intel_bo_fbdev_fill_info(obj, info, vma); >> if (ret) >> goto out_unpin; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> deleted file mode 100644 >> index a696ce42d10b..000000000000 >> --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> +++ /dev/null >> @@ -1,118 +0,0 @@ >> -/* SPDX-License-Identifier: MIT */ >> -/* >> - * Copyright © 2023 Intel Corporation >> - */ >> - >> -#include <linux/fb.h> >> - >> -#include <drm/drm_print.h> >> - >> -#include "gem/i915_gem_lmem.h" >> - >> -#include "i915_drv.h" >> -#include "intel_fbdev_fb.h" >> - >> -u32 intel_fbdev_fb_pitch_align(u32 stride) >> -{ >> - return ALIGN(stride, 64); >> -} >> - >> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int >> size) >> -{ >> - struct drm_i915_private *i915 = to_i915(drm); >> - >> - /* Skip stolen on MTL as Wa_22018444074 mitigation. */ >> - if (IS_METEORLAKE(i915)) >> - return false; >> - >> - /* >> - * If the FB is too big, just don't use it since fbdev is not very >> - * important and we should probably use that space with FBC or other >> - * features. >> - */ >> - return i915->dsm.usable_size >= size * 2; >> -} >> - >> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, >> int size) >> -{ >> - struct drm_i915_private *i915 = to_i915(drm); >> - struct drm_i915_gem_object *obj; >> - >> - obj = ERR_PTR(-ENODEV); >> - if (HAS_LMEM(i915)) { >> - obj = i915_gem_object_create_lmem(i915, size, >> - I915_BO_ALLOC_CONTIGUOUS | >> - I915_BO_ALLOC_USER); >> - } else { >> - if (intel_fbdev_fb_prefer_stolen(drm, size)) >> - obj = i915_gem_object_create_stolen(i915, size); >> - else >> - drm_info(drm, "Allocating fbdev: Stolen memory not >> preferred.\n"); >> - >> - if (IS_ERR(obj)) >> - obj = i915_gem_object_create_shmem(i915, size); >> - } >> - >> - if (IS_ERR(obj)) { >> - drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); >> - return ERR_PTR(-ENOMEM); >> - } >> - >> - return &obj->base; >> -} >> - >> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) >> -{ >> - drm_gem_object_put(obj); >> -} >> - >> -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info >> *info, >> - struct i915_vma *vma) >> -{ >> - struct drm_i915_private *i915 = to_i915(_obj->dev); >> - struct drm_i915_gem_object *obj = to_intel_bo(_obj); >> - struct i915_gem_ww_ctx ww; >> - void __iomem *vaddr; >> - int ret; >> - >> - if (i915_gem_object_is_lmem(obj)) { >> - struct intel_memory_region *mem = obj->mm.region; >> - >> - /* Use fbdev's framebuffer from lmem for discrete */ >> - info->fix.smem_start = >> - (unsigned long)(mem->io.start + >> - i915_gem_object_get_dma_address(obj, >> 0) - >> - mem->region.start); >> - info->fix.smem_len = obj->base.size; >> - } else { >> - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; >> - >> - /* Our framebuffer is the entirety of fbdev's system memory >> */ >> - info->fix.smem_start = >> - (unsigned long)(ggtt->gmadr.start + >> i915_ggtt_offset(vma)); >> - info->fix.smem_len = vma->size; >> - } >> - >> - for_i915_gem_ww(&ww, ret, false) { >> - ret = i915_gem_object_lock(vma->obj, &ww); >> - >> - if (ret) >> - continue; >> - >> - vaddr = i915_vma_pin_iomap(vma); >> - if (IS_ERR(vaddr)) { >> - drm_err(&i915->drm, >> - "Failed to remap framebuffer into virtual >> memory (%pe)\n", vaddr); >> - ret = PTR_ERR(vaddr); >> - continue; >> - } >> - } >> - >> - if (ret) >> - return ret; >> - >> - info->screen_base = vaddr; >> - info->screen_size = intel_bo_to_drm_bo(obj)->size; >> - >> - return 0; >> -} >> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> deleted file mode 100644 >> index ddba45e9839d..000000000000 >> --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> +++ /dev/null >> @@ -1,24 +0,0 @@ >> -/* SPDX-License-Identifier: MIT */ >> -/* >> - * Copyright © 2023 Intel Corporation >> - */ >> - >> -#ifndef __INTEL_FBDEV_FB_H__ >> -#define __INTEL_FBDEV_FB_H__ >> - >> -#include <linux/types.h> >> - >> -struct drm_device; >> -struct drm_gem_object; >> -struct drm_mode_fb_cmd2; >> -struct fb_info; >> -struct i915_vma; >> - >> -u32 intel_fbdev_fb_pitch_align(u32 stride); >> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, >> int size); >> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj); >> -int intel_fbdev_fb_fill_info(struct drm_gem_object *obj, struct fb_info >> *info, >> - struct i915_vma *vma); >> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int >> size); >> - >> -#endif >> diff --git a/drivers/gpu/drm/i915/i915_bo.c >> b/drivers/gpu/drm/i915/i915_bo.c >> index 1789f7cab05c..7e38d002478e 100644 >> --- a/drivers/gpu/drm/i915/i915_bo.c >> +++ b/drivers/gpu/drm/i915/i915_bo.c >> @@ -1,11 +1,14 @@ >> // SPDX-License-Identifier: MIT >> /* Copyright © 2024 Intel Corporation */ >> >> +#include <linux/fb.h> >> + >> #include <drm/drm_panic.h> >> #include <drm/drm_print.h> >> #include <drm/intel/display_parent_interface.h> >> >> #include "display/intel_fb.h" >> +#include "gem/i915_gem_lmem.h" >> #include "gem/i915_gem_mman.h" >> #include "gem/i915_gem_object.h" >> #include "gem/i915_gem_object_frontbuffer.h" >> @@ -141,6 +144,113 @@ i915_bo_framebuffer_lookup(struct drm_device *drm, >> return intel_bo_to_drm_bo(obj); >> } >> >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> +static u32 i915_bo_fbdev_pitch_align(u32 stride) >> +{ >> + return ALIGN(stride, 64); >> +} >> + >> +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int >> size) >> +{ >> + struct drm_i915_private *i915 = to_i915(drm); >> + >> + /* Skip stolen on MTL as Wa_22018444074 mitigation. */ >> + if (IS_METEORLAKE(i915)) >> + return false; >> + >> + /* >> + * If the FB is too big, just don't use it since fbdev is not very >> + * important and we should probably use that space with FBC or other >> + * features. >> + */ >> + return i915->dsm.usable_size >= size * 2; >> +} >> + >> +static struct drm_gem_object *i915_bo_fbdev_create(struct drm_device *drm, >> int size) >> +{ >> + struct drm_i915_private *i915 = to_i915(drm); > > Can we add same trick for i915_bo_fbdev_create() as we are doing > with i915_bo_fbdev_prefer_stolen() in patch [4/5]? Or e.g. add a > separate 6th patch for that? Up to patch reordering, of course. > >> + struct drm_i915_gem_object *obj; >> + >> + obj = ERR_PTR(-ENODEV); >> + if (HAS_LMEM(i915)) { >> + obj = i915_gem_object_create_lmem(i915, size, >> + I915_BO_ALLOC_CONTIGUOUS | >> + I915_BO_ALLOC_USER); >> + } else { >> + if (i915_bo_fbdev_prefer_stolen(drm, size)) >> + obj = i915_gem_object_create_stolen(i915, size); >> + else >> + drm_info(drm, "Allocating fbdev: Stolen memory not >> preferred.\n"); >> + >> + if (IS_ERR(obj)) >> + obj = i915_gem_object_create_shmem(i915, size); >> + } >> + >> + if (IS_ERR(obj)) { >> + drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + return &obj->base; >> +} >> + >> +static void i915_bo_fbdev_destroy(struct drm_gem_object *obj) >> +{ >> + drm_gem_object_put(obj); >> +} >> + >> +static int i915_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct >> fb_info *info, >> + struct i915_vma *vma) >> +{ >> + struct drm_i915_private *i915 = to_i915(_obj->dev); >> + struct drm_i915_gem_object *obj = to_intel_bo(_obj); >> + struct i915_gem_ww_ctx ww; >> + void __iomem *vaddr; >> + int ret; >> + >> + if (i915_gem_object_is_lmem(obj)) { >> + struct intel_memory_region *mem = obj->mm.region; >> + >> + /* Use fbdev's framebuffer from lmem for discrete */ >> + info->fix.smem_start = >> + (unsigned long)(mem->io.start + >> + i915_gem_object_get_dma_address(obj, >> 0) - >> + mem->region.start); >> + info->fix.smem_len = obj->base.size; >> + } else { >> + struct i915_ggtt *ggtt = to_gt(i915)->ggtt; >> + >> + /* Our framebuffer is the entirety of fbdev's system memory >> */ >> + info->fix.smem_start = >> + (unsigned long)(ggtt->gmadr.start + >> i915_ggtt_offset(vma)); >> + info->fix.smem_len = vma->size; >> + } >> + >> + for_i915_gem_ww(&ww, ret, false) { >> + ret = i915_gem_object_lock(vma->obj, &ww); >> + >> + if (ret) >> + continue; >> + >> + vaddr = i915_vma_pin_iomap(vma); >> + if (IS_ERR(vaddr)) { >> + drm_err(&i915->drm, >> + "Failed to remap framebuffer into virtual >> memory (%pe)\n", vaddr); >> + ret = PTR_ERR(vaddr); >> + continue; >> + } >> + } >> + >> + if (ret) >> + return ret; >> + >> + info->screen_base = vaddr; >> + info->screen_size = intel_bo_to_drm_bo(obj)->size; >> + >> + return 0; >> +} >> +#endif >> + >> const struct intel_display_bo_interface i915_display_bo_interface = { >> .is_tiled = i915_bo_is_tiled, >> .is_userptr = i915_bo_is_userptr, >> @@ -153,4 +263,10 @@ const struct intel_display_bo_interface >> i915_display_bo_interface = { >> .framebuffer_init = i915_bo_framebuffer_init, >> .framebuffer_fini = i915_bo_framebuffer_fini, >> .framebuffer_lookup = i915_bo_framebuffer_lookup, >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> + .fbdev_create = i915_bo_fbdev_create, >> + .fbdev_destroy = i915_bo_fbdev_destroy, >> + .fbdev_fill_info = i915_bo_fbdev_fill_info, >> + .fbdev_pitch_align = i915_bo_fbdev_pitch_align, >> +#endif >> }; >> diff --git a/drivers/gpu/drm/i915/i915_bo.h >> b/drivers/gpu/drm/i915/i915_bo.h >> index 57255d052dd9..2a0f3050dd42 100644 >> --- a/drivers/gpu/drm/i915/i915_bo.h >> +++ b/drivers/gpu/drm/i915/i915_bo.h >> @@ -4,6 +4,12 @@ >> #ifndef __I915_BO_H__ >> #define __I915_BO_H__ >> >> +#include <linux/types.h> >> + >> +struct drm_device; >> + >> +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int >> size); >> + >> extern const struct intel_display_bo_interface i915_display_bo_interface; >> >> #endif /* __I915_BO_H__ */ >> diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c >> b/drivers/gpu/drm/i915/i915_initial_plane.c >> index 390a9248d631..f4d631a395d0 100644 >> --- a/drivers/gpu/drm/i915/i915_initial_plane.c >> +++ b/drivers/gpu/drm/i915/i915_initial_plane.c >> @@ -9,10 +9,10 @@ >> #include "display/intel_crtc.h" >> #include "display/intel_display_types.h" >> #include "display/intel_fb.h" >> -#include "display/intel_fbdev_fb.h" >> #include "gem/i915_gem_lmem.h" >> #include "gem/i915_gem_region.h" >> >> +#include "i915_bo.h" >> #include "i915_drv.h" >> #include "i915_initial_plane.h" >> >> @@ -118,7 +118,7 @@ initial_plane_vma(struct drm_i915_private *i915, >> if (IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && >> IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && >> mem == i915->mm.stolen_region && >> - !intel_fbdev_fb_prefer_stolen(&i915->drm, size)) { >> + !i915_bo_fbdev_prefer_stolen(&i915->drm, size)) { >> drm_dbg_kms(&i915->drm, "Initial FB size exceeds half of >> stolen, discarding\n"); >> return NULL; >> } >> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile >> index dab979287a96..936eb79e9269 100644 >> --- a/drivers/gpu/drm/xe/Makefile >> +++ b/drivers/gpu/drm/xe/Makefile >> @@ -211,7 +211,6 @@ $(obj)/i915-display/%.o: >> $(srctree)/drivers/gpu/drm/i915/display/%.c FORCE >> >> # Display code specific to xe >> xe-$(CONFIG_DRM_XE_DISPLAY) += \ >> - display/intel_fbdev_fb.o \ >> display/xe_display.o \ >> display/xe_display_bo.o \ >> display/xe_display_pcode.o \ >> diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> deleted file mode 100644 >> index 2ad5e5a79287..000000000000 >> --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> +++ /dev/null >> @@ -1,116 +0,0 @@ >> -/* SPDX-License-Identifier: MIT */ >> -/* >> - * Copyright © 2023 Intel Corporation >> - */ >> - >> -#include <linux/fb.h> >> - >> -#include "intel_fbdev_fb.h" >> -#include "xe_bo.h" >> -#include "xe_ttm_stolen_mgr.h" >> -#include "xe_wa.h" >> - >> -#include <generated/xe_device_wa_oob.h> >> - >> -/* >> - * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride >> - * alignment. The same 64 as i915 uses should be fine, and we shouldn't >> need to >> - * have driver specific values. However, dropping the stride alignment to >> 64 >> - * leads to underflowing the bo pin count in the atomic cleanup work. >> - */ >> -u32 intel_fbdev_fb_pitch_align(u32 stride) >> -{ >> - return ALIGN(stride, XE_PAGE_SIZE); >> -} >> - >> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int >> size) >> -{ >> - struct xe_device *xe = to_xe_device(drm); >> - struct ttm_resource_manager *stolen; >> - >> - stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); >> - if (!stolen) >> - return false; >> - >> - if (IS_DGFX(xe)) >> - return false; >> - >> - if (XE_DEVICE_WA(xe, 22019338487_display)) >> - return false; >> - >> - /* >> - * If the FB is too big, just don't use it since fbdev is not very >> - * important and we should probably use that space with FBC or other >> - * features. >> - */ >> - return stolen->size >= size * 2; >> -} >> - >> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, >> int size) >> -{ >> - struct xe_device *xe = to_xe_device(drm); >> - struct xe_bo *obj; >> - >> - obj = ERR_PTR(-ENODEV); >> - >> - if (intel_fbdev_fb_prefer_stolen(drm, size)) { >> - obj = xe_bo_create_pin_map_novm(xe, >> xe_device_get_root_tile(xe), >> - size, >> - ttm_bo_type_kernel, >> XE_BO_FLAG_SCANOUT | >> - XE_BO_FLAG_STOLEN | >> - XE_BO_FLAG_GGTT, false); >> - if (!IS_ERR(obj)) >> - drm_info(&xe->drm, "Allocated fbdev into stolen\n"); >> - else >> - drm_info(&xe->drm, "Allocated fbdev into stolen >> failed: %li\n", PTR_ERR(obj)); >> - } else { >> - drm_info(&xe->drm, "Allocating fbdev: Stolen memory not >> preferred.\n"); >> - } >> - >> - if (IS_ERR(obj)) { >> - obj = xe_bo_create_pin_map_novm(xe, >> xe_device_get_root_tile(xe), size, >> - ttm_bo_type_kernel, >> XE_BO_FLAG_SCANOUT | >> - >> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >> - XE_BO_FLAG_GGTT, false); >> - } >> - >> - if (IS_ERR(obj)) { >> - drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", >> obj); >> - return ERR_PTR(-ENOMEM); >> - } >> - >> - return &obj->ttm.base; >> -} >> - >> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) >> -{ >> - xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); >> -} >> - >> -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info >> *info, >> - struct i915_vma *vma) >> -{ >> - struct xe_bo *obj = gem_to_xe_bo(_obj); >> - struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); >> - >> - if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { >> - if (obj->flags & XE_BO_FLAG_STOLEN) >> - info->fix.smem_start = xe_ttm_stolen_io_offset(obj, >> 0); >> - else >> - info->fix.smem_start = >> - pci_resource_start(pdev, 2) + >> - xe_bo_addr(obj, 0, XE_PAGE_SIZE); >> - >> - info->fix.smem_len = obj->ttm.base.size; >> - } else { >> - /* XXX: Pure fiction, as the BO may not be physically >> accessible.. */ >> - info->fix.smem_start = 0; >> - info->fix.smem_len = obj->ttm.base.size; >> - } >> - XE_WARN_ON(iosys_map_is_null(&obj->vmap)); >> - >> - info->screen_base = obj->vmap.vaddr_iomem; >> - info->screen_size = obj->ttm.base.size; >> - >> - return 0; >> -} >> diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c >> b/drivers/gpu/drm/xe/display/xe_display_bo.c >> index a689f71e7b14..10436edecc35 100644 >> --- a/drivers/gpu/drm/xe/display/xe_display_bo.c >> +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c >> @@ -1,6 +1,8 @@ >> // SPDX-License-Identifier: MIT >> /* Copyright © 2024 Intel Corporation */ >> >> +#include <linux/fb.h> >> + >> #include <drm/drm_gem.h> >> #include <drm/intel/display_parent_interface.h> >> >> @@ -8,6 +10,10 @@ >> #include "xe_bo.h" >> #include "xe_display_bo.h" >> #include "xe_pxp.h" >> +#include "xe_ttm_stolen_mgr.h" >> +#include "xe_wa.h" >> + >> +#include <generated/xe_device_wa_oob.h> >> >> static bool xe_display_bo_is_protected(struct drm_gem_object *obj) >> { >> @@ -101,6 +107,111 @@ xe_display_bo_framebuffer_lookup(struct drm_device >> *drm, >> return gem; >> } >> >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> +/* >> + * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride >> + * alignment. The same 64 as i915 uses should be fine, and we shouldn't >> need to >> + * have driver specific values. However, dropping the stride alignment to >> 64 >> + * leads to underflowing the bo pin count in the atomic cleanup work. >> + */ >> +static u32 xe_display_bo_fbdev_pitch_align(u32 stride) >> +{ >> + return ALIGN(stride, XE_PAGE_SIZE); >> +} >> + >> +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned >> int size) >> +{ >> + struct xe_device *xe = to_xe_device(drm); >> + struct ttm_resource_manager *stolen; >> + >> + stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); >> + if (!stolen) >> + return false; >> + >> + if (IS_DGFX(xe)) >> + return false; >> + >> + if (XE_DEVICE_WA(xe, 22019338487_display)) >> + return false; >> + >> + /* >> + * If the FB is too big, just don't use it since fbdev is not very >> + * important and we should probably use that space with FBC or other >> + * features. >> + */ >> + return stolen->size >= size * 2; >> +} >> + >> +static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device >> *drm, int size) >> +{ >> + struct xe_device *xe = to_xe_device(drm); > > Same question here, but adding it in patch [5/5] or as new 7th patch. Up > to patch reordering of course. > Please append my original message by: Reviewed-by: Michał Grzelak <michal.grzelak@intel.com> BR, Michał >> + struct xe_bo *obj; >> + >> + obj = ERR_PTR(-ENODEV); >> + >> + if (xe_display_bo_fbdev_prefer_stolen(drm, size)) { >> + obj = xe_bo_create_pin_map_novm(xe, >> xe_device_get_root_tile(xe), >> + size, >> + ttm_bo_type_kernel, >> XE_BO_FLAG_SCANOUT | >> + XE_BO_FLAG_STOLEN | >> + XE_BO_FLAG_GGTT, false); >> + if (!IS_ERR(obj)) >> + drm_info(&xe->drm, "Allocated fbdev into stolen\n"); >> + else >> + drm_info(&xe->drm, "Allocated fbdev into stolen >> failed: %li\n", PTR_ERR(obj)); >> + } else { >> + drm_info(&xe->drm, "Allocating fbdev: Stolen memory not >> preferred.\n"); >> + } >> + >> + if (IS_ERR(obj)) { >> + obj = xe_bo_create_pin_map_novm(xe, >> xe_device_get_root_tile(xe), size, >> + ttm_bo_type_kernel, >> XE_BO_FLAG_SCANOUT | >> + >> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >> + XE_BO_FLAG_GGTT, false); >> + } >> + >> + if (IS_ERR(obj)) { >> + drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", >> obj); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + return &obj->ttm.base; >> +} >> + >> +static void xe_display_bo_fbdev_destroy(struct drm_gem_object *obj) >> +{ >> + xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); >> +} >> + >> +static int xe_display_bo_fbdev_fill_info(struct drm_gem_object *_obj, >> struct fb_info *info, >> + struct i915_vma *vma) >> +{ >> + struct xe_bo *obj = gem_to_xe_bo(_obj); >> + struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); >> + >> + if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { >> + if (obj->flags & XE_BO_FLAG_STOLEN) >> + info->fix.smem_start = xe_ttm_stolen_io_offset(obj, >> 0); >> + else >> + info->fix.smem_start = >> + pci_resource_start(pdev, 2) + >> + xe_bo_addr(obj, 0, XE_PAGE_SIZE); >> + >> + info->fix.smem_len = obj->ttm.base.size; >> + } else { >> + /* XXX: Pure fiction, as the BO may not be physically >> accessible.. */ >> + info->fix.smem_start = 0; >> + info->fix.smem_len = obj->ttm.base.size; >> + } >> + XE_WARN_ON(iosys_map_is_null(&obj->vmap)); >> + >> + info->screen_base = obj->vmap.vaddr_iomem; >> + info->screen_size = obj->ttm.base.size; >> + >> + return 0; >> +} >> +#endif >> + >> const struct intel_display_bo_interface xe_display_bo_interface = { >> .is_protected = xe_display_bo_is_protected, >> .key_check = xe_pxp_obj_key_check, >> @@ -109,4 +220,10 @@ const struct intel_display_bo_interface >> xe_display_bo_interface = { >> .framebuffer_init = xe_display_bo_framebuffer_init, >> .framebuffer_fini = xe_display_bo_framebuffer_fini, >> .framebuffer_lookup = xe_display_bo_framebuffer_lookup, >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> + .fbdev_create = xe_display_bo_fbdev_create, >> + .fbdev_destroy = xe_display_bo_fbdev_destroy, >> + .fbdev_fill_info = xe_display_bo_fbdev_fill_info, >> + .fbdev_pitch_align = xe_display_bo_fbdev_pitch_align, >> +#endif >> }; >> diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.h >> b/drivers/gpu/drm/xe/display/xe_display_bo.h >> index 6879c104b0b1..8980e6ecf54a 100644 >> --- a/drivers/gpu/drm/xe/display/xe_display_bo.h >> +++ b/drivers/gpu/drm/xe/display/xe_display_bo.h >> @@ -4,6 +4,12 @@ >> #ifndef __XE_DISPLAY_BO_H__ >> #define __XE_DISPLAY_BO_H__ >> >> +#include <linux/types.h> >> + >> +struct drm_device; >> + >> +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned >> int size); >> + >> extern const struct intel_display_bo_interface xe_display_bo_interface; >> >> #endif >> diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c >> b/drivers/gpu/drm/xe/display/xe_initial_plane.c >> index 730c6dc49522..6e0a22429184 100644 >> --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c >> +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c >> @@ -12,8 +12,8 @@ >> #include "intel_display_types.h" >> #include "intel_fb.h" >> #include "intel_fb_pin.h" >> -#include "intel_fbdev_fb.h" >> #include "xe_bo.h" >> +#include "xe_display_bo.h" >> #include "xe_display_vma.h" >> #include "xe_ggtt.h" >> #include "xe_mmio.h" >> @@ -87,7 +87,7 @@ initial_plane_bo(struct xe_device *xe, >> >> if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && >> IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && >> - !intel_fbdev_fb_prefer_stolen(&xe->drm, >> plane_config->size)) { >> + !xe_display_bo_fbdev_prefer_stolen(&xe->drm, >> plane_config->size)) { >> drm_info(&xe->drm, "Initial FB size exceeds half of >> stolen, discarding\n"); >> return NULL; >> } >> diff --git a/include/drm/intel/display_parent_interface.h >> b/include/drm/intel/display_parent_interface.h >> index 97ec94a2e749..2fc1794a3da4 100644 >> --- a/include/drm/intel/display_parent_interface.h >> +++ b/include/drm/intel/display_parent_interface.h >> @@ -15,6 +15,7 @@ struct drm_gem_object; >> struct drm_mode_fb_cmd2; >> struct drm_plane_state; >> struct drm_scanout_buffer; >> +struct fb_info; >> struct i915_vma; >> struct intel_dpt; >> struct intel_dsb_buffer; >> @@ -43,6 +44,12 @@ struct intel_display_bo_interface { >> struct drm_gem_object *(*framebuffer_lookup)(struct drm_device *drm, >> struct drm_file *filp, >> const struct >> drm_mode_fb_cmd2 *user_mode_cmd); >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> + struct drm_gem_object *(*fbdev_create)(struct drm_device *drm, int >> size); >> + void (*fbdev_destroy)(struct drm_gem_object *obj); >> + int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info >> *info, struct i915_vma *vma); >> + u32 (*fbdev_pitch_align)(u32 stride); >> +#endif >> }; >> >> struct intel_display_dpt_interface { >> -- >> 2.47.3 >> > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/5] drm/{i915, xe}: move fbdev fb calls to parent interface 2026-03-24 23:42 ` Michał Grzelak 2026-03-24 23:51 ` Michał Grzelak @ 2026-03-25 8:13 ` Jani Nikula 2026-03-25 9:32 ` [PATCH 3/5] drm/{i915,xe}: " Michał Grzelak 1 sibling, 1 reply; 18+ messages in thread From: Jani Nikula @ 2026-03-25 8:13 UTC (permalink / raw) To: Michał Grzelak Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org On Wed, 25 Mar 2026, Michał Grzelak <michal.grzelak@intel.com> wrote: > On Wed, 18 Mar 2026, Jani Nikula wrote: >> Move the driver specific fbdev fb calls to the display parent >> interface. Reuse the existing struct intel_display_bo_interface, as this >> is mostly about gem objects. >> >> Put everything behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) to catch >> configuration issues at build or link time. >> >> Signed-off-by: Jani Nikula <jani.nikula@intel.com> >> --- >> drivers/gpu/drm/i915/Makefile | 3 +- >> drivers/gpu/drm/i915/display/intel_bo.c | 27 ++++ >> drivers/gpu/drm/i915/display/intel_bo.h | 8 ++ >> drivers/gpu/drm/i915/display/intel_fbdev.c | 14 +-- >> drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 118 ------------------ >> drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 24 ---- >> drivers/gpu/drm/i915/i915_bo.c | 116 +++++++++++++++++ >> drivers/gpu/drm/i915/i915_bo.h | 6 + >> drivers/gpu/drm/i915/i915_initial_plane.c | 4 +- >> drivers/gpu/drm/xe/Makefile | 1 - >> drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 116 ----------------- >> drivers/gpu/drm/xe/display/xe_display_bo.c | 117 +++++++++++++++++ >> drivers/gpu/drm/xe/display/xe_display_bo.h | 6 + >> drivers/gpu/drm/xe/display/xe_initial_plane.c | 4 +- >> include/drm/intel/display_parent_interface.h | 7 ++ >> 15 files changed, 299 insertions(+), 272 deletions(-) >> delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> delete mode 100644 drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> >> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile >> index be976a90c5a6..026614d74cc4 100644 >> --- a/drivers/gpu/drm/i915/Makefile >> +++ b/drivers/gpu/drm/i915/Makefile >> @@ -324,8 +324,7 @@ i915-$(CONFIG_ACPI) += \ >> display/intel_acpi.o \ >> display/intel_opregion.o >> i915-$(CONFIG_DRM_FBDEV_EMULATION) += \ >> - display/intel_fbdev.o \ >> - display/intel_fbdev_fb.o >> + display/intel_fbdev.o >> i915-$(CONFIG_DEBUG_FS) += \ >> display/intel_display_debugfs.o \ >> display/intel_display_debugfs_params.o \ >> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c >> index 3b82d38a0504..8ecdbb7e39f3 100644 >> --- a/drivers/gpu/drm/i915/display/intel_bo.c >> +++ b/drivers/gpu/drm/i915/display/intel_bo.c >> @@ -85,3 +85,30 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display >> { >> return display->parent->bo->framebuffer_lookup(display->drm, filp, user_mode_cmd); >> } >> + >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride) >> +{ >> + return display->parent->bo->fbdev_pitch_align(stride); >> +} >> + >> +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size) >> +{ >> + return display->parent->bo->fbdev_create(display->drm, size); >> +} >> + >> +void intel_bo_fbdev_destroy(struct drm_gem_object *obj) >> +{ >> + struct intel_display *display = to_intel_display(obj->dev); >> + >> + display->parent->bo->fbdev_destroy(obj); >> +} >> + >> +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, >> + struct i915_vma *vma) >> +{ >> + struct intel_display *display = to_intel_display(obj->dev); >> + >> + return display->parent->bo->fbdev_fill_info(obj, info, vma); >> +} >> +#endif >> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h >> index aec188c706c2..348f7fa66960 100644 >> --- a/drivers/gpu/drm/i915/display/intel_bo.h >> +++ b/drivers/gpu/drm/i915/display/intel_bo.h >> @@ -10,6 +10,8 @@ struct drm_file; >> struct drm_gem_object; >> struct drm_mode_fb_cmd2; >> struct drm_scanout_buffer; >> +struct fb_info; >> +struct i915_vma; >> struct intel_display; >> struct intel_framebuffer; >> struct seq_file; >> @@ -31,4 +33,10 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display >> struct drm_file *filp, >> const struct drm_mode_fb_cmd2 *user_mode_cmd); >> >> +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride); >> +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size); >> +void intel_bo_fbdev_destroy(struct drm_gem_object *obj); >> +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, >> + struct i915_vma *vma); >> + >> #endif /* __INTEL_BO__ */ >> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c >> index 6401aaaba199..14ac01c1b3eb 100644 >> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c >> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c >> @@ -54,7 +54,6 @@ >> #include "intel_fb.h" >> #include "intel_fb_pin.h" >> #include "intel_fbdev.h" >> -#include "intel_fbdev_fb.h" >> #include "intel_frontbuffer.h" >> >> struct intel_fbdev { >> @@ -204,7 +203,8 @@ static const struct drm_fb_helper_funcs intel_fb_helper_funcs = { >> .fb_set_suspend = intelfb_set_suspend, >> }; >> >> -static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, >> +static void intel_fbdev_fill_mode_cmd(struct intel_display *display, >> + struct drm_fb_helper_surface_size *sizes, >> struct drm_mode_fb_cmd2 *mode_cmd) >> { >> /* we don't do packed 24bpp */ >> @@ -215,7 +215,7 @@ static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, >> mode_cmd->width = sizes->surface_width; >> mode_cmd->height = sizes->surface_height; >> >> - mode_cmd->pitches[0] = intel_fbdev_fb_pitch_align(mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); >> + mode_cmd->pitches[0] = intel_bo_fbdev_pitch_align(display, mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); >> mode_cmd->pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, >> sizes->surface_depth); >> mode_cmd->modifier[0] = DRM_FORMAT_MOD_LINEAR; >> @@ -230,12 +230,12 @@ __intel_fbdev_fb_alloc(struct intel_display *display, >> struct drm_gem_object *obj; >> int size; >> >> - intel_fbdev_fill_mode_cmd(sizes, &mode_cmd); >> + intel_fbdev_fill_mode_cmd(display, sizes, &mode_cmd); >> >> size = mode_cmd.pitches[0] * mode_cmd.height; >> size = PAGE_ALIGN(size); >> >> - obj = intel_fbdev_fb_bo_create(display->drm, size); >> + obj = intel_bo_fbdev_create(display, size); >> if (IS_ERR(obj)) { >> fb = ERR_CAST(obj); >> goto err; >> @@ -247,7 +247,7 @@ __intel_fbdev_fb_alloc(struct intel_display *display, >> mode_cmd.modifier[0]), >> &mode_cmd); >> if (IS_ERR(fb)) { >> - intel_fbdev_fb_bo_destroy(obj); >> + intel_bo_fbdev_destroy(obj); >> goto err; >> } >> >> @@ -327,7 +327,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, >> >> obj = intel_fb_bo(&fb->base); >> >> - ret = intel_fbdev_fb_fill_info(obj, info, vma); >> + ret = intel_bo_fbdev_fill_info(obj, info, vma); >> if (ret) >> goto out_unpin; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> deleted file mode 100644 >> index a696ce42d10b..000000000000 >> --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >> +++ /dev/null >> @@ -1,118 +0,0 @@ >> -/* SPDX-License-Identifier: MIT */ >> -/* >> - * Copyright © 2023 Intel Corporation >> - */ >> - >> -#include <linux/fb.h> >> - >> -#include <drm/drm_print.h> >> - >> -#include "gem/i915_gem_lmem.h" >> - >> -#include "i915_drv.h" >> -#include "intel_fbdev_fb.h" >> - >> -u32 intel_fbdev_fb_pitch_align(u32 stride) >> -{ >> - return ALIGN(stride, 64); >> -} >> - >> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) >> -{ >> - struct drm_i915_private *i915 = to_i915(drm); >> - >> - /* Skip stolen on MTL as Wa_22018444074 mitigation. */ >> - if (IS_METEORLAKE(i915)) >> - return false; >> - >> - /* >> - * If the FB is too big, just don't use it since fbdev is not very >> - * important and we should probably use that space with FBC or other >> - * features. >> - */ >> - return i915->dsm.usable_size >= size * 2; >> -} >> - >> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) >> -{ >> - struct drm_i915_private *i915 = to_i915(drm); >> - struct drm_i915_gem_object *obj; >> - >> - obj = ERR_PTR(-ENODEV); >> - if (HAS_LMEM(i915)) { >> - obj = i915_gem_object_create_lmem(i915, size, >> - I915_BO_ALLOC_CONTIGUOUS | >> - I915_BO_ALLOC_USER); >> - } else { >> - if (intel_fbdev_fb_prefer_stolen(drm, size)) >> - obj = i915_gem_object_create_stolen(i915, size); >> - else >> - drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); >> - >> - if (IS_ERR(obj)) >> - obj = i915_gem_object_create_shmem(i915, size); >> - } >> - >> - if (IS_ERR(obj)) { >> - drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); >> - return ERR_PTR(-ENOMEM); >> - } >> - >> - return &obj->base; >> -} >> - >> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) >> -{ >> - drm_gem_object_put(obj); >> -} >> - >> -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >> - struct i915_vma *vma) >> -{ >> - struct drm_i915_private *i915 = to_i915(_obj->dev); >> - struct drm_i915_gem_object *obj = to_intel_bo(_obj); >> - struct i915_gem_ww_ctx ww; >> - void __iomem *vaddr; >> - int ret; >> - >> - if (i915_gem_object_is_lmem(obj)) { >> - struct intel_memory_region *mem = obj->mm.region; >> - >> - /* Use fbdev's framebuffer from lmem for discrete */ >> - info->fix.smem_start = >> - (unsigned long)(mem->io.start + >> - i915_gem_object_get_dma_address(obj, 0) - >> - mem->region.start); >> - info->fix.smem_len = obj->base.size; >> - } else { >> - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; >> - >> - /* Our framebuffer is the entirety of fbdev's system memory */ >> - info->fix.smem_start = >> - (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); >> - info->fix.smem_len = vma->size; >> - } >> - >> - for_i915_gem_ww(&ww, ret, false) { >> - ret = i915_gem_object_lock(vma->obj, &ww); >> - >> - if (ret) >> - continue; >> - >> - vaddr = i915_vma_pin_iomap(vma); >> - if (IS_ERR(vaddr)) { >> - drm_err(&i915->drm, >> - "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); >> - ret = PTR_ERR(vaddr); >> - continue; >> - } >> - } >> - >> - if (ret) >> - return ret; >> - >> - info->screen_base = vaddr; >> - info->screen_size = intel_bo_to_drm_bo(obj)->size; >> - >> - return 0; >> -} >> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> deleted file mode 100644 >> index ddba45e9839d..000000000000 >> --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >> +++ /dev/null >> @@ -1,24 +0,0 @@ >> -/* SPDX-License-Identifier: MIT */ >> -/* >> - * Copyright © 2023 Intel Corporation >> - */ >> - >> -#ifndef __INTEL_FBDEV_FB_H__ >> -#define __INTEL_FBDEV_FB_H__ >> - >> -#include <linux/types.h> >> - >> -struct drm_device; >> -struct drm_gem_object; >> -struct drm_mode_fb_cmd2; >> -struct fb_info; >> -struct i915_vma; >> - >> -u32 intel_fbdev_fb_pitch_align(u32 stride); >> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size); >> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj); >> -int intel_fbdev_fb_fill_info(struct drm_gem_object *obj, struct fb_info *info, >> - struct i915_vma *vma); >> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size); >> - >> -#endif >> diff --git a/drivers/gpu/drm/i915/i915_bo.c b/drivers/gpu/drm/i915/i915_bo.c >> index 1789f7cab05c..7e38d002478e 100644 >> --- a/drivers/gpu/drm/i915/i915_bo.c >> +++ b/drivers/gpu/drm/i915/i915_bo.c >> @@ -1,11 +1,14 @@ >> // SPDX-License-Identifier: MIT >> /* Copyright © 2024 Intel Corporation */ >> >> +#include <linux/fb.h> >> + >> #include <drm/drm_panic.h> >> #include <drm/drm_print.h> >> #include <drm/intel/display_parent_interface.h> >> >> #include "display/intel_fb.h" >> +#include "gem/i915_gem_lmem.h" >> #include "gem/i915_gem_mman.h" >> #include "gem/i915_gem_object.h" >> #include "gem/i915_gem_object_frontbuffer.h" >> @@ -141,6 +144,113 @@ i915_bo_framebuffer_lookup(struct drm_device *drm, >> return intel_bo_to_drm_bo(obj); >> } >> >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> +static u32 i915_bo_fbdev_pitch_align(u32 stride) >> +{ >> + return ALIGN(stride, 64); >> +} >> + >> +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) >> +{ >> + struct drm_i915_private *i915 = to_i915(drm); >> + >> + /* Skip stolen on MTL as Wa_22018444074 mitigation. */ >> + if (IS_METEORLAKE(i915)) >> + return false; >> + >> + /* >> + * If the FB is too big, just don't use it since fbdev is not very >> + * important and we should probably use that space with FBC or other >> + * features. >> + */ >> + return i915->dsm.usable_size >= size * 2; >> +} >> + >> +static struct drm_gem_object *i915_bo_fbdev_create(struct drm_device *drm, int size) >> +{ >> + struct drm_i915_private *i915 = to_i915(drm); > > Can we add same trick for i915_bo_fbdev_create() as we are doing > with i915_bo_fbdev_prefer_stolen() in patch [4/5]? Or e.g. add a > separate 6th patch for that? Up to patch reordering, of course. I don't know what you mean. BR, Jani. > >> + struct drm_i915_gem_object *obj; >> + >> + obj = ERR_PTR(-ENODEV); >> + if (HAS_LMEM(i915)) { >> + obj = i915_gem_object_create_lmem(i915, size, >> + I915_BO_ALLOC_CONTIGUOUS | >> + I915_BO_ALLOC_USER); >> + } else { >> + if (i915_bo_fbdev_prefer_stolen(drm, size)) >> + obj = i915_gem_object_create_stolen(i915, size); >> + else >> + drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); >> + >> + if (IS_ERR(obj)) >> + obj = i915_gem_object_create_shmem(i915, size); >> + } >> + >> + if (IS_ERR(obj)) { >> + drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + return &obj->base; >> +} >> + >> +static void i915_bo_fbdev_destroy(struct drm_gem_object *obj) >> +{ >> + drm_gem_object_put(obj); >> +} >> + >> +static int i915_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >> + struct i915_vma *vma) >> +{ >> + struct drm_i915_private *i915 = to_i915(_obj->dev); >> + struct drm_i915_gem_object *obj = to_intel_bo(_obj); >> + struct i915_gem_ww_ctx ww; >> + void __iomem *vaddr; >> + int ret; >> + >> + if (i915_gem_object_is_lmem(obj)) { >> + struct intel_memory_region *mem = obj->mm.region; >> + >> + /* Use fbdev's framebuffer from lmem for discrete */ >> + info->fix.smem_start = >> + (unsigned long)(mem->io.start + >> + i915_gem_object_get_dma_address(obj, 0) - >> + mem->region.start); >> + info->fix.smem_len = obj->base.size; >> + } else { >> + struct i915_ggtt *ggtt = to_gt(i915)->ggtt; >> + >> + /* Our framebuffer is the entirety of fbdev's system memory */ >> + info->fix.smem_start = >> + (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); >> + info->fix.smem_len = vma->size; >> + } >> + >> + for_i915_gem_ww(&ww, ret, false) { >> + ret = i915_gem_object_lock(vma->obj, &ww); >> + >> + if (ret) >> + continue; >> + >> + vaddr = i915_vma_pin_iomap(vma); >> + if (IS_ERR(vaddr)) { >> + drm_err(&i915->drm, >> + "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); >> + ret = PTR_ERR(vaddr); >> + continue; >> + } >> + } >> + >> + if (ret) >> + return ret; >> + >> + info->screen_base = vaddr; >> + info->screen_size = intel_bo_to_drm_bo(obj)->size; >> + >> + return 0; >> +} >> +#endif >> + >> const struct intel_display_bo_interface i915_display_bo_interface = { >> .is_tiled = i915_bo_is_tiled, >> .is_userptr = i915_bo_is_userptr, >> @@ -153,4 +263,10 @@ const struct intel_display_bo_interface i915_display_bo_interface = { >> .framebuffer_init = i915_bo_framebuffer_init, >> .framebuffer_fini = i915_bo_framebuffer_fini, >> .framebuffer_lookup = i915_bo_framebuffer_lookup, >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> + .fbdev_create = i915_bo_fbdev_create, >> + .fbdev_destroy = i915_bo_fbdev_destroy, >> + .fbdev_fill_info = i915_bo_fbdev_fill_info, >> + .fbdev_pitch_align = i915_bo_fbdev_pitch_align, >> +#endif >> }; >> diff --git a/drivers/gpu/drm/i915/i915_bo.h b/drivers/gpu/drm/i915/i915_bo.h >> index 57255d052dd9..2a0f3050dd42 100644 >> --- a/drivers/gpu/drm/i915/i915_bo.h >> +++ b/drivers/gpu/drm/i915/i915_bo.h >> @@ -4,6 +4,12 @@ >> #ifndef __I915_BO_H__ >> #define __I915_BO_H__ >> >> +#include <linux/types.h> >> + >> +struct drm_device; >> + >> +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); >> + >> extern const struct intel_display_bo_interface i915_display_bo_interface; >> >> #endif /* __I915_BO_H__ */ >> diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c >> index 390a9248d631..f4d631a395d0 100644 >> --- a/drivers/gpu/drm/i915/i915_initial_plane.c >> +++ b/drivers/gpu/drm/i915/i915_initial_plane.c >> @@ -9,10 +9,10 @@ >> #include "display/intel_crtc.h" >> #include "display/intel_display_types.h" >> #include "display/intel_fb.h" >> -#include "display/intel_fbdev_fb.h" >> #include "gem/i915_gem_lmem.h" >> #include "gem/i915_gem_region.h" >> >> +#include "i915_bo.h" >> #include "i915_drv.h" >> #include "i915_initial_plane.h" >> >> @@ -118,7 +118,7 @@ initial_plane_vma(struct drm_i915_private *i915, >> if (IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && >> IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && >> mem == i915->mm.stolen_region && >> - !intel_fbdev_fb_prefer_stolen(&i915->drm, size)) { >> + !i915_bo_fbdev_prefer_stolen(&i915->drm, size)) { >> drm_dbg_kms(&i915->drm, "Initial FB size exceeds half of stolen, discarding\n"); >> return NULL; >> } >> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile >> index dab979287a96..936eb79e9269 100644 >> --- a/drivers/gpu/drm/xe/Makefile >> +++ b/drivers/gpu/drm/xe/Makefile >> @@ -211,7 +211,6 @@ $(obj)/i915-display/%.o: $(srctree)/drivers/gpu/drm/i915/display/%.c FORCE >> >> # Display code specific to xe >> xe-$(CONFIG_DRM_XE_DISPLAY) += \ >> - display/intel_fbdev_fb.o \ >> display/xe_display.o \ >> display/xe_display_bo.o \ >> display/xe_display_pcode.o \ >> diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> deleted file mode 100644 >> index 2ad5e5a79287..000000000000 >> --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >> +++ /dev/null >> @@ -1,116 +0,0 @@ >> -/* SPDX-License-Identifier: MIT */ >> -/* >> - * Copyright © 2023 Intel Corporation >> - */ >> - >> -#include <linux/fb.h> >> - >> -#include "intel_fbdev_fb.h" >> -#include "xe_bo.h" >> -#include "xe_ttm_stolen_mgr.h" >> -#include "xe_wa.h" >> - >> -#include <generated/xe_device_wa_oob.h> >> - >> -/* >> - * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride >> - * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to >> - * have driver specific values. However, dropping the stride alignment to 64 >> - * leads to underflowing the bo pin count in the atomic cleanup work. >> - */ >> -u32 intel_fbdev_fb_pitch_align(u32 stride) >> -{ >> - return ALIGN(stride, XE_PAGE_SIZE); >> -} >> - >> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) >> -{ >> - struct xe_device *xe = to_xe_device(drm); >> - struct ttm_resource_manager *stolen; >> - >> - stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); >> - if (!stolen) >> - return false; >> - >> - if (IS_DGFX(xe)) >> - return false; >> - >> - if (XE_DEVICE_WA(xe, 22019338487_display)) >> - return false; >> - >> - /* >> - * If the FB is too big, just don't use it since fbdev is not very >> - * important and we should probably use that space with FBC or other >> - * features. >> - */ >> - return stolen->size >= size * 2; >> -} >> - >> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) >> -{ >> - struct xe_device *xe = to_xe_device(drm); >> - struct xe_bo *obj; >> - >> - obj = ERR_PTR(-ENODEV); >> - >> - if (intel_fbdev_fb_prefer_stolen(drm, size)) { >> - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), >> - size, >> - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >> - XE_BO_FLAG_STOLEN | >> - XE_BO_FLAG_GGTT, false); >> - if (!IS_ERR(obj)) >> - drm_info(&xe->drm, "Allocated fbdev into stolen\n"); >> - else >> - drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); >> - } else { >> - drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); >> - } >> - >> - if (IS_ERR(obj)) { >> - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, >> - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >> - XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >> - XE_BO_FLAG_GGTT, false); >> - } >> - >> - if (IS_ERR(obj)) { >> - drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); >> - return ERR_PTR(-ENOMEM); >> - } >> - >> - return &obj->ttm.base; >> -} >> - >> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) >> -{ >> - xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); >> -} >> - >> -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >> - struct i915_vma *vma) >> -{ >> - struct xe_bo *obj = gem_to_xe_bo(_obj); >> - struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); >> - >> - if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { >> - if (obj->flags & XE_BO_FLAG_STOLEN) >> - info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); >> - else >> - info->fix.smem_start = >> - pci_resource_start(pdev, 2) + >> - xe_bo_addr(obj, 0, XE_PAGE_SIZE); >> - >> - info->fix.smem_len = obj->ttm.base.size; >> - } else { >> - /* XXX: Pure fiction, as the BO may not be physically accessible.. */ >> - info->fix.smem_start = 0; >> - info->fix.smem_len = obj->ttm.base.size; >> - } >> - XE_WARN_ON(iosys_map_is_null(&obj->vmap)); >> - >> - info->screen_base = obj->vmap.vaddr_iomem; >> - info->screen_size = obj->ttm.base.size; >> - >> - return 0; >> -} >> diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c b/drivers/gpu/drm/xe/display/xe_display_bo.c >> index a689f71e7b14..10436edecc35 100644 >> --- a/drivers/gpu/drm/xe/display/xe_display_bo.c >> +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c >> @@ -1,6 +1,8 @@ >> // SPDX-License-Identifier: MIT >> /* Copyright © 2024 Intel Corporation */ >> >> +#include <linux/fb.h> >> + >> #include <drm/drm_gem.h> >> #include <drm/intel/display_parent_interface.h> >> >> @@ -8,6 +10,10 @@ >> #include "xe_bo.h" >> #include "xe_display_bo.h" >> #include "xe_pxp.h" >> +#include "xe_ttm_stolen_mgr.h" >> +#include "xe_wa.h" >> + >> +#include <generated/xe_device_wa_oob.h> >> >> static bool xe_display_bo_is_protected(struct drm_gem_object *obj) >> { >> @@ -101,6 +107,111 @@ xe_display_bo_framebuffer_lookup(struct drm_device *drm, >> return gem; >> } >> >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> +/* >> + * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride >> + * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to >> + * have driver specific values. However, dropping the stride alignment to 64 >> + * leads to underflowing the bo pin count in the atomic cleanup work. >> + */ >> +static u32 xe_display_bo_fbdev_pitch_align(u32 stride) >> +{ >> + return ALIGN(stride, XE_PAGE_SIZE); >> +} >> + >> +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) >> +{ >> + struct xe_device *xe = to_xe_device(drm); >> + struct ttm_resource_manager *stolen; >> + >> + stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); >> + if (!stolen) >> + return false; >> + >> + if (IS_DGFX(xe)) >> + return false; >> + >> + if (XE_DEVICE_WA(xe, 22019338487_display)) >> + return false; >> + >> + /* >> + * If the FB is too big, just don't use it since fbdev is not very >> + * important and we should probably use that space with FBC or other >> + * features. >> + */ >> + return stolen->size >= size * 2; >> +} >> + >> +static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device *drm, int size) >> +{ >> + struct xe_device *xe = to_xe_device(drm); > > Same question here, but adding it in patch [5/5] or as new 7th patch. Up > to patch reordering of course. > > BR, > Michał > >> + struct xe_bo *obj; >> + >> + obj = ERR_PTR(-ENODEV); >> + >> + if (xe_display_bo_fbdev_prefer_stolen(drm, size)) { >> + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), >> + size, >> + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >> + XE_BO_FLAG_STOLEN | >> + XE_BO_FLAG_GGTT, false); >> + if (!IS_ERR(obj)) >> + drm_info(&xe->drm, "Allocated fbdev into stolen\n"); >> + else >> + drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); >> + } else { >> + drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); >> + } >> + >> + if (IS_ERR(obj)) { >> + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, >> + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >> + XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >> + XE_BO_FLAG_GGTT, false); >> + } >> + >> + if (IS_ERR(obj)) { >> + drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + return &obj->ttm.base; >> +} >> + >> +static void xe_display_bo_fbdev_destroy(struct drm_gem_object *obj) >> +{ >> + xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); >> +} >> + >> +static int xe_display_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >> + struct i915_vma *vma) >> +{ >> + struct xe_bo *obj = gem_to_xe_bo(_obj); >> + struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); >> + >> + if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { >> + if (obj->flags & XE_BO_FLAG_STOLEN) >> + info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); >> + else >> + info->fix.smem_start = >> + pci_resource_start(pdev, 2) + >> + xe_bo_addr(obj, 0, XE_PAGE_SIZE); >> + >> + info->fix.smem_len = obj->ttm.base.size; >> + } else { >> + /* XXX: Pure fiction, as the BO may not be physically accessible.. */ >> + info->fix.smem_start = 0; >> + info->fix.smem_len = obj->ttm.base.size; >> + } >> + XE_WARN_ON(iosys_map_is_null(&obj->vmap)); >> + >> + info->screen_base = obj->vmap.vaddr_iomem; >> + info->screen_size = obj->ttm.base.size; >> + >> + return 0; >> +} >> +#endif >> + >> const struct intel_display_bo_interface xe_display_bo_interface = { >> .is_protected = xe_display_bo_is_protected, >> .key_check = xe_pxp_obj_key_check, >> @@ -109,4 +220,10 @@ const struct intel_display_bo_interface xe_display_bo_interface = { >> .framebuffer_init = xe_display_bo_framebuffer_init, >> .framebuffer_fini = xe_display_bo_framebuffer_fini, >> .framebuffer_lookup = xe_display_bo_framebuffer_lookup, >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> + .fbdev_create = xe_display_bo_fbdev_create, >> + .fbdev_destroy = xe_display_bo_fbdev_destroy, >> + .fbdev_fill_info = xe_display_bo_fbdev_fill_info, >> + .fbdev_pitch_align = xe_display_bo_fbdev_pitch_align, >> +#endif >> }; >> diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.h b/drivers/gpu/drm/xe/display/xe_display_bo.h >> index 6879c104b0b1..8980e6ecf54a 100644 >> --- a/drivers/gpu/drm/xe/display/xe_display_bo.h >> +++ b/drivers/gpu/drm/xe/display/xe_display_bo.h >> @@ -4,6 +4,12 @@ >> #ifndef __XE_DISPLAY_BO_H__ >> #define __XE_DISPLAY_BO_H__ >> >> +#include <linux/types.h> >> + >> +struct drm_device; >> + >> +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); >> + >> extern const struct intel_display_bo_interface xe_display_bo_interface; >> >> #endif >> diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c >> index 730c6dc49522..6e0a22429184 100644 >> --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c >> +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c >> @@ -12,8 +12,8 @@ >> #include "intel_display_types.h" >> #include "intel_fb.h" >> #include "intel_fb_pin.h" >> -#include "intel_fbdev_fb.h" >> #include "xe_bo.h" >> +#include "xe_display_bo.h" >> #include "xe_display_vma.h" >> #include "xe_ggtt.h" >> #include "xe_mmio.h" >> @@ -87,7 +87,7 @@ initial_plane_bo(struct xe_device *xe, >> >> if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && >> IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && >> - !intel_fbdev_fb_prefer_stolen(&xe->drm, plane_config->size)) { >> + !xe_display_bo_fbdev_prefer_stolen(&xe->drm, plane_config->size)) { >> drm_info(&xe->drm, "Initial FB size exceeds half of stolen, discarding\n"); >> return NULL; >> } >> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h >> index 97ec94a2e749..2fc1794a3da4 100644 >> --- a/include/drm/intel/display_parent_interface.h >> +++ b/include/drm/intel/display_parent_interface.h >> @@ -15,6 +15,7 @@ struct drm_gem_object; >> struct drm_mode_fb_cmd2; >> struct drm_plane_state; >> struct drm_scanout_buffer; >> +struct fb_info; >> struct i915_vma; >> struct intel_dpt; >> struct intel_dsb_buffer; >> @@ -43,6 +44,12 @@ struct intel_display_bo_interface { >> struct drm_gem_object *(*framebuffer_lookup)(struct drm_device *drm, >> struct drm_file *filp, >> const struct drm_mode_fb_cmd2 *user_mode_cmd); >> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >> + struct drm_gem_object *(*fbdev_create)(struct drm_device *drm, int size); >> + void (*fbdev_destroy)(struct drm_gem_object *obj); >> + int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info *info, struct i915_vma *vma); >> + u32 (*fbdev_pitch_align)(u32 stride); >> +#endif >> }; >> >> struct intel_display_dpt_interface { >> -- >> 2.47.3 >> >> -- Jani Nikula, Intel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-25 8:13 ` [PATCH 3/5] drm/{i915, xe}: " Jani Nikula @ 2026-03-25 9:32 ` Michał Grzelak 0 siblings, 0 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-25 9:32 UTC (permalink / raw) To: Jani Nikula Cc: Michał Grzelak, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 33456 bytes --] On Wed, 25 Mar 2026, Jani Nikula wrote: > On Wed, 25 Mar 2026, Michał Grzelak <michal.grzelak@intel.com> wrote: >> On Wed, 18 Mar 2026, Jani Nikula wrote: >>> Move the driver specific fbdev fb calls to the display parent >>> interface. Reuse the existing struct intel_display_bo_interface, as this >>> is mostly about gem objects. >>> >>> Put everything behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) to catch >>> configuration issues at build or link time. >>> >>> Signed-off-by: Jani Nikula <jani.nikula@intel.com> >>> --- >>> drivers/gpu/drm/i915/Makefile | 3 +- >>> drivers/gpu/drm/i915/display/intel_bo.c | 27 ++++ >>> drivers/gpu/drm/i915/display/intel_bo.h | 8 ++ >>> drivers/gpu/drm/i915/display/intel_fbdev.c | 14 +-- >>> drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 118 ------------------ >>> drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 24 ---- >>> drivers/gpu/drm/i915/i915_bo.c | 116 +++++++++++++++++ >>> drivers/gpu/drm/i915/i915_bo.h | 6 + >>> drivers/gpu/drm/i915/i915_initial_plane.c | 4 +- >>> drivers/gpu/drm/xe/Makefile | 1 - >>> drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 116 ----------------- >>> drivers/gpu/drm/xe/display/xe_display_bo.c | 117 +++++++++++++++++ >>> drivers/gpu/drm/xe/display/xe_display_bo.h | 6 + >>> drivers/gpu/drm/xe/display/xe_initial_plane.c | 4 +- >>> include/drm/intel/display_parent_interface.h | 7 ++ >>> 15 files changed, 299 insertions(+), 272 deletions(-) >>> delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.c >>> delete mode 100644 drivers/gpu/drm/i915/display/intel_fbdev_fb.h >>> delete mode 100644 drivers/gpu/drm/xe/display/intel_fbdev_fb.c >>> >>> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile >>> index be976a90c5a6..026614d74cc4 100644 >>> --- a/drivers/gpu/drm/i915/Makefile >>> +++ b/drivers/gpu/drm/i915/Makefile >>> @@ -324,8 +324,7 @@ i915-$(CONFIG_ACPI) += \ >>> display/intel_acpi.o \ >>> display/intel_opregion.o >>> i915-$(CONFIG_DRM_FBDEV_EMULATION) += \ >>> - display/intel_fbdev.o \ >>> - display/intel_fbdev_fb.o >>> + display/intel_fbdev.o >>> i915-$(CONFIG_DEBUG_FS) += \ >>> display/intel_display_debugfs.o \ >>> display/intel_display_debugfs_params.o \ >>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c >>> index 3b82d38a0504..8ecdbb7e39f3 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_bo.c >>> +++ b/drivers/gpu/drm/i915/display/intel_bo.c >>> @@ -85,3 +85,30 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display >>> { >>> return display->parent->bo->framebuffer_lookup(display->drm, filp, user_mode_cmd); >>> } >>> + >>> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >>> +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride) >>> +{ >>> + return display->parent->bo->fbdev_pitch_align(stride); >>> +} >>> + >>> +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size) >>> +{ >>> + return display->parent->bo->fbdev_create(display->drm, size); >>> +} >>> + >>> +void intel_bo_fbdev_destroy(struct drm_gem_object *obj) >>> +{ >>> + struct intel_display *display = to_intel_display(obj->dev); >>> + >>> + display->parent->bo->fbdev_destroy(obj); >>> +} >>> + >>> +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, >>> + struct i915_vma *vma) >>> +{ >>> + struct intel_display *display = to_intel_display(obj->dev); >>> + >>> + return display->parent->bo->fbdev_fill_info(obj, info, vma); >>> +} >>> +#endif >>> diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h >>> index aec188c706c2..348f7fa66960 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_bo.h >>> +++ b/drivers/gpu/drm/i915/display/intel_bo.h >>> @@ -10,6 +10,8 @@ struct drm_file; >>> struct drm_gem_object; >>> struct drm_mode_fb_cmd2; >>> struct drm_scanout_buffer; >>> +struct fb_info; >>> +struct i915_vma; >>> struct intel_display; >>> struct intel_framebuffer; >>> struct seq_file; >>> @@ -31,4 +33,10 @@ struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display >>> struct drm_file *filp, >>> const struct drm_mode_fb_cmd2 *user_mode_cmd); >>> >>> +u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride); >>> +struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size); >>> +void intel_bo_fbdev_destroy(struct drm_gem_object *obj); >>> +int intel_bo_fbdev_fill_info(struct drm_gem_object *obj, struct fb_info *info, >>> + struct i915_vma *vma); >>> + >>> #endif /* __INTEL_BO__ */ >>> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c >>> index 6401aaaba199..14ac01c1b3eb 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c >>> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c >>> @@ -54,7 +54,6 @@ >>> #include "intel_fb.h" >>> #include "intel_fb_pin.h" >>> #include "intel_fbdev.h" >>> -#include "intel_fbdev_fb.h" >>> #include "intel_frontbuffer.h" >>> >>> struct intel_fbdev { >>> @@ -204,7 +203,8 @@ static const struct drm_fb_helper_funcs intel_fb_helper_funcs = { >>> .fb_set_suspend = intelfb_set_suspend, >>> }; >>> >>> -static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, >>> +static void intel_fbdev_fill_mode_cmd(struct intel_display *display, >>> + struct drm_fb_helper_surface_size *sizes, >>> struct drm_mode_fb_cmd2 *mode_cmd) >>> { >>> /* we don't do packed 24bpp */ >>> @@ -215,7 +215,7 @@ static void intel_fbdev_fill_mode_cmd(struct drm_fb_helper_surface_size *sizes, >>> mode_cmd->width = sizes->surface_width; >>> mode_cmd->height = sizes->surface_height; >>> >>> - mode_cmd->pitches[0] = intel_fbdev_fb_pitch_align(mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); >>> + mode_cmd->pitches[0] = intel_bo_fbdev_pitch_align(display, mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); >>> mode_cmd->pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, >>> sizes->surface_depth); >>> mode_cmd->modifier[0] = DRM_FORMAT_MOD_LINEAR; >>> @@ -230,12 +230,12 @@ __intel_fbdev_fb_alloc(struct intel_display *display, >>> struct drm_gem_object *obj; >>> int size; >>> >>> - intel_fbdev_fill_mode_cmd(sizes, &mode_cmd); >>> + intel_fbdev_fill_mode_cmd(display, sizes, &mode_cmd); >>> >>> size = mode_cmd.pitches[0] * mode_cmd.height; >>> size = PAGE_ALIGN(size); >>> >>> - obj = intel_fbdev_fb_bo_create(display->drm, size); >>> + obj = intel_bo_fbdev_create(display, size); >>> if (IS_ERR(obj)) { >>> fb = ERR_CAST(obj); >>> goto err; >>> @@ -247,7 +247,7 @@ __intel_fbdev_fb_alloc(struct intel_display *display, >>> mode_cmd.modifier[0]), >>> &mode_cmd); >>> if (IS_ERR(fb)) { >>> - intel_fbdev_fb_bo_destroy(obj); >>> + intel_bo_fbdev_destroy(obj); >>> goto err; >>> } >>> >>> @@ -327,7 +327,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, >>> >>> obj = intel_fb_bo(&fb->base); >>> >>> - ret = intel_fbdev_fb_fill_info(obj, info, vma); >>> + ret = intel_bo_fbdev_fill_info(obj, info, vma); >>> if (ret) >>> goto out_unpin; >>> >>> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >>> deleted file mode 100644 >>> index a696ce42d10b..000000000000 >>> --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c >>> +++ /dev/null >>> @@ -1,118 +0,0 @@ >>> -/* SPDX-License-Identifier: MIT */ >>> -/* >>> - * Copyright © 2023 Intel Corporation >>> - */ >>> - >>> -#include <linux/fb.h> >>> - >>> -#include <drm/drm_print.h> >>> - >>> -#include "gem/i915_gem_lmem.h" >>> - >>> -#include "i915_drv.h" >>> -#include "intel_fbdev_fb.h" >>> - >>> -u32 intel_fbdev_fb_pitch_align(u32 stride) >>> -{ >>> - return ALIGN(stride, 64); >>> -} >>> - >>> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) >>> -{ >>> - struct drm_i915_private *i915 = to_i915(drm); >>> - >>> - /* Skip stolen on MTL as Wa_22018444074 mitigation. */ >>> - if (IS_METEORLAKE(i915)) >>> - return false; >>> - >>> - /* >>> - * If the FB is too big, just don't use it since fbdev is not very >>> - * important and we should probably use that space with FBC or other >>> - * features. >>> - */ >>> - return i915->dsm.usable_size >= size * 2; >>> -} >>> - >>> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) >>> -{ >>> - struct drm_i915_private *i915 = to_i915(drm); >>> - struct drm_i915_gem_object *obj; >>> - >>> - obj = ERR_PTR(-ENODEV); >>> - if (HAS_LMEM(i915)) { >>> - obj = i915_gem_object_create_lmem(i915, size, >>> - I915_BO_ALLOC_CONTIGUOUS | >>> - I915_BO_ALLOC_USER); >>> - } else { >>> - if (intel_fbdev_fb_prefer_stolen(drm, size)) >>> - obj = i915_gem_object_create_stolen(i915, size); >>> - else >>> - drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); >>> - >>> - if (IS_ERR(obj)) >>> - obj = i915_gem_object_create_shmem(i915, size); >>> - } >>> - >>> - if (IS_ERR(obj)) { >>> - drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); >>> - return ERR_PTR(-ENOMEM); >>> - } >>> - >>> - return &obj->base; >>> -} >>> - >>> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) >>> -{ >>> - drm_gem_object_put(obj); >>> -} >>> - >>> -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >>> - struct i915_vma *vma) >>> -{ >>> - struct drm_i915_private *i915 = to_i915(_obj->dev); >>> - struct drm_i915_gem_object *obj = to_intel_bo(_obj); >>> - struct i915_gem_ww_ctx ww; >>> - void __iomem *vaddr; >>> - int ret; >>> - >>> - if (i915_gem_object_is_lmem(obj)) { >>> - struct intel_memory_region *mem = obj->mm.region; >>> - >>> - /* Use fbdev's framebuffer from lmem for discrete */ >>> - info->fix.smem_start = >>> - (unsigned long)(mem->io.start + >>> - i915_gem_object_get_dma_address(obj, 0) - >>> - mem->region.start); >>> - info->fix.smem_len = obj->base.size; >>> - } else { >>> - struct i915_ggtt *ggtt = to_gt(i915)->ggtt; >>> - >>> - /* Our framebuffer is the entirety of fbdev's system memory */ >>> - info->fix.smem_start = >>> - (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); >>> - info->fix.smem_len = vma->size; >>> - } >>> - >>> - for_i915_gem_ww(&ww, ret, false) { >>> - ret = i915_gem_object_lock(vma->obj, &ww); >>> - >>> - if (ret) >>> - continue; >>> - >>> - vaddr = i915_vma_pin_iomap(vma); >>> - if (IS_ERR(vaddr)) { >>> - drm_err(&i915->drm, >>> - "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); >>> - ret = PTR_ERR(vaddr); >>> - continue; >>> - } >>> - } >>> - >>> - if (ret) >>> - return ret; >>> - >>> - info->screen_base = vaddr; >>> - info->screen_size = intel_bo_to_drm_bo(obj)->size; >>> - >>> - return 0; >>> -} >>> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h b/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >>> deleted file mode 100644 >>> index ddba45e9839d..000000000000 >>> --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.h >>> +++ /dev/null >>> @@ -1,24 +0,0 @@ >>> -/* SPDX-License-Identifier: MIT */ >>> -/* >>> - * Copyright © 2023 Intel Corporation >>> - */ >>> - >>> -#ifndef __INTEL_FBDEV_FB_H__ >>> -#define __INTEL_FBDEV_FB_H__ >>> - >>> -#include <linux/types.h> >>> - >>> -struct drm_device; >>> -struct drm_gem_object; >>> -struct drm_mode_fb_cmd2; >>> -struct fb_info; >>> -struct i915_vma; >>> - >>> -u32 intel_fbdev_fb_pitch_align(u32 stride); >>> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size); >>> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj); >>> -int intel_fbdev_fb_fill_info(struct drm_gem_object *obj, struct fb_info *info, >>> - struct i915_vma *vma); >>> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size); >>> - >>> -#endif >>> diff --git a/drivers/gpu/drm/i915/i915_bo.c b/drivers/gpu/drm/i915/i915_bo.c >>> index 1789f7cab05c..7e38d002478e 100644 >>> --- a/drivers/gpu/drm/i915/i915_bo.c >>> +++ b/drivers/gpu/drm/i915/i915_bo.c >>> @@ -1,11 +1,14 @@ >>> // SPDX-License-Identifier: MIT >>> /* Copyright © 2024 Intel Corporation */ >>> >>> +#include <linux/fb.h> >>> + >>> #include <drm/drm_panic.h> >>> #include <drm/drm_print.h> >>> #include <drm/intel/display_parent_interface.h> >>> >>> #include "display/intel_fb.h" >>> +#include "gem/i915_gem_lmem.h" >>> #include "gem/i915_gem_mman.h" >>> #include "gem/i915_gem_object.h" >>> #include "gem/i915_gem_object_frontbuffer.h" >>> @@ -141,6 +144,113 @@ i915_bo_framebuffer_lookup(struct drm_device *drm, >>> return intel_bo_to_drm_bo(obj); >>> } >>> >>> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >>> +static u32 i915_bo_fbdev_pitch_align(u32 stride) >>> +{ >>> + return ALIGN(stride, 64); >>> +} >>> + >>> +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) >>> +{ >>> + struct drm_i915_private *i915 = to_i915(drm); >>> + >>> + /* Skip stolen on MTL as Wa_22018444074 mitigation. */ >>> + if (IS_METEORLAKE(i915)) >>> + return false; >>> + >>> + /* >>> + * If the FB is too big, just don't use it since fbdev is not very >>> + * important and we should probably use that space with FBC or other >>> + * features. >>> + */ >>> + return i915->dsm.usable_size >= size * 2; >>> +} >>> + >>> +static struct drm_gem_object *i915_bo_fbdev_create(struct drm_device *drm, int size) >>> +{ >>> + struct drm_i915_private *i915 = to_i915(drm); >> >> Can we add same trick for i915_bo_fbdev_create() as we are doing >> with i915_bo_fbdev_prefer_stolen() in patch [4/5]? Or e.g. add a >> separate 6th patch for that? Up to patch reordering, of course. > > I don't know what you mean. > In case of xe_*, I was wondering about such 3 hunks: diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c index 8ecdbb7e39f3..9e02910d1e69 100644 --- a/drivers/gpu/drm/i915/display/intel_bo.c +++ b/drivers/gpu/drm/i915/display/intel_bo.c @@ -94,7 +94,9 @@ u32 intel_bo_fbdev_pitch_align(struct intel_display *display, u32 stride) struct drm_gem_object *intel_bo_fbdev_create(struct intel_display *display, int size) { - return display->parent->bo->fbdev_create(display->drm, size); + struct xe_device *xe = to_xe(display->drm); + + return display->parent->bo->fbdev_create(xe, size); } void intel_bo_fbdev_destroy(struct drm_gem_object *obj) diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c b/drivers/gpu/drm/xe/display/xe_display_bo.c index e81f0adac612..25fad685c2a3 100644 --- a/drivers/gpu/drm/xe/display/xe_display_bo.c +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c @@ -141,9 +141,8 @@ bool xe_display_bo_fbdev_prefer_stolen(struct xe_device *xe, unsigned int size) return stolen->size >= size * 2; } -static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device *drm, int size) +static struct drm_gem_object *xe_display_bo_fbdev_create(struct xe_device *xe, int size) { - struct xe_device *xe = to_xe_device(drm); struct xe_bo *obj; obj = ERR_PTR(-ENODEV); diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 2fc1794a3da4..607011b8ba04 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -45,7 +45,7 @@ struct intel_display_bo_interface { struct drm_file *filp, const struct drm_mode_fb_cmd2 *user_mode_cmd); #if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) - struct drm_gem_object *(*fbdev_create)(struct drm_device *drm, int size); + struct drm_gem_object *(*fbdev_create)(struct xe_device *xe, int size); void (*fbdev_destroy)(struct drm_gem_object *obj); int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info *info, struct i915_vma *vma); u32 (*fbdev_pitch_align)(u32 stride); But I missed that we can't do that because we would need to change ->bo->fbdev_create(drm, ...) into either ->bo->fbdev_create(xe, ...) or ->bo->fbdev_create(i915, ...), which in both cases doesn't make sense. So please ignore the comment and keep the R-B. BR, Michał > >> >>> + struct drm_i915_gem_object *obj; >>> + >>> + obj = ERR_PTR(-ENODEV); >>> + if (HAS_LMEM(i915)) { >>> + obj = i915_gem_object_create_lmem(i915, size, >>> + I915_BO_ALLOC_CONTIGUOUS | >>> + I915_BO_ALLOC_USER); >>> + } else { >>> + if (i915_bo_fbdev_prefer_stolen(drm, size)) >>> + obj = i915_gem_object_create_stolen(i915, size); >>> + else >>> + drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); >>> + >>> + if (IS_ERR(obj)) >>> + obj = i915_gem_object_create_shmem(i915, size); >>> + } >>> + >>> + if (IS_ERR(obj)) { >>> + drm_err(drm, "failed to allocate framebuffer (%pe)\n", obj); >>> + return ERR_PTR(-ENOMEM); >>> + } >>> + >>> + return &obj->base; >>> +} >>> + >>> +static void i915_bo_fbdev_destroy(struct drm_gem_object *obj) >>> +{ >>> + drm_gem_object_put(obj); >>> +} >>> + >>> +static int i915_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >>> + struct i915_vma *vma) >>> +{ >>> + struct drm_i915_private *i915 = to_i915(_obj->dev); >>> + struct drm_i915_gem_object *obj = to_intel_bo(_obj); >>> + struct i915_gem_ww_ctx ww; >>> + void __iomem *vaddr; >>> + int ret; >>> + >>> + if (i915_gem_object_is_lmem(obj)) { >>> + struct intel_memory_region *mem = obj->mm.region; >>> + >>> + /* Use fbdev's framebuffer from lmem for discrete */ >>> + info->fix.smem_start = >>> + (unsigned long)(mem->io.start + >>> + i915_gem_object_get_dma_address(obj, 0) - >>> + mem->region.start); >>> + info->fix.smem_len = obj->base.size; >>> + } else { >>> + struct i915_ggtt *ggtt = to_gt(i915)->ggtt; >>> + >>> + /* Our framebuffer is the entirety of fbdev's system memory */ >>> + info->fix.smem_start = >>> + (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma)); >>> + info->fix.smem_len = vma->size; >>> + } >>> + >>> + for_i915_gem_ww(&ww, ret, false) { >>> + ret = i915_gem_object_lock(vma->obj, &ww); >>> + >>> + if (ret) >>> + continue; >>> + >>> + vaddr = i915_vma_pin_iomap(vma); >>> + if (IS_ERR(vaddr)) { >>> + drm_err(&i915->drm, >>> + "Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); >>> + ret = PTR_ERR(vaddr); >>> + continue; >>> + } >>> + } >>> + >>> + if (ret) >>> + return ret; >>> + >>> + info->screen_base = vaddr; >>> + info->screen_size = intel_bo_to_drm_bo(obj)->size; >>> + >>> + return 0; >>> +} >>> +#endif >>> + >>> const struct intel_display_bo_interface i915_display_bo_interface = { >>> .is_tiled = i915_bo_is_tiled, >>> .is_userptr = i915_bo_is_userptr, >>> @@ -153,4 +263,10 @@ const struct intel_display_bo_interface i915_display_bo_interface = { >>> .framebuffer_init = i915_bo_framebuffer_init, >>> .framebuffer_fini = i915_bo_framebuffer_fini, >>> .framebuffer_lookup = i915_bo_framebuffer_lookup, >>> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >>> + .fbdev_create = i915_bo_fbdev_create, >>> + .fbdev_destroy = i915_bo_fbdev_destroy, >>> + .fbdev_fill_info = i915_bo_fbdev_fill_info, >>> + .fbdev_pitch_align = i915_bo_fbdev_pitch_align, >>> +#endif >>> }; >>> diff --git a/drivers/gpu/drm/i915/i915_bo.h b/drivers/gpu/drm/i915/i915_bo.h >>> index 57255d052dd9..2a0f3050dd42 100644 >>> --- a/drivers/gpu/drm/i915/i915_bo.h >>> +++ b/drivers/gpu/drm/i915/i915_bo.h >>> @@ -4,6 +4,12 @@ >>> #ifndef __I915_BO_H__ >>> #define __I915_BO_H__ >>> >>> +#include <linux/types.h> >>> + >>> +struct drm_device; >>> + >>> +bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); >>> + >>> extern const struct intel_display_bo_interface i915_display_bo_interface; >>> >>> #endif /* __I915_BO_H__ */ >>> diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c >>> index 390a9248d631..f4d631a395d0 100644 >>> --- a/drivers/gpu/drm/i915/i915_initial_plane.c >>> +++ b/drivers/gpu/drm/i915/i915_initial_plane.c >>> @@ -9,10 +9,10 @@ >>> #include "display/intel_crtc.h" >>> #include "display/intel_display_types.h" >>> #include "display/intel_fb.h" >>> -#include "display/intel_fbdev_fb.h" >>> #include "gem/i915_gem_lmem.h" >>> #include "gem/i915_gem_region.h" >>> >>> +#include "i915_bo.h" >>> #include "i915_drv.h" >>> #include "i915_initial_plane.h" >>> >>> @@ -118,7 +118,7 @@ initial_plane_vma(struct drm_i915_private *i915, >>> if (IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && >>> IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && >>> mem == i915->mm.stolen_region && >>> - !intel_fbdev_fb_prefer_stolen(&i915->drm, size)) { >>> + !i915_bo_fbdev_prefer_stolen(&i915->drm, size)) { >>> drm_dbg_kms(&i915->drm, "Initial FB size exceeds half of stolen, discarding\n"); >>> return NULL; >>> } >>> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile >>> index dab979287a96..936eb79e9269 100644 >>> --- a/drivers/gpu/drm/xe/Makefile >>> +++ b/drivers/gpu/drm/xe/Makefile >>> @@ -211,7 +211,6 @@ $(obj)/i915-display/%.o: $(srctree)/drivers/gpu/drm/i915/display/%.c FORCE >>> >>> # Display code specific to xe >>> xe-$(CONFIG_DRM_XE_DISPLAY) += \ >>> - display/intel_fbdev_fb.o \ >>> display/xe_display.o \ >>> display/xe_display_bo.o \ >>> display/xe_display_pcode.o \ >>> diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >>> deleted file mode 100644 >>> index 2ad5e5a79287..000000000000 >>> --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c >>> +++ /dev/null >>> @@ -1,116 +0,0 @@ >>> -/* SPDX-License-Identifier: MIT */ >>> -/* >>> - * Copyright © 2023 Intel Corporation >>> - */ >>> - >>> -#include <linux/fb.h> >>> - >>> -#include "intel_fbdev_fb.h" >>> -#include "xe_bo.h" >>> -#include "xe_ttm_stolen_mgr.h" >>> -#include "xe_wa.h" >>> - >>> -#include <generated/xe_device_wa_oob.h> >>> - >>> -/* >>> - * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride >>> - * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to >>> - * have driver specific values. However, dropping the stride alignment to 64 >>> - * leads to underflowing the bo pin count in the atomic cleanup work. >>> - */ >>> -u32 intel_fbdev_fb_pitch_align(u32 stride) >>> -{ >>> - return ALIGN(stride, XE_PAGE_SIZE); >>> -} >>> - >>> -bool intel_fbdev_fb_prefer_stolen(struct drm_device *drm, unsigned int size) >>> -{ >>> - struct xe_device *xe = to_xe_device(drm); >>> - struct ttm_resource_manager *stolen; >>> - >>> - stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); >>> - if (!stolen) >>> - return false; >>> - >>> - if (IS_DGFX(xe)) >>> - return false; >>> - >>> - if (XE_DEVICE_WA(xe, 22019338487_display)) >>> - return false; >>> - >>> - /* >>> - * If the FB is too big, just don't use it since fbdev is not very >>> - * important and we should probably use that space with FBC or other >>> - * features. >>> - */ >>> - return stolen->size >= size * 2; >>> -} >>> - >>> -struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size) >>> -{ >>> - struct xe_device *xe = to_xe_device(drm); >>> - struct xe_bo *obj; >>> - >>> - obj = ERR_PTR(-ENODEV); >>> - >>> - if (intel_fbdev_fb_prefer_stolen(drm, size)) { >>> - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), >>> - size, >>> - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >>> - XE_BO_FLAG_STOLEN | >>> - XE_BO_FLAG_GGTT, false); >>> - if (!IS_ERR(obj)) >>> - drm_info(&xe->drm, "Allocated fbdev into stolen\n"); >>> - else >>> - drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); >>> - } else { >>> - drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); >>> - } >>> - >>> - if (IS_ERR(obj)) { >>> - obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, >>> - ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >>> - XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >>> - XE_BO_FLAG_GGTT, false); >>> - } >>> - >>> - if (IS_ERR(obj)) { >>> - drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); >>> - return ERR_PTR(-ENOMEM); >>> - } >>> - >>> - return &obj->ttm.base; >>> -} >>> - >>> -void intel_fbdev_fb_bo_destroy(struct drm_gem_object *obj) >>> -{ >>> - xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); >>> -} >>> - >>> -int intel_fbdev_fb_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >>> - struct i915_vma *vma) >>> -{ >>> - struct xe_bo *obj = gem_to_xe_bo(_obj); >>> - struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); >>> - >>> - if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { >>> - if (obj->flags & XE_BO_FLAG_STOLEN) >>> - info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); >>> - else >>> - info->fix.smem_start = >>> - pci_resource_start(pdev, 2) + >>> - xe_bo_addr(obj, 0, XE_PAGE_SIZE); >>> - >>> - info->fix.smem_len = obj->ttm.base.size; >>> - } else { >>> - /* XXX: Pure fiction, as the BO may not be physically accessible.. */ >>> - info->fix.smem_start = 0; >>> - info->fix.smem_len = obj->ttm.base.size; >>> - } >>> - XE_WARN_ON(iosys_map_is_null(&obj->vmap)); >>> - >>> - info->screen_base = obj->vmap.vaddr_iomem; >>> - info->screen_size = obj->ttm.base.size; >>> - >>> - return 0; >>> -} >>> diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c b/drivers/gpu/drm/xe/display/xe_display_bo.c >>> index a689f71e7b14..10436edecc35 100644 >>> --- a/drivers/gpu/drm/xe/display/xe_display_bo.c >>> +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c >>> @@ -1,6 +1,8 @@ >>> // SPDX-License-Identifier: MIT >>> /* Copyright © 2024 Intel Corporation */ >>> >>> +#include <linux/fb.h> >>> + >>> #include <drm/drm_gem.h> >>> #include <drm/intel/display_parent_interface.h> >>> >>> @@ -8,6 +10,10 @@ >>> #include "xe_bo.h" >>> #include "xe_display_bo.h" >>> #include "xe_pxp.h" >>> +#include "xe_ttm_stolen_mgr.h" >>> +#include "xe_wa.h" >>> + >>> +#include <generated/xe_device_wa_oob.h> >>> >>> static bool xe_display_bo_is_protected(struct drm_gem_object *obj) >>> { >>> @@ -101,6 +107,111 @@ xe_display_bo_framebuffer_lookup(struct drm_device *drm, >>> return gem; >>> } >>> >>> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >>> +/* >>> + * FIXME: There shouldn't be any reason to have XE_PAGE_SIZE stride >>> + * alignment. The same 64 as i915 uses should be fine, and we shouldn't need to >>> + * have driver specific values. However, dropping the stride alignment to 64 >>> + * leads to underflowing the bo pin count in the atomic cleanup work. >>> + */ >>> +static u32 xe_display_bo_fbdev_pitch_align(u32 stride) >>> +{ >>> + return ALIGN(stride, XE_PAGE_SIZE); >>> +} >>> + >>> +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) >>> +{ >>> + struct xe_device *xe = to_xe_device(drm); >>> + struct ttm_resource_manager *stolen; >>> + >>> + stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); >>> + if (!stolen) >>> + return false; >>> + >>> + if (IS_DGFX(xe)) >>> + return false; >>> + >>> + if (XE_DEVICE_WA(xe, 22019338487_display)) >>> + return false; >>> + >>> + /* >>> + * If the FB is too big, just don't use it since fbdev is not very >>> + * important and we should probably use that space with FBC or other >>> + * features. >>> + */ >>> + return stolen->size >= size * 2; >>> +} >>> + >>> +static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device *drm, int size) >>> +{ >>> + struct xe_device *xe = to_xe_device(drm); >> >> Same question here, but adding it in patch [5/5] or as new 7th patch. Up >> to patch reordering of course. >> >> BR, >> Michał >> >>> + struct xe_bo *obj; >>> + >>> + obj = ERR_PTR(-ENODEV); >>> + >>> + if (xe_display_bo_fbdev_prefer_stolen(drm, size)) { >>> + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), >>> + size, >>> + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >>> + XE_BO_FLAG_STOLEN | >>> + XE_BO_FLAG_GGTT, false); >>> + if (!IS_ERR(obj)) >>> + drm_info(&xe->drm, "Allocated fbdev into stolen\n"); >>> + else >>> + drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); >>> + } else { >>> + drm_info(&xe->drm, "Allocating fbdev: Stolen memory not preferred.\n"); >>> + } >>> + >>> + if (IS_ERR(obj)) { >>> + obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, >>> + ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | >>> + XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >>> + XE_BO_FLAG_GGTT, false); >>> + } >>> + >>> + if (IS_ERR(obj)) { >>> + drm_err(&xe->drm, "failed to allocate framebuffer (%pe)\n", obj); >>> + return ERR_PTR(-ENOMEM); >>> + } >>> + >>> + return &obj->ttm.base; >>> +} >>> + >>> +static void xe_display_bo_fbdev_destroy(struct drm_gem_object *obj) >>> +{ >>> + xe_bo_unpin_map_no_vm(gem_to_xe_bo(obj)); >>> +} >>> + >>> +static int xe_display_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, >>> + struct i915_vma *vma) >>> +{ >>> + struct xe_bo *obj = gem_to_xe_bo(_obj); >>> + struct pci_dev *pdev = to_pci_dev(_obj->dev->dev); >>> + >>> + if (!(obj->flags & XE_BO_FLAG_SYSTEM)) { >>> + if (obj->flags & XE_BO_FLAG_STOLEN) >>> + info->fix.smem_start = xe_ttm_stolen_io_offset(obj, 0); >>> + else >>> + info->fix.smem_start = >>> + pci_resource_start(pdev, 2) + >>> + xe_bo_addr(obj, 0, XE_PAGE_SIZE); >>> + >>> + info->fix.smem_len = obj->ttm.base.size; >>> + } else { >>> + /* XXX: Pure fiction, as the BO may not be physically accessible.. */ >>> + info->fix.smem_start = 0; >>> + info->fix.smem_len = obj->ttm.base.size; >>> + } >>> + XE_WARN_ON(iosys_map_is_null(&obj->vmap)); >>> + >>> + info->screen_base = obj->vmap.vaddr_iomem; >>> + info->screen_size = obj->ttm.base.size; >>> + >>> + return 0; >>> +} >>> +#endif >>> + >>> const struct intel_display_bo_interface xe_display_bo_interface = { >>> .is_protected = xe_display_bo_is_protected, >>> .key_check = xe_pxp_obj_key_check, >>> @@ -109,4 +220,10 @@ const struct intel_display_bo_interface xe_display_bo_interface = { >>> .framebuffer_init = xe_display_bo_framebuffer_init, >>> .framebuffer_fini = xe_display_bo_framebuffer_fini, >>> .framebuffer_lookup = xe_display_bo_framebuffer_lookup, >>> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >>> + .fbdev_create = xe_display_bo_fbdev_create, >>> + .fbdev_destroy = xe_display_bo_fbdev_destroy, >>> + .fbdev_fill_info = xe_display_bo_fbdev_fill_info, >>> + .fbdev_pitch_align = xe_display_bo_fbdev_pitch_align, >>> +#endif >>> }; >>> diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.h b/drivers/gpu/drm/xe/display/xe_display_bo.h >>> index 6879c104b0b1..8980e6ecf54a 100644 >>> --- a/drivers/gpu/drm/xe/display/xe_display_bo.h >>> +++ b/drivers/gpu/drm/xe/display/xe_display_bo.h >>> @@ -4,6 +4,12 @@ >>> #ifndef __XE_DISPLAY_BO_H__ >>> #define __XE_DISPLAY_BO_H__ >>> >>> +#include <linux/types.h> >>> + >>> +struct drm_device; >>> + >>> +bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); >>> + >>> extern const struct intel_display_bo_interface xe_display_bo_interface; >>> >>> #endif >>> diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c >>> index 730c6dc49522..6e0a22429184 100644 >>> --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c >>> +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c >>> @@ -12,8 +12,8 @@ >>> #include "intel_display_types.h" >>> #include "intel_fb.h" >>> #include "intel_fb_pin.h" >>> -#include "intel_fbdev_fb.h" >>> #include "xe_bo.h" >>> +#include "xe_display_bo.h" >>> #include "xe_display_vma.h" >>> #include "xe_ggtt.h" >>> #include "xe_mmio.h" >>> @@ -87,7 +87,7 @@ initial_plane_bo(struct xe_device *xe, >>> >>> if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && >>> IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && >>> - !intel_fbdev_fb_prefer_stolen(&xe->drm, plane_config->size)) { >>> + !xe_display_bo_fbdev_prefer_stolen(&xe->drm, plane_config->size)) { >>> drm_info(&xe->drm, "Initial FB size exceeds half of stolen, discarding\n"); >>> return NULL; >>> } >>> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h >>> index 97ec94a2e749..2fc1794a3da4 100644 >>> --- a/include/drm/intel/display_parent_interface.h >>> +++ b/include/drm/intel/display_parent_interface.h >>> @@ -15,6 +15,7 @@ struct drm_gem_object; >>> struct drm_mode_fb_cmd2; >>> struct drm_plane_state; >>> struct drm_scanout_buffer; >>> +struct fb_info; >>> struct i915_vma; >>> struct intel_dpt; >>> struct intel_dsb_buffer; >>> @@ -43,6 +44,12 @@ struct intel_display_bo_interface { >>> struct drm_gem_object *(*framebuffer_lookup)(struct drm_device *drm, >>> struct drm_file *filp, >>> const struct drm_mode_fb_cmd2 *user_mode_cmd); >>> +#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) >>> + struct drm_gem_object *(*fbdev_create)(struct drm_device *drm, int size); >>> + void (*fbdev_destroy)(struct drm_gem_object *obj); >>> + int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info *info, struct i915_vma *vma); >>> + u32 (*fbdev_pitch_align)(u32 stride); >>> +#endif >>> }; >>> >>> struct intel_display_dpt_interface { >>> -- >>> 2.47.3 >>> >>> > > -- > Jani Nikula, Intel > ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 4/5] drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (2 preceding siblings ...) 2026-03-18 13:29 ` [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula @ 2026-03-18 13:29 ` Jani Nikula 2026-03-24 23:46 ` Michał Grzelak 2026-03-18 13:29 ` [PATCH 5/5] drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() Jani Nikula ` (4 subsequent siblings) 8 siblings, 1 reply; 18+ messages in thread From: Jani Nikula @ 2026-03-18 13:29 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: jani.nikula This is i915 core code, use struct drm_i915_private for simplicity. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/i915/i915_bo.c | 6 ++---- drivers/gpu/drm/i915/i915_bo.h | 4 ++-- drivers/gpu/drm/i915/i915_initial_plane.c | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_bo.c b/drivers/gpu/drm/i915/i915_bo.c index 7e38d002478e..559341103ca7 100644 --- a/drivers/gpu/drm/i915/i915_bo.c +++ b/drivers/gpu/drm/i915/i915_bo.c @@ -150,10 +150,8 @@ static u32 i915_bo_fbdev_pitch_align(u32 stride) return ALIGN(stride, 64); } -bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) +bool i915_bo_fbdev_prefer_stolen(struct drm_i915_private *i915, unsigned int size) { - struct drm_i915_private *i915 = to_i915(drm); - /* Skip stolen on MTL as Wa_22018444074 mitigation. */ if (IS_METEORLAKE(i915)) return false; @@ -177,7 +175,7 @@ static struct drm_gem_object *i915_bo_fbdev_create(struct drm_device *drm, int s I915_BO_ALLOC_CONTIGUOUS | I915_BO_ALLOC_USER); } else { - if (i915_bo_fbdev_prefer_stolen(drm, size)) + if (i915_bo_fbdev_prefer_stolen(i915, size)) obj = i915_gem_object_create_stolen(i915, size); else drm_info(drm, "Allocating fbdev: Stolen memory not preferred.\n"); diff --git a/drivers/gpu/drm/i915/i915_bo.h b/drivers/gpu/drm/i915/i915_bo.h index 2a0f3050dd42..39ba62696550 100644 --- a/drivers/gpu/drm/i915/i915_bo.h +++ b/drivers/gpu/drm/i915/i915_bo.h @@ -6,9 +6,9 @@ #include <linux/types.h> -struct drm_device; +struct drm_i915_private; -bool i915_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); +bool i915_bo_fbdev_prefer_stolen(struct drm_i915_private *i915, unsigned int size); extern const struct intel_display_bo_interface i915_display_bo_interface; diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index f4d631a395d0..c1a12bf6b66c 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -118,7 +118,7 @@ initial_plane_vma(struct drm_i915_private *i915, if (IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && mem == i915->mm.stolen_region && - !i915_bo_fbdev_prefer_stolen(&i915->drm, size)) { + !i915_bo_fbdev_prefer_stolen(i915, size)) { drm_dbg_kms(&i915->drm, "Initial FB size exceeds half of stolen, discarding\n"); return NULL; } -- 2.47.3 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 4/5] drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() 2026-03-18 13:29 ` [PATCH 4/5] drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() Jani Nikula @ 2026-03-24 23:46 ` Michał Grzelak 0 siblings, 0 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-24 23:46 UTC (permalink / raw) To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 313 bytes --] On Wed, 18 Mar 2026, Jani Nikula wrote: > This is i915 core code, use struct drm_i915_private for simplicity. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> Same comment as from patch [3/5] if it applies at all. With it being addressed: Reviewed-by: Michał Grzelak <michal.grzelak@intel.com> BR, Michał ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 5/5] drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (3 preceding siblings ...) 2026-03-18 13:29 ` [PATCH 4/5] drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() Jani Nikula @ 2026-03-18 13:29 ` Jani Nikula 2026-03-24 23:47 ` Michał Grzelak 2026-03-18 13:35 ` ✗ CI.checkpatch: warning for drm/{i915,xe}: move fbdev fb calls to parent interface Patchwork ` (3 subsequent siblings) 8 siblings, 1 reply; 18+ messages in thread From: Jani Nikula @ 2026-03-18 13:29 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: jani.nikula This is xe core code, use struct xe_device for simplicity. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/xe/display/xe_display_bo.c | 5 ++--- drivers/gpu/drm/xe/display/xe_display_bo.h | 4 ++-- drivers/gpu/drm/xe/display/xe_initial_plane.c | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.c b/drivers/gpu/drm/xe/display/xe_display_bo.c index 10436edecc35..f420e2ba581e 100644 --- a/drivers/gpu/drm/xe/display/xe_display_bo.c +++ b/drivers/gpu/drm/xe/display/xe_display_bo.c @@ -119,9 +119,8 @@ static u32 xe_display_bo_fbdev_pitch_align(u32 stride) return ALIGN(stride, XE_PAGE_SIZE); } -bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size) +bool xe_display_bo_fbdev_prefer_stolen(struct xe_device *xe, unsigned int size) { - struct xe_device *xe = to_xe_device(drm); struct ttm_resource_manager *stolen; stolen = ttm_manager_type(&xe->ttm, XE_PL_STOLEN); @@ -149,7 +148,7 @@ static struct drm_gem_object *xe_display_bo_fbdev_create(struct drm_device *drm, obj = ERR_PTR(-ENODEV); - if (xe_display_bo_fbdev_prefer_stolen(drm, size)) { + if (xe_display_bo_fbdev_prefer_stolen(xe, size)) { obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe), size, ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT | diff --git a/drivers/gpu/drm/xe/display/xe_display_bo.h b/drivers/gpu/drm/xe/display/xe_display_bo.h index 8980e6ecf54a..c72056884ff4 100644 --- a/drivers/gpu/drm/xe/display/xe_display_bo.h +++ b/drivers/gpu/drm/xe/display/xe_display_bo.h @@ -6,9 +6,9 @@ #include <linux/types.h> -struct drm_device; +struct xe_device; -bool xe_display_bo_fbdev_prefer_stolen(struct drm_device *drm, unsigned int size); +bool xe_display_bo_fbdev_prefer_stolen(struct xe_device *xe, unsigned int size); extern const struct intel_display_bo_interface xe_display_bo_interface; diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 6e0a22429184..12c09d33292d 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -87,7 +87,7 @@ initial_plane_bo(struct xe_device *xe, if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) && IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) && - !xe_display_bo_fbdev_prefer_stolen(&xe->drm, plane_config->size)) { + !xe_display_bo_fbdev_prefer_stolen(xe, plane_config->size)) { drm_info(&xe->drm, "Initial FB size exceeds half of stolen, discarding\n"); return NULL; } -- 2.47.3 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 5/5] drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() 2026-03-18 13:29 ` [PATCH 5/5] drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() Jani Nikula @ 2026-03-24 23:47 ` Michał Grzelak 0 siblings, 0 replies; 18+ messages in thread From: Michał Grzelak @ 2026-03-24 23:47 UTC (permalink / raw) To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org [-- Attachment #1: Type: text/plain, Size: 305 bytes --] On Wed, 18 Mar 2026, Jani Nikula wrote: > This is xe core code, use struct xe_device for simplicity. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> Same comment as from patch [3/5], if it applies at all. With it being addressed: Reviewed-by: Michał Grzelak <michal.grzelak@intel.com> BR, Michał ^ permalink raw reply [flat|nested] 18+ messages in thread
* ✗ CI.checkpatch: warning for drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (4 preceding siblings ...) 2026-03-18 13:29 ` [PATCH 5/5] drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() Jani Nikula @ 2026-03-18 13:35 ` Patchwork 2026-03-18 13:37 ` ✓ CI.KUnit: success " Patchwork ` (2 subsequent siblings) 8 siblings, 0 replies; 18+ messages in thread From: Patchwork @ 2026-03-18 13:35 UTC (permalink / raw) To: Jani Nikula; +Cc: intel-xe == Series Details == Series: drm/{i915,xe}: move fbdev fb calls to parent interface URL : https://patchwork.freedesktop.org/series/163466/ State : warning == Summary == + KERNEL=/kernel + git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt Cloning into 'mt'... warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/ + git -C mt rev-list -n1 origin/master 1f57ba1afceae32108bd24770069f764d940a0e4 + cd /kernel + git config --global --add safe.directory /kernel + git log -n1 commit 141ec63366ccb82ff598628508a5bca841dd5aed Author: Jani Nikula <jani.nikula@intel.com> Date: Wed Mar 18 15:29:50 2026 +0200 drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() This is xe core code, use struct xe_device for simplicity. Signed-off-by: Jani Nikula <jani.nikula@intel.com> + /mt/dim checkpatch 185629feb8aee7cf88f72d1e67531574f1bea7f5 drm-intel 23baef62993f drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) 9ecaf6ff95bf drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() f8386f7a0fe0 drm/{i915,xe}: move fbdev fb calls to parent interface -:115: WARNING:LONG_LINE: line length of 122 exceeds 100 columns #115: FILE: drivers/gpu/drm/i915/display/intel_fbdev.c:218: + mode_cmd->pitches[0] = intel_bo_fbdev_pitch_align(display, mode_cmd->width * DIV_ROUND_UP(sizes->surface_bpp, 8)); -:153: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #153: deleted file mode 100644 -:705: WARNING:LONG_LINE: line length of 102 exceeds 100 columns #705: FILE: drivers/gpu/drm/xe/display/xe_display_bo.c:161: + drm_info(&xe->drm, "Allocated fbdev into stolen failed: %li\n", PTR_ERR(obj)); -:713: WARNING:LONG_LINE: line length of 102 exceeds 100 columns #713: FILE: drivers/gpu/drm/xe/display/xe_display_bo.c:169: + XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | -:731: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #731: FILE: drivers/gpu/drm/xe/display/xe_display_bo.c:187: +static int xe_display_bo_fbdev_fill_info(struct drm_gem_object *_obj, struct fb_info *info, + struct i915_vma *vma) -:832: WARNING:LONG_LINE: line length of 103 exceeds 100 columns #832: FILE: include/drm/intel/display_parent_interface.h:50: + int (*fbdev_fill_info)(struct drm_gem_object *obj, struct fb_info *info, struct i915_vma *vma); total: 0 errors, 5 warnings, 1 checks, 473 lines checked 853506b530b6 drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() 141ec63366cc drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() ^ permalink raw reply [flat|nested] 18+ messages in thread
* ✓ CI.KUnit: success for drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (5 preceding siblings ...) 2026-03-18 13:35 ` ✗ CI.checkpatch: warning for drm/{i915,xe}: move fbdev fb calls to parent interface Patchwork @ 2026-03-18 13:37 ` Patchwork 2026-03-18 14:16 ` ✓ Xe.CI.BAT: " Patchwork 2026-03-20 2:02 ` ✗ Xe.CI.FULL: failure " Patchwork 8 siblings, 0 replies; 18+ messages in thread From: Patchwork @ 2026-03-18 13:37 UTC (permalink / raw) To: Jani Nikula; +Cc: intel-xe == Series Details == Series: drm/{i915,xe}: move fbdev fb calls to parent interface URL : https://patchwork.freedesktop.org/series/163466/ State : success == Summary == + trap cleanup EXIT + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [13:35:58] Configuring KUnit Kernel ... Generating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [13:36:02] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=25 [13:36:40] Starting KUnit Kernel (1/1)... [13:36:40] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [13:36:40] ================== guc_buf (11 subtests) =================== [13:36:40] [PASSED] test_smallest [13:36:40] [PASSED] test_largest [13:36:40] [PASSED] test_granular [13:36:40] [PASSED] test_unique [13:36:40] [PASSED] test_overlap [13:36:40] [PASSED] test_reusable [13:36:40] [PASSED] test_too_big [13:36:40] [PASSED] test_flush [13:36:40] [PASSED] test_lookup [13:36:40] [PASSED] test_data [13:36:40] [PASSED] test_class [13:36:40] ===================== [PASSED] guc_buf ===================== [13:36:40] =================== guc_dbm (7 subtests) =================== [13:36:40] [PASSED] test_empty [13:36:40] [PASSED] test_default [13:36:40] ======================== test_size ======================== [13:36:40] [PASSED] 4 [13:36:40] [PASSED] 8 [13:36:40] [PASSED] 32 [13:36:40] [PASSED] 256 [13:36:40] ==================== [PASSED] test_size ==================== [13:36:40] ======================= test_reuse ======================== [13:36:40] [PASSED] 4 [13:36:40] [PASSED] 8 [13:36:40] [PASSED] 32 [13:36:40] [PASSED] 256 [13:36:40] =================== [PASSED] test_reuse ==================== [13:36:40] =================== test_range_overlap ==================== [13:36:40] [PASSED] 4 [13:36:40] [PASSED] 8 [13:36:40] [PASSED] 32 [13:36:40] [PASSED] 256 [13:36:40] =============== [PASSED] test_range_overlap ================ [13:36:40] =================== test_range_compact ==================== [13:36:40] [PASSED] 4 [13:36:40] [PASSED] 8 [13:36:40] [PASSED] 32 [13:36:40] [PASSED] 256 [13:36:40] =============== [PASSED] test_range_compact ================ [13:36:40] ==================== test_range_spare ===================== [13:36:40] [PASSED] 4 [13:36:40] [PASSED] 8 [13:36:40] [PASSED] 32 [13:36:40] [PASSED] 256 [13:36:40] ================ [PASSED] test_range_spare ================= [13:36:40] ===================== [PASSED] guc_dbm ===================== [13:36:40] =================== guc_idm (6 subtests) =================== [13:36:40] [PASSED] bad_init [13:36:40] [PASSED] no_init [13:36:40] [PASSED] init_fini [13:36:40] [PASSED] check_used [13:36:40] [PASSED] check_quota [13:36:40] [PASSED] check_all [13:36:40] ===================== [PASSED] guc_idm ===================== [13:36:40] ================== no_relay (3 subtests) =================== [13:36:40] [PASSED] xe_drops_guc2pf_if_not_ready [13:36:40] [PASSED] xe_drops_guc2vf_if_not_ready [13:36:40] [PASSED] xe_rejects_send_if_not_ready [13:36:40] ==================== [PASSED] no_relay ===================== [13:36:40] ================== pf_relay (14 subtests) ================== [13:36:40] [PASSED] pf_rejects_guc2pf_too_short [13:36:40] [PASSED] pf_rejects_guc2pf_too_long [13:36:40] [PASSED] pf_rejects_guc2pf_no_payload [13:36:40] [PASSED] pf_fails_no_payload [13:36:40] [PASSED] pf_fails_bad_origin [13:36:40] [PASSED] pf_fails_bad_type [13:36:40] [PASSED] pf_txn_reports_error [13:36:40] [PASSED] pf_txn_sends_pf2guc [13:36:40] [PASSED] pf_sends_pf2guc [13:36:40] [SKIPPED] pf_loopback_nop [13:36:40] [SKIPPED] pf_loopback_echo [13:36:40] [SKIPPED] pf_loopback_fail [13:36:40] [SKIPPED] pf_loopback_busy [13:36:40] [SKIPPED] pf_loopback_retry [13:36:40] ==================== [PASSED] pf_relay ===================== [13:36:40] ================== vf_relay (3 subtests) =================== [13:36:40] [PASSED] vf_rejects_guc2vf_too_short [13:36:40] [PASSED] vf_rejects_guc2vf_too_long [13:36:40] [PASSED] vf_rejects_guc2vf_no_payload [13:36:40] ==================== [PASSED] vf_relay ===================== [13:36:40] ================ pf_gt_config (9 subtests) ================= [13:36:40] [PASSED] fair_contexts_1vf [13:36:40] [PASSED] fair_doorbells_1vf [13:36:40] [PASSED] fair_ggtt_1vf [13:36:40] ====================== fair_vram_1vf ====================== [13:36:40] [PASSED] 3.50 GiB [13:36:40] [PASSED] 11.5 GiB [13:36:40] [PASSED] 15.5 GiB [13:36:40] [PASSED] 31.5 GiB [13:36:40] [PASSED] 63.5 GiB [13:36:40] [PASSED] 1.91 GiB [13:36:40] ================== [PASSED] fair_vram_1vf ================== [13:36:40] ================ fair_vram_1vf_admin_only ================= [13:36:40] [PASSED] 3.50 GiB [13:36:40] [PASSED] 11.5 GiB [13:36:40] [PASSED] 15.5 GiB [13:36:40] [PASSED] 31.5 GiB [13:36:40] [PASSED] 63.5 GiB [13:36:40] [PASSED] 1.91 GiB [13:36:40] ============ [PASSED] fair_vram_1vf_admin_only ============= [13:36:40] ====================== fair_contexts ====================== [13:36:40] [PASSED] 1 VF [13:36:40] [PASSED] 2 VFs [13:36:40] [PASSED] 3 VFs [13:36:40] [PASSED] 4 VFs [13:36:40] [PASSED] 5 VFs [13:36:40] [PASSED] 6 VFs [13:36:40] [PASSED] 7 VFs [13:36:40] [PASSED] 8 VFs [13:36:40] [PASSED] 9 VFs [13:36:40] [PASSED] 10 VFs [13:36:40] [PASSED] 11 VFs [13:36:40] [PASSED] 12 VFs [13:36:40] [PASSED] 13 VFs [13:36:40] [PASSED] 14 VFs [13:36:40] [PASSED] 15 VFs [13:36:40] [PASSED] 16 VFs [13:36:40] [PASSED] 17 VFs [13:36:40] [PASSED] 18 VFs [13:36:40] [PASSED] 19 VFs [13:36:40] [PASSED] 20 VFs [13:36:40] [PASSED] 21 VFs [13:36:40] [PASSED] 22 VFs [13:36:40] [PASSED] 23 VFs [13:36:40] [PASSED] 24 VFs [13:36:40] [PASSED] 25 VFs [13:36:40] [PASSED] 26 VFs [13:36:40] [PASSED] 27 VFs [13:36:40] [PASSED] 28 VFs [13:36:40] [PASSED] 29 VFs [13:36:40] [PASSED] 30 VFs [13:36:40] [PASSED] 31 VFs [13:36:40] [PASSED] 32 VFs [13:36:40] [PASSED] 33 VFs [13:36:40] [PASSED] 34 VFs [13:36:40] [PASSED] 35 VFs [13:36:40] [PASSED] 36 VFs [13:36:40] [PASSED] 37 VFs [13:36:40] [PASSED] 38 VFs [13:36:40] [PASSED] 39 VFs [13:36:40] [PASSED] 40 VFs [13:36:40] [PASSED] 41 VFs [13:36:40] [PASSED] 42 VFs [13:36:40] [PASSED] 43 VFs [13:36:40] [PASSED] 44 VFs [13:36:40] [PASSED] 45 VFs [13:36:40] [PASSED] 46 VFs [13:36:40] [PASSED] 47 VFs [13:36:40] [PASSED] 48 VFs [13:36:40] [PASSED] 49 VFs [13:36:40] [PASSED] 50 VFs [13:36:40] [PASSED] 51 VFs [13:36:40] [PASSED] 52 VFs [13:36:40] [PASSED] 53 VFs [13:36:40] [PASSED] 54 VFs [13:36:40] [PASSED] 55 VFs [13:36:40] [PASSED] 56 VFs [13:36:40] [PASSED] 57 VFs [13:36:40] [PASSED] 58 VFs [13:36:40] [PASSED] 59 VFs [13:36:40] [PASSED] 60 VFs [13:36:40] [PASSED] 61 VFs [13:36:40] [PASSED] 62 VFs [13:36:40] [PASSED] 63 VFs [13:36:40] ================== [PASSED] fair_contexts ================== [13:36:40] ===================== fair_doorbells ====================== [13:36:40] [PASSED] 1 VF [13:36:40] [PASSED] 2 VFs [13:36:40] [PASSED] 3 VFs [13:36:40] [PASSED] 4 VFs [13:36:40] [PASSED] 5 VFs [13:36:40] [PASSED] 6 VFs [13:36:40] [PASSED] 7 VFs [13:36:40] [PASSED] 8 VFs [13:36:40] [PASSED] 9 VFs [13:36:40] [PASSED] 10 VFs [13:36:40] [PASSED] 11 VFs [13:36:40] [PASSED] 12 VFs [13:36:40] [PASSED] 13 VFs [13:36:40] [PASSED] 14 VFs [13:36:40] [PASSED] 15 VFs [13:36:40] [PASSED] 16 VFs [13:36:40] [PASSED] 17 VFs [13:36:40] [PASSED] 18 VFs [13:36:40] [PASSED] 19 VFs [13:36:40] [PASSED] 20 VFs [13:36:40] [PASSED] 21 VFs [13:36:40] [PASSED] 22 VFs [13:36:40] [PASSED] 23 VFs [13:36:40] [PASSED] 24 VFs [13:36:40] [PASSED] 25 VFs [13:36:40] [PASSED] 26 VFs [13:36:40] [PASSED] 27 VFs [13:36:40] [PASSED] 28 VFs [13:36:40] [PASSED] 29 VFs [13:36:40] [PASSED] 30 VFs [13:36:40] [PASSED] 31 VFs [13:36:40] [PASSED] 32 VFs [13:36:40] [PASSED] 33 VFs [13:36:40] [PASSED] 34 VFs [13:36:40] [PASSED] 35 VFs [13:36:40] [PASSED] 36 VFs [13:36:40] [PASSED] 37 VFs [13:36:40] [PASSED] 38 VFs [13:36:40] [PASSED] 39 VFs [13:36:40] [PASSED] 40 VFs [13:36:40] [PASSED] 41 VFs [13:36:40] [PASSED] 42 VFs [13:36:40] [PASSED] 43 VFs [13:36:40] [PASSED] 44 VFs [13:36:40] [PASSED] 45 VFs [13:36:40] [PASSED] 46 VFs [13:36:40] [PASSED] 47 VFs [13:36:40] [PASSED] 48 VFs [13:36:40] [PASSED] 49 VFs [13:36:40] [PASSED] 50 VFs [13:36:40] [PASSED] 51 VFs [13:36:40] [PASSED] 52 VFs [13:36:40] [PASSED] 53 VFs [13:36:40] [PASSED] 54 VFs [13:36:40] [PASSED] 55 VFs [13:36:40] [PASSED] 56 VFs [13:36:40] [PASSED] 57 VFs [13:36:40] [PASSED] 58 VFs [13:36:40] [PASSED] 59 VFs [13:36:41] [PASSED] 60 VFs [13:36:41] [PASSED] 61 VFs [13:36:41] [PASSED] 62 VFs [13:36:41] [PASSED] 63 VFs [13:36:41] ================= [PASSED] fair_doorbells ================== [13:36:41] ======================== fair_ggtt ======================== [13:36:41] [PASSED] 1 VF [13:36:41] [PASSED] 2 VFs [13:36:41] [PASSED] 3 VFs [13:36:41] [PASSED] 4 VFs [13:36:41] [PASSED] 5 VFs [13:36:41] [PASSED] 6 VFs [13:36:41] [PASSED] 7 VFs [13:36:41] [PASSED] 8 VFs [13:36:41] [PASSED] 9 VFs [13:36:41] [PASSED] 10 VFs [13:36:41] [PASSED] 11 VFs [13:36:41] [PASSED] 12 VFs [13:36:41] [PASSED] 13 VFs [13:36:41] [PASSED] 14 VFs [13:36:41] [PASSED] 15 VFs [13:36:41] [PASSED] 16 VFs [13:36:41] [PASSED] 17 VFs [13:36:41] [PASSED] 18 VFs [13:36:41] [PASSED] 19 VFs [13:36:41] [PASSED] 20 VFs [13:36:41] [PASSED] 21 VFs [13:36:41] [PASSED] 22 VFs [13:36:41] [PASSED] 23 VFs [13:36:41] [PASSED] 24 VFs [13:36:41] [PASSED] 25 VFs [13:36:41] [PASSED] 26 VFs [13:36:41] [PASSED] 27 VFs [13:36:41] [PASSED] 28 VFs [13:36:41] [PASSED] 29 VFs [13:36:41] [PASSED] 30 VFs [13:36:41] [PASSED] 31 VFs [13:36:41] [PASSED] 32 VFs [13:36:41] [PASSED] 33 VFs [13:36:41] [PASSED] 34 VFs [13:36:41] [PASSED] 35 VFs [13:36:41] [PASSED] 36 VFs [13:36:41] [PASSED] 37 VFs [13:36:41] [PASSED] 38 VFs [13:36:41] [PASSED] 39 VFs [13:36:41] [PASSED] 40 VFs [13:36:41] [PASSED] 41 VFs [13:36:41] [PASSED] 42 VFs [13:36:41] [PASSED] 43 VFs [13:36:41] [PASSED] 44 VFs [13:36:41] [PASSED] 45 VFs [13:36:41] [PASSED] 46 VFs [13:36:41] [PASSED] 47 VFs [13:36:41] [PASSED] 48 VFs [13:36:41] [PASSED] 49 VFs [13:36:41] [PASSED] 50 VFs [13:36:41] [PASSED] 51 VFs [13:36:41] [PASSED] 52 VFs [13:36:41] [PASSED] 53 VFs [13:36:41] [PASSED] 54 VFs [13:36:41] [PASSED] 55 VFs [13:36:41] [PASSED] 56 VFs [13:36:41] [PASSED] 57 VFs [13:36:41] [PASSED] 58 VFs [13:36:41] [PASSED] 59 VFs [13:36:41] [PASSED] 60 VFs [13:36:41] [PASSED] 61 VFs [13:36:41] [PASSED] 62 VFs [13:36:41] [PASSED] 63 VFs [13:36:41] ==================== [PASSED] fair_ggtt ==================== [13:36:41] ======================== fair_vram ======================== [13:36:41] [PASSED] 1 VF [13:36:41] [PASSED] 2 VFs [13:36:41] [PASSED] 3 VFs [13:36:41] [PASSED] 4 VFs [13:36:41] [PASSED] 5 VFs [13:36:41] [PASSED] 6 VFs [13:36:41] [PASSED] 7 VFs [13:36:41] [PASSED] 8 VFs [13:36:41] [PASSED] 9 VFs [13:36:41] [PASSED] 10 VFs [13:36:41] [PASSED] 11 VFs [13:36:41] [PASSED] 12 VFs [13:36:41] [PASSED] 13 VFs [13:36:41] [PASSED] 14 VFs [13:36:41] [PASSED] 15 VFs [13:36:41] [PASSED] 16 VFs [13:36:41] [PASSED] 17 VFs [13:36:41] [PASSED] 18 VFs [13:36:41] [PASSED] 19 VFs [13:36:41] [PASSED] 20 VFs [13:36:41] [PASSED] 21 VFs [13:36:41] [PASSED] 22 VFs [13:36:41] [PASSED] 23 VFs [13:36:41] [PASSED] 24 VFs [13:36:41] [PASSED] 25 VFs [13:36:41] [PASSED] 26 VFs [13:36:41] [PASSED] 27 VFs [13:36:41] [PASSED] 28 VFs [13:36:41] [PASSED] 29 VFs [13:36:41] [PASSED] 30 VFs [13:36:41] [PASSED] 31 VFs [13:36:41] [PASSED] 32 VFs [13:36:41] [PASSED] 33 VFs [13:36:41] [PASSED] 34 VFs [13:36:41] [PASSED] 35 VFs [13:36:41] [PASSED] 36 VFs [13:36:41] [PASSED] 37 VFs [13:36:41] [PASSED] 38 VFs [13:36:41] [PASSED] 39 VFs [13:36:41] [PASSED] 40 VFs [13:36:41] [PASSED] 41 VFs [13:36:41] [PASSED] 42 VFs [13:36:41] [PASSED] 43 VFs [13:36:41] [PASSED] 44 VFs [13:36:41] [PASSED] 45 VFs [13:36:41] [PASSED] 46 VFs [13:36:41] [PASSED] 47 VFs [13:36:41] [PASSED] 48 VFs [13:36:41] [PASSED] 49 VFs [13:36:41] [PASSED] 50 VFs [13:36:41] [PASSED] 51 VFs [13:36:41] [PASSED] 52 VFs [13:36:41] [PASSED] 53 VFs [13:36:41] [PASSED] 54 VFs [13:36:41] [PASSED] 55 VFs [13:36:41] [PASSED] 56 VFs [13:36:41] [PASSED] 57 VFs [13:36:41] [PASSED] 58 VFs [13:36:41] [PASSED] 59 VFs [13:36:41] [PASSED] 60 VFs [13:36:41] [PASSED] 61 VFs [13:36:41] [PASSED] 62 VFs [13:36:41] [PASSED] 63 VFs [13:36:41] ==================== [PASSED] fair_vram ==================== [13:36:41] ================== [PASSED] pf_gt_config =================== [13:36:41] ===================== lmtt (1 subtest) ===================== [13:36:41] ======================== test_ops ========================= [13:36:41] [PASSED] 2-level [13:36:41] [PASSED] multi-level [13:36:41] ==================== [PASSED] test_ops ===================== [13:36:41] ====================== [PASSED] lmtt ======================= [13:36:41] ================= pf_service (11 subtests) ================= [13:36:41] [PASSED] pf_negotiate_any [13:36:41] [PASSED] pf_negotiate_base_match [13:36:41] [PASSED] pf_negotiate_base_newer [13:36:41] [PASSED] pf_negotiate_base_next [13:36:41] [SKIPPED] pf_negotiate_base_older [13:36:41] [PASSED] pf_negotiate_base_prev [13:36:41] [PASSED] pf_negotiate_latest_match [13:36:41] [PASSED] pf_negotiate_latest_newer [13:36:41] [PASSED] pf_negotiate_latest_next [13:36:41] [SKIPPED] pf_negotiate_latest_older [13:36:41] [SKIPPED] pf_negotiate_latest_prev [13:36:41] =================== [PASSED] pf_service ==================== [13:36:41] ================= xe_guc_g2g (2 subtests) ================== [13:36:41] ============== xe_live_guc_g2g_kunit_default ============== [13:36:41] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ========== [13:36:41] ============== xe_live_guc_g2g_kunit_allmem =============== [13:36:41] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ========== [13:36:41] =================== [SKIPPED] xe_guc_g2g =================== [13:36:41] =================== xe_mocs (2 subtests) =================== [13:36:41] ================ xe_live_mocs_kernel_kunit ================ [13:36:41] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [13:36:41] ================ xe_live_mocs_reset_kunit ================= [13:36:41] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [13:36:41] ==================== [SKIPPED] xe_mocs ===================== [13:36:41] ================= xe_migrate (2 subtests) ================== [13:36:41] ================= xe_migrate_sanity_kunit ================= [13:36:41] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [13:36:41] ================== xe_validate_ccs_kunit ================== [13:36:41] ============= [SKIPPED] xe_validate_ccs_kunit ============== [13:36:41] =================== [SKIPPED] xe_migrate =================== [13:36:41] ================== xe_dma_buf (1 subtest) ================== [13:36:41] ==================== xe_dma_buf_kunit ===================== [13:36:41] ================ [SKIPPED] xe_dma_buf_kunit ================ [13:36:41] =================== [SKIPPED] xe_dma_buf =================== [13:36:41] ================= xe_bo_shrink (1 subtest) ================= [13:36:41] =================== xe_bo_shrink_kunit ==================== [13:36:41] =============== [SKIPPED] xe_bo_shrink_kunit =============== [13:36:41] ================== [SKIPPED] xe_bo_shrink ================== [13:36:41] ==================== xe_bo (2 subtests) ==================== [13:36:41] ================== xe_ccs_migrate_kunit =================== [13:36:41] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [13:36:41] ==================== xe_bo_evict_kunit ==================== [13:36:41] =============== [SKIPPED] xe_bo_evict_kunit ================ [13:36:41] ===================== [SKIPPED] xe_bo ====================== [13:36:41] ==================== args (13 subtests) ==================== [13:36:41] [PASSED] count_args_test [13:36:41] [PASSED] call_args_example [13:36:41] [PASSED] call_args_test [13:36:41] [PASSED] drop_first_arg_example [13:36:41] [PASSED] drop_first_arg_test [13:36:41] [PASSED] first_arg_example [13:36:41] [PASSED] first_arg_test [13:36:41] [PASSED] last_arg_example [13:36:41] [PASSED] last_arg_test [13:36:41] [PASSED] pick_arg_example [13:36:41] [PASSED] if_args_example [13:36:41] [PASSED] if_args_test [13:36:41] [PASSED] sep_comma_example [13:36:41] ====================== [PASSED] args ======================= [13:36:41] =================== xe_pci (3 subtests) ==================== [13:36:41] ==================== check_graphics_ip ==================== [13:36:41] [PASSED] 12.00 Xe_LP [13:36:41] [PASSED] 12.10 Xe_LP+ [13:36:41] [PASSED] 12.55 Xe_HPG [13:36:41] [PASSED] 12.60 Xe_HPC [13:36:41] [PASSED] 12.70 Xe_LPG [13:36:41] [PASSED] 12.71 Xe_LPG [13:36:41] [PASSED] 12.74 Xe_LPG+ [13:36:41] [PASSED] 20.01 Xe2_HPG [13:36:41] [PASSED] 20.02 Xe2_HPG [13:36:41] [PASSED] 20.04 Xe2_LPG [13:36:41] [PASSED] 30.00 Xe3_LPG [13:36:41] [PASSED] 30.01 Xe3_LPG [13:36:41] [PASSED] 30.03 Xe3_LPG [13:36:41] [PASSED] 30.04 Xe3_LPG [13:36:41] [PASSED] 30.05 Xe3_LPG [13:36:41] [PASSED] 35.10 Xe3p_LPG [13:36:41] [PASSED] 35.11 Xe3p_XPC [13:36:41] ================ [PASSED] check_graphics_ip ================ [13:36:41] ===================== check_media_ip ====================== [13:36:41] [PASSED] 12.00 Xe_M [13:36:41] [PASSED] 12.55 Xe_HPM [13:36:41] [PASSED] 13.00 Xe_LPM+ [13:36:41] [PASSED] 13.01 Xe2_HPM [13:36:41] [PASSED] 20.00 Xe2_LPM [13:36:41] [PASSED] 30.00 Xe3_LPM [13:36:41] [PASSED] 30.02 Xe3_LPM [13:36:41] [PASSED] 35.00 Xe3p_LPM [13:36:41] [PASSED] 35.03 Xe3p_HPM [13:36:41] ================= [PASSED] check_media_ip ================== [13:36:41] =================== check_platform_desc =================== [13:36:41] [PASSED] 0x9A60 (TIGERLAKE) [13:36:41] [PASSED] 0x9A68 (TIGERLAKE) [13:36:41] [PASSED] 0x9A70 (TIGERLAKE) [13:36:41] [PASSED] 0x9A40 (TIGERLAKE) [13:36:41] [PASSED] 0x9A49 (TIGERLAKE) [13:36:41] [PASSED] 0x9A59 (TIGERLAKE) [13:36:41] [PASSED] 0x9A78 (TIGERLAKE) [13:36:41] [PASSED] 0x9AC0 (TIGERLAKE) [13:36:41] [PASSED] 0x9AC9 (TIGERLAKE) [13:36:41] [PASSED] 0x9AD9 (TIGERLAKE) [13:36:41] [PASSED] 0x9AF8 (TIGERLAKE) [13:36:41] [PASSED] 0x4C80 (ROCKETLAKE) [13:36:41] [PASSED] 0x4C8A (ROCKETLAKE) [13:36:41] [PASSED] 0x4C8B (ROCKETLAKE) [13:36:41] [PASSED] 0x4C8C (ROCKETLAKE) [13:36:41] [PASSED] 0x4C90 (ROCKETLAKE) [13:36:41] [PASSED] 0x4C9A (ROCKETLAKE) [13:36:41] [PASSED] 0x4680 (ALDERLAKE_S) [13:36:41] [PASSED] 0x4682 (ALDERLAKE_S) [13:36:41] [PASSED] 0x4688 (ALDERLAKE_S) [13:36:41] [PASSED] 0x468A (ALDERLAKE_S) [13:36:41] [PASSED] 0x468B (ALDERLAKE_S) [13:36:41] [PASSED] 0x4690 (ALDERLAKE_S) [13:36:41] [PASSED] 0x4692 (ALDERLAKE_S) [13:36:41] [PASSED] 0x4693 (ALDERLAKE_S) [13:36:41] [PASSED] 0x46A0 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46A1 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46A2 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46A3 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46A6 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46A8 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46AA (ALDERLAKE_P) [13:36:41] [PASSED] 0x462A (ALDERLAKE_P) [13:36:41] [PASSED] 0x4626 (ALDERLAKE_P) [13:36:41] [PASSED] 0x4628 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46B0 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46B1 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46B2 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46B3 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46C0 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46C1 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46C2 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46C3 (ALDERLAKE_P) [13:36:41] [PASSED] 0x46D0 (ALDERLAKE_N) [13:36:41] [PASSED] 0x46D1 (ALDERLAKE_N) [13:36:41] [PASSED] 0x46D2 (ALDERLAKE_N) [13:36:41] [PASSED] 0x46D3 (ALDERLAKE_N) [13:36:41] [PASSED] 0x46D4 (ALDERLAKE_N) [13:36:41] [PASSED] 0xA721 (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7A1 (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7A9 (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7AC (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7AD (ALDERLAKE_P) [13:36:41] [PASSED] 0xA720 (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7A0 (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7A8 (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7AA (ALDERLAKE_P) [13:36:41] [PASSED] 0xA7AB (ALDERLAKE_P) [13:36:41] [PASSED] 0xA780 (ALDERLAKE_S) [13:36:41] [PASSED] 0xA781 (ALDERLAKE_S) [13:36:41] [PASSED] 0xA782 (ALDERLAKE_S) [13:36:41] [PASSED] 0xA783 (ALDERLAKE_S) [13:36:41] [PASSED] 0xA788 (ALDERLAKE_S) [13:36:41] [PASSED] 0xA789 (ALDERLAKE_S) [13:36:41] [PASSED] 0xA78A (ALDERLAKE_S) [13:36:41] [PASSED] 0xA78B (ALDERLAKE_S) [13:36:41] [PASSED] 0x4905 (DG1) [13:36:41] [PASSED] 0x4906 (DG1) [13:36:41] [PASSED] 0x4907 (DG1) [13:36:41] [PASSED] 0x4908 (DG1) [13:36:41] [PASSED] 0x4909 (DG1) [13:36:41] [PASSED] 0x56C0 (DG2) [13:36:41] [PASSED] 0x56C2 (DG2) [13:36:41] [PASSED] 0x56C1 (DG2) [13:36:41] [PASSED] 0x7D51 (METEORLAKE) [13:36:41] [PASSED] 0x7DD1 (METEORLAKE) [13:36:41] [PASSED] 0x7D41 (METEORLAKE) [13:36:41] [PASSED] 0x7D67 (METEORLAKE) [13:36:41] [PASSED] 0xB640 (METEORLAKE) [13:36:41] [PASSED] 0x56A0 (DG2) [13:36:41] [PASSED] 0x56A1 (DG2) [13:36:41] [PASSED] 0x56A2 (DG2) [13:36:41] [PASSED] 0x56BE (DG2) [13:36:41] [PASSED] 0x56BF (DG2) [13:36:41] [PASSED] 0x5690 (DG2) [13:36:41] [PASSED] 0x5691 (DG2) [13:36:41] [PASSED] 0x5692 (DG2) [13:36:41] [PASSED] 0x56A5 (DG2) [13:36:41] [PASSED] 0x56A6 (DG2) [13:36:41] [PASSED] 0x56B0 (DG2) [13:36:41] [PASSED] 0x56B1 (DG2) [13:36:41] [PASSED] 0x56BA (DG2) [13:36:41] [PASSED] 0x56BB (DG2) [13:36:41] [PASSED] 0x56BC (DG2) [13:36:41] [PASSED] 0x56BD (DG2) [13:36:41] [PASSED] 0x5693 (DG2) [13:36:41] [PASSED] 0x5694 (DG2) [13:36:41] [PASSED] 0x5695 (DG2) [13:36:41] [PASSED] 0x56A3 (DG2) [13:36:41] [PASSED] 0x56A4 (DG2) [13:36:41] [PASSED] 0x56B2 (DG2) [13:36:41] [PASSED] 0x56B3 (DG2) [13:36:41] [PASSED] 0x5696 (DG2) [13:36:41] [PASSED] 0x5697 (DG2) [13:36:41] [PASSED] 0xB69 (PVC) [13:36:41] [PASSED] 0xB6E (PVC) [13:36:41] [PASSED] 0xBD4 (PVC) [13:36:41] [PASSED] 0xBD5 (PVC) [13:36:41] [PASSED] 0xBD6 (PVC) [13:36:41] [PASSED] 0xBD7 (PVC) [13:36:41] [PASSED] 0xBD8 (PVC) [13:36:41] [PASSED] 0xBD9 (PVC) [13:36:41] [PASSED] 0xBDA (PVC) [13:36:41] [PASSED] 0xBDB (PVC) [13:36:41] [PASSED] 0xBE0 (PVC) [13:36:41] [PASSED] 0xBE1 (PVC) [13:36:41] [PASSED] 0xBE5 (PVC) [13:36:41] [PASSED] 0x7D40 (METEORLAKE) [13:36:41] [PASSED] 0x7D45 (METEORLAKE) [13:36:41] [PASSED] 0x7D55 (METEORLAKE) [13:36:41] [PASSED] 0x7D60 (METEORLAKE) [13:36:41] [PASSED] 0x7DD5 (METEORLAKE) [13:36:41] [PASSED] 0x6420 (LUNARLAKE) [13:36:41] [PASSED] 0x64A0 (LUNARLAKE) [13:36:41] [PASSED] 0x64B0 (LUNARLAKE) [13:36:41] [PASSED] 0xE202 (BATTLEMAGE) [13:36:41] [PASSED] 0xE209 (BATTLEMAGE) [13:36:41] [PASSED] 0xE20B (BATTLEMAGE) [13:36:41] [PASSED] 0xE20C (BATTLEMAGE) [13:36:41] [PASSED] 0xE20D (BATTLEMAGE) [13:36:41] [PASSED] 0xE210 (BATTLEMAGE) [13:36:41] [PASSED] 0xE211 (BATTLEMAGE) [13:36:41] [PASSED] 0xE212 (BATTLEMAGE) [13:36:41] [PASSED] 0xE216 (BATTLEMAGE) [13:36:41] [PASSED] 0xE220 (BATTLEMAGE) [13:36:41] [PASSED] 0xE221 (BATTLEMAGE) [13:36:41] [PASSED] 0xE222 (BATTLEMAGE) [13:36:41] [PASSED] 0xE223 (BATTLEMAGE) [13:36:41] [PASSED] 0xB080 (PANTHERLAKE) [13:36:41] [PASSED] 0xB081 (PANTHERLAKE) [13:36:41] [PASSED] 0xB082 (PANTHERLAKE) [13:36:41] [PASSED] 0xB083 (PANTHERLAKE) [13:36:41] [PASSED] 0xB084 (PANTHERLAKE) [13:36:41] [PASSED] 0xB085 (PANTHERLAKE) [13:36:41] [PASSED] 0xB086 (PANTHERLAKE) [13:36:41] [PASSED] 0xB087 (PANTHERLAKE) [13:36:41] [PASSED] 0xB08F (PANTHERLAKE) [13:36:41] [PASSED] 0xB090 (PANTHERLAKE) [13:36:41] [PASSED] 0xB0A0 (PANTHERLAKE) [13:36:41] [PASSED] 0xB0B0 (PANTHERLAKE) [13:36:41] [PASSED] 0xFD80 (PANTHERLAKE) [13:36:41] [PASSED] 0xFD81 (PANTHERLAKE) [13:36:41] [PASSED] 0xD740 (NOVALAKE_S) [13:36:41] [PASSED] 0xD741 (NOVALAKE_S) [13:36:41] [PASSED] 0xD742 (NOVALAKE_S) [13:36:41] [PASSED] 0xD743 (NOVALAKE_S) [13:36:41] [PASSED] 0xD744 (NOVALAKE_S) [13:36:41] [PASSED] 0xD745 (NOVALAKE_S) [13:36:41] [PASSED] 0x674C (CRESCENTISLAND) [13:36:41] [PASSED] 0xD750 (NOVALAKE_P) [13:36:41] [PASSED] 0xD751 (NOVALAKE_P) [13:36:41] [PASSED] 0xD752 (NOVALAKE_P) [13:36:41] [PASSED] 0xD753 (NOVALAKE_P) [13:36:41] [PASSED] 0xD754 (NOVALAKE_P) [13:36:41] [PASSED] 0xD755 (NOVALAKE_P) [13:36:41] [PASSED] 0xD756 (NOVALAKE_P) [13:36:41] [PASSED] 0xD757 (NOVALAKE_P) [13:36:41] [PASSED] 0xD75F (NOVALAKE_P) [13:36:41] =============== [PASSED] check_platform_desc =============== [13:36:41] ===================== [PASSED] xe_pci ====================== [13:36:41] =================== xe_rtp (2 subtests) ==================== [13:36:41] =============== xe_rtp_process_to_sr_tests ================ [13:36:41] [PASSED] coalesce-same-reg [13:36:41] [PASSED] no-match-no-add [13:36:41] [PASSED] match-or [13:36:41] [PASSED] match-or-xfail [13:36:41] [PASSED] no-match-no-add-multiple-rules [13:36:41] [PASSED] two-regs-two-entries [13:36:41] [PASSED] clr-one-set-other [13:36:41] [PASSED] set-field [13:36:41] [PASSED] conflict-duplicate stty: 'standard input': Inappropriate ioctl for device [13:36:41] [PASSED] conflict-not-disjoint [13:36:41] [PASSED] conflict-reg-type [13:36:41] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [13:36:41] ================== xe_rtp_process_tests =================== [13:36:41] [PASSED] active1 [13:36:41] [PASSED] active2 [13:36:41] [PASSED] active-inactive [13:36:41] [PASSED] inactive-active [13:36:41] [PASSED] inactive-1st_or_active-inactive [13:36:41] [PASSED] inactive-2nd_or_active-inactive [13:36:41] [PASSED] inactive-last_or_active-inactive [13:36:41] [PASSED] inactive-no_or_active-inactive [13:36:41] ============== [PASSED] xe_rtp_process_tests =============== [13:36:41] ===================== [PASSED] xe_rtp ====================== [13:36:41] ==================== xe_wa (1 subtest) ===================== [13:36:41] ======================== xe_wa_gt ========================= [13:36:41] [PASSED] TIGERLAKE B0 [13:36:41] [PASSED] DG1 A0 [13:36:41] [PASSED] DG1 B0 [13:36:41] [PASSED] ALDERLAKE_S A0 [13:36:41] [PASSED] ALDERLAKE_S B0 [13:36:41] [PASSED] ALDERLAKE_S C0 [13:36:41] [PASSED] ALDERLAKE_S D0 [13:36:41] [PASSED] ALDERLAKE_P A0 [13:36:41] [PASSED] ALDERLAKE_P B0 [13:36:41] [PASSED] ALDERLAKE_P C0 [13:36:41] [PASSED] ALDERLAKE_S RPLS D0 [13:36:41] [PASSED] ALDERLAKE_P RPLU E0 [13:36:41] [PASSED] DG2 G10 C0 [13:36:41] [PASSED] DG2 G11 B1 [13:36:41] [PASSED] DG2 G12 A1 [13:36:41] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0 [13:36:41] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0 [13:36:41] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0 [13:36:41] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0 [13:36:41] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0 [13:36:41] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1 [13:36:41] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0 [13:36:41] ==================== [PASSED] xe_wa_gt ===================== [13:36:41] ====================== [PASSED] xe_wa ====================== [13:36:41] ============================================================ [13:36:41] Testing complete. Ran 597 tests: passed: 579, skipped: 18 [13:36:41] Elapsed time: 42.779s total, 4.358s configuring, 37.754s building, 0.627s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [13:36:41] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [13:36:42] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=25 [13:37:12] Starting KUnit Kernel (1/1)... [13:37:12] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [13:37:12] ============ drm_test_pick_cmdline (2 subtests) ============ [13:37:12] [PASSED] drm_test_pick_cmdline_res_1920_1080_60 [13:37:12] =============== drm_test_pick_cmdline_named =============== [13:37:12] [PASSED] NTSC [13:37:12] [PASSED] NTSC-J [13:37:12] [PASSED] PAL [13:37:12] [PASSED] PAL-M [13:37:12] =========== [PASSED] drm_test_pick_cmdline_named =========== [13:37:12] ============== [PASSED] drm_test_pick_cmdline ============== [13:37:12] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [13:37:12] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [13:37:12] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [13:37:12] =========== drm_validate_clone_mode (2 subtests) =========== [13:37:12] ============== drm_test_check_in_clone_mode =============== [13:37:12] [PASSED] in_clone_mode [13:37:12] [PASSED] not_in_clone_mode [13:37:12] ========== [PASSED] drm_test_check_in_clone_mode =========== [13:37:12] =============== drm_test_check_valid_clones =============== [13:37:12] [PASSED] not_in_clone_mode [13:37:12] [PASSED] valid_clone [13:37:12] [PASSED] invalid_clone [13:37:12] =========== [PASSED] drm_test_check_valid_clones =========== [13:37:12] ============= [PASSED] drm_validate_clone_mode ============= [13:37:12] ============= drm_validate_modeset (1 subtest) ============= [13:37:12] [PASSED] drm_test_check_connector_changed_modeset [13:37:12] ============== [PASSED] drm_validate_modeset =============== [13:37:12] ====== drm_test_bridge_get_current_state (2 subtests) ====== [13:37:12] [PASSED] drm_test_drm_bridge_get_current_state_atomic [13:37:12] [PASSED] drm_test_drm_bridge_get_current_state_legacy [13:37:12] ======== [PASSED] drm_test_bridge_get_current_state ======== [13:37:12] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ====== [13:37:12] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [13:37:12] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [13:37:12] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy [13:37:12] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [13:37:12] ============== drm_bridge_alloc (2 subtests) =============== [13:37:12] [PASSED] drm_test_drm_bridge_alloc_basic [13:37:12] [PASSED] drm_test_drm_bridge_alloc_get_put [13:37:12] ================ [PASSED] drm_bridge_alloc ================= [13:37:12] ============= drm_cmdline_parser (40 subtests) ============= [13:37:12] [PASSED] drm_test_cmdline_force_d_only [13:37:12] [PASSED] drm_test_cmdline_force_D_only_dvi [13:37:12] [PASSED] drm_test_cmdline_force_D_only_hdmi [13:37:12] [PASSED] drm_test_cmdline_force_D_only_not_digital [13:37:12] [PASSED] drm_test_cmdline_force_e_only [13:37:12] [PASSED] drm_test_cmdline_res [13:37:12] [PASSED] drm_test_cmdline_res_vesa [13:37:12] [PASSED] drm_test_cmdline_res_vesa_rblank [13:37:12] [PASSED] drm_test_cmdline_res_rblank [13:37:12] [PASSED] drm_test_cmdline_res_bpp [13:37:12] [PASSED] drm_test_cmdline_res_refresh [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [13:37:12] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [13:37:12] [PASSED] drm_test_cmdline_res_margins_force_on [13:37:12] [PASSED] drm_test_cmdline_res_vesa_margins [13:37:12] [PASSED] drm_test_cmdline_name [13:37:12] [PASSED] drm_test_cmdline_name_bpp [13:37:12] [PASSED] drm_test_cmdline_name_option [13:37:12] [PASSED] drm_test_cmdline_name_bpp_option [13:37:12] [PASSED] drm_test_cmdline_rotate_0 [13:37:12] [PASSED] drm_test_cmdline_rotate_90 [13:37:12] [PASSED] drm_test_cmdline_rotate_180 [13:37:12] [PASSED] drm_test_cmdline_rotate_270 [13:37:12] [PASSED] drm_test_cmdline_hmirror [13:37:12] [PASSED] drm_test_cmdline_vmirror [13:37:12] [PASSED] drm_test_cmdline_margin_options [13:37:12] [PASSED] drm_test_cmdline_multiple_options [13:37:12] [PASSED] drm_test_cmdline_bpp_extra_and_option [13:37:12] [PASSED] drm_test_cmdline_extra_and_option [13:37:12] [PASSED] drm_test_cmdline_freestanding_options [13:37:12] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [13:37:12] [PASSED] drm_test_cmdline_panel_orientation [13:37:12] ================ drm_test_cmdline_invalid ================= [13:37:12] [PASSED] margin_only [13:37:12] [PASSED] interlace_only [13:37:12] [PASSED] res_missing_x [13:37:12] [PASSED] res_missing_y [13:37:12] [PASSED] res_bad_y [13:37:12] [PASSED] res_missing_y_bpp [13:37:12] [PASSED] res_bad_bpp [13:37:12] [PASSED] res_bad_refresh [13:37:12] [PASSED] res_bpp_refresh_force_on_off [13:37:12] [PASSED] res_invalid_mode [13:37:12] [PASSED] res_bpp_wrong_place_mode [13:37:12] [PASSED] name_bpp_refresh [13:37:12] [PASSED] name_refresh [13:37:12] [PASSED] name_refresh_wrong_mode [13:37:12] [PASSED] name_refresh_invalid_mode [13:37:12] [PASSED] rotate_multiple [13:37:12] [PASSED] rotate_invalid_val [13:37:12] [PASSED] rotate_truncated [13:37:12] [PASSED] invalid_option [13:37:12] [PASSED] invalid_tv_option [13:37:12] [PASSED] truncated_tv_option [13:37:12] ============ [PASSED] drm_test_cmdline_invalid ============= [13:37:12] =============== drm_test_cmdline_tv_options =============== [13:37:12] [PASSED] NTSC [13:37:12] [PASSED] NTSC_443 [13:37:12] [PASSED] NTSC_J [13:37:12] [PASSED] PAL [13:37:12] [PASSED] PAL_M [13:37:12] [PASSED] PAL_N [13:37:12] [PASSED] SECAM [13:37:12] [PASSED] MONO_525 [13:37:12] [PASSED] MONO_625 [13:37:12] =========== [PASSED] drm_test_cmdline_tv_options =========== [13:37:12] =============== [PASSED] drm_cmdline_parser ================ [13:37:12] ========== drmm_connector_hdmi_init (20 subtests) ========== [13:37:12] [PASSED] drm_test_connector_hdmi_init_valid [13:37:12] [PASSED] drm_test_connector_hdmi_init_bpc_8 [13:37:12] [PASSED] drm_test_connector_hdmi_init_bpc_10 [13:37:12] [PASSED] drm_test_connector_hdmi_init_bpc_12 [13:37:12] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [13:37:12] [PASSED] drm_test_connector_hdmi_init_bpc_null [13:37:12] [PASSED] drm_test_connector_hdmi_init_formats_empty [13:37:12] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [13:37:12] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [13:37:12] [PASSED] supported_formats=0x9 yuv420_allowed=1 [13:37:12] [PASSED] supported_formats=0x9 yuv420_allowed=0 [13:37:12] [PASSED] supported_formats=0x3 yuv420_allowed=1 [13:37:12] [PASSED] supported_formats=0x3 yuv420_allowed=0 [13:37:12] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [13:37:12] [PASSED] drm_test_connector_hdmi_init_null_ddc [13:37:12] [PASSED] drm_test_connector_hdmi_init_null_product [13:37:12] [PASSED] drm_test_connector_hdmi_init_null_vendor [13:37:12] [PASSED] drm_test_connector_hdmi_init_product_length_exact [13:37:12] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [13:37:12] [PASSED] drm_test_connector_hdmi_init_product_valid [13:37:12] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [13:37:12] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [13:37:12] [PASSED] drm_test_connector_hdmi_init_vendor_valid [13:37:12] ========= drm_test_connector_hdmi_init_type_valid ========= [13:37:12] [PASSED] HDMI-A [13:37:12] [PASSED] HDMI-B [13:37:12] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [13:37:12] ======== drm_test_connector_hdmi_init_type_invalid ======== [13:37:12] [PASSED] Unknown [13:37:12] [PASSED] VGA [13:37:12] [PASSED] DVI-I [13:37:12] [PASSED] DVI-D [13:37:12] [PASSED] DVI-A [13:37:12] [PASSED] Composite [13:37:12] [PASSED] SVIDEO [13:37:12] [PASSED] LVDS [13:37:12] [PASSED] Component [13:37:12] [PASSED] DIN [13:37:12] [PASSED] DP [13:37:12] [PASSED] TV [13:37:12] [PASSED] eDP [13:37:12] [PASSED] Virtual [13:37:12] [PASSED] DSI [13:37:12] [PASSED] DPI [13:37:12] [PASSED] Writeback [13:37:12] [PASSED] SPI [13:37:12] [PASSED] USB [13:37:12] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [13:37:12] ============ [PASSED] drmm_connector_hdmi_init ============= [13:37:12] ============= drmm_connector_init (3 subtests) ============= [13:37:12] [PASSED] drm_test_drmm_connector_init [13:37:12] [PASSED] drm_test_drmm_connector_init_null_ddc [13:37:12] ========= drm_test_drmm_connector_init_type_valid ========= [13:37:12] [PASSED] Unknown [13:37:12] [PASSED] VGA [13:37:12] [PASSED] DVI-I [13:37:12] [PASSED] DVI-D [13:37:12] [PASSED] DVI-A [13:37:12] [PASSED] Composite [13:37:12] [PASSED] SVIDEO [13:37:12] [PASSED] LVDS [13:37:12] [PASSED] Component [13:37:12] [PASSED] DIN [13:37:12] [PASSED] DP [13:37:12] [PASSED] HDMI-A [13:37:12] [PASSED] HDMI-B [13:37:12] [PASSED] TV [13:37:12] [PASSED] eDP [13:37:12] [PASSED] Virtual [13:37:12] [PASSED] DSI [13:37:12] [PASSED] DPI [13:37:12] [PASSED] Writeback [13:37:12] [PASSED] SPI [13:37:12] [PASSED] USB [13:37:12] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [13:37:12] =============== [PASSED] drmm_connector_init =============== [13:37:12] ========= drm_connector_dynamic_init (6 subtests) ========== [13:37:12] [PASSED] drm_test_drm_connector_dynamic_init [13:37:12] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [13:37:12] [PASSED] drm_test_drm_connector_dynamic_init_not_added [13:37:12] [PASSED] drm_test_drm_connector_dynamic_init_properties [13:37:12] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [13:37:12] [PASSED] Unknown [13:37:12] [PASSED] VGA [13:37:12] [PASSED] DVI-I [13:37:12] [PASSED] DVI-D [13:37:12] [PASSED] DVI-A [13:37:12] [PASSED] Composite [13:37:12] [PASSED] SVIDEO [13:37:12] [PASSED] LVDS [13:37:12] [PASSED] Component [13:37:12] [PASSED] DIN [13:37:12] [PASSED] DP [13:37:12] [PASSED] HDMI-A [13:37:12] [PASSED] HDMI-B [13:37:12] [PASSED] TV [13:37:12] [PASSED] eDP [13:37:12] [PASSED] Virtual [13:37:12] [PASSED] DSI [13:37:12] [PASSED] DPI [13:37:12] [PASSED] Writeback [13:37:12] [PASSED] SPI [13:37:12] [PASSED] USB [13:37:12] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [13:37:12] ======== drm_test_drm_connector_dynamic_init_name ========= [13:37:12] [PASSED] Unknown [13:37:12] [PASSED] VGA [13:37:12] [PASSED] DVI-I [13:37:12] [PASSED] DVI-D [13:37:12] [PASSED] DVI-A [13:37:12] [PASSED] Composite [13:37:12] [PASSED] SVIDEO [13:37:12] [PASSED] LVDS [13:37:12] [PASSED] Component [13:37:12] [PASSED] DIN [13:37:12] [PASSED] DP [13:37:12] [PASSED] HDMI-A [13:37:12] [PASSED] HDMI-B [13:37:12] [PASSED] TV [13:37:12] [PASSED] eDP [13:37:12] [PASSED] Virtual [13:37:12] [PASSED] DSI [13:37:12] [PASSED] DPI [13:37:12] [PASSED] Writeback [13:37:12] [PASSED] SPI [13:37:12] [PASSED] USB [13:37:12] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [13:37:12] =========== [PASSED] drm_connector_dynamic_init ============ [13:37:12] ==== drm_connector_dynamic_register_early (4 subtests) ===== [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [13:37:12] ====== [PASSED] drm_connector_dynamic_register_early ======= [13:37:12] ======= drm_connector_dynamic_register (7 subtests) ======== [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_on_list [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_no_init [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [13:37:12] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [13:37:12] ========= [PASSED] drm_connector_dynamic_register ========== [13:37:12] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [13:37:12] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [13:37:12] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [13:37:12] === [PASSED] drm_connector_attach_broadcast_rgb_property === [13:37:12] ========== drm_get_tv_mode_from_name (2 subtests) ========== [13:37:12] ========== drm_test_get_tv_mode_from_name_valid =========== [13:37:12] [PASSED] NTSC [13:37:12] [PASSED] NTSC-443 [13:37:12] [PASSED] NTSC-J [13:37:12] [PASSED] PAL [13:37:12] [PASSED] PAL-M [13:37:12] [PASSED] PAL-N [13:37:12] [PASSED] SECAM [13:37:12] [PASSED] Mono [13:37:12] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [13:37:12] [PASSED] drm_test_get_tv_mode_from_name_truncated [13:37:12] ============ [PASSED] drm_get_tv_mode_from_name ============ [13:37:12] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [13:37:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [13:37:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [13:37:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [13:37:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [13:37:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [13:37:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [13:37:12] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [13:37:12] [PASSED] VIC 96 [13:37:12] [PASSED] VIC 97 [13:37:12] [PASSED] VIC 101 [13:37:12] [PASSED] VIC 102 [13:37:12] [PASSED] VIC 106 [13:37:12] [PASSED] VIC 107 [13:37:12] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [13:37:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [13:37:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [13:37:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [13:37:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [13:37:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [13:37:12] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [13:37:12] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [13:37:12] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [13:37:12] [PASSED] Automatic [13:37:12] [PASSED] Full [13:37:12] [PASSED] Limited 16:235 [13:37:12] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [13:37:12] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [13:37:12] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [13:37:12] == drm_hdmi_connector_get_output_format_name (2 subtests) == [13:37:12] === drm_test_drm_hdmi_connector_get_output_format_name ==== [13:37:12] [PASSED] RGB [13:37:12] [PASSED] YUV 4:2:0 [13:37:12] [PASSED] YUV 4:2:2 [13:37:12] [PASSED] YUV 4:4:4 [13:37:12] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [13:37:12] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [13:37:12] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [13:37:12] ============= drm_damage_helper (21 subtests) ============== [13:37:12] [PASSED] drm_test_damage_iter_no_damage [13:37:12] [PASSED] drm_test_damage_iter_no_damage_fractional_src [13:37:12] [PASSED] drm_test_damage_iter_no_damage_src_moved [13:37:12] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [13:37:12] [PASSED] drm_test_damage_iter_no_damage_not_visible [13:37:12] [PASSED] drm_test_damage_iter_no_damage_no_crtc [13:37:12] [PASSED] drm_test_damage_iter_no_damage_no_fb [13:37:12] [PASSED] drm_test_damage_iter_simple_damage [13:37:12] [PASSED] drm_test_damage_iter_single_damage [13:37:12] [PASSED] drm_test_damage_iter_single_damage_intersect_src [13:37:12] [PASSED] drm_test_damage_iter_single_damage_outside_src [13:37:12] [PASSED] drm_test_damage_iter_single_damage_fractional_src [13:37:12] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [13:37:12] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [13:37:12] [PASSED] drm_test_damage_iter_single_damage_src_moved [13:37:12] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [13:37:12] [PASSED] drm_test_damage_iter_damage [13:37:12] [PASSED] drm_test_damage_iter_damage_one_intersect [13:37:12] [PASSED] drm_test_damage_iter_damage_one_outside [13:37:12] [PASSED] drm_test_damage_iter_damage_src_moved [13:37:12] [PASSED] drm_test_damage_iter_damage_not_visible [13:37:12] ================ [PASSED] drm_damage_helper ================ [13:37:12] ============== drm_dp_mst_helper (3 subtests) ============== [13:37:12] ============== drm_test_dp_mst_calc_pbn_mode ============== [13:37:12] [PASSED] Clock 154000 BPP 30 DSC disabled [13:37:12] [PASSED] Clock 234000 BPP 30 DSC disabled [13:37:12] [PASSED] Clock 297000 BPP 24 DSC disabled [13:37:12] [PASSED] Clock 332880 BPP 24 DSC enabled [13:37:12] [PASSED] Clock 324540 BPP 24 DSC enabled [13:37:12] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [13:37:12] ============== drm_test_dp_mst_calc_pbn_div =============== [13:37:12] [PASSED] Link rate 2000000 lane count 4 [13:37:12] [PASSED] Link rate 2000000 lane count 2 [13:37:12] [PASSED] Link rate 2000000 lane count 1 [13:37:12] [PASSED] Link rate 1350000 lane count 4 [13:37:12] [PASSED] Link rate 1350000 lane count 2 [13:37:12] [PASSED] Link rate 1350000 lane count 1 [13:37:12] [PASSED] Link rate 1000000 lane count 4 [13:37:12] [PASSED] Link rate 1000000 lane count 2 [13:37:12] [PASSED] Link rate 1000000 lane count 1 [13:37:12] [PASSED] Link rate 810000 lane count 4 [13:37:12] [PASSED] Link rate 810000 lane count 2 [13:37:12] [PASSED] Link rate 810000 lane count 1 [13:37:12] [PASSED] Link rate 540000 lane count 4 [13:37:12] [PASSED] Link rate 540000 lane count 2 [13:37:12] [PASSED] Link rate 540000 lane count 1 [13:37:12] [PASSED] Link rate 270000 lane count 4 [13:37:12] [PASSED] Link rate 270000 lane count 2 [13:37:12] [PASSED] Link rate 270000 lane count 1 [13:37:12] [PASSED] Link rate 162000 lane count 4 [13:37:12] [PASSED] Link rate 162000 lane count 2 [13:37:12] [PASSED] Link rate 162000 lane count 1 [13:37:12] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [13:37:12] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [13:37:12] [PASSED] DP_ENUM_PATH_RESOURCES with port number [13:37:12] [PASSED] DP_POWER_UP_PHY with port number [13:37:12] [PASSED] DP_POWER_DOWN_PHY with port number [13:37:12] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [13:37:12] [PASSED] DP_ALLOCATE_PAYLOAD with port number [13:37:12] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [13:37:12] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [13:37:12] [PASSED] DP_QUERY_PAYLOAD with port number [13:37:12] [PASSED] DP_QUERY_PAYLOAD with VCPI [13:37:12] [PASSED] DP_REMOTE_DPCD_READ with port number [13:37:12] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [13:37:12] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [13:37:12] [PASSED] DP_REMOTE_DPCD_WRITE with port number [13:37:12] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [13:37:12] [PASSED] DP_REMOTE_DPCD_WRITE with data array [13:37:12] [PASSED] DP_REMOTE_I2C_READ with port number [13:37:12] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [13:37:12] [PASSED] DP_REMOTE_I2C_READ with transactions array [13:37:12] [PASSED] DP_REMOTE_I2C_WRITE with port number [13:37:12] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [13:37:12] [PASSED] DP_REMOTE_I2C_WRITE with data array [13:37:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [13:37:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [13:37:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [13:37:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [13:37:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [13:37:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [13:37:12] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [13:37:12] ================ [PASSED] drm_dp_mst_helper ================ [13:37:12] ================== drm_exec (7 subtests) =================== [13:37:12] [PASSED] sanitycheck [13:37:12] [PASSED] test_lock [13:37:12] [PASSED] test_lock_unlock [13:37:12] [PASSED] test_duplicates [13:37:12] [PASSED] test_prepare [13:37:12] [PASSED] test_prepare_array [13:37:12] [PASSED] test_multiple_loops [13:37:12] ==================== [PASSED] drm_exec ===================== [13:37:12] =========== drm_format_helper_test (17 subtests) =========== [13:37:12] ============== drm_test_fb_xrgb8888_to_gray8 ============== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [13:37:12] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [13:37:12] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [13:37:12] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [13:37:12] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [13:37:12] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [13:37:12] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [13:37:12] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [13:37:12] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [13:37:12] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [13:37:12] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [13:37:12] ============== drm_test_fb_xrgb8888_to_mono =============== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [13:37:12] ==================== drm_test_fb_swab ===================== [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ================ [PASSED] drm_test_fb_swab ================= [13:37:12] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [13:37:12] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [13:37:12] [PASSED] single_pixel_source_buffer [13:37:12] [PASSED] single_pixel_clip_rectangle [13:37:12] [PASSED] well_known_colors [13:37:12] [PASSED] destination_pitch [13:37:12] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [13:37:12] ================= drm_test_fb_clip_offset ================= [13:37:12] [PASSED] pass through [13:37:12] [PASSED] horizontal offset [13:37:12] [PASSED] vertical offset [13:37:12] [PASSED] horizontal and vertical offset [13:37:12] [PASSED] horizontal offset (custom pitch) [13:37:12] [PASSED] vertical offset (custom pitch) [13:37:12] [PASSED] horizontal and vertical offset (custom pitch) [13:37:12] ============= [PASSED] drm_test_fb_clip_offset ============= [13:37:12] =================== drm_test_fb_memcpy ==================== [13:37:12] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [13:37:12] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [13:37:12] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [13:37:12] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [13:37:12] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [13:37:12] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [13:37:12] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [13:37:12] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [13:37:12] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [13:37:12] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [13:37:12] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [13:37:12] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [13:37:12] =============== [PASSED] drm_test_fb_memcpy ================ [13:37:12] ============= [PASSED] drm_format_helper_test ============== [13:37:12] ================= drm_format (18 subtests) ================= [13:37:12] [PASSED] drm_test_format_block_width_invalid [13:37:12] [PASSED] drm_test_format_block_width_one_plane [13:37:12] [PASSED] drm_test_format_block_width_two_plane [13:37:12] [PASSED] drm_test_format_block_width_three_plane [13:37:12] [PASSED] drm_test_format_block_width_tiled [13:37:12] [PASSED] drm_test_format_block_height_invalid [13:37:12] [PASSED] drm_test_format_block_height_one_plane [13:37:12] [PASSED] drm_test_format_block_height_two_plane [13:37:12] [PASSED] drm_test_format_block_height_three_plane [13:37:12] [PASSED] drm_test_format_block_height_tiled [13:37:12] [PASSED] drm_test_format_min_pitch_invalid [13:37:12] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [13:37:12] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [13:37:12] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [13:37:12] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [13:37:12] [PASSED] drm_test_format_min_pitch_two_plane [13:37:12] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [13:37:12] [PASSED] drm_test_format_min_pitch_tiled [13:37:12] =================== [PASSED] drm_format ==================== [13:37:12] ============== drm_framebuffer (10 subtests) =============== [13:37:12] ========== drm_test_framebuffer_check_src_coords ========== [13:37:12] [PASSED] Success: source fits into fb [13:37:12] [PASSED] Fail: overflowing fb with x-axis coordinate [13:37:12] [PASSED] Fail: overflowing fb with y-axis coordinate [13:37:12] [PASSED] Fail: overflowing fb with source width [13:37:12] [PASSED] Fail: overflowing fb with source height [13:37:12] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [13:37:12] [PASSED] drm_test_framebuffer_cleanup [13:37:12] =============== drm_test_framebuffer_create =============== [13:37:12] [PASSED] ABGR8888 normal sizes [13:37:12] [PASSED] ABGR8888 max sizes [13:37:12] [PASSED] ABGR8888 pitch greater than min required [13:37:12] [PASSED] ABGR8888 pitch less than min required [13:37:12] [PASSED] ABGR8888 Invalid width [13:37:12] [PASSED] ABGR8888 Invalid buffer handle [13:37:12] [PASSED] No pixel format [13:37:12] [PASSED] ABGR8888 Width 0 [13:37:12] [PASSED] ABGR8888 Height 0 [13:37:12] [PASSED] ABGR8888 Out of bound height * pitch combination [13:37:12] [PASSED] ABGR8888 Large buffer offset [13:37:12] [PASSED] ABGR8888 Buffer offset for inexistent plane [13:37:12] [PASSED] ABGR8888 Invalid flag [13:37:12] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [13:37:12] [PASSED] ABGR8888 Valid buffer modifier [13:37:12] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [13:37:12] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] NV12 Normal sizes [13:37:12] [PASSED] NV12 Max sizes [13:37:12] [PASSED] NV12 Invalid pitch [13:37:12] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [13:37:12] [PASSED] NV12 different modifier per-plane [13:37:12] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [13:37:12] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] NV12 Modifier for inexistent plane [13:37:12] [PASSED] NV12 Handle for inexistent plane [13:37:12] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [13:37:12] [PASSED] YVU420 Normal sizes [13:37:12] [PASSED] YVU420 Max sizes [13:37:12] [PASSED] YVU420 Invalid pitch [13:37:12] [PASSED] YVU420 Different pitches [13:37:12] [PASSED] YVU420 Different buffer offsets/pitches [13:37:12] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [13:37:12] [PASSED] YVU420 Valid modifier [13:37:12] [PASSED] YVU420 Different modifiers per plane [13:37:12] [PASSED] YVU420 Modifier for inexistent plane [13:37:12] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [13:37:12] [PASSED] X0L2 Normal sizes [13:37:12] [PASSED] X0L2 Max sizes [13:37:12] [PASSED] X0L2 Invalid pitch [13:37:12] [PASSED] X0L2 Pitch greater than minimum required [13:37:12] [PASSED] X0L2 Handle for inexistent plane [13:37:12] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [13:37:12] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [13:37:12] [PASSED] X0L2 Valid modifier [13:37:12] [PASSED] X0L2 Modifier for inexistent plane [13:37:12] =========== [PASSED] drm_test_framebuffer_create =========== [13:37:12] [PASSED] drm_test_framebuffer_free [13:37:12] [PASSED] drm_test_framebuffer_init [13:37:12] [PASSED] drm_test_framebuffer_init_bad_format [13:37:12] [PASSED] drm_test_framebuffer_init_dev_mismatch [13:37:12] [PASSED] drm_test_framebuffer_lookup [13:37:12] [PASSED] drm_test_framebuffer_lookup_inexistent [13:37:12] [PASSED] drm_test_framebuffer_modifiers_not_supported [13:37:12] ================= [PASSED] drm_framebuffer ================= [13:37:12] ================ drm_gem_shmem (8 subtests) ================ [13:37:12] [PASSED] drm_gem_shmem_test_obj_create [13:37:12] [PASSED] drm_gem_shmem_test_obj_create_private [13:37:12] [PASSED] drm_gem_shmem_test_pin_pages [13:37:12] [PASSED] drm_gem_shmem_test_vmap [13:37:12] [PASSED] drm_gem_shmem_test_get_sg_table [13:37:12] [PASSED] drm_gem_shmem_test_get_pages_sgt [13:37:12] [PASSED] drm_gem_shmem_test_madvise [13:37:12] [PASSED] drm_gem_shmem_test_purge [13:37:12] ================== [PASSED] drm_gem_shmem ================== [13:37:12] === drm_atomic_helper_connector_hdmi_check (27 subtests) === [13:37:12] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [13:37:12] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [13:37:12] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [13:37:12] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [13:37:12] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [13:37:12] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [13:37:12] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [13:37:12] [PASSED] Automatic [13:37:12] [PASSED] Full [13:37:12] [PASSED] Limited 16:235 [13:37:12] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [13:37:12] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [13:37:12] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [13:37:12] [PASSED] drm_test_check_disable_connector [13:37:12] [PASSED] drm_test_check_hdmi_funcs_reject_rate [13:37:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [13:37:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [13:37:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [13:37:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [13:37:12] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [13:37:12] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [13:37:12] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [13:37:12] [PASSED] drm_test_check_output_bpc_dvi [13:37:12] [PASSED] drm_test_check_output_bpc_format_vic_1 [13:37:12] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [13:37:12] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [13:37:12] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [13:37:12] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [13:37:12] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [13:37:12] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [13:37:12] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [13:37:12] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [13:37:12] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [13:37:12] [PASSED] drm_test_check_broadcast_rgb_value [13:37:12] [PASSED] drm_test_check_bpc_8_value [13:37:12] [PASSED] drm_test_check_bpc_10_value [13:37:12] [PASSED] drm_test_check_bpc_12_value [13:37:12] [PASSED] drm_test_check_format_value [13:37:12] [PASSED] drm_test_check_tmds_char_value [13:37:12] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [13:37:12] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) = [13:37:12] [PASSED] drm_test_check_mode_valid [13:37:12] [PASSED] drm_test_check_mode_valid_reject [13:37:12] [PASSED] drm_test_check_mode_valid_reject_rate [13:37:12] [PASSED] drm_test_check_mode_valid_reject_max_clock [13:37:12] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [13:37:12] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) = [13:37:12] [PASSED] drm_test_check_infoframes [13:37:12] [PASSED] drm_test_check_reject_avi_infoframe [13:37:12] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8 [13:37:12] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10 [13:37:12] [PASSED] drm_test_check_reject_audio_infoframe [13:37:12] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes === [13:37:12] ================= drm_managed (2 subtests) ================= [13:37:12] [PASSED] drm_test_managed_release_action [13:37:12] [PASSED] drm_test_managed_run_action [13:37:12] =================== [PASSED] drm_managed =================== [13:37:12] =================== drm_mm (6 subtests) ==================== [13:37:12] [PASSED] drm_test_mm_init [13:37:12] [PASSED] drm_test_mm_debug [13:37:12] [PASSED] drm_test_mm_align32 [13:37:12] [PASSED] drm_test_mm_align64 [13:37:12] [PASSED] drm_test_mm_lowest [13:37:12] [PASSED] drm_test_mm_highest [13:37:12] ===================== [PASSED] drm_mm ====================== [13:37:12] ============= drm_modes_analog_tv (5 subtests) ============= [13:37:12] [PASSED] drm_test_modes_analog_tv_mono_576i [13:37:12] [PASSED] drm_test_modes_analog_tv_ntsc_480i [13:37:12] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [13:37:12] [PASSED] drm_test_modes_analog_tv_pal_576i [13:37:12] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [13:37:12] =============== [PASSED] drm_modes_analog_tv =============== [13:37:12] ============== drm_plane_helper (2 subtests) =============== [13:37:12] =============== drm_test_check_plane_state ================ [13:37:12] [PASSED] clipping_simple [13:37:12] [PASSED] clipping_rotate_reflect [13:37:12] [PASSED] positioning_simple [13:37:12] [PASSED] upscaling [13:37:12] [PASSED] downscaling [13:37:12] [PASSED] rounding1 [13:37:12] [PASSED] rounding2 [13:37:12] [PASSED] rounding3 [13:37:12] [PASSED] rounding4 [13:37:12] =========== [PASSED] drm_test_check_plane_state ============ [13:37:12] =========== drm_test_check_invalid_plane_state ============ [13:37:12] [PASSED] positioning_invalid [13:37:12] [PASSED] upscaling_invalid [13:37:12] [PASSED] downscaling_invalid [13:37:12] ======= [PASSED] drm_test_check_invalid_plane_state ======== [13:37:12] ================ [PASSED] drm_plane_helper ================= [13:37:12] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [13:37:12] ====== drm_test_connector_helper_tv_get_modes_check ======= [13:37:12] [PASSED] None [13:37:12] [PASSED] PAL [13:37:12] [PASSED] NTSC [13:37:12] [PASSED] Both, NTSC Default [13:37:12] [PASSED] Both, PAL Default [13:37:12] [PASSED] Both, NTSC Default, with PAL on command-line [13:37:12] [PASSED] Both, PAL Default, with NTSC on command-line [13:37:12] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [13:37:12] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [13:37:12] ================== drm_rect (9 subtests) =================== [13:37:12] [PASSED] drm_test_rect_clip_scaled_div_by_zero [13:37:12] [PASSED] drm_test_rect_clip_scaled_not_clipped [13:37:12] [PASSED] drm_test_rect_clip_scaled_clipped [13:37:12] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [13:37:12] ================= drm_test_rect_intersect ================= [13:37:12] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [13:37:12] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [13:37:12] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [13:37:12] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [13:37:12] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [13:37:12] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [13:37:12] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [13:37:12] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [13:37:12] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [13:37:12] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [13:37:12] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [13:37:12] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [13:37:12] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [13:37:12] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [13:37:12] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 [13:37:12] ============= [PASSED] drm_test_rect_intersect ============= [13:37:12] ================ drm_test_rect_calc_hscale ================ [13:37:12] [PASSED] normal use [13:37:12] [PASSED] out of max range [13:37:12] [PASSED] out of min range [13:37:12] [PASSED] zero dst [13:37:12] [PASSED] negative src [13:37:12] [PASSED] negative dst [13:37:12] ============ [PASSED] drm_test_rect_calc_hscale ============ [13:37:12] ================ drm_test_rect_calc_vscale ================ [13:37:12] [PASSED] normal use [13:37:12] [PASSED] out of max range [13:37:12] [PASSED] out of min range [13:37:12] [PASSED] zero dst [13:37:12] [PASSED] negative src [13:37:12] [PASSED] negative dst stty: 'standard input': Inappropriate ioctl for device [13:37:12] ============ [PASSED] drm_test_rect_calc_vscale ============ [13:37:12] ================== drm_test_rect_rotate =================== [13:37:12] [PASSED] reflect-x [13:37:12] [PASSED] reflect-y [13:37:12] [PASSED] rotate-0 [13:37:12] [PASSED] rotate-90 [13:37:12] [PASSED] rotate-180 [13:37:12] [PASSED] rotate-270 [13:37:12] ============== [PASSED] drm_test_rect_rotate =============== [13:37:12] ================ drm_test_rect_rotate_inv ================= [13:37:12] [PASSED] reflect-x [13:37:12] [PASSED] reflect-y [13:37:12] [PASSED] rotate-0 [13:37:12] [PASSED] rotate-90 [13:37:12] [PASSED] rotate-180 [13:37:12] [PASSED] rotate-270 [13:37:12] ============ [PASSED] drm_test_rect_rotate_inv ============= [13:37:12] ==================== [PASSED] drm_rect ===================== [13:37:12] ============ drm_sysfb_modeset_test (1 subtest) ============ [13:37:12] ============ drm_test_sysfb_build_fourcc_list ============= [13:37:12] [PASSED] no native formats [13:37:12] [PASSED] XRGB8888 as native format [13:37:12] [PASSED] remove duplicates [13:37:12] [PASSED] convert alpha formats [13:37:12] [PASSED] random formats [13:37:12] ======== [PASSED] drm_test_sysfb_build_fourcc_list ========= [13:37:12] ============= [PASSED] drm_sysfb_modeset_test ============== [13:37:12] ================== drm_fixp (2 subtests) =================== [13:37:12] [PASSED] drm_test_int2fixp [13:37:12] [PASSED] drm_test_sm2fixp [13:37:12] ==================== [PASSED] drm_fixp ===================== [13:37:12] ============================================================ [13:37:12] Testing complete. Ran 621 tests: passed: 621 [13:37:12] Elapsed time: 31.245s total, 1.654s configuring, 29.375s building, 0.177s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [13:37:12] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [13:37:14] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=25 [13:37:23] Starting KUnit Kernel (1/1)... [13:37:23] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [13:37:23] ================= ttm_device (5 subtests) ================== [13:37:23] [PASSED] ttm_device_init_basic [13:37:23] [PASSED] ttm_device_init_multiple [13:37:23] [PASSED] ttm_device_fini_basic [13:37:23] [PASSED] ttm_device_init_no_vma_man [13:37:23] ================== ttm_device_init_pools ================== [13:37:23] [PASSED] No DMA allocations, no DMA32 required [13:37:23] [PASSED] DMA allocations, DMA32 required [13:37:23] [PASSED] No DMA allocations, DMA32 required [13:37:23] [PASSED] DMA allocations, no DMA32 required [13:37:23] ============== [PASSED] ttm_device_init_pools ============== [13:37:23] =================== [PASSED] ttm_device ==================== [13:37:23] ================== ttm_pool (8 subtests) =================== [13:37:23] ================== ttm_pool_alloc_basic =================== [13:37:23] [PASSED] One page [13:37:23] [PASSED] More than one page [13:37:23] [PASSED] Above the allocation limit [13:37:23] [PASSED] One page, with coherent DMA mappings enabled [13:37:23] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [13:37:23] ============== [PASSED] ttm_pool_alloc_basic =============== [13:37:23] ============== ttm_pool_alloc_basic_dma_addr ============== [13:37:23] [PASSED] One page [13:37:23] [PASSED] More than one page [13:37:23] [PASSED] Above the allocation limit [13:37:23] [PASSED] One page, with coherent DMA mappings enabled [13:37:23] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [13:37:23] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ========== [13:37:23] [PASSED] ttm_pool_alloc_order_caching_match [13:37:23] [PASSED] ttm_pool_alloc_caching_mismatch [13:37:23] [PASSED] ttm_pool_alloc_order_mismatch [13:37:23] [PASSED] ttm_pool_free_dma_alloc [13:37:23] [PASSED] ttm_pool_free_no_dma_alloc [13:37:23] [PASSED] ttm_pool_fini_basic [13:37:23] ==================== [PASSED] ttm_pool ===================== [13:37:23] ================ ttm_resource (8 subtests) ================= [13:37:23] ================= ttm_resource_init_basic ================= [13:37:23] [PASSED] Init resource in TTM_PL_SYSTEM [13:37:23] [PASSED] Init resource in TTM_PL_VRAM [13:37:23] [PASSED] Init resource in a private placement [13:37:23] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags [13:37:23] ============= [PASSED] ttm_resource_init_basic ============= [13:37:23] [PASSED] ttm_resource_init_pinned [13:37:23] [PASSED] ttm_resource_fini_basic [13:37:23] [PASSED] ttm_resource_manager_init_basic [13:37:23] [PASSED] ttm_resource_manager_usage_basic [13:37:23] [PASSED] ttm_resource_manager_set_used_basic [13:37:23] [PASSED] ttm_sys_man_alloc_basic [13:37:23] [PASSED] ttm_sys_man_free_basic [13:37:23] ================== [PASSED] ttm_resource =================== [13:37:23] =================== ttm_tt (15 subtests) =================== [13:37:23] ==================== ttm_tt_init_basic ==================== [13:37:23] [PASSED] Page-aligned size [13:37:23] [PASSED] Extra pages requested [13:37:23] ================ [PASSED] ttm_tt_init_basic ================ [13:37:23] [PASSED] ttm_tt_init_misaligned [13:37:23] [PASSED] ttm_tt_fini_basic [13:37:23] [PASSED] ttm_tt_fini_sg [13:37:23] [PASSED] ttm_tt_fini_shmem [13:37:23] [PASSED] ttm_tt_create_basic [13:37:23] [PASSED] ttm_tt_create_invalid_bo_type [13:37:23] [PASSED] ttm_tt_create_ttm_exists [13:37:23] [PASSED] ttm_tt_create_failed [13:37:23] [PASSED] ttm_tt_destroy_basic [13:37:23] [PASSED] ttm_tt_populate_null_ttm [13:37:23] [PASSED] ttm_tt_populate_populated_ttm [13:37:23] [PASSED] ttm_tt_unpopulate_basic [13:37:23] [PASSED] ttm_tt_unpopulate_empty_ttm [13:37:23] [PASSED] ttm_tt_swapin_basic [13:37:23] ===================== [PASSED] ttm_tt ====================== [13:37:23] =================== ttm_bo (14 subtests) =================== [13:37:23] =========== ttm_bo_reserve_optimistic_no_ticket =========== [13:37:23] [PASSED] Cannot be interrupted and sleeps [13:37:23] [PASSED] Cannot be interrupted, locks straight away [13:37:23] [PASSED] Can be interrupted, sleeps [13:37:23] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket ======= [13:37:23] [PASSED] ttm_bo_reserve_locked_no_sleep [13:37:23] [PASSED] ttm_bo_reserve_no_wait_ticket [13:37:23] [PASSED] ttm_bo_reserve_double_resv [13:37:23] [PASSED] ttm_bo_reserve_interrupted [13:37:23] [PASSED] ttm_bo_reserve_deadlock [13:37:23] [PASSED] ttm_bo_unreserve_basic [13:37:23] [PASSED] ttm_bo_unreserve_pinned [13:37:23] [PASSED] ttm_bo_unreserve_bulk [13:37:23] [PASSED] ttm_bo_fini_basic [13:37:23] [PASSED] ttm_bo_fini_shared_resv [13:37:23] [PASSED] ttm_bo_pin_basic [13:37:23] [PASSED] ttm_bo_pin_unpin_resource [13:37:23] [PASSED] ttm_bo_multiple_pin_one_unpin [13:37:23] ===================== [PASSED] ttm_bo ====================== [13:37:23] ============== ttm_bo_validate (22 subtests) =============== [13:37:23] ============== ttm_bo_init_reserved_sys_man =============== [13:37:23] [PASSED] Buffer object for userspace [13:37:23] [PASSED] Kernel buffer object [13:37:23] [PASSED] Shared buffer object [13:37:23] ========== [PASSED] ttm_bo_init_reserved_sys_man =========== [13:37:23] ============== ttm_bo_init_reserved_mock_man ============== [13:37:23] [PASSED] Buffer object for userspace [13:37:23] [PASSED] Kernel buffer object [13:37:23] [PASSED] Shared buffer object [13:37:23] ========== [PASSED] ttm_bo_init_reserved_mock_man ========== [13:37:23] [PASSED] ttm_bo_init_reserved_resv [13:37:23] ================== ttm_bo_validate_basic ================== [13:37:23] [PASSED] Buffer object for userspace [13:37:23] [PASSED] Kernel buffer object [13:37:23] [PASSED] Shared buffer object [13:37:23] ============== [PASSED] ttm_bo_validate_basic ============== [13:37:23] [PASSED] ttm_bo_validate_invalid_placement [13:37:23] ============= ttm_bo_validate_same_placement ============== [13:37:23] [PASSED] System manager [13:37:23] [PASSED] VRAM manager [13:37:23] ========= [PASSED] ttm_bo_validate_same_placement ========== [13:37:23] [PASSED] ttm_bo_validate_failed_alloc [13:37:23] [PASSED] ttm_bo_validate_pinned [13:37:23] [PASSED] ttm_bo_validate_busy_placement [13:37:23] ================ ttm_bo_validate_multihop ================= [13:37:23] [PASSED] Buffer object for userspace [13:37:23] [PASSED] Kernel buffer object [13:37:23] [PASSED] Shared buffer object [13:37:23] ============ [PASSED] ttm_bo_validate_multihop ============= [13:37:23] ========== ttm_bo_validate_no_placement_signaled ========== [13:37:23] [PASSED] Buffer object in system domain, no page vector [13:37:23] [PASSED] Buffer object in system domain with an existing page vector [13:37:23] ====== [PASSED] ttm_bo_validate_no_placement_signaled ====== [13:37:23] ======== ttm_bo_validate_no_placement_not_signaled ======== [13:37:23] [PASSED] Buffer object for userspace [13:37:23] [PASSED] Kernel buffer object [13:37:23] [PASSED] Shared buffer object [13:37:23] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ==== [13:37:23] [PASSED] ttm_bo_validate_move_fence_signaled [13:37:23] ========= ttm_bo_validate_move_fence_not_signaled ========= [13:37:23] [PASSED] Waits for GPU [13:37:23] [PASSED] Tries to lock straight away [13:37:23] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled ===== [13:37:23] [PASSED] ttm_bo_validate_swapout [13:37:23] [PASSED] ttm_bo_validate_happy_evict [13:37:23] [PASSED] ttm_bo_validate_all_pinned_evict [13:37:23] [PASSED] ttm_bo_validate_allowed_only_evict [13:37:23] [PASSED] ttm_bo_validate_deleted_evict [13:37:23] [PASSED] ttm_bo_validate_busy_domain_evict [13:37:23] [PASSED] ttm_bo_validate_evict_gutting [13:37:23] [PASSED] ttm_bo_validate_recrusive_evict stty: 'standard input': Inappropriate ioctl for device [13:37:23] ================= [PASSED] ttm_bo_validate ================= [13:37:23] ============================================================ [13:37:23] Testing complete. Ran 102 tests: passed: 102 [13:37:23] Elapsed time: 11.018s total, 1.658s configuring, 9.144s building, 0.186s running + cleanup ++ stat -c %u:%g /kernel + chown -R 1003:1003 /kernel ^ permalink raw reply [flat|nested] 18+ messages in thread
* ✓ Xe.CI.BAT: success for drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (6 preceding siblings ...) 2026-03-18 13:37 ` ✓ CI.KUnit: success " Patchwork @ 2026-03-18 14:16 ` Patchwork 2026-03-20 2:02 ` ✗ Xe.CI.FULL: failure " Patchwork 8 siblings, 0 replies; 18+ messages in thread From: Patchwork @ 2026-03-18 14:16 UTC (permalink / raw) To: Jani Nikula; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 2472 bytes --] == Series Details == Series: drm/{i915,xe}: move fbdev fb calls to parent interface URL : https://patchwork.freedesktop.org/series/163466/ State : success == Summary == CI Bug Log - changes from xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5_BAT -> xe-pw-163466v1_BAT ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (14 -> 14) ------------------------------ No changes in participating hosts Known issues ------------ Here are the changes found in xe-pw-163466v1_BAT that come from known issues: ### IGT changes ### #### Issues hit #### * igt@kms_flip@basic-flip-vs-wf_vblank@c-edp1: - bat-adlp-7: [PASS][1] -> [DMESG-WARN][2] ([Intel XE#7483]) [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/bat-adlp-7/igt@kms_flip@basic-flip-vs-wf_vblank@c-edp1.html [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/bat-adlp-7/igt@kms_flip@basic-flip-vs-wf_vblank@c-edp1.html * igt@xe_waitfence@engine: - bat-dg2-oem2: [PASS][3] -> [FAIL][4] ([Intel XE#6519]) [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/bat-dg2-oem2/igt@xe_waitfence@engine.html [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/bat-dg2-oem2/igt@xe_waitfence@engine.html #### Possible fixes #### * igt@kms_flip@basic-flip-vs-wf_vblank@d-edp1: - bat-adlp-7: [DMESG-WARN][5] ([Intel XE#7483]) -> [PASS][6] [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/bat-adlp-7/igt@kms_flip@basic-flip-vs-wf_vblank@d-edp1.html [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/bat-adlp-7/igt@kms_flip@basic-flip-vs-wf_vblank@d-edp1.html [Intel XE#6519]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6519 [Intel XE#7483]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7483 Build changes ------------- * IGT: IGT_8808 -> IGT_8809 * Linux: xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5 -> xe-pw-163466v1 IGT_8808: 8808 IGT_8809: 9e55b6cdd3ad1ec8c2264106b035be91d12d8322 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5: 185629feb8aee7cf88f72d1e67531574f1bea7f5 xe-pw-163466v1: 163466v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/index.html [-- Attachment #2: Type: text/html, Size: 3183 bytes --] ^ permalink raw reply [flat|nested] 18+ messages in thread
* ✗ Xe.CI.FULL: failure for drm/{i915,xe}: move fbdev fb calls to parent interface 2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula ` (7 preceding siblings ...) 2026-03-18 14:16 ` ✓ Xe.CI.BAT: " Patchwork @ 2026-03-20 2:02 ` Patchwork 8 siblings, 0 replies; 18+ messages in thread From: Patchwork @ 2026-03-20 2:02 UTC (permalink / raw) To: Jani Nikula; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 29430 bytes --] == Series Details == Series: drm/{i915,xe}: move fbdev fb calls to parent interface URL : https://patchwork.freedesktop.org/series/163466/ State : failure == Summary == CI Bug Log - changes from xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5_FULL -> xe-pw-163466v1_FULL ==================================================== Summary ------- **FAILURE** Serious unknown changes coming with xe-pw-163466v1_FULL absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in xe-pw-163466v1_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them to document this new failure mode, which will reduce false positives in CI. Participating hosts (2 -> 2) ------------------------------ No changes in participating hosts Possible new issues ------------------- Here are the unknown changes that may have been introduced in xe-pw-163466v1_FULL: ### IGT changes ### #### Possible regressions #### * igt@xe_ccs@vm-bind-fault-mode-decompress: - shard-lnl: NOTRUN -> [SKIP][1] +1 other test skip [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-lnl-7/igt@xe_ccs@vm-bind-fault-mode-decompress.html Known issues ------------ Here are the changes found in xe-pw-163466v1_FULL that come from known issues: ### IGT changes ### #### Issues hit #### * igt@kms_big_fb@x-tiled-32bpp-rotate-90: - shard-bmg: NOTRUN -> [SKIP][2] ([Intel XE#2327]) [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html * igt@kms_bw@connected-linear-tiling-1-displays-3840x2160p: - shard-bmg: [PASS][3] -> [SKIP][4] ([Intel XE#7621]) [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_bw@connected-linear-tiling-1-displays-3840x2160p.html [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-10/igt@kms_bw@connected-linear-tiling-1-displays-3840x2160p.html * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc: - shard-bmg: NOTRUN -> [SKIP][5] ([Intel XE#2887]) [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc.html * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs-cc: - shard-bmg: NOTRUN -> [SKIP][6] ([Intel XE#3432]) [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs-cc.html * igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-a-dp-2: - shard-bmg: NOTRUN -> [SKIP][7] ([Intel XE#2652]) +7 other tests skip [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-a-dp-2.html * igt@kms_content_protection@lic-type-0@pipe-a-dp-2: - shard-bmg: NOTRUN -> [FAIL][8] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) +3 other tests fail [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html * igt@kms_content_protection@type1: - shard-bmg: NOTRUN -> [SKIP][9] ([Intel XE#2341]) [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-10/igt@kms_content_protection@type1.html * igt@kms_cursor_crc@cursor-onscreen-128x42: - shard-bmg: NOTRUN -> [SKIP][10] ([Intel XE#2320]) [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-2/igt@kms_cursor_crc@cursor-onscreen-128x42.html * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size: - shard-bmg: [PASS][11] -> [SKIP][12] ([Intel XE#2291]) +2 other tests skip [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-7/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html * igt@kms_cursor_legacy@cursorb-vs-flipb-toggle: - shard-bmg: [PASS][13] -> [SKIP][14] ([Intel XE#2291] / [Intel XE#7343]) +1 other test skip [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-8/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html * igt@kms_dsc@dsc-with-output-formats: - shard-bmg: NOTRUN -> [SKIP][15] ([Intel XE#2244]) [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-2/igt@kms_dsc@dsc-with-output-formats.html * igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible: - shard-bmg: [PASS][16] -> [SKIP][17] ([Intel XE#2316]) +4 other tests skip [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-4/igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible.html [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible.html * igt@kms_flip@2x-flip-vs-suspend-interruptible@cd-dp2-hdmi-a3: - shard-bmg: [PASS][18] -> [INCOMPLETE][19] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-2/igt@kms_flip@2x-flip-vs-suspend-interruptible@cd-dp2-hdmi-a3.html [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-6/igt@kms_flip@2x-flip-vs-suspend-interruptible@cd-dp2-hdmi-a3.html * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling: - shard-bmg: NOTRUN -> [SKIP][20] ([Intel XE#7178] / [Intel XE#7351]) [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling.html * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff: - shard-bmg: NOTRUN -> [SKIP][21] ([Intel XE#4141]) +1 other test skip [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-10/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff.html * igt@kms_frontbuffer_tracking@fbcdrrs-argb161616f-draw-render: - shard-bmg: NOTRUN -> [SKIP][22] ([Intel XE#7061] / [Intel XE#7356]) [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcdrrs-argb161616f-draw-render.html * igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render: - shard-bmg: NOTRUN -> [SKIP][23] ([Intel XE#2313]) [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render.html * igt@kms_hdr@invalid-metadata-sizes: - shard-bmg: [PASS][24] -> [SKIP][25] ([Intel XE#1503]) [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-9/igt@kms_hdr@invalid-metadata-sizes.html [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_hdr@invalid-metadata-sizes.html * igt@kms_plane_multiple@2x-tiling-x: - shard-bmg: [PASS][26] -> [SKIP][27] ([Intel XE#4596]) [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-x.html [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_plane_multiple@2x-tiling-x.html * igt@kms_plane_multiple@tiling-y: - shard-bmg: NOTRUN -> [SKIP][28] ([Intel XE#5020] / [Intel XE#7348]) [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_plane_multiple@tiling-y.html * igt@kms_psr@pr-sprite-plane-onoff: - shard-bmg: NOTRUN -> [SKIP][29] ([Intel XE#2234] / [Intel XE#2850]) +1 other test skip [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_psr@pr-sprite-plane-onoff.html * igt@kms_psr_stress_test@flip-primary-invalidate-overlay: - shard-lnl: [PASS][30] -> [SKIP][31] ([Intel XE#4692] / [Intel XE#7508]) [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-lnl-7/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-lnl-7/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html * igt@kms_rotation_crc@multiplane-rotation-cropping-top: - shard-lnl: [PASS][32] -> [FAIL][33] ([Intel XE#1874] / [Intel XE#7305]) [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-lnl-1/igt@kms_rotation_crc@multiplane-rotation-cropping-top.html [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-lnl-1/igt@kms_rotation_crc@multiplane-rotation-cropping-top.html * igt@kms_setmode@clone-exclusive-crtc: - shard-bmg: [PASS][34] -> [SKIP][35] ([Intel XE#1435]) [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-9/igt@kms_setmode@clone-exclusive-crtc.html [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_setmode@clone-exclusive-crtc.html * igt@kms_vrr@cmrr@pipe-a-edp-1: - shard-lnl: [PASS][36] -> [FAIL][37] ([Intel XE#4459]) +1 other test fail [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-lnl-2/igt@kms_vrr@cmrr@pipe-a-edp-1.html [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-lnl-2/igt@kms_vrr@cmrr@pipe-a-edp-1.html * igt@kms_vrr@negative-basic: - shard-bmg: [PASS][38] -> [SKIP][39] ([Intel XE#1499]) [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-6/igt@kms_vrr@negative-basic.html [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_vrr@negative-basic.html * igt@xe_exec_fault_mode@many-multi-queue-userptr-invalidate-prefetch: - shard-bmg: NOTRUN -> [SKIP][40] ([Intel XE#7136]) [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@xe_exec_fault_mode@many-multi-queue-userptr-invalidate-prefetch.html * igt@xe_exec_multi_queue@max-queues-preempt-mode-close-fd-smem: - shard-bmg: NOTRUN -> [SKIP][41] ([Intel XE#6874]) +4 other tests skip [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@xe_exec_multi_queue@max-queues-preempt-mode-close-fd-smem.html * igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma: - shard-lnl: [PASS][42] -> [FAIL][43] ([Intel XE#5625]) [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-lnl-7/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-lnl-4/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html #### Possible fixes #### * igt@intel_hwmon@hwmon-write: - shard-bmg: [FAIL][44] ([Intel XE#7445]) -> [PASS][45] [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-6/igt@intel_hwmon@hwmon-write.html [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@intel_hwmon@hwmon-write.html * igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p: - shard-bmg: [SKIP][46] ([Intel XE#2314] / [Intel XE#2894] / [Intel XE#7373]) -> [PASS][47] +1 other test pass [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-5/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-1/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html * igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p: - shard-bmg: [SKIP][48] -> [PASS][49] [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-10/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html * igt@kms_cursor_legacy@2x-cursor-vs-flip-atomic: - shard-bmg: [SKIP][50] ([Intel XE#2291]) -> [PASS][51] +3 other tests pass [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_cursor_legacy@2x-cursor-vs-flip-atomic.html [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-2/igt@kms_cursor_legacy@2x-cursor-vs-flip-atomic.html * igt@kms_display_modes@extended-mode-basic: - shard-bmg: [SKIP][52] ([Intel XE#4302]) -> [PASS][53] [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-5/igt@kms_display_modes@extended-mode-basic.html [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_display_modes@extended-mode-basic.html * igt@kms_feature_discovery@display-2x: - shard-bmg: [SKIP][54] ([Intel XE#2373] / [Intel XE#7344]) -> [PASS][55] [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_feature_discovery@display-2x.html [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_feature_discovery@display-2x.html * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset: - shard-bmg: [SKIP][56] ([Intel XE#2316]) -> [PASS][57] +12 other tests pass [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html * igt@kms_flip@flip-vs-expired-vblank-interruptible: - shard-lnl: [FAIL][58] ([Intel XE#301]) -> [PASS][59] +1 other test pass [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html * igt@kms_flip@flip-vs-suspend-interruptible: - shard-bmg: [INCOMPLETE][60] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][61] +1 other test pass [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-1/igt@kms_flip@flip-vs-suspend-interruptible.html [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_flip@flip-vs-suspend-interruptible.html * igt@kms_hdmi_inject@inject-audio: - shard-bmg: [SKIP][62] ([Intel XE#7308]) -> [PASS][63] [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-6/igt@kms_hdmi_inject@inject-audio.html [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_hdmi_inject@inject-audio.html * igt@kms_hdr@static-toggle-dpms: - shard-bmg: [SKIP][64] ([Intel XE#1503]) -> [PASS][65] +1 other test pass [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-5/igt@kms_hdr@static-toggle-dpms.html [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_hdr@static-toggle-dpms.html * igt@kms_setmode@invalid-clone-single-crtc-stealing: - shard-bmg: [SKIP][66] ([Intel XE#1435]) -> [PASS][67] +1 other test pass [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_setmode@invalid-clone-single-crtc-stealing.html [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_setmode@invalid-clone-single-crtc-stealing.html * igt@xe_evict@evict-beng-mixed-many-threads-small: - shard-bmg: [INCOMPLETE][68] ([Intel XE#6321]) -> [PASS][69] [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-6/igt@xe_evict@evict-beng-mixed-many-threads-small.html [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-7/igt@xe_evict@evict-beng-mixed-many-threads-small.html #### Warnings #### * igt@kms_content_protection@atomic-hdcp14: - shard-bmg: [SKIP][70] ([Intel XE#7194]) -> [FAIL][71] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) +1 other test fail [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-5/igt@kms_content_protection@atomic-hdcp14.html [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-2/igt@kms_content_protection@atomic-hdcp14.html * igt@kms_content_protection@legacy: - shard-bmg: [SKIP][72] ([Intel XE#2341]) -> [FAIL][73] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) +1 other test fail [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_content_protection@legacy.html [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-7/igt@kms_content_protection@legacy.html * igt@kms_content_protection@srm: - shard-bmg: [FAIL][74] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) -> [SKIP][75] ([Intel XE#2341]) [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-7/igt@kms_content_protection@srm.html [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_content_protection@srm.html * igt@kms_content_protection@uevent: - shard-bmg: [FAIL][76] ([Intel XE#6707] / [Intel XE#7439]) -> [SKIP][77] ([Intel XE#2341]) [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-8/igt@kms_content_protection@uevent.html [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_content_protection@uevent.html * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt: - shard-bmg: [SKIP][78] ([Intel XE#2312]) -> [SKIP][79] ([Intel XE#4141]) +5 other tests skip [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc: - shard-bmg: [SKIP][80] ([Intel XE#4141]) -> [SKIP][81] ([Intel XE#2312]) +7 other tests skip [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc: - shard-bmg: [SKIP][82] ([Intel XE#2312]) -> [SKIP][83] ([Intel XE#2311]) +15 other tests skip [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-msflip-blt: - shard-bmg: [SKIP][84] ([Intel XE#2311]) -> [SKIP][85] ([Intel XE#2312]) +16 other tests skip [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-9/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-msflip-blt.html [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-msflip-blt.html * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt: - shard-bmg: [SKIP][86] ([Intel XE#2312]) -> [SKIP][87] ([Intel XE#2313]) +19 other tests skip [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-5/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-7/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-wc: - shard-bmg: [SKIP][88] ([Intel XE#2313]) -> [SKIP][89] ([Intel XE#2312]) +15 other tests skip [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-2/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-wc.html [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-wc.html * igt@kms_plane_multiple@2x-tiling-yf: - shard-bmg: [SKIP][90] ([Intel XE#4596]) -> [SKIP][91] ([Intel XE#5021] / [Intel XE#7377]) [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_plane_multiple@2x-tiling-yf.html [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-9/igt@kms_plane_multiple@2x-tiling-yf.html * igt@kms_rotation_crc@bad-pixel-format: - shard-bmg: [SKIP][92] ([Intel XE#3414] / [Intel XE#3904] / [Intel XE#7342]) -> [SKIP][93] ([Intel XE#3904] / [Intel XE#7342]) +1 other test skip [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_rotation_crc@bad-pixel-format.html [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-6/igt@kms_rotation_crc@bad-pixel-format.html * igt@kms_rotation_crc@primary-y-tiled-reflect-x-90: - shard-bmg: [SKIP][94] ([Intel XE#3904] / [Intel XE#7342]) -> [SKIP][95] ([Intel XE#3414] / [Intel XE#3904] / [Intel XE#7342]) +1 other test skip [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-7/igt@kms_rotation_crc@primary-y-tiled-reflect-x-90.html [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-3/igt@kms_rotation_crc@primary-y-tiled-reflect-x-90.html * igt@kms_tiled_display@basic-test-pattern: - shard-bmg: [SKIP][96] ([Intel XE#2426] / [Intel XE#5848]) -> [FAIL][97] ([Intel XE#1729] / [Intel XE#7424]) [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-5/igt@kms_tiled_display@basic-test-pattern.html [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_tiled_display@basic-test-pattern.html * igt@kms_tiled_display@basic-test-pattern-with-chamelium: - shard-bmg: [SKIP][98] ([Intel XE#2426] / [Intel XE#5848]) -> [SKIP][99] ([Intel XE#2509] / [Intel XE#7437]) [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5/shard-bmg-3/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/shard-bmg-4/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178 [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435 [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499 [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503 [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729 [Intel XE#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874 [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049 [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234 [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244 [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291 [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311 [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312 [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313 [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314 [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316 [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320 [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327 [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341 [Intel XE#2373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2373 [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426 [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509 [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597 [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652 [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850 [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887 [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894 [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301 [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304 [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414 [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432 [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904 [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141 [Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302 [Intel XE#4459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4459 [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596 [Intel XE#4692]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4692 [Intel XE#5020]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5020 [Intel XE#5021]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5021 [Intel XE#5625]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5625 [Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848 [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321 [Intel XE#6707]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6707 [Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874 [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061 [Intel XE#7136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7136 [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178 [Intel XE#7194]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7194 [Intel XE#7305]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7305 [Intel XE#7308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7308 [Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342 [Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343 [Intel XE#7344]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7344 [Intel XE#7348]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7348 [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351 [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356 [Intel XE#7373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7373 [Intel XE#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374 [Intel XE#7377]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7377 [Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424 [Intel XE#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437 [Intel XE#7439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7439 [Intel XE#7445]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7445 [Intel XE#7508]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7508 [Intel XE#7621]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7621 Build changes ------------- * IGT: IGT_8808 -> IGT_8809 * Linux: xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5 -> xe-pw-163466v1 IGT_8808: 8808 IGT_8809: 9e55b6cdd3ad1ec8c2264106b035be91d12d8322 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git xe-4744-185629feb8aee7cf88f72d1e67531574f1bea7f5: 185629feb8aee7cf88f72d1e67531574f1bea7f5 xe-pw-163466v1: 163466v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163466v1/index.html [-- Attachment #2: Type: text/html, Size: 33917 bytes --] ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2026-03-25 9:32 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-18 13:29 [PATCH 0/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula
2026-03-18 13:29 ` [PATCH 1/5] drm/xe/fbdev: put intel_fbdev_fb_prefer_stolen() behind IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) Jani Nikula
2026-03-24 23:33 ` Michał Grzelak
2026-03-18 13:29 ` [PATCH 2/5] drm/{i915, xe}/fbdev: drop drm device parameter from intel_fbdev_fb_fill_info() Jani Nikula
2026-03-24 23:34 ` Michał Grzelak
2026-03-18 13:29 ` [PATCH 3/5] drm/{i915,xe}: move fbdev fb calls to parent interface Jani Nikula
2026-03-24 23:42 ` Michał Grzelak
2026-03-24 23:51 ` Michał Grzelak
2026-03-25 8:13 ` [PATCH 3/5] drm/{i915, xe}: " Jani Nikula
2026-03-25 9:32 ` [PATCH 3/5] drm/{i915,xe}: " Michał Grzelak
2026-03-18 13:29 ` [PATCH 4/5] drm/i915: pass struct drm_i915_private to i915_bo_fbdev_prefer_stolen() Jani Nikula
2026-03-24 23:46 ` Michał Grzelak
2026-03-18 13:29 ` [PATCH 5/5] drm/xe: pass struct xe_device to xe_display_bo_fbdev_prefer_stolen() Jani Nikula
2026-03-24 23:47 ` Michał Grzelak
2026-03-18 13:35 ` ✗ CI.checkpatch: warning for drm/{i915,xe}: move fbdev fb calls to parent interface Patchwork
2026-03-18 13:37 ` ✓ CI.KUnit: success " Patchwork
2026-03-18 14:16 ` ✓ Xe.CI.BAT: " Patchwork
2026-03-20 2:02 ` ✗ Xe.CI.FULL: failure " Patchwork
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox