From 9dacae143e6ff18e77fbad6f1413fb8f2f975407 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 15 Dec 2025 17:28:18 +0200 Subject: drm/{i915, xe}: move initial plane calls to parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the initial plane handling functions to the display parent interface. Add the call wrappers in dedicated intel_initial_plane.c instead of intel_parent.c, as we'll be refactoring the calls heavily. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/ab91c891677fe2bb83bf5aafa5ee984b2442b84d.1765812266.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- include/drm/intel/display_parent_interface.h | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'include') diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 10c50b42844e..48d52bee4cee 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -7,6 +7,7 @@ #include struct dma_fence; +struct drm_crtc; struct drm_device; struct drm_scanout_buffer; struct intel_hdcp_gsc_context; @@ -25,6 +26,11 @@ struct intel_display_hdcp_interface { void (*gsc_context_free)(struct intel_hdcp_gsc_context *gsc_context); }; +struct intel_display_initial_plane_interface { + void (*vblank_wait)(struct drm_crtc *crtc); + void (*config)(struct drm_device *drm); +}; + struct intel_display_irq_interface { bool (*enabled)(struct drm_device *drm); void (*synchronize)(struct drm_device *drm); @@ -95,6 +101,9 @@ struct intel_display_parent_interface { /** @hdcp: HDCP GSC interface */ const struct intel_display_hdcp_interface *hdcp; + /** @initial_plane: Initial plane interface */ + const struct intel_display_initial_plane_interface *initial_plane; + /** @irq: IRQ interface */ const struct intel_display_irq_interface *irq; -- cgit v1.2.3 From a13f152a6c09338a7f81efdd414425a9d8d50b16 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 15 Dec 2025 17:28:19 +0200 Subject: drm/{i915, xe}: deduplicate intel_initial_plane_config() between i915 and xe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the parent interface at one step lower level, allowing deduplication. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/0cb4077a5a39274c7a2dae95d548d7b33365a518.1765812266.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_initial_plane.c | 48 +++++++++++++++++++++- drivers/gpu/drm/i915/i915_initial_plane.c | 47 +++------------------ drivers/gpu/drm/xe/display/xe_initial_plane.c | 47 +++------------------ include/drm/intel/display_parent_interface.h | 4 +- 4 files changed, 62 insertions(+), 84 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c index c68d7555aee5..561a2ba2a486 100644 --- a/drivers/gpu/drm/i915/display/intel_initial_plane.c +++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c @@ -14,7 +14,53 @@ void intel_initial_plane_vblank_wait(struct intel_crtc *crtc) display->parent->initial_plane->vblank_wait(&crtc->base); } +static void +intel_find_initial_plane_obj(struct intel_crtc *crtc, + struct intel_initial_plane_config plane_configs[]) +{ + struct intel_display *display = to_intel_display(crtc); + + display->parent->initial_plane->find_obj(&crtc->base, plane_configs); +} + +static void plane_config_fini(struct intel_display *display, + struct intel_initial_plane_config *plane_config) +{ + display->parent->initial_plane->config_fini(plane_config); +} + void intel_initial_plane_config(struct intel_display *display) { - display->parent->initial_plane->config(display->drm); + struct intel_initial_plane_config plane_configs[I915_MAX_PIPES] = {}; + struct intel_crtc *crtc; + + for_each_intel_crtc(display->drm, crtc) { + const struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + struct intel_initial_plane_config *plane_config = + &plane_configs[crtc->pipe]; + + if (!crtc_state->hw.active) + continue; + + /* + * Note that reserving the BIOS fb up front prevents us + * from stuffing other stolen allocations like the ring + * on top. This prevents some ugliness at boot time, and + * can even allow for smooth boot transitions if the BIOS + * fb is large enough for the active pipe configuration. + */ + display->funcs.display->get_initial_plane_config(crtc, plane_config); + + /* + * If the fb is shared between multiple heads, we'll + * just get the first one. + */ + intel_find_initial_plane_obj(crtc, plane_configs); + + if (display->funcs.display->fixup_initial_plane_config(crtc, plane_config)) + intel_initial_plane_vblank_wait(crtc); + + plane_config_fini(display, plane_config); + } } diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index f26563eed9ba..68cf2499855a 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -312,9 +312,10 @@ err_vma: } static void -intel_find_initial_plane_obj(struct intel_crtc *crtc, - struct intel_initial_plane_config plane_configs[]) +i915_find_initial_plane_obj(struct drm_crtc *_crtc, + struct intel_initial_plane_config plane_configs[]) { + struct intel_crtc *crtc = to_intel_crtc(_crtc); struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); struct intel_initial_plane_config *plane_config = &plane_configs[crtc->pipe]; @@ -392,7 +393,7 @@ valid_fb: atomic_or(plane->frontbuffer_bit, &to_intel_frontbuffer(fb)->bits); } -static void plane_config_fini(struct intel_initial_plane_config *plane_config) +static void i915_plane_config_fini(struct intel_initial_plane_config *plane_config) { if (plane_config->fb) { struct drm_framebuffer *fb = &plane_config->fb->base; @@ -408,44 +409,8 @@ static void plane_config_fini(struct intel_initial_plane_config *plane_config) i915_vma_put(plane_config->vma); } -static void i915_initial_plane_config(struct drm_device *drm) -{ - struct intel_display *display = to_intel_display(drm); - struct intel_initial_plane_config plane_configs[I915_MAX_PIPES] = {}; - struct intel_crtc *crtc; - - for_each_intel_crtc(display->drm, crtc) { - const struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - struct intel_initial_plane_config *plane_config = - &plane_configs[crtc->pipe]; - - if (!crtc_state->hw.active) - continue; - - /* - * Note that reserving the BIOS fb up front prevents us - * from stuffing other stolen allocations like the ring - * on top. This prevents some ugliness at boot time, and - * can even allow for smooth boot transitions if the BIOS - * fb is large enough for the active pipe configuration. - */ - display->funcs.display->get_initial_plane_config(crtc, plane_config); - - /* - * If the fb is shared between multiple heads, we'll - * just get the first one. - */ - intel_find_initial_plane_obj(crtc, plane_configs); - - if (display->funcs.display->fixup_initial_plane_config(crtc, plane_config)) - i915_initial_plane_vblank_wait(&crtc->base); - - plane_config_fini(plane_config); - } -} - const struct intel_display_initial_plane_interface i915_display_initial_plane_interface = { .vblank_wait = i915_initial_plane_vblank_wait, - .config = i915_initial_plane_config, + .find_obj = i915_find_initial_plane_obj, + .config_fini = i915_plane_config_fini, }; diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index dd69f1c65903..0007337c60da 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -204,9 +204,10 @@ err_bo: } static void -intel_find_initial_plane_obj(struct intel_crtc *crtc, - struct intel_initial_plane_config plane_configs[]) +xe_find_initial_plane_obj(struct drm_crtc *_crtc, + struct intel_initial_plane_config plane_configs[]) { + struct intel_crtc *crtc = to_intel_crtc(_crtc); struct intel_initial_plane_config *plane_config = &plane_configs[crtc->pipe]; struct intel_plane *plane = @@ -274,7 +275,7 @@ nofb: intel_plane_disable_noatomic(crtc, plane); } -static void plane_config_fini(struct intel_initial_plane_config *plane_config) +static void xe_plane_config_fini(struct intel_initial_plane_config *plane_config) { if (plane_config->fb) { struct drm_framebuffer *fb = &plane_config->fb->base; @@ -287,44 +288,8 @@ static void plane_config_fini(struct intel_initial_plane_config *plane_config) } } -static void xe_initial_plane_config(struct drm_device *drm) -{ - struct intel_display *display = to_intel_display(drm); - struct intel_initial_plane_config plane_configs[I915_MAX_PIPES] = {}; - struct intel_crtc *crtc; - - for_each_intel_crtc(display->drm, crtc) { - const struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - struct intel_initial_plane_config *plane_config = - &plane_configs[crtc->pipe]; - - if (!crtc_state->hw.active) - continue; - - /* - * Note that reserving the BIOS fb up front prevents us - * from stuffing other stolen allocations like the ring - * on top. This prevents some ugliness at boot time, and - * can even allow for smooth boot transitions if the BIOS - * fb is large enough for the active pipe configuration. - */ - display->funcs.display->get_initial_plane_config(crtc, plane_config); - - /* - * If the fb is shared between multiple heads, we'll - * just get the first one. - */ - intel_find_initial_plane_obj(crtc, plane_configs); - - if (display->funcs.display->fixup_initial_plane_config(crtc, plane_config)) - xe_initial_plane_vblank_wait(&crtc->base); - - plane_config_fini(plane_config); - } -} - const struct intel_display_initial_plane_interface xe_display_initial_plane_interface = { .vblank_wait = xe_initial_plane_vblank_wait, - .config = xe_initial_plane_config, + .find_obj = xe_find_initial_plane_obj, + .config_fini = xe_plane_config_fini, }; diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 48d52bee4cee..87cd3c5e1055 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -11,6 +11,7 @@ struct drm_crtc; struct drm_device; struct drm_scanout_buffer; struct intel_hdcp_gsc_context; +struct intel_initial_plane_config; struct intel_panic; struct intel_stolen_node; struct ref_tracker; @@ -28,7 +29,8 @@ struct intel_display_hdcp_interface { struct intel_display_initial_plane_interface { void (*vblank_wait)(struct drm_crtc *crtc); - void (*config)(struct drm_device *drm); + void (*find_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_configs); + void (*config_fini)(struct intel_initial_plane_config *plane_configs); }; struct intel_display_irq_interface { -- cgit v1.2.3 From 1b3cc68df363820537d6c837069db4c303ee58a9 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 15 Dec 2025 17:28:21 +0200 Subject: drm/{i915, xe}: start deduplicating intel_find_initial_plane_obj() between i915 and xe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move some easy common parts to display. Initially, the intel_find_initial_plane_obj() error path seems silly, but it'll be more helpful this way for later changes. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/950d308172443d5bae975aa1ab72111720134219.1765812266.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_initial_plane.c | 29 ++++++++++++++++-- drivers/gpu/drm/i915/i915_initial_plane.c | 34 ++++------------------ drivers/gpu/drm/xe/display/xe_initial_plane.c | 27 ++++------------- include/drm/intel/display_parent_interface.h | 2 +- 4 files changed, 38 insertions(+), 54 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c index 62f4fb3be9f0..9e67da94ac02 100644 --- a/drivers/gpu/drm/i915/display/intel_initial_plane.c +++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c @@ -19,8 +19,33 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, struct intel_initial_plane_config plane_configs[]) { struct intel_display *display = to_intel_display(crtc); - - display->parent->initial_plane->find_obj(&crtc->base, plane_configs); + struct intel_initial_plane_config *plane_config = &plane_configs[crtc->pipe]; + struct intel_plane *plane = to_intel_plane(crtc->base.primary); + int ret; + + /* + * TODO: + * Disable planes if get_initial_plane_config() failed. + * Make sure things work if the surface base is not page aligned. + */ + if (!plane_config->fb) + return; + + ret = display->parent->initial_plane->find_obj(&crtc->base, plane_configs); + if (ret) + goto nofb; + + return; + +nofb: + /* + * We've failed to reconstruct the BIOS FB. Current display state + * indicates that the primary plane is visible, but has a NULL FB, + * which will lead to problems later if we don't fix it up. The + * simplest solution is to just disable the primary plane now and + * pretend the BIOS never had it enabled. + */ + intel_plane_disable_noatomic(crtc, plane); } static void plane_config_fini(struct intel_display *display, diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index d8f2a2a11dd0..57afe6e29ce3 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -311,7 +311,7 @@ err_vma: return false; } -static void +static int i915_find_initial_plane_obj(struct drm_crtc *_crtc, struct intel_initial_plane_config plane_configs[]) { @@ -326,39 +326,13 @@ i915_find_initial_plane_obj(struct drm_crtc *_crtc, struct drm_framebuffer *fb; struct i915_vma *vma; - /* - * TODO: - * Disable planes if get_initial_plane_config() failed. - * Make sure things work if the surface base is not page aligned. - */ - if (!plane_config->fb) - return; - if (intel_alloc_initial_plane_obj(crtc, plane_config)) { fb = &plane_config->fb->base; vma = plane_config->vma; - goto valid_fb; + } else if (!intel_reuse_initial_plane_obj(crtc, plane_configs, &fb, &vma)) { + return -EINVAL; } - /* - * Failed to alloc the obj, check to see if we should share - * an fb with another CRTC instead - */ - if (intel_reuse_initial_plane_obj(crtc, plane_configs, &fb, &vma)) - goto valid_fb; - - /* - * We've failed to reconstruct the BIOS FB. Current display state - * indicates that the primary plane is visible, but has a NULL FB, - * which will lead to problems later if we don't fix it up. The - * simplest solution is to just disable the primary plane now and - * pretend the BIOS never had it enabled. - */ - intel_plane_disable_noatomic(crtc, plane); - - return; - -valid_fb: plane_state->uapi.rotation = plane_config->rotation; intel_fb_fill_view(to_intel_framebuffer(fb), plane_state->uapi.rotation, &plane_state->view); @@ -391,6 +365,8 @@ valid_fb: intel_plane_copy_uapi_to_hw_state(plane_state, plane_state, crtc); atomic_or(plane->frontbuffer_bit, &to_intel_frontbuffer(fb)->bits); + + return 0; } static void i915_plane_config_fini(struct intel_initial_plane_config *plane_config) diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 95000f8b0662..ddf22631240e 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -203,7 +203,7 @@ err_bo: return false; } -static void +static int xe_find_initial_plane_obj(struct drm_crtc *_crtc, struct intel_initial_plane_config plane_configs[]) { @@ -217,18 +217,10 @@ xe_find_initial_plane_obj(struct drm_crtc *_crtc, struct drm_framebuffer *fb; struct i915_vma *vma; - /* - * TODO: - * Disable planes if get_initial_plane_config() failed. - * Make sure things work if the surface base is not page aligned. - */ - if (!plane_config->fb) - return; - if (intel_alloc_initial_plane_obj(crtc, plane_config)) fb = &plane_config->fb->base; else if (!intel_reuse_initial_plane_obj(crtc, plane_configs, &fb)) - goto nofb; + return -EINVAL; plane_state->uapi.rotation = plane_config->rotation; intel_fb_fill_view(to_intel_framebuffer(fb), @@ -237,7 +229,7 @@ xe_find_initial_plane_obj(struct drm_crtc *_crtc, vma = intel_fb_pin_to_ggtt(fb, &plane_state->view.gtt, 0, 0, 0, false, &plane_state->flags); if (IS_ERR(vma)) - goto nofb; + return PTR_ERR(vma); plane_state->ggtt_vma = vma; @@ -262,17 +254,8 @@ xe_find_initial_plane_obj(struct drm_crtc *_crtc, atomic_or(plane->frontbuffer_bit, &to_intel_frontbuffer(fb)->bits); plane_config->vma = vma; - return; - -nofb: - /* - * We've failed to reconstruct the BIOS FB. Current display state - * indicates that the primary plane is visible, but has a NULL FB, - * which will lead to problems later if we don't fix it up. The - * simplest solution is to just disable the primary plane now and - * pretend the BIOS never had it enabled. - */ - intel_plane_disable_noatomic(crtc, plane); + + return 0; } static void xe_plane_config_fini(struct intel_initial_plane_config *plane_config) diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 87cd3c5e1055..997a9746dc83 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -29,7 +29,7 @@ struct intel_display_hdcp_interface { struct intel_display_initial_plane_interface { void (*vblank_wait)(struct drm_crtc *crtc); - void (*find_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_configs); + int (*find_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_configs); void (*config_fini)(struct intel_initial_plane_config *plane_configs); }; -- cgit v1.2.3 From adf7968e52e8d9f1b76ecc46ac5720c0e61c9d51 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 15 Dec 2025 17:28:24 +0200 Subject: drm/i915: further deduplicate intel_find_initial_plane_obj() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move intel_reuse_initial_plane_obj() into common display code, and split the ->find_obj hook into ->alloc_obj and ->setup hooks. Return the struct drm_gem_object from ->alloc_obj in preparation for moving more things to display. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/c71011dbb11afaa5c4da30aa2627833374300d63.1765812266.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_initial_plane.c | 55 ++++++++++++++++- drivers/gpu/drm/i915/i915_initial_plane.c | 70 +++++----------------- drivers/gpu/drm/xe/display/xe_initial_plane.c | 67 +++++---------------- include/drm/intel/display_parent_interface.h | 7 ++- 4 files changed, 88 insertions(+), 111 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c index 9e67da94ac02..cbfcc52f180f 100644 --- a/drivers/gpu/drm/i915/display/intel_initial_plane.c +++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c @@ -14,6 +14,43 @@ void intel_initial_plane_vblank_wait(struct intel_crtc *crtc) display->parent->initial_plane->vblank_wait(&crtc->base); } +static const struct intel_plane_state * +intel_reuse_initial_plane_obj(struct intel_crtc *this, + const struct intel_initial_plane_config plane_configs[]) +{ + struct intel_display *display = to_intel_display(this); + struct intel_crtc *crtc; + + for_each_intel_crtc(display->drm, crtc) { + struct intel_plane *plane = + to_intel_plane(crtc->base.primary); + const struct intel_plane_state *plane_state = + to_intel_plane_state(plane->base.state); + const struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + + if (!crtc_state->hw.active) + continue; + + if (!plane_state->ggtt_vma) + continue; + + if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) + return plane_state; + } + + return NULL; +} + +static struct drm_gem_object * +intel_alloc_initial_plane_obj(struct intel_crtc *crtc, + struct intel_initial_plane_config *plane_config) +{ + struct intel_display *display = to_intel_display(crtc); + + return display->parent->initial_plane->alloc_obj(&crtc->base, plane_config); +} + static void intel_find_initial_plane_obj(struct intel_crtc *crtc, struct intel_initial_plane_config plane_configs[]) @@ -21,6 +58,8 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, struct intel_display *display = to_intel_display(crtc); struct intel_initial_plane_config *plane_config = &plane_configs[crtc->pipe]; struct intel_plane *plane = to_intel_plane(crtc->base.primary); + struct drm_framebuffer *fb; + struct i915_vma *vma; int ret; /* @@ -31,7 +70,21 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, if (!plane_config->fb) return; - ret = display->parent->initial_plane->find_obj(&crtc->base, plane_configs); + if (intel_alloc_initial_plane_obj(crtc, plane_config)) { + fb = &plane_config->fb->base; + vma = plane_config->vma; + } else { + const struct intel_plane_state *other_plane_state; + + other_plane_state = intel_reuse_initial_plane_obj(crtc, plane_configs); + if (!other_plane_state) + goto nofb; + + fb = other_plane_state->hw.fb; + vma = other_plane_state->ggtt_vma; + } + + ret = display->parent->initial_plane->setup(&crtc->base, plane_config, fb, vma); if (ret) goto nofb; diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index 40b9f981c9ac..0117f9e115d1 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -25,34 +25,6 @@ static void i915_initial_plane_vblank_wait(struct drm_crtc *crtc) intel_crtc_wait_for_next_vblank(to_intel_crtc(crtc)); } -static const struct intel_plane_state * -intel_reuse_initial_plane_obj(struct intel_crtc *this, - const struct intel_initial_plane_config plane_configs[]) -{ - struct intel_display *display = to_intel_display(this); - struct intel_crtc *crtc; - - for_each_intel_crtc(display->drm, crtc) { - struct intel_plane *plane = - to_intel_plane(crtc->base.primary); - const struct intel_plane_state *plane_state = - to_intel_plane_state(plane->base.state); - const struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - - if (!crtc_state->hw.active) - continue; - - if (!plane_state->ggtt_vma) - continue; - - if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) - return plane_state; - } - - return NULL; -} - static enum intel_memory_type initial_plane_memory_type(struct intel_display *display) { @@ -258,10 +230,11 @@ err_obj: return NULL; } -static bool -intel_alloc_initial_plane_obj(struct intel_crtc *crtc, - struct intel_initial_plane_config *plane_config) +static struct drm_gem_object * +i915_alloc_initial_plane_obj(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config) { + struct intel_crtc *crtc = to_intel_crtc(_crtc); struct intel_display *display = to_intel_display(crtc); struct drm_mode_fb_cmd2 mode_cmd = {}; struct drm_framebuffer *fb = &plane_config->fb->base; @@ -277,12 +250,12 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, drm_dbg(display->drm, "Unsupported modifier for initial FB: 0x%llx\n", fb->modifier); - return false; + return NULL; } vma = initial_plane_vma(display, plane_config); if (!vma) - return false; + return NULL; mode_cmd.pixel_format = fb->format->format; mode_cmd.width = fb->width; @@ -299,41 +272,25 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, } plane_config->vma = vma; - return true; + return intel_bo_to_drm_bo(vma->obj); err_vma: i915_vma_put(vma); - return false; + return NULL; } static int -i915_find_initial_plane_obj(struct drm_crtc *_crtc, - struct intel_initial_plane_config plane_configs[]) +i915_initial_plane_setup(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config, + struct drm_framebuffer *fb, + struct i915_vma *vma) { struct intel_crtc *crtc = to_intel_crtc(_crtc); struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); - struct intel_initial_plane_config *plane_config = - &plane_configs[crtc->pipe]; struct intel_plane *plane = to_intel_plane(crtc->base.primary); struct intel_plane_state *plane_state = to_intel_plane_state(plane->base.state); - struct drm_framebuffer *fb; - struct i915_vma *vma; - - if (intel_alloc_initial_plane_obj(crtc, plane_config)) { - fb = &plane_config->fb->base; - vma = plane_config->vma; - } else { - const struct intel_plane_state *other_plane_state; - - other_plane_state = intel_reuse_initial_plane_obj(crtc, plane_configs); - if (!other_plane_state) - return -EINVAL; - - fb = other_plane_state->hw.fb; - vma = other_plane_state->ggtt_vma; - } plane_state->uapi.rotation = plane_config->rotation; intel_fb_fill_view(to_intel_framebuffer(fb), @@ -379,6 +336,7 @@ static void i915_plane_config_fini(struct intel_initial_plane_config *plane_conf const struct intel_display_initial_plane_interface i915_display_initial_plane_interface = { .vblank_wait = i915_initial_plane_vblank_wait, - .find_obj = i915_find_initial_plane_obj, + .alloc_obj = i915_alloc_initial_plane_obj, + .setup = i915_initial_plane_setup, .config_fini = i915_plane_config_fini, }; diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 42d2c2f8138e..2ce0f78cd7b1 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -45,34 +45,6 @@ static void xe_initial_plane_vblank_wait(struct drm_crtc *_crtc) drm_warn(&xe->drm, "waiting for early vblank failed with %i\n", ret); } -static const struct intel_plane_state * -intel_reuse_initial_plane_obj(struct intel_crtc *this, - const struct intel_initial_plane_config plane_configs[]) -{ - struct xe_device *xe = to_xe_device(this->base.dev); - struct intel_crtc *crtc; - - for_each_intel_crtc(&xe->drm, crtc) { - struct intel_plane *plane = - to_intel_plane(crtc->base.primary); - const struct intel_plane_state *plane_state = - to_intel_plane_state(plane->base.state); - const struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - - if (!crtc_state->hw.active) - continue; - - if (!plane_state->ggtt_vma) - continue; - - if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) - return plane_state; - } - - return NULL; -} - static struct xe_bo * initial_plane_bo(struct xe_device *xe, struct intel_initial_plane_config *plane_config) @@ -152,10 +124,11 @@ initial_plane_bo(struct xe_device *xe, return bo; } -static bool -intel_alloc_initial_plane_obj(struct intel_crtc *crtc, - struct intel_initial_plane_config *plane_config) +static struct drm_gem_object * +xe_alloc_initial_plane_obj(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config) { + struct intel_crtc *crtc = to_intel_crtc(_crtc); struct xe_device *xe = to_xe_device(crtc->base.dev); struct drm_mode_fb_cmd2 mode_cmd = { 0 }; struct drm_framebuffer *fb = &plane_config->fb->base; @@ -171,7 +144,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, drm_dbg_kms(&xe->drm, "Unsupported modifier for initial FB: 0x%llx\n", fb->modifier); - return false; + return NULL; } mode_cmd.pixel_format = fb->format->format; @@ -183,7 +156,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, bo = initial_plane_bo(xe, plane_config); if (!bo) - return false; + return NULL; if (intel_framebuffer_init(to_intel_framebuffer(fb), &bo->ttm.base, fb->format, &mode_cmd)) { @@ -193,39 +166,26 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, /* Reference handed over to fb */ xe_bo_put(bo); - return true; + return &bo->ttm.base; err_bo: xe_bo_unpin_map_no_vm(bo); - return false; + return NULL; } static int -xe_find_initial_plane_obj(struct drm_crtc *_crtc, - struct intel_initial_plane_config plane_configs[]) +xe_initial_plane_setup(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config, + struct drm_framebuffer *fb, + struct i915_vma *_unused) { struct intel_crtc *crtc = to_intel_crtc(_crtc); - struct intel_initial_plane_config *plane_config = - &plane_configs[crtc->pipe]; struct intel_plane *plane = to_intel_plane(crtc->base.primary); struct intel_plane_state *plane_state = to_intel_plane_state(plane->base.state); - struct drm_framebuffer *fb; struct i915_vma *vma; - if (intel_alloc_initial_plane_obj(crtc, plane_config)) { - fb = &plane_config->fb->base; - } else { - const struct intel_plane_state *other_plane_state; - - other_plane_state = intel_reuse_initial_plane_obj(crtc, plane_configs); - if (!other_plane_state) - return -EINVAL; - - fb = other_plane_state->hw.fb; - } - plane_state->uapi.rotation = plane_config->rotation; intel_fb_fill_view(to_intel_framebuffer(fb), plane_state->uapi.rotation, &plane_state->view); @@ -268,6 +228,7 @@ static void xe_plane_config_fini(struct intel_initial_plane_config *plane_config const struct intel_display_initial_plane_interface xe_display_initial_plane_interface = { .vblank_wait = xe_initial_plane_vblank_wait, - .find_obj = xe_find_initial_plane_obj, + .alloc_obj = xe_alloc_initial_plane_obj, + .setup = xe_initial_plane_setup, .config_fini = xe_plane_config_fini, }; diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 997a9746dc83..f0f379ae912d 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -9,7 +9,10 @@ struct dma_fence; struct drm_crtc; struct drm_device; +struct drm_framebuffer; +struct drm_gem_object; struct drm_scanout_buffer; +struct i915_vma; struct intel_hdcp_gsc_context; struct intel_initial_plane_config; struct intel_panic; @@ -29,7 +32,9 @@ struct intel_display_hdcp_interface { struct intel_display_initial_plane_interface { void (*vblank_wait)(struct drm_crtc *crtc); - int (*find_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_configs); + struct drm_gem_object *(*alloc_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config); + int (*setup)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config, + struct drm_framebuffer *fb, struct i915_vma *vma); void (*config_fini)(struct intel_initial_plane_config *plane_configs); }; -- cgit v1.2.3 From 5bad00377ec844d93947fd4c081abd2000a63dfc Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 15 Dec 2025 17:28:27 +0200 Subject: drm/{i915, xe}: pass struct drm_plane_state instead of struct drm_crtc to ->setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The initial plane parent interface ->setup hook no longer needs the crtc for anything. Pass the struct drm_plane_state instead. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/c3db101ef5fd13c56cb3a9329adecf521a807abc.1765812266.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_initial_plane.c | 2 +- drivers/gpu/drm/i915/i915_initial_plane.c | 10 +++------- drivers/gpu/drm/xe/display/xe_initial_plane.c | 8 ++------ include/drm/intel/display_parent_interface.h | 3 ++- 4 files changed, 8 insertions(+), 15 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c index 6e7bd6c3c02d..e4d6aa438e66 100644 --- a/drivers/gpu/drm/i915/display/intel_initial_plane.c +++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c @@ -106,7 +106,7 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, intel_fb_fill_view(to_intel_framebuffer(fb), plane_state->uapi.rotation, &plane_state->view); - ret = display->parent->initial_plane->setup(&crtc->base, plane_config, fb, vma); + ret = display->parent->initial_plane->setup(plane->base.state, plane_config, fb, vma); if (ret) goto nofb; diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index 5fe96b52d2cd..40d4f990f23c 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -264,17 +264,13 @@ err_vma: } static int -i915_initial_plane_setup(struct drm_crtc *_crtc, +i915_initial_plane_setup(struct drm_plane_state *_plane_state, struct intel_initial_plane_config *plane_config, struct drm_framebuffer *fb, struct i915_vma *vma) { - struct intel_crtc *crtc = to_intel_crtc(_crtc); - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); - struct intel_plane *plane = - to_intel_plane(crtc->base.primary); - struct intel_plane_state *plane_state = - to_intel_plane_state(plane->base.state); + struct intel_plane_state *plane_state = to_intel_plane_state(_plane_state); + struct drm_i915_private *dev_priv = to_i915(_plane_state->plane->dev); __i915_vma_pin(vma); plane_state->ggtt_vma = i915_vma_get(vma); diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 45513fd79766..9999bc07743b 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -158,16 +158,12 @@ err_bo: } static int -xe_initial_plane_setup(struct drm_crtc *_crtc, +xe_initial_plane_setup(struct drm_plane_state *_plane_state, struct intel_initial_plane_config *plane_config, struct drm_framebuffer *fb, struct i915_vma *_unused) { - struct intel_crtc *crtc = to_intel_crtc(_crtc); - struct intel_plane *plane = - to_intel_plane(crtc->base.primary); - struct intel_plane_state *plane_state = - to_intel_plane_state(plane->base.state); + struct intel_plane_state *plane_state = to_intel_plane_state(_plane_state); struct i915_vma *vma; vma = intel_fb_pin_to_ggtt(fb, &plane_state->view.gtt, diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index f0f379ae912d..129e2b9e9a21 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -11,6 +11,7 @@ struct drm_crtc; struct drm_device; struct drm_framebuffer; struct drm_gem_object; +struct drm_plane_state; struct drm_scanout_buffer; struct i915_vma; struct intel_hdcp_gsc_context; @@ -33,7 +34,7 @@ struct intel_display_hdcp_interface { struct intel_display_initial_plane_interface { void (*vblank_wait)(struct drm_crtc *crtc); struct drm_gem_object *(*alloc_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config); - int (*setup)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config, + int (*setup)(struct drm_plane_state *plane_state, struct intel_initial_plane_config *plane_config, struct drm_framebuffer *fb, struct i915_vma *vma); void (*config_fini)(struct intel_initial_plane_config *plane_configs); }; -- cgit v1.2.3 From 82eaf3459dbf92ea78243150508740c007e0eea7 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 15 Dec 2025 17:28:28 +0200 Subject: drm/{i915, xe}: pass struct drm_device instead of drm_device to ->alloc_obj MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The initial plane parent interface ->alloc_obj hook no longer needs the crtc for anything. Pass struct drm_device instead. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/7a40381be6d98dc0916a5447be5dd6cba86cfd0a.1765812266.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_initial_plane.c | 7 +++---- drivers/gpu/drm/i915/i915_initial_plane.c | 5 ++--- drivers/gpu/drm/xe/display/xe_initial_plane.c | 7 ++----- include/drm/intel/display_parent_interface.h | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c index e4d6aa438e66..ee545c033da6 100644 --- a/drivers/gpu/drm/i915/display/intel_initial_plane.c +++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c @@ -47,10 +47,9 @@ intel_reuse_initial_plane_obj(struct intel_crtc *this, } static struct drm_gem_object * -intel_alloc_initial_plane_obj(struct intel_crtc *crtc, +intel_alloc_initial_plane_obj(struct intel_display *display, struct intel_initial_plane_config *plane_config) { - struct intel_display *display = to_intel_display(crtc); struct intel_framebuffer *fb = plane_config->fb; switch (fb->base.modifier) { @@ -65,7 +64,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, return NULL; } - return display->parent->initial_plane->alloc_obj(&crtc->base, plane_config); + return display->parent->initial_plane->alloc_obj(display->drm, plane_config); } static void @@ -88,7 +87,7 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, if (!plane_config->fb) return; - if (intel_alloc_initial_plane_obj(crtc, plane_config)) { + if (intel_alloc_initial_plane_obj(display, plane_config)) { fb = &plane_config->fb->base; vma = plane_config->vma; } else { diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index 40d4f990f23c..de90ca69e0bb 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -228,11 +228,10 @@ err_obj: } static struct drm_gem_object * -i915_alloc_initial_plane_obj(struct drm_crtc *_crtc, +i915_alloc_initial_plane_obj(struct drm_device *drm, struct intel_initial_plane_config *plane_config) { - struct intel_crtc *crtc = to_intel_crtc(_crtc); - struct intel_display *display = to_intel_display(crtc); + struct intel_display *display = to_intel_display(drm); struct drm_mode_fb_cmd2 mode_cmd = {}; struct drm_framebuffer *fb = &plane_config->fb->base; struct i915_vma *vma; diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 9999bc07743b..4cfeafcc158d 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -14,8 +14,6 @@ #include "i915_vma.h" #include "intel_crtc.h" -#include "intel_display.h" -#include "intel_display_core.h" #include "intel_display_regs.h" #include "intel_display_types.h" #include "intel_fb.h" @@ -122,11 +120,10 @@ initial_plane_bo(struct xe_device *xe, } static struct drm_gem_object * -xe_alloc_initial_plane_obj(struct drm_crtc *_crtc, +xe_alloc_initial_plane_obj(struct drm_device *drm, struct intel_initial_plane_config *plane_config) { - struct intel_crtc *crtc = to_intel_crtc(_crtc); - struct xe_device *xe = to_xe_device(crtc->base.dev); + struct xe_device *xe = to_xe_device(drm); struct drm_mode_fb_cmd2 mode_cmd = { 0 }; struct drm_framebuffer *fb = &plane_config->fb->base; struct xe_bo *bo; diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 129e2b9e9a21..ce946859a3a9 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -33,7 +33,7 @@ struct intel_display_hdcp_interface { struct intel_display_initial_plane_interface { void (*vblank_wait)(struct drm_crtc *crtc); - struct drm_gem_object *(*alloc_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config); + struct drm_gem_object *(*alloc_obj)(struct drm_device *drm, struct intel_initial_plane_config *plane_config); int (*setup)(struct drm_plane_state *plane_state, struct intel_initial_plane_config *plane_config, struct drm_framebuffer *fb, struct i915_vma *vma); void (*config_fini)(struct intel_initial_plane_config *plane_configs); -- cgit v1.2.3 From 936cae9254e55a39aeaa0c156a764d22f319338b Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Wed, 7 Jan 2026 18:02:26 +0200 Subject: mei: late_bind: fix struct intel_lb_component_ops kernel-doc Fix kernel-doc warnings on struct intel_lb_component_ops: Warning: include/drm/intel/intel_lb_mei_interface.h:55 Incorrect use of kernel-doc format: * push_payload - Sends a payload to the authentication firmware And a bunch more. There isn't really support for documenting function pointer struct members in kernel-doc, but at least reference the member properly. Fixes: 741eeabb7c78 ("mei: late_bind: add late binding component driver") Cc: Alexander Usyskin Reviewed-by: Nitin Gote Link: https://patch.msgid.link/20260107160226.2381388-1-jani.nikula@intel.com Signed-off-by: Jani Nikula --- include/drm/intel/intel_lb_mei_interface.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/drm/intel/intel_lb_mei_interface.h b/include/drm/intel/intel_lb_mei_interface.h index d65be2cba2ab..0850738a30fc 100644 --- a/include/drm/intel/intel_lb_mei_interface.h +++ b/include/drm/intel/intel_lb_mei_interface.h @@ -53,7 +53,8 @@ enum intel_lb_status { */ struct intel_lb_component_ops { /** - * push_payload - Sends a payload to the authentication firmware + * @push_payload: Sends a payload to the authentication firmware + * * @dev: Device struct corresponding to the mei device * @type: Payload type (see &enum intel_lb_type) * @flags: Payload flags bitmap (e.g. %INTEL_LB_FLAGS_IS_PERSISTENT) -- cgit v1.2.3