From 3815e8f2ffe44396d10b100fbd38f511dfefbbc7 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 17 Nov 2025 11:16:10 +0200 Subject: drm/{i915,xe}/display: move irq calls to parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an irq parent driver interface for the .enabled and .synchronize calls. This lets us drop the dependency on i915_drv.h and i915_irq.h in multiple places, and subsequently remove the compat i915_irq.h and i915_irq.c files along with the display/ext directory from xe altogether. Introduce new intel_parent.[ch] as the wrapper layer to chase the function pointers and convert between generic and more specific display types. v2: Keep static wrappers in intel_display_irq.c (Ville) v3: Full blown wrappers in intel_parent.[ch] (Ville) Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/dd62dd52ef10d9ecf77da3bdf6a70f71193d141c.1763370931.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- include/drm/intel/display_parent_interface.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'include') diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 26bedc360044..3a008a18eb65 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -25,6 +25,11 @@ struct intel_display_rpm_interface { void (*assert_unblock)(const struct drm_device *drm); }; +struct intel_display_irq_interface { + bool (*enabled)(struct drm_device *drm); + void (*synchronize)(struct drm_device *drm); +}; + /** * struct intel_display_parent_interface - services parent driver provides to display * @@ -40,6 +45,9 @@ struct intel_display_rpm_interface { struct intel_display_parent_interface { /** @rpm: Runtime PM functions */ const struct intel_display_rpm_interface *rpm; + + /** @irq: IRQ interface */ + const struct intel_display_irq_interface *irq; }; #endif -- cgit v1.2.3 From e8916738977e29a6f1e8edc593ee336f2bcf1b7d Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 17 Nov 2025 11:16:11 +0200 Subject: drm/i915: add .vgpu_active to parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add .vgpu_active() to display parent interface, removing more dependencies on struct drm_i915_private, i915_drv.h, and i915_vgpu.h. This also allows us to remove the xe compat i915_vgpu.h. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/a2d4043ebaaf8f69bb738d5d1332afd2847550ad.1763370931.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_crtc.c | 6 ++---- drivers/gpu/drm/i915/display/intel_fbc.c | 5 ++--- drivers/gpu/drm/i915/display/intel_parent.c | 5 +++++ drivers/gpu/drm/i915/display/intel_parent.h | 2 ++ drivers/gpu/drm/i915/i915_driver.c | 6 ++++++ drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h | 18 ------------------ include/drm/intel/display_parent_interface.h | 3 +++ 7 files changed, 20 insertions(+), 25 deletions(-) delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c index 9d2a23c96c61..153ff4b4b52c 100644 --- a/drivers/gpu/drm/i915/display/intel_crtc.c +++ b/drivers/gpu/drm/i915/display/intel_crtc.c @@ -13,8 +13,6 @@ #include #include -#include "i915_drv.h" -#include "i915_vgpu.h" #include "i9xx_plane.h" #include "icl_dsi.h" #include "intel_atomic.h" @@ -28,6 +26,7 @@ #include "intel_drrs.h" #include "intel_dsi.h" #include "intel_fifo_underrun.h" +#include "intel_parent.h" #include "intel_pipe_crc.h" #include "intel_plane.h" #include "intel_psr.h" @@ -671,7 +670,6 @@ void intel_pipe_update_end(struct intel_atomic_state *state, int scanline_end = intel_get_crtc_scanline(crtc); u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc); ktime_t end_vbl_time = ktime_get(); - struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); drm_WARN_ON(display->drm, new_crtc_state->use_dsb); @@ -737,7 +735,7 @@ void intel_pipe_update_end(struct intel_atomic_state *state, local_irq_enable(); - if (intel_vgpu_active(dev_priv)) + if (intel_parent_vgpu_active(display)) goto out; if (crtc->debug.start_vbl_count && diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index 205c7266af43..cfadc69010a4 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -50,7 +50,6 @@ #include "gt/intel_gt_types.h" #include "i915_drv.h" -#include "i915_vgpu.h" #include "i915_vma.h" #include "i9xx_plane_regs.h" #include "intel_de.h" @@ -64,6 +63,7 @@ #include "intel_fbc.h" #include "intel_fbc_regs.h" #include "intel_frontbuffer.h" +#include "intel_parent.h" #define for_each_fbc_id(__display, __fbc_id) \ for ((__fbc_id) = INTEL_FBC_A; (__fbc_id) < I915_MAX_FBCS; (__fbc_id)++) \ @@ -1485,7 +1485,6 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, struct intel_plane *plane) { struct intel_display *display = to_intel_display(state->base.dev); - struct drm_i915_private *i915 = to_i915(display->drm); struct intel_plane_state *plane_state = intel_atomic_get_new_plane_state(state, plane); const struct drm_framebuffer *fb = plane_state->hw.fb; @@ -1501,7 +1500,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, return 0; } - if (intel_vgpu_active(i915)) { + if (intel_parent_vgpu_active(display)) { plane_state->no_fbc_reason = "VGPU active"; return 0; } diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 375713f6f411..3786fd42827d 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -31,3 +31,8 @@ void intel_parent_irq_synchronize(struct intel_display *display) { display->parent->irq->synchronize(display->drm); } + +bool intel_parent_vgpu_active(struct intel_display *display) +{ + return display->parent->vgpu_active && display->parent->vgpu_active(display->drm); +} diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 3ade493f1008..222c95836d35 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -11,4 +11,6 @@ struct intel_display; bool intel_parent_irq_enabled(struct intel_display *display); void intel_parent_irq_synchronize(struct intel_display *display); +bool intel_parent_vgpu_active(struct intel_display *display); + #endif /* __INTEL_PARENT_H__ */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 07715aef62d3..f21f1919a225 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -739,9 +739,15 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv) "DRM_I915_DEBUG_RUNTIME_PM enabled\n"); } +static bool vgpu_active(struct drm_device *drm) +{ + return intel_vgpu_active(to_i915(drm)); +} + static const struct intel_display_parent_interface parent = { .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, + .vgpu_active = vgpu_active, }; const struct intel_display_parent_interface *i915_driver_parent_interface(void) diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h deleted file mode 100644 index 4931c7198f13..000000000000 --- a/drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2023 Intel Corporation - */ - -#ifndef _I915_VGPU_H_ -#define _I915_VGPU_H_ - -#include - -struct drm_i915_private; - -static inline bool intel_vgpu_active(struct drm_i915_private *i915) -{ - return false; -} - -#endif /* _I915_VGPU_H_ */ diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 3a008a18eb65..f3834f36ce74 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -48,6 +48,9 @@ struct intel_display_parent_interface { /** @irq: IRQ interface */ const struct intel_display_irq_interface *irq; + + /** @vgpu_active: Is vGPU active? Optional. */ + bool (*vgpu_active)(struct drm_device *drm); }; #endif -- cgit v1.2.3 From 4799ff418f9a68361331fdc7fc01f66dc314adb9 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 17 Nov 2025 11:16:12 +0200 Subject: drm/i915: add .has_fenced_regions to parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add .has_fenced_regions() to display parent interface, removing more dependencies on struct drm_i915_private, i915_drv.h, and gt/intel_gt_types.h. This allows us to remove the xe compat gt/intel_gt_types.h. v2: s/fence_support_legacy/has_fenced_regions/ (Ville) Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/309f61a8742c3bf731c820b2f9e1024143db8598.1763370931.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_fbc.c | 8 ++------ drivers/gpu/drm/i915/display/intel_parent.c | 5 +++++ drivers/gpu/drm/i915/display/intel_parent.h | 2 ++ drivers/gpu/drm/i915/i915_driver.c | 6 ++++++ drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h | 11 ----------- include/drm/intel/display_parent_interface.h | 3 +++ 6 files changed, 18 insertions(+), 17 deletions(-) delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index cfadc69010a4..d9cab25d414a 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -47,9 +47,6 @@ #include "gem/i915_gem_stolen.h" -#include "gt/intel_gt_types.h" - -#include "i915_drv.h" #include "i915_vma.h" #include "i9xx_plane_regs.h" #include "intel_de.h" @@ -64,6 +61,7 @@ #include "intel_fbc_regs.h" #include "intel_frontbuffer.h" #include "intel_parent.h" +#include "intel_step.h" #define for_each_fbc_id(__display, __fbc_id) \ for ((__fbc_id) = INTEL_FBC_A; (__fbc_id) < I915_MAX_FBCS; (__fbc_id)++) \ @@ -267,9 +265,7 @@ static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_s static bool intel_fbc_has_fences(struct intel_display *display) { - struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); - - return intel_gt_support_legacy_fencing(to_gt(i915)); + return intel_parent_has_fenced_regions(display); } static u32 i8xx_fbc_ctl(struct intel_fbc *fbc) diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 3786fd42827d..535065e57213 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -36,3 +36,8 @@ bool intel_parent_vgpu_active(struct intel_display *display) { return display->parent->vgpu_active && display->parent->vgpu_active(display->drm); } + +bool intel_parent_has_fenced_regions(struct intel_display *display) +{ + return display->parent->has_fenced_regions && display->parent->has_fenced_regions(display->drm); +} diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 222c95836d35..04320d937777 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -13,4 +13,6 @@ void intel_parent_irq_synchronize(struct intel_display *display); bool intel_parent_vgpu_active(struct intel_display *display); +bool intel_parent_has_fenced_regions(struct intel_display *display); + #endif /* __INTEL_PARENT_H__ */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index f21f1919a225..9ba46850da72 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -744,10 +744,16 @@ static bool vgpu_active(struct drm_device *drm) return intel_vgpu_active(to_i915(drm)); } +static bool has_fenced_regions(struct drm_device *drm) +{ + return intel_gt_support_legacy_fencing(to_gt(to_i915(drm))); +} + static const struct intel_display_parent_interface parent = { .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, .vgpu_active = vgpu_active, + .has_fenced_regions = has_fenced_regions, }; const struct intel_display_parent_interface *i915_driver_parent_interface(void) diff --git a/drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h b/drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h deleted file mode 100644 index c15806d6c4f7..000000000000 --- a/drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2023 Intel Corporation - */ - -#ifndef __INTEL_GT_TYPES__ -#define __INTEL_GT_TYPES__ - -#define intel_gt_support_legacy_fencing(gt) 0 - -#endif diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index f3834f36ce74..927d964f2071 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -51,6 +51,9 @@ struct intel_display_parent_interface { /** @vgpu_active: Is vGPU active? Optional. */ bool (*vgpu_active)(struct drm_device *drm); + + /** @has_fenced_regions: Support legacy fencing? Optional. */ + bool (*has_fenced_regions)(struct drm_device *drm); }; #endif -- cgit v1.2.3 From 1314027632ae2d98ec7ba250495d1a6084caafc6 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 17 Nov 2025 11:16:14 +0200 Subject: drm/i915/rps: call RPS functions via the parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add struct intel_display_rps_interface to the display parent interface, and call the RPS functions through it. The RPS interface is optional. v2: s/boost/boost_if_not_started/ and keep comment in caller (Ville) Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/6a6c4420d9f2d9a545ee6df4cad5fdc32a86636b.1763370931.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_display_rps.c | 27 +++++++++++++--------- drivers/gpu/drm/i915/display/intel_parent.c | 23 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_parent.h | 6 +++++ drivers/gpu/drm/i915/gt/intel_rps.c | 29 ++++++++++++++++++++++++ drivers/gpu/drm/i915/gt/intel_rps.h | 2 ++ drivers/gpu/drm/i915/i915_driver.c | 2 ++ include/drm/intel/display_parent_interface.h | 10 ++++++++ 7 files changed, 88 insertions(+), 11 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_display_rps.c b/drivers/gpu/drm/i915/display/intel_display_rps.c index b6720f7c09d9..d639d9152bf5 100644 --- a/drivers/gpu/drm/i915/display/intel_display_rps.c +++ b/drivers/gpu/drm/i915/display/intel_display_rps.c @@ -3,16 +3,18 @@ * Copyright © 2023 Intel Corporation */ +#include + #include #include -#include "gt/intel_rps.h" -#include "i915_drv.h" #include "i915_reg.h" +#include "i915_request.h" #include "intel_display_core.h" #include "intel_display_irq.h" #include "intel_display_rps.h" #include "intel_display_types.h" +#include "intel_parent.h" struct wait_rps_boost { struct wait_queue_entry wait; @@ -25,15 +27,15 @@ static int do_rps_boost(struct wait_queue_entry *_wait, unsigned mode, int sync, void *key) { struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait); - struct i915_request *rq = to_request(wait->fence); + struct intel_display *display = to_intel_display(wait->crtc->dev); /* * If we missed the vblank, but the request is already running it * is reasonable to assume that it will complete before the next - * vblank without our intervention, so leave RPS alone. + * vblank without our intervention, so leave RPS alone if not started. */ - if (!i915_request_started(rq)) - intel_rps_boost(rq); + intel_parent_rps_boost_if_not_started(display, wait->fence); + dma_fence_put(wait->fence); drm_crtc_vblank_put(wait->crtc); @@ -49,6 +51,9 @@ void intel_display_rps_boost_after_vblank(struct drm_crtc *crtc, struct intel_display *display = to_intel_display(crtc->dev); struct wait_rps_boost *wait; + if (!intel_parent_rps_available(display)) + return; + if (!dma_fence_is_i915(fence)) return; @@ -77,12 +82,14 @@ void intel_display_rps_mark_interactive(struct intel_display *display, struct intel_atomic_state *state, bool interactive) { - struct drm_i915_private *i915 = to_i915(display->drm); + if (!intel_parent_rps_available(display)) + return; if (state->rps_interactive == interactive) return; - intel_rps_mark_interactive(&to_gt(i915)->rps, interactive); + intel_parent_rps_mark_interactive(display, interactive); + state->rps_interactive = interactive; } @@ -102,7 +109,5 @@ void ilk_display_rps_disable(struct intel_display *display) void ilk_display_rps_irq_handler(struct intel_display *display) { - struct drm_i915_private *i915 = to_i915(display->drm); - - gen5_rps_irq_handler(&to_gt(i915)->rps); + intel_parent_rps_ilk_irq_handler(display); } diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 535065e57213..6c131196718e 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -32,6 +32,29 @@ void intel_parent_irq_synchronize(struct intel_display *display) display->parent->irq->synchronize(display->drm); } +bool intel_parent_rps_available(struct intel_display *display) +{ + return display->parent->rps; +} + +void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct dma_fence *fence) +{ + if (display->parent->rps) + display->parent->rps->boost_if_not_started(fence); +} + +void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive) +{ + if (display->parent->rps) + display->parent->rps->mark_interactive(display->drm, interactive); +} + +void intel_parent_rps_ilk_irq_handler(struct intel_display *display) +{ + if (display->parent->rps) + display->parent->rps->ilk_irq_handler(display->drm); +} + bool intel_parent_vgpu_active(struct intel_display *display) { return display->parent->vgpu_active && display->parent->vgpu_active(display->drm); diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 04320d937777..12cfbea95aa1 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -6,11 +6,17 @@ #include +struct dma_fence; struct intel_display; bool intel_parent_irq_enabled(struct intel_display *display); void intel_parent_irq_synchronize(struct intel_display *display); +bool intel_parent_rps_available(struct intel_display *display); +void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct dma_fence *fence); +void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive); +void intel_parent_rps_ilk_irq_handler(struct intel_display *display); + bool intel_parent_vgpu_active(struct intel_display *display); bool intel_parent_has_fenced_regions(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c index b01c837ab646..c42a1ee42b58 100644 --- a/drivers/gpu/drm/i915/gt/intel_rps.c +++ b/drivers/gpu/drm/i915/gt/intel_rps.c @@ -6,6 +6,7 @@ #include #include +#include #include "display/intel_display_rps.h" #include "display/vlv_clock.h" @@ -2914,6 +2915,34 @@ bool i915_gpu_turbo_disable(void) } EXPORT_SYMBOL_GPL(i915_gpu_turbo_disable); +static void boost_if_not_started(struct dma_fence *fence) +{ + struct i915_request *rq = to_request(fence); + + if (!i915_request_started(rq)) + intel_rps_boost(rq); +} + +static void mark_interactive(struct drm_device *drm, bool interactive) +{ + struct drm_i915_private *i915 = to_i915(drm); + + intel_rps_mark_interactive(&to_gt(i915)->rps, interactive); +} + +static void ilk_irq_handler(struct drm_device *drm) +{ + struct drm_i915_private *i915 = to_i915(drm); + + gen5_rps_irq_handler(&to_gt(i915)->rps); +} + +const struct intel_display_rps_interface i915_display_rps_interface = { + .boost_if_not_started = boost_if_not_started, + .mark_interactive = mark_interactive, + .ilk_irq_handler = ilk_irq_handler, +}; + #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) #include "selftest_rps.c" #include "selftest_slpc.c" diff --git a/drivers/gpu/drm/i915/gt/intel_rps.h b/drivers/gpu/drm/i915/gt/intel_rps.h index 92fb01f5a452..5dbcebd7d4a5 100644 --- a/drivers/gpu/drm/i915/gt/intel_rps.h +++ b/drivers/gpu/drm/i915/gt/intel_rps.h @@ -128,4 +128,6 @@ static inline void intel_rps_clear_timer(struct intel_rps *rps) clear_bit(INTEL_RPS_TIMER, &rps->flags); } +extern const struct intel_display_rps_interface i915_display_rps_interface; + #endif /* INTEL_RPS_H */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 9ba46850da72..7e1dedabf0ee 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -81,6 +81,7 @@ #include "gt/intel_gt_pm.h" #include "gt/intel_gt_print.h" #include "gt/intel_rc6.h" +#include "gt/intel_rps.h" #include "pxp/intel_pxp.h" #include "pxp/intel_pxp_debugfs.h" @@ -752,6 +753,7 @@ static bool has_fenced_regions(struct drm_device *drm) static const struct intel_display_parent_interface parent = { .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, + .rps = &i915_display_rps_interface, .vgpu_active = vgpu_active, .has_fenced_regions = has_fenced_regions, }; diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 927d964f2071..0a6a26234fbe 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -6,6 +6,7 @@ #include +struct dma_fence; struct drm_device; struct ref_tracker; @@ -30,6 +31,12 @@ struct intel_display_irq_interface { void (*synchronize)(struct drm_device *drm); }; +struct intel_display_rps_interface { + void (*boost_if_not_started)(struct dma_fence *fence); + void (*mark_interactive)(struct drm_device *drm, bool interactive); + void (*ilk_irq_handler)(struct drm_device *drm); +}; + /** * struct intel_display_parent_interface - services parent driver provides to display * @@ -49,6 +56,9 @@ struct intel_display_parent_interface { /** @irq: IRQ interface */ const struct intel_display_irq_interface *irq; + /** @rpm: RPS interface. Optional. */ + const struct intel_display_rps_interface *rps; + /** @vgpu_active: Is vGPU active? Optional. */ bool (*vgpu_active)(struct drm_device *drm); -- cgit v1.2.3 From 55fc11ce96e92dbae2aab1d692735f7a9b96fefd Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 17 Nov 2025 11:16:16 +0200 Subject: drm/i915: add .fence_priority_display to parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add .fence_priority_display() to display parent interface, removing a display dependency on gem/i915_gem_object.h. This allows us to remove the xe compat gem/i915_gem_object.h. v2: Don't mix this with the rps interface (Ville) v3: Rebase Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/c7782862956e3aa59eaeb6dcf80906c1fc063ae1.1763370931.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_parent.c | 6 ++++++ drivers/gpu/drm/i915/display/intel_parent.h | 2 ++ drivers/gpu/drm/i915/display/intel_plane.c | 5 ++--- drivers/gpu/drm/i915/i915_driver.c | 7 +++++++ .../gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h | 13 ------------- include/drm/intel/display_parent_interface.h | 3 +++ 6 files changed, 20 insertions(+), 16 deletions(-) delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 6c131196718e..27c7ef34ce48 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -64,3 +64,9 @@ bool intel_parent_has_fenced_regions(struct intel_display *display) { return display->parent->has_fenced_regions && display->parent->has_fenced_regions(display->drm); } + +void intel_parent_fence_priority_display(struct intel_display *display, struct dma_fence *fence) +{ + if (display->parent->fence_priority_display) + display->parent->fence_priority_display(fence); +} diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 12cfbea95aa1..a8ca40b57ea9 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -21,4 +21,6 @@ bool intel_parent_vgpu_active(struct intel_display *display); bool intel_parent_has_fenced_regions(struct intel_display *display); +void intel_parent_fence_priority_display(struct intel_display *display, struct dma_fence *fence); + #endif /* __INTEL_PARENT_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c index 5105e3278bc4..a7fec5ba6ac0 100644 --- a/drivers/gpu/drm/i915/display/intel_plane.c +++ b/drivers/gpu/drm/i915/display/intel_plane.c @@ -45,7 +45,6 @@ #include #include -#include "gem/i915_gem_object.h" #include "i9xx_plane_regs.h" #include "intel_cdclk.h" #include "intel_cursor.h" @@ -56,6 +55,7 @@ #include "intel_fb_pin.h" #include "intel_fbdev.h" #include "intel_panic.h" +#include "intel_parent.h" #include "intel_plane.h" #include "intel_psr.h" #include "skl_scaler.h" @@ -1180,8 +1180,7 @@ intel_prepare_plane_fb(struct drm_plane *_plane, goto unpin_fb; if (new_plane_state->uapi.fence) { - i915_gem_fence_wait_priority_display(new_plane_state->uapi.fence); - + intel_parent_fence_priority_display(display, new_plane_state->uapi.fence); intel_display_rps_boost_after_vblank(new_plane_state->hw.crtc, new_plane_state->uapi.fence); } diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 7e1dedabf0ee..7c60b6873934 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -750,12 +750,19 @@ static bool has_fenced_regions(struct drm_device *drm) return intel_gt_support_legacy_fencing(to_gt(to_i915(drm))); } +static void fence_priority_display(struct dma_fence *fence) +{ + if (dma_fence_is_i915(fence)) + i915_gem_fence_wait_priority_display(fence); +} + static const struct intel_display_parent_interface parent = { .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, .rps = &i915_display_rps_interface, .vgpu_active = vgpu_active, .has_fenced_regions = has_fenced_regions, + .fence_priority_display = fence_priority_display, }; const struct intel_display_parent_interface *i915_driver_parent_interface(void) diff --git a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h deleted file mode 100644 index 0548b2e0316f..000000000000 --- a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* Copyright © 2025 Intel Corporation */ - -#ifndef __I915_GEM_OBJECT_H__ -#define __I915_GEM_OBJECT_H__ - -struct dma_fence; - -static inline void i915_gem_fence_wait_priority_display(struct dma_fence *fence) -{ -} - -#endif diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 0a6a26234fbe..4135d1e1a67e 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -64,6 +64,9 @@ struct intel_display_parent_interface { /** @has_fenced_regions: Support legacy fencing? Optional. */ bool (*has_fenced_regions)(struct drm_device *drm); + + /** @fence_priority_display: Set display priority. Optional. */ + void (*fence_priority_display)(struct dma_fence *fence); }; #endif -- cgit v1.2.3 From 29fdc6e98d3c3657c8b4874ab3bfc75f9df59bf4 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Tue, 25 Nov 2025 19:17:44 +0200 Subject: drm/{i915,xe}/hdcp: use parent interface for HDCP GSC calls The HDCP GSC implementation is different for both i915 and xe. Add it to the display parent interface, and call the hooks via the parent interface. Reviewed-by: Suraj Kandpal Link: https://patch.msgid.link/e397073e91f8aa7518754b3b79f65c1936be91ad.1764090990.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_hdcp.c | 4 +- drivers/gpu/drm/i915/display/intel_hdcp_gsc.h | 22 ------ .../gpu/drm/i915/display/intel_hdcp_gsc_message.c | 78 ++++++++++------------ drivers/gpu/drm/i915/display/intel_parent.c | 24 +++++++ drivers/gpu/drm/i915/display/intel_parent.h | 10 +++ drivers/gpu/drm/i915/i915_driver.c | 2 + drivers/gpu/drm/i915/i915_hdcp_gsc.c | 22 ++++-- drivers/gpu/drm/i915/i915_hdcp_gsc.h | 9 +++ drivers/gpu/drm/xe/display/xe_display.c | 2 + drivers/gpu/drm/xe/display/xe_hdcp_gsc.c | 25 ++++--- drivers/gpu/drm/xe/display/xe_hdcp_gsc.h | 9 +++ include/drm/intel/display_parent_interface.h | 13 ++++ 12 files changed, 139 insertions(+), 81 deletions(-) delete mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h create mode 100644 drivers/gpu/drm/i915/i915_hdcp_gsc.h create mode 100644 drivers/gpu/drm/xe/display/xe_hdcp_gsc.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c index 5e1a96223a9c..7114fc405c29 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c @@ -29,10 +29,10 @@ #include "intel_display_types.h" #include "intel_dp_mst.h" #include "intel_hdcp.h" -#include "intel_hdcp_gsc.h" #include "intel_hdcp_gsc_message.h" #include "intel_hdcp_regs.h" #include "intel_hdcp_shim.h" +#include "intel_parent.h" #include "intel_pcode.h" #include "intel_step.h" @@ -258,7 +258,7 @@ static bool intel_hdcp2_prerequisite(struct intel_connector *connector) /* If MTL+ make sure gsc is loaded and proxy is setup */ if (USE_HDCP_GSC(display)) { - if (!intel_hdcp_gsc_check_status(display->drm)) + if (!intel_parent_hdcp_gsc_check_status(display)) return false; } diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h deleted file mode 100644 index 9305c14aaffe..000000000000 --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2023 Intel Corporation - */ - -#ifndef __INTEL_HDCP_GSC_H__ -#define __INTEL_HDCP_GSC_H__ - -#include - -struct drm_device; -struct intel_hdcp_gsc_context; - -ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, - void *msg_in, size_t msg_in_len, - void *msg_out, size_t msg_out_len); -bool intel_hdcp_gsc_check_status(struct drm_device *drm); - -struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *drm); -void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context); - -#endif /* __INTEL_HDCP_GCS_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c index 98967bb148e3..781667b710b4 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c @@ -10,8 +10,8 @@ #include "intel_display_core.h" #include "intel_display_types.h" -#include "intel_hdcp_gsc.h" #include "intel_hdcp_gsc_message.h" +#include "intel_parent.h" static int intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data *data, @@ -44,10 +44,9 @@ intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data *data, session_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder; session_init_in.protocol = data->protocol; - byte = intel_hdcp_gsc_msg_send(gsc_context, &session_init_in, - sizeof(session_init_in), - &session_init_out, - sizeof(session_init_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &session_init_in, sizeof(session_init_in), + &session_init_out, sizeof(session_init_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -106,10 +105,9 @@ intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev, memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN); memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps, HDCP_2_2_RXCAPS_LEN); - byte = intel_hdcp_gsc_msg_send(gsc_context, &verify_rxcert_in, - sizeof(verify_rxcert_in), - &verify_rxcert_out, - sizeof(verify_rxcert_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &verify_rxcert_in, sizeof(verify_rxcert_in), + &verify_rxcert_out, sizeof(verify_rxcert_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed: %zd\n", byte); return byte; @@ -169,10 +167,9 @@ intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data *data, memcpy(send_hprime_in.h_prime, rx_hprime->h_prime, HDCP_2_2_H_PRIME_LEN); - byte = intel_hdcp_gsc_msg_send(gsc_context, &send_hprime_in, - sizeof(send_hprime_in), - &send_hprime_out, - sizeof(send_hprime_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &send_hprime_in, sizeof(send_hprime_in), + &send_hprime_out, sizeof(send_hprime_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -220,10 +217,9 @@ intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data *dat memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km, HDCP_2_2_E_KH_KM_LEN); - byte = intel_hdcp_gsc_msg_send(gsc_context, &pairing_info_in, - sizeof(pairing_info_in), - &pairing_info_out, - sizeof(pairing_info_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &pairing_info_in, sizeof(pairing_info_in), + &pairing_info_out, sizeof(pairing_info_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -269,8 +265,9 @@ intel_hdcp_gsc_initiate_locality_check(struct device *dev, lc_init_in.port.physical_port = (u8)data->hdcp_ddi; lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder; - byte = intel_hdcp_gsc_msg_send(gsc_context, &lc_init_in, sizeof(lc_init_in), - &lc_init_out, sizeof(lc_init_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &lc_init_in, sizeof(lc_init_in), + &lc_init_out, sizeof(lc_init_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -321,10 +318,9 @@ intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data *data, memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime, HDCP_2_2_L_PRIME_LEN); - byte = intel_hdcp_gsc_msg_send(gsc_context, &verify_lprime_in, - sizeof(verify_lprime_in), - &verify_lprime_out, - sizeof(verify_lprime_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &verify_lprime_in, sizeof(verify_lprime_in), + &verify_lprime_out, sizeof(verify_lprime_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -370,8 +366,9 @@ intel_hdcp_gsc_get_session_key(struct device *dev, get_skey_in.port.physical_port = (u8)data->hdcp_ddi; get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder; - byte = intel_hdcp_gsc_msg_send(gsc_context, &get_skey_in, sizeof(get_skey_in), - &get_skey_out, sizeof(get_skey_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &get_skey_in, sizeof(get_skey_in), + &get_skey_out, sizeof(get_skey_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -434,10 +431,9 @@ intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev, memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids, HDCP_2_2_RECEIVER_IDS_MAX_LEN); - byte = intel_hdcp_gsc_msg_send(gsc_context, &verify_repeater_in, - sizeof(verify_repeater_in), - &verify_repeater_out, - sizeof(verify_repeater_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &verify_repeater_in, sizeof(verify_repeater_in), + &verify_repeater_out, sizeof(verify_repeater_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -504,9 +500,9 @@ intel_hdcp_gsc_verify_mprime(struct device *dev, verify_mprime_in->k = cpu_to_be16(data->k); - byte = intel_hdcp_gsc_msg_send(gsc_context, verify_mprime_in, cmd_size, - &verify_mprime_out, - sizeof(verify_mprime_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + verify_mprime_in, cmd_size, + &verify_mprime_out, sizeof(verify_mprime_out)); kfree(verify_mprime_in); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); @@ -552,10 +548,9 @@ static int intel_hdcp_gsc_enable_authentication(struct device *dev, enable_auth_in.port.attached_transcoder = (u8)data->hdcp_transcoder; enable_auth_in.stream_type = data->streams[0].stream_type; - byte = intel_hdcp_gsc_msg_send(gsc_context, &enable_auth_in, - sizeof(enable_auth_in), - &enable_auth_out, - sizeof(enable_auth_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &enable_auth_in, sizeof(enable_auth_in), + &enable_auth_out, sizeof(enable_auth_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -599,10 +594,9 @@ intel_hdcp_gsc_close_session(struct device *dev, struct hdcp_port_data *data) session_close_in.port.physical_port = (u8)data->hdcp_ddi; session_close_in.port.attached_transcoder = (u8)data->hdcp_transcoder; - byte = intel_hdcp_gsc_msg_send(gsc_context, &session_close_in, - sizeof(session_close_in), - &session_close_out, - sizeof(session_close_out)); + byte = intel_parent_hdcp_gsc_msg_send(display, gsc_context, + &session_close_in, sizeof(session_close_in), + &session_close_out, sizeof(session_close_out)); if (byte < 0) { drm_dbg_kms(display->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte); return byte; @@ -645,7 +639,7 @@ int intel_hdcp_gsc_init(struct intel_display *display) mutex_lock(&display->hdcp.hdcp_mutex); - gsc_context = intel_hdcp_gsc_context_alloc(display->drm); + gsc_context = intel_parent_hdcp_gsc_context_alloc(display); if (IS_ERR(gsc_context)) { ret = PTR_ERR(gsc_context); kfree(arbiter); @@ -665,7 +659,7 @@ out: void intel_hdcp_gsc_fini(struct intel_display *display) { - intel_hdcp_gsc_context_free(display->hdcp.gsc_context); + intel_parent_hdcp_gsc_context_free(display, display->hdcp.gsc_context); display->hdcp.gsc_context = NULL; kfree(display->hdcp.arbiter); display->hdcp.arbiter = NULL; diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 27c7ef34ce48..2ea310cc3509 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -22,6 +22,30 @@ #include "intel_display_core.h" #include "intel_parent.h" +ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, + struct intel_hdcp_gsc_context *gsc_context, + void *msg_in, size_t msg_in_len, + void *msg_out, size_t msg_out_len) +{ + return display->parent->hdcp->gsc_msg_send(gsc_context, msg_in, msg_in_len, msg_out, msg_out_len); +} + +bool intel_parent_hdcp_gsc_check_status(struct intel_display *display) +{ + return display->parent->hdcp->gsc_check_status(display->drm); +} + +struct intel_hdcp_gsc_context *intel_parent_hdcp_gsc_context_alloc(struct intel_display *display) +{ + return display->parent->hdcp->gsc_context_alloc(display->drm); +} + +void intel_parent_hdcp_gsc_context_free(struct intel_display *display, + struct intel_hdcp_gsc_context *gsc_context) +{ + display->parent->hdcp->gsc_context_free(gsc_context); +} + bool intel_parent_irq_enabled(struct intel_display *display) { return display->parent->irq->enabled(display->drm); diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index a8ca40b57ea9..8f91a6f75c53 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -8,6 +8,16 @@ struct dma_fence; struct intel_display; +struct intel_hdcp_gsc_context; + +ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, + struct intel_hdcp_gsc_context *gsc_context, + void *msg_in, size_t msg_in_len, + void *msg_out, size_t msg_out_len); +bool intel_parent_hdcp_gsc_check_status(struct intel_display *display); +struct intel_hdcp_gsc_context *intel_parent_hdcp_gsc_context_alloc(struct intel_display *display); +void intel_parent_hdcp_gsc_context_free(struct intel_display *display, + struct intel_hdcp_gsc_context *gsc_context); bool intel_parent_irq_enabled(struct intel_display *display); void intel_parent_irq_synchronize(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index db0dd25f734d..d98839427ef9 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -96,6 +96,7 @@ #include "i915_file_private.h" #include "i915_getparam.h" #include "i915_gmch.h" +#include "i915_hdcp_gsc.h" #include "i915_hwmon.h" #include "i915_ioc32.h" #include "i915_ioctl.h" @@ -757,6 +758,7 @@ static void fence_priority_display(struct dma_fence *fence) } static const struct intel_display_parent_interface parent = { + .hdcp = &i915_display_hdcp_interface, .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, .rps = &i915_display_rps_interface, diff --git a/drivers/gpu/drm/i915/i915_hdcp_gsc.c b/drivers/gpu/drm/i915/i915_hdcp_gsc.c index 38df5318e13a..9906da2aef1c 100644 --- a/drivers/gpu/drm/i915/i915_hdcp_gsc.c +++ b/drivers/gpu/drm/i915/i915_hdcp_gsc.c @@ -4,13 +4,14 @@ */ #include +#include #include -#include "display/intel_hdcp_gsc.h" #include "gem/i915_gem_region.h" #include "gt/intel_gt.h" #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h" #include "i915_drv.h" +#include "i915_hdcp_gsc.h" struct intel_hdcp_gsc_context { struct drm_i915_private *i915; @@ -19,7 +20,7 @@ struct intel_hdcp_gsc_context { void *hdcp_cmd_out; }; -bool intel_hdcp_gsc_check_status(struct drm_device *drm) +static bool intel_hdcp_gsc_check_status(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); struct intel_gt *gt = i915->media_gt; @@ -87,7 +88,7 @@ out_unpin: return err; } -struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *drm) +static struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); struct intel_hdcp_gsc_context *gsc_context; @@ -111,7 +112,7 @@ struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *d return gsc_context; } -void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context) +static void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context) { if (!gsc_context) return; @@ -168,9 +169,9 @@ static int intel_gsc_send_sync(struct drm_i915_private *i915, * gsc cs memory header as stated in specs after which the normal HDCP payload * will follow */ -ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, - void *msg_in, size_t msg_in_len, - void *msg_out, size_t msg_out_len) +static ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, + void *msg_in, size_t msg_in_len, + void *msg_out, size_t msg_out_len) { struct drm_i915_private *i915 = gsc_context->i915; struct intel_gt *gt = i915->media_gt; @@ -237,3 +238,10 @@ ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, err: return ret; } + +const struct intel_display_hdcp_interface i915_display_hdcp_interface = { + .gsc_msg_send = intel_hdcp_gsc_msg_send, + .gsc_check_status = intel_hdcp_gsc_check_status, + .gsc_context_alloc = intel_hdcp_gsc_context_alloc, + .gsc_context_free = intel_hdcp_gsc_context_free, +}; diff --git a/drivers/gpu/drm/i915/i915_hdcp_gsc.h b/drivers/gpu/drm/i915/i915_hdcp_gsc.h new file mode 100644 index 000000000000..e0b562cfcde3 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_hdcp_gsc.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __I915_HDCP_GSC_H__ +#define __I915_HDCP_GSC_H__ + +extern const struct intel_display_hdcp_interface i915_display_hdcp_interface; + +#endif /* __I915_HDCP_GSC_H__ */ diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index 793115077615..9d2aa69ea428 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -37,6 +37,7 @@ #include "skl_watermark.h" #include "xe_display_rpm.h" #include "xe_module.h" +#include "xe_hdcp_gsc.h" /* Ensure drm and display members are placed properly. */ INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display); @@ -534,6 +535,7 @@ static const struct intel_display_irq_interface xe_display_irq_interface = { }; static const struct intel_display_parent_interface parent = { + .hdcp = &xe_display_hdcp_interface, .rpm = &xe_display_rpm_interface, .irq = &xe_display_irq_interface, }; diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c index 4ae847b628e2..4e5ccd50f69d 100644 --- a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c +++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c @@ -3,18 +3,20 @@ * Copyright 2023, Intel Corporation. */ +#include + #include +#include #include -#include #include "abi/gsc_command_header_abi.h" -#include "intel_hdcp_gsc.h" #include "xe_bo.h" #include "xe_device.h" #include "xe_device_types.h" #include "xe_force_wake.h" #include "xe_gsc_proxy.h" #include "xe_gsc_submit.h" +#include "xe_hdcp_gsc.h" #include "xe_map.h" #include "xe_pm.h" #include "xe_uc_fw.h" @@ -30,7 +32,7 @@ struct intel_hdcp_gsc_context { #define HDCP_GSC_HEADER_SIZE sizeof(struct intel_gsc_mtl_header) -bool intel_hdcp_gsc_check_status(struct drm_device *drm) +static bool intel_hdcp_gsc_check_status(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); struct xe_tile *tile = xe_device_get_root_tile(xe); @@ -96,7 +98,7 @@ out: return ret; } -struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *drm) +static struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); struct intel_hdcp_gsc_context *gsc_context; @@ -120,7 +122,7 @@ struct intel_hdcp_gsc_context *intel_hdcp_gsc_context_alloc(struct drm_device *d return gsc_context; } -void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context) +static void intel_hdcp_gsc_context_free(struct intel_hdcp_gsc_context *gsc_context) { if (!gsc_context) return; @@ -155,9 +157,9 @@ static int xe_gsc_send_sync(struct xe_device *xe, return ret; } -ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, - void *msg_in, size_t msg_in_len, - void *msg_out, size_t msg_out_len) +static ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context, + void *msg_in, size_t msg_in_len, + void *msg_out, size_t msg_out_len) { struct xe_device *xe = gsc_context->xe; const size_t max_msg_size = PAGE_SIZE - HDCP_GSC_HEADER_SIZE; @@ -211,3 +213,10 @@ out: xe_pm_runtime_put(xe); return ret; } + +const struct intel_display_hdcp_interface xe_display_hdcp_interface = { + .gsc_msg_send = intel_hdcp_gsc_msg_send, + .gsc_check_status = intel_hdcp_gsc_check_status, + .gsc_context_alloc = intel_hdcp_gsc_context_alloc, + .gsc_context_free = intel_hdcp_gsc_context_free, +}; diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.h b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.h new file mode 100644 index 000000000000..c1062e4b62f7 --- /dev/null +++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __XE_HDCP_GSC_H__ +#define __XE_HDCP_GSC_H__ + +extern const struct intel_display_hdcp_interface xe_display_hdcp_interface; + +#endif diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 4135d1e1a67e..61d1b22adc83 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -8,6 +8,7 @@ struct dma_fence; struct drm_device; +struct intel_hdcp_gsc_context; struct ref_tracker; struct intel_display_rpm_interface { @@ -26,6 +27,15 @@ struct intel_display_rpm_interface { void (*assert_unblock)(const struct drm_device *drm); }; +struct intel_display_hdcp_interface { + ssize_t (*gsc_msg_send)(struct intel_hdcp_gsc_context *gsc_context, + void *msg_in, size_t msg_in_len, + void *msg_out, size_t msg_out_len); + bool (*gsc_check_status)(struct drm_device *drm); + struct intel_hdcp_gsc_context *(*gsc_context_alloc)(struct drm_device *drm); + void (*gsc_context_free)(struct intel_hdcp_gsc_context *gsc_context); +}; + struct intel_display_irq_interface { bool (*enabled)(struct drm_device *drm); void (*synchronize)(struct drm_device *drm); @@ -50,6 +60,9 @@ struct intel_display_rps_interface { * check the optional pointers. */ struct intel_display_parent_interface { + /** @hdcp: HDCP GSC interface */ + const struct intel_display_hdcp_interface *hdcp; + /** @rpm: Runtime PM functions */ const struct intel_display_rpm_interface *rpm; -- cgit v1.2.3 From d6c862572b69fd92f1793738e2e8d7d326ba0740 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Fri, 5 Dec 2025 12:30:29 +0200 Subject: drm/{i915, xe}/stolen: move stolen memory handling to display parent interface Call the stolen memory interface through the display parent interface. This makes xe compat gem/i915_gem_stolen.h redundant, and it can be removed. v2: Rebase, convert one more call that appeared Reviewed-by: Vinod Govindapillai Link: https://patch.msgid.link/350c82c49fe40f6319d14d309180e2e2752145ac.1764930576.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_fbc.c | 71 +++++++++++----------- drivers/gpu/drm/i915/display/intel_parent.c | 66 ++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_parent.h | 19 ++++++ drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 52 ++++++++++------ drivers/gpu/drm/i915/gem/i915_gem_stolen.h | 23 +------ drivers/gpu/drm/i915/i915_driver.c | 1 + .../xe/compat-i915-headers/gem/i915_gem_stolen.h | 40 ------------ drivers/gpu/drm/xe/display/xe_display.c | 4 +- drivers/gpu/drm/xe/display/xe_stolen.c | 47 +++++++++----- drivers/gpu/drm/xe/display/xe_stolen.h | 9 +++ include/drm/intel/display_parent_interface.h | 20 ++++++ 11 files changed, 222 insertions(+), 130 deletions(-) delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h create mode 100644 drivers/gpu/drm/xe/display/xe_stolen.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index 0e946bed484f..fef2f35ff1e9 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -45,8 +45,6 @@ #include #include -#include "gem/i915_gem_stolen.h" - #include "i915_vma.h" #include "i9xx_plane_regs.h" #include "intel_de.h" @@ -393,17 +391,17 @@ static void i8xx_fbc_program_cfb(struct intel_fbc *fbc) struct intel_display *display = fbc->display; drm_WARN_ON(display->drm, - range_end_overflows_t(u64, i915_gem_stolen_area_address(display->drm), - i915_gem_stolen_node_offset(fbc->compressed_fb), + range_end_overflows_t(u64, intel_parent_stolen_area_address(display), + intel_parent_stolen_node_offset(display, fbc->compressed_fb), U32_MAX)); drm_WARN_ON(display->drm, - range_end_overflows_t(u64, i915_gem_stolen_area_address(display->drm), - i915_gem_stolen_node_offset(fbc->compressed_llb), + range_end_overflows_t(u64, intel_parent_stolen_area_address(display), + intel_parent_stolen_node_offset(display, fbc->compressed_llb), U32_MAX)); intel_de_write(display, FBC_CFB_BASE, - i915_gem_stolen_node_address(fbc->compressed_fb)); + intel_parent_stolen_node_address(display, fbc->compressed_fb)); intel_de_write(display, FBC_LL_BASE, - i915_gem_stolen_node_address(fbc->compressed_llb)); + intel_parent_stolen_node_address(display, fbc->compressed_llb)); } static const struct intel_fbc_funcs i8xx_fbc_funcs = { @@ -511,7 +509,7 @@ static void g4x_fbc_program_cfb(struct intel_fbc *fbc) struct intel_display *display = fbc->display; intel_de_write(display, DPFC_CB_BASE, - i915_gem_stolen_node_offset(fbc->compressed_fb)); + intel_parent_stolen_node_offset(display, fbc->compressed_fb)); } static const struct intel_fbc_funcs g4x_fbc_funcs = { @@ -580,7 +578,7 @@ static void ilk_fbc_program_cfb(struct intel_fbc *fbc) struct intel_display *display = fbc->display; intel_de_write(display, ILK_DPFC_CB_BASE(fbc->id), - i915_gem_stolen_node_offset(fbc->compressed_fb)); + intel_parent_stolen_node_offset(display, fbc->compressed_fb)); } static const struct intel_fbc_funcs ilk_fbc_funcs = { @@ -819,7 +817,7 @@ static u64 intel_fbc_stolen_end(struct intel_display *display) * underruns, even if that range is not reserved by the BIOS. */ if (display->platform.broadwell || (DISPLAY_VER(display) == 9 && !display->platform.broxton)) - end = i915_gem_stolen_area_size(display->drm) - 8 * 1024 * 1024; + end = intel_parent_stolen_area_size(display) - 8 * 1024 * 1024; else end = U64_MAX; @@ -854,14 +852,14 @@ static int find_compression_limit(struct intel_fbc *fbc, size /= limit; /* Try to over-allocate to reduce reallocations and fragmentation. */ - ret = i915_gem_stolen_insert_node_in_range(fbc->compressed_fb, - size <<= 1, 4096, 0, end); + ret = intel_parent_stolen_insert_node_in_range(display, fbc->compressed_fb, + size <<= 1, 4096, 0, end); if (ret == 0) return limit; for (; limit <= intel_fbc_max_limit(display); limit <<= 1) { - ret = i915_gem_stolen_insert_node_in_range(fbc->compressed_fb, - size >>= 1, 4096, 0, end); + ret = intel_parent_stolen_insert_node_in_range(display, fbc->compressed_fb, + size >>= 1, 4096, 0, end); if (ret == 0) return limit; } @@ -876,12 +874,12 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, int ret; drm_WARN_ON(display->drm, - i915_gem_stolen_node_allocated(fbc->compressed_fb)); + intel_parent_stolen_node_allocated(display, fbc->compressed_fb)); drm_WARN_ON(display->drm, - i915_gem_stolen_node_allocated(fbc->compressed_llb)); + intel_parent_stolen_node_allocated(display, fbc->compressed_llb)); if (DISPLAY_VER(display) < 5 && !display->platform.g4x) { - ret = i915_gem_stolen_insert_node(fbc->compressed_llb, 4096, 4096); + ret = intel_parent_stolen_insert_node(display, fbc->compressed_llb, 4096, 4096); if (ret) goto err; } @@ -897,14 +895,14 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, drm_dbg_kms(display->drm, "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", - i915_gem_stolen_node_size(fbc->compressed_fb), fbc->limit); + intel_parent_stolen_node_size(display, fbc->compressed_fb), fbc->limit); return 0; err_llb: - if (i915_gem_stolen_node_allocated(fbc->compressed_llb)) - i915_gem_stolen_remove_node(fbc->compressed_llb); + if (intel_parent_stolen_node_allocated(display, fbc->compressed_llb)) + intel_parent_stolen_remove_node(display, fbc->compressed_llb); err: - if (i915_gem_stolen_initialized(display->drm)) + if (intel_parent_stolen_initialized(display)) drm_info_once(display->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); return -ENOSPC; @@ -1010,7 +1008,7 @@ static void fbc_sys_cache_enable(const struct intel_fbc *fbc) range = fbc_sys_cache_limit(display) / (64 * 1024); - offset = i915_gem_stolen_node_offset(fbc->compressed_fb) / (4 * 1024); + offset = intel_parent_stolen_node_offset(display, fbc->compressed_fb) / (4 * 1024); cfg = FBC_SYS_CACHE_TAG_USE_RES_SPACE | FBC_SYS_CACHEABLE_RANGE(range) | FBC_SYS_CACHE_START_BASE(offset); @@ -1024,13 +1022,15 @@ static void fbc_sys_cache_enable(const struct intel_fbc *fbc) static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) { + struct intel_display *display = fbc->display; + if (WARN_ON(intel_fbc_hw_is_active(fbc))) return; - if (i915_gem_stolen_node_allocated(fbc->compressed_llb)) - i915_gem_stolen_remove_node(fbc->compressed_llb); - if (i915_gem_stolen_node_allocated(fbc->compressed_fb)) - i915_gem_stolen_remove_node(fbc->compressed_fb); + if (intel_parent_stolen_node_allocated(display, fbc->compressed_llb)) + intel_parent_stolen_remove_node(display, fbc->compressed_llb); + if (intel_parent_stolen_node_allocated(display, fbc->compressed_fb)) + intel_parent_stolen_remove_node(display, fbc->compressed_fb); } void intel_fbc_cleanup(struct intel_display *display) @@ -1043,8 +1043,8 @@ void intel_fbc_cleanup(struct intel_display *display) __intel_fbc_cleanup_cfb(fbc); mutex_unlock(&fbc->lock); - i915_gem_stolen_node_free(fbc->compressed_fb); - i915_gem_stolen_node_free(fbc->compressed_llb); + intel_parent_stolen_node_free(display, fbc->compressed_fb); + intel_parent_stolen_node_free(display, fbc->compressed_llb); kfree(fbc); } @@ -1480,12 +1480,13 @@ static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state) static bool intel_fbc_is_cfb_ok(const struct intel_plane_state *plane_state) { + struct intel_display *display = to_intel_display(plane_state); struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); struct intel_fbc *fbc = plane->fbc; return intel_fbc_min_limit(plane_state) <= fbc->limit && intel_fbc_cfb_size(plane_state) <= fbc->limit * - i915_gem_stolen_node_size(fbc->compressed_fb); + intel_parent_stolen_node_size(display, fbc->compressed_fb); } static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state) @@ -1577,7 +1578,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, if (!fbc) return 0; - if (!i915_gem_stolen_initialized(display->drm)) { + if (!intel_parent_stolen_initialized(display)) { plane_state->no_fbc_reason = "stolen memory not initialised"; return 0; } @@ -2282,10 +2283,10 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display, if (!fbc) return NULL; - fbc->compressed_fb = i915_gem_stolen_node_alloc(display->drm); + fbc->compressed_fb = intel_parent_stolen_node_alloc(display); if (!fbc->compressed_fb) goto err; - fbc->compressed_llb = i915_gem_stolen_node_alloc(display->drm); + fbc->compressed_llb = intel_parent_stolen_node_alloc(display); if (!fbc->compressed_llb) goto err; @@ -2310,8 +2311,8 @@ static struct intel_fbc *intel_fbc_create(struct intel_display *display, return fbc; err: - i915_gem_stolen_node_free(fbc->compressed_llb); - i915_gem_stolen_node_free(fbc->compressed_fb); + intel_parent_stolen_node_free(display, fbc->compressed_llb); + intel_parent_stolen_node_free(display, fbc->compressed_fb); kfree(fbc); return NULL; diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 2ea310cc3509..49cb64ca8c4c 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -79,6 +79,72 @@ void intel_parent_rps_ilk_irq_handler(struct intel_display *display) display->parent->rps->ilk_irq_handler(display->drm); } +int intel_parent_stolen_insert_node_in_range(struct intel_display *display, + struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end) +{ + return display->parent->stolen->insert_node_in_range(node, size, align, start, end); +} + +int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size, + unsigned int align) +{ + return display->parent->stolen->insert_node(node, size, align); +} + +void intel_parent_stolen_remove_node(struct intel_display *display, + struct intel_stolen_node *node) +{ + display->parent->stolen->remove_node(node); +} + +bool intel_parent_stolen_initialized(struct intel_display *display) +{ + return display->parent->stolen->initialized(display->drm); +} + +bool intel_parent_stolen_node_allocated(struct intel_display *display, + const struct intel_stolen_node *node) +{ + return display->parent->stolen->node_allocated(node); +} + +u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node) +{ + return display->parent->stolen->node_offset(node); +} + +u64 intel_parent_stolen_area_address(struct intel_display *display) +{ + return display->parent->stolen->area_address(display->drm); +} + +u64 intel_parent_stolen_area_size(struct intel_display *display) +{ + return display->parent->stolen->area_size(display->drm); +} + +u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node) +{ + return display->parent->stolen->node_address(node); +} + +u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node) +{ + return display->parent->stolen->node_size(node); +} + +struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display) +{ + return display->parent->stolen->node_alloc(display->drm); +} + +void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node) +{ + display->parent->stolen->node_free(node); +} + + bool intel_parent_vgpu_active(struct intel_display *display) { return display->parent->vgpu_active && display->parent->vgpu_active(display->drm); diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 8f91a6f75c53..bc740dfad985 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -9,6 +9,7 @@ struct dma_fence; struct intel_display; struct intel_hdcp_gsc_context; +struct intel_stolen_node; ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, struct intel_hdcp_gsc_context *gsc_context, @@ -27,6 +28,24 @@ void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive); void intel_parent_rps_ilk_irq_handler(struct intel_display *display); +int intel_parent_stolen_insert_node_in_range(struct intel_display *display, + struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end); +int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size, + unsigned int align); +void intel_parent_stolen_remove_node(struct intel_display *display, + struct intel_stolen_node *node); +bool intel_parent_stolen_initialized(struct intel_display *display); +bool intel_parent_stolen_node_allocated(struct intel_display *display, + const struct intel_stolen_node *node); +u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node); +u64 intel_parent_stolen_area_address(struct intel_display *display); +u64 intel_parent_stolen_area_size(struct intel_display *display); +u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node); +u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node); +struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display); +void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node); + bool intel_parent_vgpu_active(struct intel_display *display); bool intel_parent_has_fenced_regions(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c index f859c99f969b..c3e0b8da485c 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c @@ -8,6 +8,7 @@ #include #include +#include #include #include "gem/i915_gem_lmem.h" @@ -64,8 +65,8 @@ static int __i915_gem_stolen_insert_node_in_range(struct drm_i915_private *i915, return ret; } -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned int alignment, u64 start, u64 end) +static int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, + unsigned int alignment, u64 start, u64 end) { return __i915_gem_stolen_insert_node_in_range(node->i915, &node->node, size, alignment, @@ -82,8 +83,8 @@ static int __i915_gem_stolen_insert_node(struct drm_i915_private *i915, U64_MAX); } -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, - unsigned int alignment) +static int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, + unsigned int alignment) { return __i915_gem_stolen_insert_node(node->i915, &node->node, size, alignment); } @@ -96,7 +97,7 @@ static void __i915_gem_stolen_remove_node(struct drm_i915_private *i915, mutex_unlock(&i915->mm.stolen_lock); } -void i915_gem_stolen_remove_node(struct intel_stolen_node *node) +static void i915_gem_stolen_remove_node(struct intel_stolen_node *node) { __i915_gem_stolen_remove_node(node->i915, &node->node); } @@ -1025,50 +1026,50 @@ bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj) return obj->ops == &i915_gem_object_stolen_ops; } -bool i915_gem_stolen_initialized(struct drm_device *drm) +static bool i915_gem_stolen_initialized(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); return drm_mm_initialized(&i915->mm.stolen); } -u64 i915_gem_stolen_area_address(struct drm_device *drm) +static u64 i915_gem_stolen_area_address(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); return i915->dsm.stolen.start; } -u64 i915_gem_stolen_area_size(struct drm_device *drm) +static u64 i915_gem_stolen_area_size(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); return resource_size(&i915->dsm.stolen); } -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node) +static u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) +{ + return node->node.start; +} + +static u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node) { struct drm_i915_private *i915 = node->i915; return i915->dsm.stolen.start + i915_gem_stolen_node_offset(node); } -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node) +static bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node) { return drm_mm_node_allocated(&node->node); } -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) -{ - return node->node.start; -} - -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node) +static u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node) { return node->node.size; } -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) +static struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) { struct drm_i915_private *i915 = to_i915(drm); struct intel_stolen_node *node; @@ -1082,7 +1083,22 @@ struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) return node; } -void i915_gem_stolen_node_free(const struct intel_stolen_node *node) +static void i915_gem_stolen_node_free(const struct intel_stolen_node *node) { kfree(node); } + +const struct intel_display_stolen_interface i915_display_stolen_interface = { + .insert_node_in_range = i915_gem_stolen_insert_node_in_range, + .insert_node = i915_gem_stolen_insert_node, + .remove_node = i915_gem_stolen_remove_node, + .initialized = i915_gem_stolen_initialized, + .node_allocated = i915_gem_stolen_node_allocated, + .node_offset = i915_gem_stolen_node_offset, + .area_address = i915_gem_stolen_area_address, + .area_size = i915_gem_stolen_area_size, + .node_address = i915_gem_stolen_node_address, + .node_size = i915_gem_stolen_node_size, + .node_alloc = i915_gem_stolen_node_alloc, + .node_free = i915_gem_stolen_node_free, +}; diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h index 7b0386002ed4..6db5262046a2 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h @@ -8,17 +8,9 @@ #include -struct drm_device; struct drm_i915_gem_object; struct drm_i915_private; -struct intel_stolen_node; - -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, - unsigned alignment); -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned alignment, u64 start, - u64 end); -void i915_gem_stolen_remove_node(struct intel_stolen_node *node); + struct intel_memory_region * i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, u16 instance); @@ -34,17 +26,6 @@ bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj); #define I915_GEM_STOLEN_BIAS SZ_128K -bool i915_gem_stolen_initialized(struct drm_device *drm); -u64 i915_gem_stolen_area_address(struct drm_device *drm); -u64 i915_gem_stolen_area_size(struct drm_device *drm); - -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node); - -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node); -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node); -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node); - -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm); -void i915_gem_stolen_node_free(const struct intel_stolen_node *node); +extern const struct intel_display_stolen_interface i915_display_stolen_interface; #endif /* __I915_GEM_STOLEN_H__ */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index d98839427ef9..fe84df4eae8f 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -762,6 +762,7 @@ static const struct intel_display_parent_interface parent = { .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, .rps = &i915_display_rps_interface, + .stolen = &i915_display_stolen_interface, .vgpu_active = vgpu_active, .has_fenced_regions = has_fenced_regions, .fence_priority_display = fence_priority_display, diff --git a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h deleted file mode 100644 index 368045a470d1..000000000000 --- a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * Copyright © 2024 Intel Corporation - */ - -#ifndef _I915_GEM_STOLEN_H_ -#define _I915_GEM_STOLEN_H_ - -#include - -struct drm_device; -struct intel_stolen_node; - -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned int align, u64 start, u64 end); - -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, - unsigned int align); - -void i915_gem_stolen_remove_node(struct intel_stolen_node *node); - -bool i915_gem_stolen_initialized(struct drm_device *drm); - -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node); - -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node); - -u64 i915_gem_stolen_area_address(struct drm_device *drm); - -u64 i915_gem_stolen_area_size(struct drm_device *drm); - -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node); - -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node); - -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm); - -void i915_gem_stolen_node_free(const struct intel_stolen_node *node); - -#endif diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index 9d2aa69ea428..9fb5c2f3ddd8 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -36,8 +36,9 @@ #include "intel_opregion.h" #include "skl_watermark.h" #include "xe_display_rpm.h" -#include "xe_module.h" #include "xe_hdcp_gsc.h" +#include "xe_module.h" +#include "xe_stolen.h" /* Ensure drm and display members are placed properly. */ INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display); @@ -538,6 +539,7 @@ static const struct intel_display_parent_interface parent = { .hdcp = &xe_display_hdcp_interface, .rpm = &xe_display_rpm_interface, .irq = &xe_display_irq_interface, + .stolen = &xe_display_stolen_interface, }; /** diff --git a/drivers/gpu/drm/xe/display/xe_stolen.c b/drivers/gpu/drm/xe/display/xe_stolen.c index 387506586288..cc7aec7db76c 100644 --- a/drivers/gpu/drm/xe/display/xe_stolen.c +++ b/drivers/gpu/drm/xe/display/xe_stolen.c @@ -1,8 +1,10 @@ // SPDX-License-Identifier: MIT /* Copyright © 2025 Intel Corporation */ -#include "gem/i915_gem_stolen.h" +#include + #include "xe_res_cursor.h" +#include "xe_stolen.h" #include "xe_ttm_stolen_mgr.h" #include "xe_validation.h" @@ -11,8 +13,8 @@ struct intel_stolen_node { struct xe_bo *bo; }; -int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, - unsigned int align, u64 start, u64 end) +static int xe_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end) { struct xe_device *xe = node->xe; @@ -41,7 +43,7 @@ int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 siz return err; } -int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align) +static int xe_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align) { /* Not used on xe */ WARN_ON(1); @@ -49,25 +51,25 @@ int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsign return -ENODEV; } -void i915_gem_stolen_remove_node(struct intel_stolen_node *node) +static void xe_stolen_remove_node(struct intel_stolen_node *node) { xe_bo_unpin_map_no_vm(node->bo); node->bo = NULL; } -bool i915_gem_stolen_initialized(struct drm_device *drm) +static bool xe_stolen_initialized(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); return ttm_manager_type(&xe->ttm, XE_PL_STOLEN); } -bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node) +static bool xe_stolen_node_allocated(const struct intel_stolen_node *node) { return node->bo; } -u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) +static u64 xe_stolen_node_offset(const struct intel_stolen_node *node) { struct xe_res_cursor res; @@ -76,7 +78,7 @@ u64 i915_gem_stolen_node_offset(const struct intel_stolen_node *node) } /* Used for < gen4. These are not supported by Xe */ -u64 i915_gem_stolen_area_address(struct drm_device *drm) +static u64 xe_stolen_area_address(struct drm_device *drm) { WARN_ON(1); @@ -84,26 +86,26 @@ u64 i915_gem_stolen_area_address(struct drm_device *drm) } /* Used for gen9 specific WA. Gen9 is not supported by Xe */ -u64 i915_gem_stolen_area_size(struct drm_device *drm) +static u64 xe_stolen_area_size(struct drm_device *drm) { WARN_ON(1); return 0; } -u64 i915_gem_stolen_node_address(const struct intel_stolen_node *node) +static u64 xe_stolen_node_address(const struct intel_stolen_node *node) { struct xe_device *xe = node->xe; - return xe_ttm_stolen_gpu_offset(xe) + i915_gem_stolen_node_offset(node); + return xe_ttm_stolen_gpu_offset(xe) + xe_stolen_node_offset(node); } -u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node) +static u64 xe_stolen_node_size(const struct intel_stolen_node *node) { return node->bo->ttm.base.size; } -struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) +static struct intel_stolen_node *xe_stolen_node_alloc(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); struct intel_stolen_node *node; @@ -117,7 +119,22 @@ struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm) return node; } -void i915_gem_stolen_node_free(const struct intel_stolen_node *node) +static void xe_stolen_node_free(const struct intel_stolen_node *node) { kfree(node); } + +const struct intel_display_stolen_interface xe_display_stolen_interface = { + .insert_node_in_range = xe_stolen_insert_node_in_range, + .insert_node = xe_stolen_insert_node, + .remove_node = xe_stolen_remove_node, + .initialized = xe_stolen_initialized, + .node_allocated = xe_stolen_node_allocated, + .node_offset = xe_stolen_node_offset, + .area_address = xe_stolen_area_address, + .area_size = xe_stolen_area_size, + .node_address = xe_stolen_node_address, + .node_size = xe_stolen_node_size, + .node_alloc = xe_stolen_node_alloc, + .node_free = xe_stolen_node_free, +}; diff --git a/drivers/gpu/drm/xe/display/xe_stolen.h b/drivers/gpu/drm/xe/display/xe_stolen.h new file mode 100644 index 000000000000..db86b9e01242 --- /dev/null +++ b/drivers/gpu/drm/xe/display/xe_stolen.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __XE_STOLEN_H__ +#define __XE_STOLEN_H__ + +extern const struct intel_display_stolen_interface xe_display_stolen_interface; + +#endif diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 61d1b22adc83..f590e846464d 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -9,6 +9,7 @@ struct dma_fence; struct drm_device; struct intel_hdcp_gsc_context; +struct intel_stolen_node; struct ref_tracker; struct intel_display_rpm_interface { @@ -47,6 +48,22 @@ struct intel_display_rps_interface { void (*ilk_irq_handler)(struct drm_device *drm); }; +struct intel_display_stolen_interface { + int (*insert_node_in_range)(struct intel_stolen_node *node, u64 size, + unsigned int align, u64 start, u64 end); + int (*insert_node)(struct intel_stolen_node *node, u64 size, unsigned int align); + void (*remove_node)(struct intel_stolen_node *node); + bool (*initialized)(struct drm_device *drm); + bool (*node_allocated)(const struct intel_stolen_node *node); + u64 (*node_offset)(const struct intel_stolen_node *node); + u64 (*area_address)(struct drm_device *drm); + u64 (*area_size)(struct drm_device *drm); + u64 (*node_address)(const struct intel_stolen_node *node); + u64 (*node_size)(const struct intel_stolen_node *node); + struct intel_stolen_node *(*node_alloc)(struct drm_device *drm); + void (*node_free)(const struct intel_stolen_node *node); +}; + /** * struct intel_display_parent_interface - services parent driver provides to display * @@ -72,6 +89,9 @@ struct intel_display_parent_interface { /** @rpm: RPS interface. Optional. */ const struct intel_display_rps_interface *rps; + /** @stolen: Stolen memory. */ + const struct intel_display_stolen_interface *stolen; + /** @vgpu_active: Is vGPU active? Optional. */ bool (*vgpu_active)(struct drm_device *drm); -- cgit v1.2.3 From 0c085485a90351bb38dc97c2df99ac2038d0d87c Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Fri, 5 Dec 2025 12:30:30 +0200 Subject: drm/{i915, xe}/stolen: make insert_node, area_address, area_size optional Since the stolen memory hooks are function pointers, make some of them optional instead of having to define them for xe. insert_node, area_address, and area_size are only needed on platforms not supported by xe. Reviewed-by: Vinod Govindapillai Link: https://patch.msgid.link/0dbb460e8bd1df29df98862d08fcdfda03912673.1764930576.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_parent.c | 10 ++++++++++ drivers/gpu/drm/xe/display/xe_stolen.c | 27 --------------------------- include/drm/intel/display_parent_interface.h | 6 +++--- 3 files changed, 13 insertions(+), 30 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 49cb64ca8c4c..d16163007545 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -17,6 +17,7 @@ * function pointer interface. */ +#include #include #include "intel_display_core.h" @@ -89,6 +90,9 @@ int intel_parent_stolen_insert_node_in_range(struct intel_display *display, int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size, unsigned int align) { + if (drm_WARN_ON_ONCE(display->drm, !display->parent->stolen->insert_node)) + return -ENODEV; + return display->parent->stolen->insert_node(node, size, align); } @@ -116,11 +120,17 @@ u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_ u64 intel_parent_stolen_area_address(struct intel_display *display) { + if (drm_WARN_ON_ONCE(display->drm, !display->parent->stolen->area_address)) + return 0; + return display->parent->stolen->area_address(display->drm); } u64 intel_parent_stolen_area_size(struct intel_display *display) { + if (drm_WARN_ON_ONCE(display->drm, !display->parent->stolen->area_size)) + return 0; + return display->parent->stolen->area_size(display->drm); } diff --git a/drivers/gpu/drm/xe/display/xe_stolen.c b/drivers/gpu/drm/xe/display/xe_stolen.c index cc7aec7db76c..12771709183a 100644 --- a/drivers/gpu/drm/xe/display/xe_stolen.c +++ b/drivers/gpu/drm/xe/display/xe_stolen.c @@ -43,14 +43,6 @@ static int xe_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 si return err; } -static int xe_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align) -{ - /* Not used on xe */ - WARN_ON(1); - - return -ENODEV; -} - static void xe_stolen_remove_node(struct intel_stolen_node *node) { xe_bo_unpin_map_no_vm(node->bo); @@ -77,22 +69,6 @@ static u64 xe_stolen_node_offset(const struct intel_stolen_node *node) return res.start; } -/* Used for < gen4. These are not supported by Xe */ -static u64 xe_stolen_area_address(struct drm_device *drm) -{ - WARN_ON(1); - - return 0; -} - -/* Used for gen9 specific WA. Gen9 is not supported by Xe */ -static u64 xe_stolen_area_size(struct drm_device *drm) -{ - WARN_ON(1); - - return 0; -} - static u64 xe_stolen_node_address(const struct intel_stolen_node *node) { struct xe_device *xe = node->xe; @@ -126,13 +102,10 @@ static void xe_stolen_node_free(const struct intel_stolen_node *node) const struct intel_display_stolen_interface xe_display_stolen_interface = { .insert_node_in_range = xe_stolen_insert_node_in_range, - .insert_node = xe_stolen_insert_node, .remove_node = xe_stolen_remove_node, .initialized = xe_stolen_initialized, .node_allocated = xe_stolen_node_allocated, .node_offset = xe_stolen_node_offset, - .area_address = xe_stolen_area_address, - .area_size = xe_stolen_area_size, .node_address = xe_stolen_node_address, .node_size = xe_stolen_node_size, .node_alloc = xe_stolen_node_alloc, diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index f590e846464d..cc13b2ce1324 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -51,13 +51,13 @@ struct intel_display_rps_interface { struct intel_display_stolen_interface { int (*insert_node_in_range)(struct intel_stolen_node *node, u64 size, unsigned int align, u64 start, u64 end); - int (*insert_node)(struct intel_stolen_node *node, u64 size, unsigned int align); + int (*insert_node)(struct intel_stolen_node *node, u64 size, unsigned int align); /* Optional */ void (*remove_node)(struct intel_stolen_node *node); bool (*initialized)(struct drm_device *drm); bool (*node_allocated)(const struct intel_stolen_node *node); u64 (*node_offset)(const struct intel_stolen_node *node); - u64 (*area_address)(struct drm_device *drm); - u64 (*area_size)(struct drm_device *drm); + u64 (*area_address)(struct drm_device *drm); /* Optional */ + u64 (*area_size)(struct drm_device *drm); /* Optional */ u64 (*node_address)(const struct intel_stolen_node *node); u64 (*node_size)(const struct intel_stolen_node *node); struct intel_stolen_node *(*node_alloc)(struct drm_device *drm); -- cgit v1.2.3 From 6a99e91a6ca8fec5882450128fb128265f86b32a Mon Sep 17 00:00:00 2001 From: Tvrtko Ursulin Date: Tue, 9 Dec 2025 13:00:34 +0100 Subject: drm/i915/display: Detect AuxCCS support via display parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Whether AuxCCS can be properly supported depends on the support both from the display side and non-display side of the driver. Let us therefore allow for the non-display part to be queried via the display parent interface. The new interface replaces the HAS_AUX_CCS macro and we also remove the FIXME from skl_universal_plane_create since now the xe will not advertise the AuxCCS caps to start with so they do not need to be removed after enumeration. Also, by removing this build specific FIXME we come a step closer to fully de-coupling display and non-display. The existing HAS_AUX_CCS gets renamed to HAS_AUX_DIST since it is still required for determining the need for PLANE_AUX_DIST programming. Signed-off-by: Tvrtko Ursulin References: cf48bddd31de ("drm/i915/display: Disable AuxCCS framebuffers if built for Xe") Cc: intel-gfx@lists.freedesktop.org Cc: intel-xe@lists.freedesktop.org Cc: Jani Nikula Cc: José Roberto de Souza Cc: Juha-Pekka Heikkila Cc: Rodrigo Vivi Cc: Ville Syrjälä Acked-by: Jani Nikula # v1 Reviewed-by: Jani Nikula Signed-off-by: Tvrtko Ursulin Link: https://lore.kernel.org/r/20251209120034.9143-1-tursulin@igalia.com --- drivers/gpu/drm/i915/display/intel_display_device.h | 2 +- drivers/gpu/drm/i915/display/intel_fb.c | 3 ++- drivers/gpu/drm/i915/display/intel_parent.c | 5 +++++ drivers/gpu/drm/i915/display/intel_parent.h | 2 ++ drivers/gpu/drm/i915/display/skl_universal_plane.c | 9 ++------- drivers/gpu/drm/i915/i915_driver.c | 10 ++++++++++ include/drm/intel/display_parent_interface.h | 3 +++ 7 files changed, 25 insertions(+), 9 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h index 11c2b2883f35..50b2e9ae2c18 100644 --- a/drivers/gpu/drm/i915/display/intel_display_device.h +++ b/drivers/gpu/drm/i915/display/intel_display_device.h @@ -149,7 +149,7 @@ struct intel_display_platforms { #define HAS_4TILE(__display) ((__display)->platform.dg2 || DISPLAY_VER(__display) >= 14) #define HAS_ASYNC_FLIPS(__display) (DISPLAY_VER(__display) >= 5) #define HAS_AS_SDP(__display) (DISPLAY_VER(__display) >= 13) -#define HAS_AUX_CCS(__display) (IS_DISPLAY_VER(__display, 9, 12) || (__display)->platform.alderlake_p || (__display)->platform.meteorlake) +#define HAS_AUX_DIST(__display) (IS_DISPLAY_VER(__display, 9, 12) || (__display)->platform.alderlake_p || (__display)->platform.meteorlake) #define HAS_BIGJOINER(__display) (DISPLAY_VER(__display) >= 11 && HAS_DSC(__display)) #define HAS_CASF(__display) (DISPLAY_VER(__display) >= 20) #define HAS_CDCLK_CRAWL(__display) (DISPLAY_INFO(__display)->has_cdclk_crawl) diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index b34b4961fe1c..5b8e02ca2faf 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -21,6 +21,7 @@ #include "intel_fb_bo.h" #include "intel_frontbuffer.h" #include "intel_panic.h" +#include "intel_parent.h" #include "intel_plane.h" #define check_array_bounds(display, a, i) drm_WARN_ON((display)->drm, (i) >= ARRAY_SIZE(a)) @@ -558,7 +559,7 @@ static bool plane_has_modifier(struct intel_display *display, * where supported. */ if (intel_fb_is_ccs_modifier(md->modifier) && - HAS_AUX_CCS(display) != !!md->ccs.packed_aux_planes) + intel_parent_has_auxccs(display) != !!md->ccs.packed_aux_planes) return false; if (md->modifier == I915_FORMAT_MOD_4_TILED_BMG_CCS && diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index d16163007545..1d7bee7d2ccd 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -170,3 +170,8 @@ void intel_parent_fence_priority_display(struct intel_display *display, struct d if (display->parent->fence_priority_display) display->parent->fence_priority_display(fence); } + +bool intel_parent_has_auxccs(struct intel_display *display) +{ + return display->parent->has_auxccs && display->parent->has_auxccs(display->drm); +} diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index bc740dfad985..1bb584d850e5 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -52,4 +52,6 @@ bool intel_parent_has_fenced_regions(struct intel_display *display); void intel_parent_fence_priority_display(struct intel_display *display, struct dma_fence *fence); +bool intel_parent_has_auxccs(struct intel_display *display); + #endif /* __INTEL_PARENT_H__ */ diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c index 6cd94f400e3f..40148d225410 100644 --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c @@ -22,6 +22,7 @@ #include "intel_fbc.h" #include "intel_frontbuffer.h" #include "intel_panic.h" +#include "intel_parent.h" #include "intel_plane.h" #include "intel_psr.h" #include "intel_psr_regs.h" @@ -1602,7 +1603,7 @@ icl_plane_update_noarm(struct intel_dsb *dsb, } /* FLAT CCS doesn't need to program AUX_DIST */ - if (HAS_AUX_CCS(display)) + if (HAS_AUX_DIST(display)) intel_de_write_dsb(display, dsb, PLANE_AUX_DIST(pipe, plane_id), skl_plane_aux_dist(plane_state, color_plane)); @@ -2972,12 +2973,6 @@ skl_universal_plane_create(struct intel_display *display, else caps = skl_plane_caps(display, pipe, plane_id); - /* FIXME: xe has problems with AUX */ - if (!IS_ENABLED(I915) && HAS_AUX_CCS(display)) - caps &= ~(INTEL_PLANE_CAP_CCS_RC | - INTEL_PLANE_CAP_CCS_RC_CC | - INTEL_PLANE_CAP_CCS_MC); - modifiers = intel_fb_plane_get_modifiers(display, caps); ret = drm_universal_plane_init(display->drm, &plane->base, diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index fe84df4eae8f..0300a1df8bd2 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -757,6 +757,15 @@ static void fence_priority_display(struct dma_fence *fence) i915_gem_fence_wait_priority_display(fence); } +static bool has_auxccs(struct drm_device *drm) +{ + struct drm_i915_private *i915 = to_i915(drm); + + return IS_GRAPHICS_VER(i915, 9, 12) || + IS_ALDERLAKE_P(i915) || + IS_METEORLAKE(i915); +} + static const struct intel_display_parent_interface parent = { .hdcp = &i915_display_hdcp_interface, .rpm = &i915_display_rpm_interface, @@ -766,6 +775,7 @@ static const struct intel_display_parent_interface parent = { .vgpu_active = vgpu_active, .has_fenced_regions = has_fenced_regions, .fence_priority_display = fence_priority_display, + .has_auxccs = has_auxccs, }; const struct intel_display_parent_interface *i915_driver_parent_interface(void) diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index cc13b2ce1324..9733c508ad4c 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -100,6 +100,9 @@ struct intel_display_parent_interface { /** @fence_priority_display: Set display priority. Optional. */ void (*fence_priority_display)(struct dma_fence *fence); + + /** @has_auxcss: Are AuxCCS formats supported by the parent. Optional. */ + bool (*has_auxccs)(struct drm_device *drm); }; #endif -- cgit v1.2.3 From 63c7f93b6033800e9bc4eca02949dc9d12553138 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Thu, 11 Dec 2025 19:37:12 +0200 Subject: drm/{i915, xe}/panic: move panic handling to parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the panic handling to the display parent interface, making display more independent of i915 and xe driver implementations. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/e27eca5424479e8936b786018d0af19a34f839f6.1765474612.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/i9xx_plane.c | 1 - drivers/gpu/drm/i915/display/intel_fb.c | 3 +-- drivers/gpu/drm/i915/display/intel_panic.h | 14 -------------- drivers/gpu/drm/i915/display/intel_parent.c | 15 +++++++++++++++ drivers/gpu/drm/i915/display/intel_parent.h | 6 ++++++ drivers/gpu/drm/i915/display/intel_plane.c | 5 ++--- drivers/gpu/drm/i915/display/skl_universal_plane.c | 1 - drivers/gpu/drm/i915/i915_driver.c | 2 ++ drivers/gpu/drm/i915/i915_panic.c | 16 ++++++++++++---- drivers/gpu/drm/i915/i915_panic.h | 9 +++++++++ drivers/gpu/drm/xe/display/xe_display.c | 2 ++ drivers/gpu/drm/xe/display/xe_panic.c | 16 +++++++++------- drivers/gpu/drm/xe/display/xe_panic.h | 9 +++++++++ include/drm/intel/display_parent_interface.h | 11 +++++++++++ 14 files changed, 78 insertions(+), 32 deletions(-) delete mode 100644 drivers/gpu/drm/i915/display/intel_panic.h create mode 100644 drivers/gpu/drm/i915/i915_panic.h create mode 100644 drivers/gpu/drm/xe/display/xe_panic.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c b/drivers/gpu/drm/i915/display/i9xx_plane.c index 45730ae05591..b1fecf178906 100644 --- a/drivers/gpu/drm/i915/display/i9xx_plane.c +++ b/drivers/gpu/drm/i915/display/i9xx_plane.c @@ -22,7 +22,6 @@ #include "intel_fb.h" #include "intel_fbc.h" #include "intel_frontbuffer.h" -#include "intel_panic.h" #include "intel_plane.h" #include "intel_sprite.h" diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index 5b8e02ca2faf..b9bd9b6dfe94 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -20,7 +20,6 @@ #include "intel_fb.h" #include "intel_fb_bo.h" #include "intel_frontbuffer.h" -#include "intel_panic.h" #include "intel_parent.h" #include "intel_plane.h" @@ -2217,7 +2216,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb, int ret; int i; - intel_fb->panic = intel_panic_alloc(); + intel_fb->panic = intel_parent_panic_alloc(display); if (!intel_fb->panic) return -ENOMEM; diff --git a/drivers/gpu/drm/i915/display/intel_panic.h b/drivers/gpu/drm/i915/display/intel_panic.h deleted file mode 100644 index afb472e924aa..000000000000 --- a/drivers/gpu/drm/i915/display/intel_panic.h +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* Copyright © 2025 Intel Corporation */ - -#ifndef __INTEL_PANIC_H__ -#define __INTEL_PANIC_H__ - -struct drm_scanout_buffer; -struct intel_panic; - -struct intel_panic *intel_panic_alloc(void); -int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb); -void intel_panic_finish(struct intel_panic *panic); - -#endif /* __INTEL_PANIC_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 1d7bee7d2ccd..d1c2194767e7 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -47,6 +47,21 @@ void intel_parent_hdcp_gsc_context_free(struct intel_display *display, display->parent->hdcp->gsc_context_free(gsc_context); } +struct intel_panic *intel_parent_panic_alloc(struct intel_display *display) +{ + return display->parent->panic->alloc(); +} + +int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb) +{ + return display->parent->panic->setup(panic, sb); +} + +void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic) +{ + display->parent->panic->finish(panic); +} + bool intel_parent_irq_enabled(struct intel_display *display) { return display->parent->irq->enabled(display->drm); diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 1bb584d850e5..8cd811d14fb1 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -7,8 +7,10 @@ #include struct dma_fence; +struct drm_scanout_buffer; struct intel_display; struct intel_hdcp_gsc_context; +struct intel_panic; struct intel_stolen_node; ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, @@ -23,6 +25,10 @@ void intel_parent_hdcp_gsc_context_free(struct intel_display *display, bool intel_parent_irq_enabled(struct intel_display *display); void intel_parent_irq_synchronize(struct intel_display *display); +struct intel_panic *intel_parent_panic_alloc(struct intel_display *display); +int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb); +void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic); + bool intel_parent_rps_available(struct intel_display *display); void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct dma_fence *fence); void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive); diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c index ca9449589161..3dc2ed52147f 100644 --- a/drivers/gpu/drm/i915/display/intel_plane.c +++ b/drivers/gpu/drm/i915/display/intel_plane.c @@ -55,7 +55,6 @@ #include "intel_fb.h" #include "intel_fb_pin.h" #include "intel_fbdev.h" -#include "intel_panic.h" #include "intel_parent.h" #include "intel_plane.h" #include "intel_psr.h" @@ -1344,7 +1343,7 @@ static void intel_panic_flush(struct drm_plane *_plane) const struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); const struct intel_framebuffer *fb = to_intel_framebuffer(plane_state->hw.fb); - intel_panic_finish(fb->panic); + intel_parent_panic_finish(display, fb->panic); if (crtc_state->enable_psr2_sel_fetch) { /* Force a full update for psr2 */ @@ -1425,7 +1424,7 @@ static int intel_get_scanout_buffer(struct drm_plane *plane, return -EOPNOTSUPP; } sb->private = fb; - ret = intel_panic_setup(fb->panic, sb); + ret = intel_parent_panic_setup(display, fb->panic, sb); if (ret) return ret; } diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c index 40148d225410..b3d41705448a 100644 --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c @@ -21,7 +21,6 @@ #include "intel_fb.h" #include "intel_fbc.h" #include "intel_frontbuffer.h" -#include "intel_panic.h" #include "intel_parent.h" #include "intel_plane.h" #include "intel_psr.h" diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 0300a1df8bd2..a341e2d46551 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -102,6 +102,7 @@ #include "i915_ioctl.h" #include "i915_irq.h" #include "i915_memcpy.h" +#include "i915_panic.h" #include "i915_perf.h" #include "i915_query.h" #include "i915_reg.h" @@ -768,6 +769,7 @@ static bool has_auxccs(struct drm_device *drm) static const struct intel_display_parent_interface parent = { .hdcp = &i915_display_hdcp_interface, + .panic = &i915_display_panic_interface, .rpm = &i915_display_rpm_interface, .irq = &i915_display_irq_interface, .rps = &i915_display_rps_interface, diff --git a/drivers/gpu/drm/i915/i915_panic.c b/drivers/gpu/drm/i915/i915_panic.c index 028ff83b2519..728be077e8e8 100644 --- a/drivers/gpu/drm/i915/i915_panic.c +++ b/drivers/gpu/drm/i915/i915_panic.c @@ -2,18 +2,20 @@ /* Copyright © 2025 Intel Corporation */ #include +#include #include "display/intel_display_types.h" #include "display/intel_fb.h" -#include "display/intel_panic.h" #include "gem/i915_gem_object.h" -struct intel_panic *intel_panic_alloc(void) +#include "i915_panic.h" + +static struct intel_panic *intel_panic_alloc(void) { return i915_gem_object_alloc_panic(); } -int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb) +static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb) { struct intel_framebuffer *fb = sb->private; struct drm_gem_object *obj = intel_fb_bo(&fb->base); @@ -21,7 +23,13 @@ int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb) return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling); } -void intel_panic_finish(struct intel_panic *panic) +static void intel_panic_finish(struct intel_panic *panic) { return i915_gem_object_panic_finish(panic); } + +const struct intel_display_panic_interface i915_display_panic_interface = { + .alloc = intel_panic_alloc, + .setup = intel_panic_setup, + .finish = intel_panic_finish, +}; diff --git a/drivers/gpu/drm/i915/i915_panic.h b/drivers/gpu/drm/i915/i915_panic.h new file mode 100644 index 000000000000..743d8c861c42 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_panic.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __I915_PANIC_H__ +#define __I915_PANIC_H__ + +extern const struct intel_display_panic_interface i915_display_panic_interface; + +#endif /* __I915_PANIC_H__ */ diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index 9fb5c2f3ddd8..56796cedbd06 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -38,6 +38,7 @@ #include "xe_display_rpm.h" #include "xe_hdcp_gsc.h" #include "xe_module.h" +#include "xe_panic.h" #include "xe_stolen.h" /* Ensure drm and display members are placed properly. */ @@ -537,6 +538,7 @@ static const struct intel_display_irq_interface xe_display_irq_interface = { static const struct intel_display_parent_interface parent = { .hdcp = &xe_display_hdcp_interface, + .panic = &xe_display_panic_interface, .rpm = &xe_display_rpm_interface, .irq = &xe_display_irq_interface, .stolen = &xe_display_stolen_interface, diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c index df663286092a..e078494dc8ba 100644 --- a/drivers/gpu/drm/xe/display/xe_panic.c +++ b/drivers/gpu/drm/xe/display/xe_panic.c @@ -3,11 +3,12 @@ #include #include +#include #include "intel_display_types.h" #include "intel_fb.h" -#include "intel_panic.h" #include "xe_bo.h" +#include "xe_panic.h" #include "xe_res_cursor.h" struct intel_panic { @@ -74,7 +75,7 @@ static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int iosys_map_wr(&panic->vmap, offset, u32, color); } -struct intel_panic *intel_panic_alloc(void) +static struct intel_panic *xe_panic_alloc(void) { struct intel_panic *panic; @@ -83,7 +84,7 @@ struct intel_panic *intel_panic_alloc(void) return panic; } -int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb) +static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb) { struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private; struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base)); @@ -96,7 +97,8 @@ int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb) return 0; } -void intel_panic_finish(struct intel_panic *panic) -{ - xe_panic_kunmap(panic); -} +const struct intel_display_panic_interface xe_display_panic_interface = { + .alloc = xe_panic_alloc, + .setup = xe_panic_setup, + .finish = xe_panic_kunmap, +}; diff --git a/drivers/gpu/drm/xe/display/xe_panic.h b/drivers/gpu/drm/xe/display/xe_panic.h new file mode 100644 index 000000000000..3054b511011b --- /dev/null +++ b/drivers/gpu/drm/xe/display/xe_panic.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __XE_PANIC_H__ +#define __XE_PANIC_H__ + +extern const struct intel_display_panic_interface xe_display_panic_interface; + +#endif diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 9733c508ad4c..477ee9e735f9 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -8,7 +8,9 @@ struct dma_fence; struct drm_device; +struct drm_scanout_buffer; struct intel_hdcp_gsc_context; +struct intel_panic; struct intel_stolen_node; struct ref_tracker; @@ -42,6 +44,12 @@ struct intel_display_irq_interface { void (*synchronize)(struct drm_device *drm); }; +struct intel_display_panic_interface { + struct intel_panic *(*alloc)(void); + int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb); + void (*finish)(struct intel_panic *panic); +}; + struct intel_display_rps_interface { void (*boost_if_not_started)(struct dma_fence *fence); void (*mark_interactive)(struct drm_device *drm, bool interactive); @@ -86,6 +94,9 @@ struct intel_display_parent_interface { /** @irq: IRQ interface */ const struct intel_display_irq_interface *irq; + /** @panic: Panic interface */ + const struct intel_display_panic_interface *panic; + /** @rpm: RPS interface. Optional. */ const struct intel_display_rps_interface *rps; -- cgit v1.2.3 From 4e899d9b4ea7798debb0c24e201a27fe2694d222 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Fri, 12 Dec 2025 16:14:04 +0200 Subject: drm/intel: fix parent interface kernel-doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix some typos in the kernel-doc. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/b293e25aa00418908e67576e8adcab325319705a.1765548786.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- include/drm/intel/display_parent_interface.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 477ee9e735f9..87e26ee0ecbf 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -97,7 +97,7 @@ struct intel_display_parent_interface { /** @panic: Panic interface */ const struct intel_display_panic_interface *panic; - /** @rpm: RPS interface. Optional. */ + /** @rps: RPS interface. Optional. */ const struct intel_display_rps_interface *rps; /** @stolen: Stolen memory. */ @@ -112,7 +112,7 @@ struct intel_display_parent_interface { /** @fence_priority_display: Set display priority. Optional. */ void (*fence_priority_display)(struct dma_fence *fence); - /** @has_auxcss: Are AuxCCS formats supported by the parent. Optional. */ + /** @has_auxccs: Are AuxCCS formats supported by the parent. Optional. */ bool (*has_auxccs)(struct drm_device *drm); }; -- cgit v1.2.3 From 8c88104ac6b8bdf5099a22165ff79348f84a0d77 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Fri, 12 Dec 2025 16:14:05 +0200 Subject: drm/intel: group individual funcs in parent interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are a handful of function pointers that don't really warrant a dedicated sub-struct for the functionality. Group all of them together in a single anonymous sub-struct. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/4305b09a93ce2c8ca83bf1fbb3cc7ef5a29d1567.1765548786.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- include/drm/intel/display_parent_interface.h | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'include') diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 87e26ee0ecbf..5d4b9dc837d9 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -103,17 +103,20 @@ struct intel_display_parent_interface { /** @stolen: Stolen memory. */ const struct intel_display_stolen_interface *stolen; - /** @vgpu_active: Is vGPU active? Optional. */ - bool (*vgpu_active)(struct drm_device *drm); + /* Generic independent functions */ + struct { + /** @vgpu_active: Is vGPU active? Optional. */ + bool (*vgpu_active)(struct drm_device *drm); - /** @has_fenced_regions: Support legacy fencing? Optional. */ - bool (*has_fenced_regions)(struct drm_device *drm); + /** @has_fenced_regions: Support legacy fencing? Optional. */ + bool (*has_fenced_regions)(struct drm_device *drm); - /** @fence_priority_display: Set display priority. Optional. */ - void (*fence_priority_display)(struct dma_fence *fence); + /** @fence_priority_display: Set display priority. Optional. */ + void (*fence_priority_display)(struct dma_fence *fence); - /** @has_auxccs: Are AuxCCS formats supported by the parent. Optional. */ - bool (*has_auxccs)(struct drm_device *drm); + /** @has_auxccs: Are AuxCCS formats supported by the parent. Optional. */ + bool (*has_auxccs)(struct drm_device *drm); + }; }; #endif -- cgit v1.2.3 From 07d46ada28813393af461d9b739995d00368b93b Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Fri, 12 Dec 2025 16:14:06 +0200 Subject: drm/intel: sort parent interface struct definitions and members MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sort the parent interface struct definitions and members to improve clarity on where to add new stuff. Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/7f2e45d030e78928ebc8cf0a6d0fb47a3aa13c48.1765548786.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- include/drm/intel/display_parent_interface.h | 50 +++++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) (limited to 'include') diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 5d4b9dc837d9..55d4df714645 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -14,21 +14,7 @@ struct intel_panic; struct intel_stolen_node; struct ref_tracker; -struct intel_display_rpm_interface { - struct ref_tracker *(*get)(const struct drm_device *drm); - struct ref_tracker *(*get_raw)(const struct drm_device *drm); - struct ref_tracker *(*get_if_in_use)(const struct drm_device *drm); - struct ref_tracker *(*get_noresume)(const struct drm_device *drm); - - void (*put)(const struct drm_device *drm, struct ref_tracker *wakeref); - void (*put_raw)(const struct drm_device *drm, struct ref_tracker *wakeref); - void (*put_unchecked)(const struct drm_device *drm); - - bool (*suspended)(const struct drm_device *drm); - void (*assert_held)(const struct drm_device *drm); - void (*assert_block)(const struct drm_device *drm); - void (*assert_unblock)(const struct drm_device *drm); -}; +/* Keep struct definitions sorted */ struct intel_display_hdcp_interface { ssize_t (*gsc_msg_send)(struct intel_hdcp_gsc_context *gsc_context, @@ -50,6 +36,22 @@ struct intel_display_panic_interface { void (*finish)(struct intel_panic *panic); }; +struct intel_display_rpm_interface { + struct ref_tracker *(*get)(const struct drm_device *drm); + struct ref_tracker *(*get_raw)(const struct drm_device *drm); + struct ref_tracker *(*get_if_in_use)(const struct drm_device *drm); + struct ref_tracker *(*get_noresume)(const struct drm_device *drm); + + void (*put)(const struct drm_device *drm, struct ref_tracker *wakeref); + void (*put_raw)(const struct drm_device *drm, struct ref_tracker *wakeref); + void (*put_unchecked)(const struct drm_device *drm); + + bool (*suspended)(const struct drm_device *drm); + void (*assert_held)(const struct drm_device *drm); + void (*assert_block)(const struct drm_device *drm); + void (*assert_unblock)(const struct drm_device *drm); +}; + struct intel_display_rps_interface { void (*boost_if_not_started)(struct dma_fence *fence); void (*mark_interactive)(struct drm_device *drm, bool interactive); @@ -88,15 +90,15 @@ struct intel_display_parent_interface { /** @hdcp: HDCP GSC interface */ const struct intel_display_hdcp_interface *hdcp; - /** @rpm: Runtime PM functions */ - const struct intel_display_rpm_interface *rpm; - /** @irq: IRQ interface */ const struct intel_display_irq_interface *irq; /** @panic: Panic interface */ const struct intel_display_panic_interface *panic; + /** @rpm: Runtime PM functions */ + const struct intel_display_rpm_interface *rpm; + /** @rps: RPS interface. Optional. */ const struct intel_display_rps_interface *rps; @@ -105,17 +107,17 @@ struct intel_display_parent_interface { /* Generic independent functions */ struct { - /** @vgpu_active: Is vGPU active? Optional. */ - bool (*vgpu_active)(struct drm_device *drm); - - /** @has_fenced_regions: Support legacy fencing? Optional. */ - bool (*has_fenced_regions)(struct drm_device *drm); - /** @fence_priority_display: Set display priority. Optional. */ void (*fence_priority_display)(struct dma_fence *fence); /** @has_auxccs: Are AuxCCS formats supported by the parent. Optional. */ bool (*has_auxccs)(struct drm_device *drm); + + /** @has_fenced_regions: Support legacy fencing? Optional. */ + bool (*has_fenced_regions)(struct drm_device *drm); + + /** @vgpu_active: Is vGPU active? Optional. */ + bool (*vgpu_active)(struct drm_device *drm); }; }; -- cgit v1.2.3 From 92a73fec6acdcef3f2da7b2d1d4574308ebbe975 Mon Sep 17 00:00:00 2001 From: Imre Deak Date: Mon, 15 Dec 2025 21:23:42 +0200 Subject: drm/dp: Add drm_dp_dsc_sink_slice_count_mask() A DSC sink supporting DSC slice count N, not necessarily supports slice counts less than N. Hence the driver should check the sink's support for a particular slice count before using that slice count. Add the helper functions required for this. Cc: dri-devel@lists.freedesktop.org Reviewed-by: Luca Coelho Acked-by: Maarten Lankhorst Signed-off-by: Imre Deak Link: https://patch.msgid.link/20251215192357.172201-3-imre.deak@intel.com --- drivers/gpu/drm/display/drm_dp_helper.c | 82 +++++++++++++++++++++++---------- include/drm/display/drm_dp_helper.h | 3 ++ 2 files changed, 61 insertions(+), 24 deletions(-) (limited to 'include') diff --git a/drivers/gpu/drm/display/drm_dp_helper.c b/drivers/gpu/drm/display/drm_dp_helper.c index 19564c1afba6..a697cc227e28 100644 --- a/drivers/gpu/drm/display/drm_dp_helper.c +++ b/drivers/gpu/drm/display/drm_dp_helper.c @@ -2705,56 +2705,90 @@ u8 drm_dp_dsc_sink_bpp_incr(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE]) EXPORT_SYMBOL(drm_dp_dsc_sink_bpp_incr); /** - * drm_dp_dsc_sink_max_slice_count() - Get the max slice count - * supported by the DSC sink. - * @dsc_dpcd: DSC capabilities from DPCD - * @is_edp: true if its eDP, false for DP + * drm_dp_dsc_slice_count_to_mask() - Convert a slice count to a slice count mask + * @slice_count: slice count * - * Read the slice capabilities DPCD register from DSC sink to get - * the maximum slice count supported. This is used to populate - * the DSC parameters in the &struct drm_dsc_config by the driver. - * Driver creates an infoframe using these parameters to populate - * &struct drm_dsc_pps_infoframe. These are sent to the sink using DSC - * infoframe using the helper function drm_dsc_pps_infoframe_pack() + * Convert @slice_count to a slice count mask. + * + * Returns the slice count mask. + */ +u32 drm_dp_dsc_slice_count_to_mask(int slice_count) +{ + return BIT(slice_count - 1); +} +EXPORT_SYMBOL(drm_dp_dsc_slice_count_to_mask); + +/** + * drm_dp_dsc_sink_slice_count_mask() - Get the mask of valid DSC sink slice counts + * @dsc_dpcd: the sink's DSC DPCD capabilities + * @is_edp: %true for an eDP sink + * + * Get the mask of supported slice counts from the sink's DSC DPCD register. * * Returns: - * Maximum slice count supported by DSC sink or 0 its invalid + * Mask of slice counts supported by the DSC sink: + * - > 0: bit#0,1,3,5..,23 set if the sink supports 1,2,4,6..,24 slices + * - 0: if the sink doesn't support any slices */ -u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], - bool is_edp) +u32 drm_dp_dsc_sink_slice_count_mask(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], + bool is_edp) { u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT]; + u32 mask = 0; if (!is_edp) { /* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */ u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT]; if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK) - return 24; + mask |= drm_dp_dsc_slice_count_to_mask(24); if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK) - return 20; + mask |= drm_dp_dsc_slice_count_to_mask(20); if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK) - return 16; + mask |= drm_dp_dsc_slice_count_to_mask(16); } /* DP, eDP v1.5+ */ if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK) - return 12; + mask |= drm_dp_dsc_slice_count_to_mask(12); if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK) - return 10; + mask |= drm_dp_dsc_slice_count_to_mask(10); if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK) - return 8; + mask |= drm_dp_dsc_slice_count_to_mask(8); if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK) - return 6; + mask |= drm_dp_dsc_slice_count_to_mask(6); /* DP, eDP v1.4+ */ if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK) - return 4; + mask |= drm_dp_dsc_slice_count_to_mask(4); if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK) - return 2; + mask |= drm_dp_dsc_slice_count_to_mask(2); if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK) - return 1; + mask |= drm_dp_dsc_slice_count_to_mask(1); - return 0; + return mask; +} +EXPORT_SYMBOL(drm_dp_dsc_sink_slice_count_mask); + +/** + * drm_dp_dsc_sink_max_slice_count() - Get the max slice count + * supported by the DSC sink. + * @dsc_dpcd: DSC capabilities from DPCD + * @is_edp: true if its eDP, false for DP + * + * Read the slice capabilities DPCD register from DSC sink to get + * the maximum slice count supported. This is used to populate + * the DSC parameters in the &struct drm_dsc_config by the driver. + * Driver creates an infoframe using these parameters to populate + * &struct drm_dsc_pps_infoframe. These are sent to the sink using DSC + * infoframe using the helper function drm_dsc_pps_infoframe_pack() + * + * Returns: + * Maximum slice count supported by DSC sink or 0 its invalid + */ +u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], + bool is_edp) +{ + return fls(drm_dp_dsc_sink_slice_count_mask(dsc_dpcd, is_edp)); } EXPORT_SYMBOL(drm_dp_dsc_sink_max_slice_count); diff --git a/include/drm/display/drm_dp_helper.h b/include/drm/display/drm_dp_helper.h index df2f24b950e4..85e868238e28 100644 --- a/include/drm/display/drm_dp_helper.h +++ b/include/drm/display/drm_dp_helper.h @@ -206,6 +206,9 @@ drm_dp_is_branch(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) /* DP/eDP DSC support */ u8 drm_dp_dsc_sink_bpp_incr(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE]); +u32 drm_dp_dsc_slice_count_to_mask(int slice_count); +u32 drm_dp_dsc_sink_slice_count_mask(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], + bool is_edp); u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], bool is_edp); u8 drm_dp_dsc_sink_line_buf_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE]); -- cgit v1.2.3 From 35ec71285c9311395b14bedc60fa94f6b7e24d2d Mon Sep 17 00:00:00 2001 From: Ville Syrjälä Date: Thu, 18 Dec 2025 20:20:52 +0200 Subject: drm/i915/pc8: Add parent interface for PC8 forcewake tricks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We use forcewake to prevent the SoC from actually entering PC8 while performing the PC8 disable sequence. Hide that behind a new parent interface to eliminate the naked forcewake/uncore usage from the display power code. v2: Mark the interface optional and warn if someone calls it when not provided (Jani) Include the header to make sure the extern declaration matches the definition (Jani) v3: Rebase due to shuffling Reviewed-by: Jani Nikula Signed-off-by: Ville Syrjälä Link: https://patch.msgid.link/20251218182052.18756-1-ville.syrjala@linux.intel.com --- drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/display/intel_display_power.c | 8 +++--- drivers/gpu/drm/i915/display/intel_parent.c | 17 ++++++++++++ drivers/gpu/drm/i915/display/intel_parent.h | 4 +++ drivers/gpu/drm/i915/i915_display_pc8.c | 31 ++++++++++++++++++++++ drivers/gpu/drm/i915/i915_display_pc8.h | 9 +++++++ drivers/gpu/drm/i915/i915_driver.c | 2 ++ include/drm/intel/display_parent_interface.h | 8 ++++++ 8 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 drivers/gpu/drm/i915/i915_display_pc8.c create mode 100644 drivers/gpu/drm/i915/i915_display_pc8.h (limited to 'include') diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 13b9e71fa993..801dd155d1f0 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -76,6 +76,7 @@ i915-$(CONFIG_PERF_EVENTS) += \ # core display adaptation i915-y += \ + i915_display_pc8.o \ i915_hdcp_gsc.o \ i915_panic.o diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c index 9f323c39d798..47042a4c3a30 100644 --- a/drivers/gpu/drm/i915/display/intel_display_power.c +++ b/drivers/gpu/drm/i915/display/intel_display_power.c @@ -1339,10 +1339,10 @@ static void hsw_restore_lcpll(struct intel_display *display) return; /* - * Make sure we're not on PC8 state before disabling PC8, otherwise - * we'll hang the machine. To prevent PC8 state, just enable force_wake. + * Make sure we're not on PC8 state before disabling + * PC8, otherwise we'll hang the machine. */ - intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL); + intel_parent_pc8_block(display); if (val & LCPLL_POWER_DOWN_ALLOW) { val &= ~LCPLL_POWER_DOWN_ALLOW; @@ -1372,7 +1372,7 @@ static void hsw_restore_lcpll(struct intel_display *display) "Switching back to LCPLL failed\n"); } - intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL); + intel_parent_pc8_unblock(display); intel_update_cdclk(display); intel_cdclk_dump_config(display, &display->cdclk.hw, "Current CDCLK"); diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index 9b1a84a439e9..72ae553f79a4 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -75,6 +75,23 @@ void intel_parent_panic_finish(struct intel_display *display, struct intel_panic display->parent->panic->finish(panic); } +/* pc8 */ +void intel_parent_pc8_block(struct intel_display *display) +{ + if (drm_WARN_ON_ONCE(display->drm, !display->parent->pc8)) + return; + + display->parent->pc8->block(display->drm); +} + +void intel_parent_pc8_unblock(struct intel_display *display) +{ + if (drm_WARN_ON_ONCE(display->drm, !display->parent->pc8)) + return; + + display->parent->pc8->unblock(display->drm); +} + /* rps */ bool intel_parent_rps_available(struct intel_display *display) { diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index a2a631fba118..47cdc14f9aa2 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -32,6 +32,10 @@ struct intel_panic *intel_parent_panic_alloc(struct intel_display *display); int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb); void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic); +/* pc8 */ +void intel_parent_pc8_block(struct intel_display *display); +void intel_parent_pc8_unblock(struct intel_display *display); + /* rps */ bool intel_parent_rps_available(struct intel_display *display); void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct dma_fence *fence); diff --git a/drivers/gpu/drm/i915/i915_display_pc8.c b/drivers/gpu/drm/i915/i915_display_pc8.c new file mode 100644 index 000000000000..2af5dbab20ef --- /dev/null +++ b/drivers/gpu/drm/i915/i915_display_pc8.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright 2025, Intel Corporation. + */ + +#include +#include + +#include "i915_display_pc8.h" +#include "i915_drv.h" +#include "intel_uncore.h" + +static void i915_display_pc8_block(struct drm_device *drm) +{ + struct intel_uncore *uncore = &to_i915(drm)->uncore; + + /* to prevent PC8 state, just enable force_wake */ + intel_uncore_forcewake_get(uncore, FORCEWAKE_ALL); +} + +static void i915_display_pc8_unblock(struct drm_device *drm) +{ + struct intel_uncore *uncore = &to_i915(drm)->uncore; + + intel_uncore_forcewake_put(uncore, FORCEWAKE_ALL); +} + +const struct intel_display_pc8_interface i915_display_pc8_interface = { + .block = i915_display_pc8_block, + .unblock = i915_display_pc8_unblock, +}; diff --git a/drivers/gpu/drm/i915/i915_display_pc8.h b/drivers/gpu/drm/i915/i915_display_pc8.h new file mode 100644 index 000000000000..717f313d2a21 --- /dev/null +++ b/drivers/gpu/drm/i915/i915_display_pc8.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright © 2025 Intel Corporation */ + +#ifndef __I915_DISPLAY_PC8_H__ +#define __I915_DISPLAY_PC8_H__ + +extern const struct intel_display_pc8_interface i915_display_pc8_interface; + +#endif /* __I915_DISPLAY_PC8_H__ */ diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index 75f503e52e70..e025273e9ab1 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -89,6 +89,7 @@ #include "pxp/intel_pxp_pm.h" #include "i915_debugfs.h" +#include "i915_display_pc8.h" #include "i915_driver.h" #include "i915_drm_client.h" #include "i915_drv.h" @@ -765,6 +766,7 @@ static const struct intel_display_parent_interface parent = { .hdcp = &i915_display_hdcp_interface, .irq = &i915_display_irq_interface, .panic = &i915_display_panic_interface, + .pc8 = &i915_display_pc8_interface, .rpm = &i915_display_rpm_interface, .rps = &i915_display_rps_interface, .stolen = &i915_display_stolen_interface, diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 55d4df714645..10c50b42844e 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -36,6 +36,11 @@ struct intel_display_panic_interface { void (*finish)(struct intel_panic *panic); }; +struct intel_display_pc8_interface { + void (*block)(struct drm_device *drm); + void (*unblock)(struct drm_device *drm); +}; + struct intel_display_rpm_interface { struct ref_tracker *(*get)(const struct drm_device *drm); struct ref_tracker *(*get_raw)(const struct drm_device *drm); @@ -96,6 +101,9 @@ struct intel_display_parent_interface { /** @panic: Panic interface */ const struct intel_display_panic_interface *panic; + /** @pc8: PC8 interface. Optional. */ + const struct intel_display_pc8_interface *pc8; + /** @rpm: Runtime PM functions */ const struct intel_display_rpm_interface *rpm; -- cgit v1.2.3