* [PATCH v2 1/6] drm/{i915, xe}/display: pass parent interface to display probe
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
@ 2025-10-24 9:31 ` Jouni Högander
2025-10-24 12:25 ` [PATCH v2 1/6] drm/{i915,xe}/display: " Jani Nikula
2025-10-24 9:31 ` [PATCH v2 2/6] drm/{i915, xe}/display: Add display runtime pm parent interface Jouni Högander
` (5 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Jouni Högander @ 2025-10-24 9:31 UTC (permalink / raw)
To: intel-gfx, intel-xe
Cc: jani.nikula, Jouni Högander, Lucas De Marchi, Rodrigo Vivi,
Ville Syrjälä
From: Jani Nikula <jani.nikula@intel.com>
Let's gradually start calling i915 and xe parent, or core, drivers from
display via function pointers passed at display probe.
Going forward, the struct intel_display_parent_interface is expected to
include const pointers to sub-structs by functionality, for example:
struct intel_display_rpm {
struct ref_tracker *(*get)(struct drm_device *drm);
/* ... */
};
struct intel_display_parent_interface {
/* ... */
const struct intel_display_rpm *rpm;
};
This is a baby step towards not building display as part of both i915
and xe drivers, but rather making it an independent driver interfacing
with the two.
v2: unrelated include removal dropped
Cc: Jouni Högander <jouni.hogander@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
.../gpu/drm/i915/display/intel_display_core.h | 4 +++
.../drm/i915/display/intel_display_device.c | 5 +++-
.../drm/i915/display/intel_display_device.h | 4 ++-
drivers/gpu/drm/i915/display/intel_fb.c | 1 +
.../drm/i915/display/skl_universal_plane.c | 1 +
drivers/gpu/drm/i915/i915_driver.c | 11 +++++++-
drivers/gpu/drm/i915/i915_driver.h | 2 ++
.../gpu/drm/i915/selftests/mock_gem_device.c | 4 ++-
drivers/gpu/drm/xe/display/xe_display.c | 6 ++++-
include/drm/intel/display_parent_interface.h | 26 +++++++++++++++++++
10 files changed, 59 insertions(+), 5 deletions(-)
create mode 100644 include/drm/intel/display_parent_interface.h
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 32664098b4078..893279be84091 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -41,6 +41,7 @@ struct intel_cdclk_vals;
struct intel_color_funcs;
struct intel_crtc;
struct intel_crtc_state;
+struct intel_display_parent_interface;
struct intel_dmc;
struct intel_dpll_global_funcs;
struct intel_dpll_mgr;
@@ -291,6 +292,9 @@ struct intel_display {
/* Intel PCH: where the south display engine lives */
enum intel_pch pch_type;
+ /* Parent, or core, driver functions exposed to display */
+ const struct intel_display_parent_interface *parent;
+
/* Display functions */
struct {
/* Top level crtc-ish functions */
diff --git a/drivers/gpu/drm/i915/display/intel_display_device.c b/drivers/gpu/drm/i915/display/intel_display_device.c
index f3f1f25b0f383..328447a5e5e8c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_device.c
+++ b/drivers/gpu/drm/i915/display/intel_display_device.c
@@ -1647,7 +1647,8 @@ static void display_platforms_or(struct intel_display_platforms *dst,
bitmap_or(dst->bitmap, dst->bitmap, src->bitmap, display_platforms_num_bits());
}
-struct intel_display *intel_display_device_probe(struct pci_dev *pdev)
+struct intel_display *intel_display_device_probe(struct pci_dev *pdev,
+ const struct intel_display_parent_interface *parent)
{
struct intel_display *display;
const struct intel_display_device_info *info;
@@ -1663,6 +1664,8 @@ struct intel_display *intel_display_device_probe(struct pci_dev *pdev)
/* Add drm device backpointer as early as possible. */
display->drm = pci_get_drvdata(pdev);
+ display->parent = parent;
+
intel_display_params_copy(&display->params);
if (has_no_display(pdev)) {
diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
index 8fdb8a0a42821..a009082e3107b 100644
--- a/drivers/gpu/drm/i915/display/intel_display_device.h
+++ b/drivers/gpu/drm/i915/display/intel_display_device.h
@@ -13,6 +13,7 @@
struct drm_printer;
struct intel_display;
+struct intel_display_parent_interface;
struct pci_dev;
/*
@@ -312,7 +313,8 @@ struct intel_display_device_info {
bool intel_display_device_present(struct intel_display *display);
bool intel_display_device_enabled(struct intel_display *display);
-struct intel_display *intel_display_device_probe(struct pci_dev *pdev);
+struct intel_display *intel_display_device_probe(struct pci_dev *pdev,
+ const struct intel_display_parent_interface *parent);
void intel_display_device_remove(struct intel_display *display);
void intel_display_device_info_runtime_init(struct intel_display *display);
diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c
index 6ade38198f396..f4512fb38a778 100644
--- a/drivers/gpu/drm/i915/display/intel_fb.c
+++ b/drivers/gpu/drm/i915/display/intel_fb.c
@@ -9,6 +9,7 @@
#include <drm/drm_blend.h>
#include <drm/drm_gem.h>
#include <drm/drm_modeset_helper.h>
+#include <drm/intel/display_parent_interface.h>
#include "i915_utils.h"
#include "intel_bo.h"
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
index 765d288cce2b0..c70bde90b9a9e 100644
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
@@ -8,6 +8,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
#include "pxp/intel_pxp.h"
#include "i915_utils.h"
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index e19a08893b998..b295326eb4331 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -47,6 +47,7 @@
#include <drm/drm_managed.h>
#include <drm/drm_probe_helper.h>
#include <drm/intel/display_member.h>
+#include <drm/intel/display_parent_interface.h>
#include "display/i9xx_display_sr.h"
#include "display/intel_bw.h"
@@ -738,6 +739,14 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
"DRM_I915_DEBUG_RUNTIME_PM enabled\n");
}
+static const struct intel_display_parent_interface parent = {
+};
+
+const struct intel_display_parent_interface *i915_driver_parent_interface(void)
+{
+ return &parent;
+}
+
/* Ensure drm and display members are placed properly. */
INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct drm_i915_private, drm, display);
@@ -762,7 +771,7 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
/* Set up device info and initial runtime info. */
intel_device_info_driver_create(i915, pdev->device, match_info);
- display = intel_display_device_probe(pdev);
+ display = intel_display_device_probe(pdev, &parent);
if (IS_ERR(display))
return ERR_CAST(display);
diff --git a/drivers/gpu/drm/i915/i915_driver.h b/drivers/gpu/drm/i915/i915_driver.h
index 1e95ecb2a163f..9551519ab4297 100644
--- a/drivers/gpu/drm/i915/i915_driver.h
+++ b/drivers/gpu/drm/i915/i915_driver.h
@@ -12,6 +12,7 @@ struct pci_dev;
struct pci_device_id;
struct drm_i915_private;
struct drm_printer;
+struct intel_display_parent_interface;
#define DRIVER_NAME "i915"
#define DRIVER_DESC "Intel Graphics"
@@ -24,6 +25,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915);
int i915_driver_resume_switcheroo(struct drm_i915_private *i915);
int i915_driver_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state);
+const struct intel_display_parent_interface *i915_driver_parent_interface(void);
void
i915_print_iommu_status(struct drm_i915_private *i915, struct drm_printer *p);
diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
index fb8751bd5df0a..b59626c4994cb 100644
--- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
+++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
@@ -33,6 +33,7 @@
#include "gt/intel_gt.h"
#include "gt/intel_gt_requests.h"
#include "gt/mock_engine.h"
+#include "i915_driver.h"
#include "intel_memory_region.h"
#include "intel_region_ttm.h"
@@ -183,7 +184,8 @@ struct drm_i915_private *mock_gem_device(void)
/* Set up device info and initial runtime info. */
intel_device_info_driver_create(i915, pdev->device, &mock_info);
- display = intel_display_device_probe(pdev);
+ /* FIXME: Can we run selftests using a mock device without display? */
+ display = intel_display_device_probe(pdev, i915_driver_parent_interface());
if (IS_ERR(display))
goto err_device;
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 5a02754d0610e..0e38c96eb6def 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -14,6 +14,7 @@
#include <drm/drm_managed.h>
#include <drm/drm_probe_helper.h>
#include <drm/intel/display_member.h>
+#include <drm/intel/display_parent_interface.h>
#include <uapi/drm/xe_drm.h>
#include "soc/intel_dram.h"
@@ -514,6 +515,9 @@ static void display_device_remove(struct drm_device *dev, void *arg)
intel_display_device_remove(display);
}
+static const struct intel_display_parent_interface parent = {
+};
+
/**
* xe_display_probe - probe display and create display struct
* @xe: XE device instance
@@ -534,7 +538,7 @@ int xe_display_probe(struct xe_device *xe)
if (!xe->info.probe_display)
goto no_display;
- display = intel_display_device_probe(pdev);
+ display = intel_display_device_probe(pdev, &parent);
if (IS_ERR(display))
return PTR_ERR(display);
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
new file mode 100644
index 0000000000000..28c976815327a
--- /dev/null
+++ b/include/drm/intel/display_parent_interface.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2025 Intel Corporation x*/
+
+#ifndef __DISPLAY_PARENT_INTERFACE_H__
+#define __DISPLAY_PARENT_INTERFACE_H__
+
+#include <linux/types.h>
+
+struct drm_device;
+
+/**
+ * struct intel_display_parent_interface - services parent driver provides to display
+ *
+ * The parent, or core, driver provides a pointer to this structure to display
+ * driver when calling intel_display_device_probe(). The display driver uses it
+ * to access services provided by the parent driver. The structure may contain
+ * sub-struct pointers to group function pointers by functionality.
+ *
+ * All function and sub-struct pointers must be initialized and callable unless
+ * explicitly marked as "optional" below. The display driver will only NULL
+ * check the optional pointers.
+ */
+struct intel_display_parent_interface {
+};
+
+#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 1/6] drm/{i915,xe}/display: pass parent interface to display probe
2025-10-24 9:31 ` [PATCH v2 1/6] drm/{i915, xe}/display: pass parent interface to display probe Jouni Högander
@ 2025-10-24 12:25 ` Jani Nikula
0 siblings, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:25 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe
Cc: Jouni Högander, Lucas De Marchi, Rodrigo Vivi,
Ville Syrjälä
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> From: Jani Nikula <jani.nikula@intel.com>
>
> Let's gradually start calling i915 and xe parent, or core, drivers from
> display via function pointers passed at display probe.
>
> Going forward, the struct intel_display_parent_interface is expected to
> include const pointers to sub-structs by functionality, for example:
>
> struct intel_display_rpm {
> struct ref_tracker *(*get)(struct drm_device *drm);
> /* ... */
> };
>
> struct intel_display_parent_interface {
> /* ... */
> const struct intel_display_rpm *rpm;
> };
>
> This is a baby step towards not building display as part of both i915
> and xe drivers, but rather making it an independent driver interfacing
> with the two.
>
> v2: unrelated include removal dropped
>
> Cc: Jouni Högander <jouni.hogander@intel.com>
> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
> .../gpu/drm/i915/display/intel_display_core.h | 4 +++
> .../drm/i915/display/intel_display_device.c | 5 +++-
> .../drm/i915/display/intel_display_device.h | 4 ++-
> drivers/gpu/drm/i915/display/intel_fb.c | 1 +
> .../drm/i915/display/skl_universal_plane.c | 1 +
> drivers/gpu/drm/i915/i915_driver.c | 11 +++++++-
> drivers/gpu/drm/i915/i915_driver.h | 2 ++
> .../gpu/drm/i915/selftests/mock_gem_device.c | 4 ++-
> drivers/gpu/drm/xe/display/xe_display.c | 6 ++++-
> include/drm/intel/display_parent_interface.h | 26 +++++++++++++++++++
> 10 files changed, 59 insertions(+), 5 deletions(-)
> create mode 100644 include/drm/intel/display_parent_interface.h
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 32664098b4078..893279be84091 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -41,6 +41,7 @@ struct intel_cdclk_vals;
> struct intel_color_funcs;
> struct intel_crtc;
> struct intel_crtc_state;
> +struct intel_display_parent_interface;
> struct intel_dmc;
> struct intel_dpll_global_funcs;
> struct intel_dpll_mgr;
> @@ -291,6 +292,9 @@ struct intel_display {
> /* Intel PCH: where the south display engine lives */
> enum intel_pch pch_type;
>
> + /* Parent, or core, driver functions exposed to display */
> + const struct intel_display_parent_interface *parent;
> +
> /* Display functions */
> struct {
> /* Top level crtc-ish functions */
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.c b/drivers/gpu/drm/i915/display/intel_display_device.c
> index f3f1f25b0f383..328447a5e5e8c 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.c
> @@ -1647,7 +1647,8 @@ static void display_platforms_or(struct intel_display_platforms *dst,
> bitmap_or(dst->bitmap, dst->bitmap, src->bitmap, display_platforms_num_bits());
> }
>
> -struct intel_display *intel_display_device_probe(struct pci_dev *pdev)
> +struct intel_display *intel_display_device_probe(struct pci_dev *pdev,
> + const struct intel_display_parent_interface *parent)
> {
> struct intel_display *display;
> const struct intel_display_device_info *info;
> @@ -1663,6 +1664,8 @@ struct intel_display *intel_display_device_probe(struct pci_dev *pdev)
> /* Add drm device backpointer as early as possible. */
> display->drm = pci_get_drvdata(pdev);
>
> + display->parent = parent;
> +
> intel_display_params_copy(&display->params);
>
> if (has_no_display(pdev)) {
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
> index 8fdb8a0a42821..a009082e3107b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.h
> @@ -13,6 +13,7 @@
>
> struct drm_printer;
> struct intel_display;
> +struct intel_display_parent_interface;
> struct pci_dev;
>
> /*
> @@ -312,7 +313,8 @@ struct intel_display_device_info {
>
> bool intel_display_device_present(struct intel_display *display);
> bool intel_display_device_enabled(struct intel_display *display);
> -struct intel_display *intel_display_device_probe(struct pci_dev *pdev);
> +struct intel_display *intel_display_device_probe(struct pci_dev *pdev,
> + const struct intel_display_parent_interface *parent);
> void intel_display_device_remove(struct intel_display *display);
> void intel_display_device_info_runtime_init(struct intel_display *display);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c
> index 6ade38198f396..f4512fb38a778 100644
> --- a/drivers/gpu/drm/i915/display/intel_fb.c
> +++ b/drivers/gpu/drm/i915/display/intel_fb.c
> @@ -9,6 +9,7 @@
> #include <drm/drm_blend.h>
> #include <drm/drm_gem.h>
> #include <drm/drm_modeset_helper.h>
> +#include <drm/intel/display_parent_interface.h>
Argh, I keep spotting rebase leftovers from my own patch. *facepalm*.
>
> #include "i915_utils.h"
> #include "intel_bo.h"
> diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> index 765d288cce2b0..c70bde90b9a9e 100644
> --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> @@ -8,6 +8,7 @@
> #include <drm/drm_damage_helper.h>
> #include <drm/drm_fourcc.h>
> #include <drm/drm_print.h>
> +#include <drm/intel/display_parent_interface.h>
Ditto.
Obviously, I can't r-b this either, it being my code.
BR,
Jani.
>
> #include "pxp/intel_pxp.h"
> #include "i915_utils.h"
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index e19a08893b998..b295326eb4331 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -47,6 +47,7 @@
> #include <drm/drm_managed.h>
> #include <drm/drm_probe_helper.h>
> #include <drm/intel/display_member.h>
> +#include <drm/intel/display_parent_interface.h>
>
> #include "display/i9xx_display_sr.h"
> #include "display/intel_bw.h"
> @@ -738,6 +739,14 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
> "DRM_I915_DEBUG_RUNTIME_PM enabled\n");
> }
>
> +static const struct intel_display_parent_interface parent = {
> +};
> +
> +const struct intel_display_parent_interface *i915_driver_parent_interface(void)
> +{
> + return &parent;
> +}
> +
> /* Ensure drm and display members are placed properly. */
> INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct drm_i915_private, drm, display);
>
> @@ -762,7 +771,7 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
> /* Set up device info and initial runtime info. */
> intel_device_info_driver_create(i915, pdev->device, match_info);
>
> - display = intel_display_device_probe(pdev);
> + display = intel_display_device_probe(pdev, &parent);
> if (IS_ERR(display))
> return ERR_CAST(display);
>
> diff --git a/drivers/gpu/drm/i915/i915_driver.h b/drivers/gpu/drm/i915/i915_driver.h
> index 1e95ecb2a163f..9551519ab4297 100644
> --- a/drivers/gpu/drm/i915/i915_driver.h
> +++ b/drivers/gpu/drm/i915/i915_driver.h
> @@ -12,6 +12,7 @@ struct pci_dev;
> struct pci_device_id;
> struct drm_i915_private;
> struct drm_printer;
> +struct intel_display_parent_interface;
>
> #define DRIVER_NAME "i915"
> #define DRIVER_DESC "Intel Graphics"
> @@ -24,6 +25,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915);
>
> int i915_driver_resume_switcheroo(struct drm_i915_private *i915);
> int i915_driver_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state);
> +const struct intel_display_parent_interface *i915_driver_parent_interface(void);
>
> void
> i915_print_iommu_status(struct drm_i915_private *i915, struct drm_printer *p);
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> index fb8751bd5df0a..b59626c4994cb 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> @@ -33,6 +33,7 @@
> #include "gt/intel_gt.h"
> #include "gt/intel_gt_requests.h"
> #include "gt/mock_engine.h"
> +#include "i915_driver.h"
> #include "intel_memory_region.h"
> #include "intel_region_ttm.h"
>
> @@ -183,7 +184,8 @@ struct drm_i915_private *mock_gem_device(void)
> /* Set up device info and initial runtime info. */
> intel_device_info_driver_create(i915, pdev->device, &mock_info);
>
> - display = intel_display_device_probe(pdev);
> + /* FIXME: Can we run selftests using a mock device without display? */
> + display = intel_display_device_probe(pdev, i915_driver_parent_interface());
> if (IS_ERR(display))
> goto err_device;
>
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 5a02754d0610e..0e38c96eb6def 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -14,6 +14,7 @@
> #include <drm/drm_managed.h>
> #include <drm/drm_probe_helper.h>
> #include <drm/intel/display_member.h>
> +#include <drm/intel/display_parent_interface.h>
> #include <uapi/drm/xe_drm.h>
>
> #include "soc/intel_dram.h"
> @@ -514,6 +515,9 @@ static void display_device_remove(struct drm_device *dev, void *arg)
> intel_display_device_remove(display);
> }
>
> +static const struct intel_display_parent_interface parent = {
> +};
> +
> /**
> * xe_display_probe - probe display and create display struct
> * @xe: XE device instance
> @@ -534,7 +538,7 @@ int xe_display_probe(struct xe_device *xe)
> if (!xe->info.probe_display)
> goto no_display;
>
> - display = intel_display_device_probe(pdev);
> + display = intel_display_device_probe(pdev, &parent);
> if (IS_ERR(display))
> return PTR_ERR(display);
>
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> new file mode 100644
> index 0000000000000..28c976815327a
> --- /dev/null
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -0,0 +1,26 @@
> +/* SPDX-License-Identifier: MIT */
> +/* Copyright © 2025 Intel Corporation x*/
> +
> +#ifndef __DISPLAY_PARENT_INTERFACE_H__
> +#define __DISPLAY_PARENT_INTERFACE_H__
> +
> +#include <linux/types.h>
> +
> +struct drm_device;
> +
> +/**
> + * struct intel_display_parent_interface - services parent driver provides to display
> + *
> + * The parent, or core, driver provides a pointer to this structure to display
> + * driver when calling intel_display_device_probe(). The display driver uses it
> + * to access services provided by the parent driver. The structure may contain
> + * sub-struct pointers to group function pointers by functionality.
> + *
> + * All function and sub-struct pointers must be initialized and callable unless
> + * explicitly marked as "optional" below. The display driver will only NULL
> + * check the optional pointers.
> + */
> +struct intel_display_parent_interface {
> +};
> +
> +#endif
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 2/6] drm/{i915, xe}/display: Add display runtime pm parent interface
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
2025-10-24 9:31 ` [PATCH v2 1/6] drm/{i915, xe}/display: pass parent interface to display probe Jouni Högander
@ 2025-10-24 9:31 ` Jouni Högander
2025-10-24 12:25 ` [PATCH v2 2/6] drm/{i915,xe}/display: " Jani Nikula
2025-10-24 9:31 ` [PATCH v2 3/6] drm/i915/display: Runtime pm wrappers for display " Jouni Högander
` (4 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Jouni Högander @ 2025-10-24 9:31 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula, Jouni Högander
We have differing implementations for display runtime pm in i915 and xe
drivers. Add struct of function pointers into display_parent_interface
which will contain used implementation of runtime pm.
v2:
- add _interface suffix to rpm function pointer struct
- add struct ref_tracker forward declaration
- use kernel-doc comments
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
include/drm/intel/display_parent_interface.h | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index 28c976815327a..26bedc360044d 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -7,6 +7,23 @@
#include <linux/types.h>
struct drm_device;
+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);
+};
/**
* struct intel_display_parent_interface - services parent driver provides to display
@@ -21,6 +38,8 @@ struct drm_device;
* check the optional pointers.
*/
struct intel_display_parent_interface {
+ /** @rpm: Runtime PM functions */
+ const struct intel_display_rpm_interface *rpm;
};
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 2/6] drm/{i915,xe}/display: Add display runtime pm parent interface
2025-10-24 9:31 ` [PATCH v2 2/6] drm/{i915, xe}/display: Add display runtime pm parent interface Jouni Högander
@ 2025-10-24 12:25 ` Jani Nikula
0 siblings, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:25 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe; +Cc: Jouni Högander
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> We have differing implementations for display runtime pm in i915 and xe
> drivers. Add struct of function pointers into display_parent_interface
> which will contain used implementation of runtime pm.
>
> v2:
> - add _interface suffix to rpm function pointer struct
> - add struct ref_tracker forward declaration
> - use kernel-doc comments
>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> include/drm/intel/display_parent_interface.h | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> index 28c976815327a..26bedc360044d 100644
> --- a/include/drm/intel/display_parent_interface.h
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -7,6 +7,23 @@
> #include <linux/types.h>
>
> struct drm_device;
> +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);
> +};
>
> /**
> * struct intel_display_parent_interface - services parent driver provides to display
> @@ -21,6 +38,8 @@ struct drm_device;
> * check the optional pointers.
> */
> struct intel_display_parent_interface {
> + /** @rpm: Runtime PM functions */
> + const struct intel_display_rpm_interface *rpm;
> };
>
> #endif
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 3/6] drm/i915/display: Runtime pm wrappers for display parent interface
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
2025-10-24 9:31 ` [PATCH v2 1/6] drm/{i915, xe}/display: pass parent interface to display probe Jouni Högander
2025-10-24 9:31 ` [PATCH v2 2/6] drm/{i915, xe}/display: Add display runtime pm parent interface Jouni Högander
@ 2025-10-24 9:31 ` Jouni Högander
2025-10-24 12:26 ` Jani Nikula
2025-10-24 9:31 ` [PATCH v2 4/6] drm/xe/display: " Jouni Högander
` (3 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Jouni Högander @ 2025-10-24 9:31 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula, Jouni Högander
Implement runtime pm wrappers for i915 driver and add them into display
parent interface.
v2:
- move i915 display rpm interface implementation to intel_runtime_pm.c
- rename intel_display as i915_display
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
drivers/gpu/drm/i915/i915_driver.c | 1 +
drivers/gpu/drm/i915/intel_runtime_pm.c | 77 +++++++++++++++++++++++++
drivers/gpu/drm/i915/intel_runtime_pm.h | 3 +
3 files changed, 81 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index b295326eb4331..c97b767719176 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -740,6 +740,7 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
}
static const struct intel_display_parent_interface parent = {
+ .rpm = &i915_display_rpm_interface,
};
const struct intel_display_parent_interface *i915_driver_parent_interface(void)
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 7ce3e6de0c197..d11c2814b787b 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -29,6 +29,7 @@
#include <linux/pm_runtime.h>
#include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
#include "i915_drv.h"
#include "i915_trace.h"
@@ -177,6 +178,82 @@ static intel_wakeref_t __intel_runtime_pm_get(struct intel_runtime_pm *rpm,
return track_intel_runtime_pm_wakeref(rpm);
}
+static struct intel_runtime_pm *drm_to_rpm(const struct drm_device *drm)
+{
+ struct drm_i915_private *i915 = to_i915(drm);
+
+ return &i915->runtime_pm;
+}
+
+static struct ref_tracker *i915_display_rpm_get(const struct drm_device *drm)
+{
+ return intel_runtime_pm_get(drm_to_rpm(drm));
+}
+
+static struct ref_tracker *i915_display_rpm_get_raw(const struct drm_device *drm)
+{
+ return intel_runtime_pm_get_raw(drm_to_rpm(drm));
+}
+
+static struct ref_tracker *i915_display_rpm_get_if_in_use(const struct drm_device *drm)
+{
+ return intel_runtime_pm_get_if_in_use(drm_to_rpm(drm));
+}
+
+static struct ref_tracker *i915_display_rpm_get_noresume(const struct drm_device *drm)
+{
+ return intel_runtime_pm_get_noresume(drm_to_rpm(drm));
+}
+
+static void i915_display_rpm_put(const struct drm_device *drm, struct ref_tracker *wakeref)
+{
+ intel_runtime_pm_put(drm_to_rpm(drm), wakeref);
+}
+
+static void i915_display_rpm_put_raw(const struct drm_device *drm, struct ref_tracker *wakeref)
+{
+ intel_runtime_pm_put_raw(drm_to_rpm(drm), wakeref);
+}
+
+static void i915_display_rpm_put_unchecked(const struct drm_device *drm)
+{
+ intel_runtime_pm_put_unchecked(drm_to_rpm(drm));
+}
+
+static bool i915_display_rpm_suspended(const struct drm_device *drm)
+{
+ return intel_runtime_pm_suspended(drm_to_rpm(drm));
+}
+
+static void i915_display_rpm_assert_held(const struct drm_device *drm)
+{
+ assert_rpm_wakelock_held(drm_to_rpm(drm));
+}
+
+static void i915_display_rpm_assert_block(const struct drm_device *drm)
+{
+ disable_rpm_wakeref_asserts(drm_to_rpm(drm));
+}
+
+static void i915_display_rpm_assert_unblock(const struct drm_device *drm)
+{
+ enable_rpm_wakeref_asserts(drm_to_rpm(drm));
+}
+
+const struct intel_display_rpm_interface i915_display_rpm_interface = {
+ .get = i915_display_rpm_get,
+ .get_raw = i915_display_rpm_get_raw,
+ .get_if_in_use = i915_display_rpm_get_if_in_use,
+ .get_noresume = i915_display_rpm_get_noresume,
+ .put = i915_display_rpm_put,
+ .put_raw = i915_display_rpm_put_raw,
+ .put_unchecked = i915_display_rpm_put_unchecked,
+ .suspended = i915_display_rpm_suspended,
+ .assert_held = i915_display_rpm_assert_held,
+ .assert_block = i915_display_rpm_assert_block,
+ .assert_unblock = i915_display_rpm_assert_unblock
+};
+
/**
* intel_runtime_pm_get_raw - grab a raw runtime pm reference
* @rpm: the intel_runtime_pm structure
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h b/drivers/gpu/drm/i915/intel_runtime_pm.h
index 7428bd8fa67f4..ed6c43b17f9ae 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.h
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.h
@@ -14,6 +14,7 @@
struct device;
struct drm_i915_private;
struct drm_printer;
+struct intel_display_rpm_interface;
/*
* This struct helps tracking the state needed for runtime PM, which puts the
@@ -226,4 +227,6 @@ static inline void print_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm,
}
#endif
+extern const struct intel_display_rpm_interface i915_display_rpm_interface;
+
#endif /* __INTEL_RUNTIME_PM_H__ */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 3/6] drm/i915/display: Runtime pm wrappers for display parent interface
2025-10-24 9:31 ` [PATCH v2 3/6] drm/i915/display: Runtime pm wrappers for display " Jouni Högander
@ 2025-10-24 12:26 ` Jani Nikula
0 siblings, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:26 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe; +Cc: Jouni Högander
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> Implement runtime pm wrappers for i915 driver and add them into display
> parent interface.
>
> v2:
> - move i915 display rpm interface implementation to intel_runtime_pm.c
> - rename intel_display as i915_display
>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/i915_driver.c | 1 +
> drivers/gpu/drm/i915/intel_runtime_pm.c | 77 +++++++++++++++++++++++++
> drivers/gpu/drm/i915/intel_runtime_pm.h | 3 +
> 3 files changed, 81 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index b295326eb4331..c97b767719176 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -740,6 +740,7 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
> }
>
> static const struct intel_display_parent_interface parent = {
> + .rpm = &i915_display_rpm_interface,
> };
>
> const struct intel_display_parent_interface *i915_driver_parent_interface(void)
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 7ce3e6de0c197..d11c2814b787b 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -29,6 +29,7 @@
> #include <linux/pm_runtime.h>
>
> #include <drm/drm_print.h>
> +#include <drm/intel/display_parent_interface.h>
>
> #include "i915_drv.h"
> #include "i915_trace.h"
> @@ -177,6 +178,82 @@ static intel_wakeref_t __intel_runtime_pm_get(struct intel_runtime_pm *rpm,
> return track_intel_runtime_pm_wakeref(rpm);
> }
>
> +static struct intel_runtime_pm *drm_to_rpm(const struct drm_device *drm)
> +{
> + struct drm_i915_private *i915 = to_i915(drm);
> +
> + return &i915->runtime_pm;
> +}
> +
> +static struct ref_tracker *i915_display_rpm_get(const struct drm_device *drm)
> +{
> + return intel_runtime_pm_get(drm_to_rpm(drm));
> +}
> +
> +static struct ref_tracker *i915_display_rpm_get_raw(const struct drm_device *drm)
> +{
> + return intel_runtime_pm_get_raw(drm_to_rpm(drm));
> +}
> +
> +static struct ref_tracker *i915_display_rpm_get_if_in_use(const struct drm_device *drm)
> +{
> + return intel_runtime_pm_get_if_in_use(drm_to_rpm(drm));
> +}
> +
> +static struct ref_tracker *i915_display_rpm_get_noresume(const struct drm_device *drm)
> +{
> + return intel_runtime_pm_get_noresume(drm_to_rpm(drm));
> +}
> +
> +static void i915_display_rpm_put(const struct drm_device *drm, struct ref_tracker *wakeref)
> +{
> + intel_runtime_pm_put(drm_to_rpm(drm), wakeref);
> +}
> +
> +static void i915_display_rpm_put_raw(const struct drm_device *drm, struct ref_tracker *wakeref)
> +{
> + intel_runtime_pm_put_raw(drm_to_rpm(drm), wakeref);
> +}
> +
> +static void i915_display_rpm_put_unchecked(const struct drm_device *drm)
> +{
> + intel_runtime_pm_put_unchecked(drm_to_rpm(drm));
> +}
> +
> +static bool i915_display_rpm_suspended(const struct drm_device *drm)
> +{
> + return intel_runtime_pm_suspended(drm_to_rpm(drm));
> +}
> +
> +static void i915_display_rpm_assert_held(const struct drm_device *drm)
> +{
> + assert_rpm_wakelock_held(drm_to_rpm(drm));
> +}
> +
> +static void i915_display_rpm_assert_block(const struct drm_device *drm)
> +{
> + disable_rpm_wakeref_asserts(drm_to_rpm(drm));
> +}
> +
> +static void i915_display_rpm_assert_unblock(const struct drm_device *drm)
> +{
> + enable_rpm_wakeref_asserts(drm_to_rpm(drm));
> +}
> +
> +const struct intel_display_rpm_interface i915_display_rpm_interface = {
> + .get = i915_display_rpm_get,
> + .get_raw = i915_display_rpm_get_raw,
> + .get_if_in_use = i915_display_rpm_get_if_in_use,
> + .get_noresume = i915_display_rpm_get_noresume,
> + .put = i915_display_rpm_put,
> + .put_raw = i915_display_rpm_put_raw,
> + .put_unchecked = i915_display_rpm_put_unchecked,
> + .suspended = i915_display_rpm_suspended,
> + .assert_held = i915_display_rpm_assert_held,
> + .assert_block = i915_display_rpm_assert_block,
> + .assert_unblock = i915_display_rpm_assert_unblock
> +};
> +
> /**
> * intel_runtime_pm_get_raw - grab a raw runtime pm reference
> * @rpm: the intel_runtime_pm structure
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.h b/drivers/gpu/drm/i915/intel_runtime_pm.h
> index 7428bd8fa67f4..ed6c43b17f9ae 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.h
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.h
> @@ -14,6 +14,7 @@
> struct device;
> struct drm_i915_private;
> struct drm_printer;
> +struct intel_display_rpm_interface;
>
> /*
> * This struct helps tracking the state needed for runtime PM, which puts the
> @@ -226,4 +227,6 @@ static inline void print_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm,
> }
> #endif
>
> +extern const struct intel_display_rpm_interface i915_display_rpm_interface;
> +
> #endif /* __INTEL_RUNTIME_PM_H__ */
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 4/6] drm/xe/display: Runtime pm wrappers for display parent interface
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
` (2 preceding siblings ...)
2025-10-24 9:31 ` [PATCH v2 3/6] drm/i915/display: Runtime pm wrappers for display " Jouni Högander
@ 2025-10-24 9:31 ` Jouni Högander
2025-10-24 12:27 ` Jani Nikula
2025-10-24 12:31 ` Jani Nikula
2025-10-24 9:31 ` [PATCH v2 5/6] drm/i915/display: Use display parent interface for i915 runtime pm Jouni Högander
` (2 subsequent siblings)
6 siblings, 2 replies; 15+ messages in thread
From: Jouni Högander @ 2025-10-24 9:31 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula, Jouni Högander
Implement runtime pm wrappers for xe driver and add them into display
parent interface.
v2:
- move xe_display_rpm_interface code into xe_display_rpm.c
- rename xe_rpm as xe_display_rpm
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
drivers/gpu/drm/xe/display/xe_display.c | 3 +
drivers/gpu/drm/xe/display/xe_display_rpm.c | 76 +++++++++++++++++++++
drivers/gpu/drm/xe/display/xe_display_rpm.h | 11 +++
3 files changed, 90 insertions(+)
create mode 100644 drivers/gpu/drm/xe/display/xe_display_rpm.h
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 0e38c96eb6def..be7f3c7ef5c3f 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -35,7 +35,9 @@
#include "intel_hotplug.h"
#include "intel_opregion.h"
#include "skl_watermark.h"
+#include "xe_display_rpm.h"
#include "xe_module.h"
+#include "xe_pm.h"
/* Ensure drm and display members are placed properly. */
INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display);
@@ -516,6 +518,7 @@ static void display_device_remove(struct drm_device *dev, void *arg)
}
static const struct intel_display_parent_interface parent = {
+ .rpm = &xe_display_rpm_interface,
};
/**
diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.c b/drivers/gpu/drm/xe/display/xe_display_rpm.c
index 3825376e98ccd..72a351e26a008 100644
--- a/drivers/gpu/drm/xe/display/xe_display_rpm.c
+++ b/drivers/gpu/drm/xe/display/xe_display_rpm.c
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: MIT
/* Copyright © 2025 Intel Corporation */
+#include <drm/intel/display_parent_interface.h>
+
#include "intel_display_core.h"
#include "intel_display_rpm.h"
#include "xe_device.h"
@@ -71,3 +73,77 @@ void intel_display_rpm_assert_unblock(struct intel_display *display)
{
/* FIXME */
}
+
+static struct ref_tracker *xe_display_rpm_get(const struct drm_device *drm)
+{
+ return xe_pm_runtime_resume_and_get(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
+}
+
+static struct ref_tracker *xe_display_rpm_get_raw(const struct drm_device *drm)
+{
+ return xe_display_rpm_get(drm);
+}
+
+static struct ref_tracker *xe_display_rpm_get_if_in_use(const struct drm_device *drm)
+{
+ return xe_pm_runtime_get_if_in_use(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
+}
+
+static struct ref_tracker *xe_display_rpm_get_noresume(const struct drm_device *drm)
+{
+ xe_pm_runtime_get_noresume(to_xe_device(drm));
+
+ return INTEL_WAKEREF_DEF;
+}
+
+static void xe_display_rpm_put(const struct drm_device *drm, struct ref_tracker *wakeref)
+{
+ if (wakeref)
+ xe_pm_runtime_put(to_xe_device(drm));
+}
+
+static void xe_display_rpm_put_raw(const struct drm_device *drm, struct ref_tracker *wakeref)
+{
+ xe_display_rpm_put(drm, wakeref);
+}
+
+static void xe_display_rpm_put_unchecked(const struct drm_device *drm)
+{
+ xe_pm_runtime_put(to_xe_device(drm));
+}
+
+static bool xe_display_rpm_suspended(const struct drm_device *drm)
+{
+ struct xe_device *xe = to_xe_device(drm);
+
+ return pm_runtime_suspended(xe->drm.dev);
+}
+
+static void xe_display_rpm_assert_held(const struct drm_device *drm)
+{
+ /* FIXME */
+}
+
+static void xe_display_rpm_assert_block(const struct drm_device *drm)
+{
+ /* FIXME */
+}
+
+static void xe_display_rpm_assert_unblock(const struct drm_device *drm)
+{
+ /* FIXME */
+}
+
+const struct intel_display_rpm_interface xe_display_rpm_interface = {
+ .get = xe_display_rpm_get,
+ .get_raw = xe_display_rpm_get_raw,
+ .get_if_in_use = xe_display_rpm_get_if_in_use,
+ .get_noresume = xe_display_rpm_get_noresume,
+ .put = xe_display_rpm_put,
+ .put_raw = xe_display_rpm_put_raw,
+ .put_unchecked = xe_display_rpm_put_unchecked,
+ .suspended = xe_display_rpm_suspended,
+ .assert_held = xe_display_rpm_assert_held,
+ .assert_block = xe_display_rpm_assert_block,
+ .assert_unblock = xe_display_rpm_assert_unblock
+};
diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.h b/drivers/gpu/drm/xe/display/xe_display_rpm.h
new file mode 100644
index 0000000000000..0bf9d31e87c17
--- /dev/null
+++ b/drivers/gpu/drm/xe/display/xe_display_rpm.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _XE_DISPLAY_RPM_H_
+#define _XE_DISPLAY_RPM_H_
+
+extern const struct intel_display_rpm_interface xe_display_rpm_interface;
+
+#endif /* _XE_DISPLAY_RPM_H_ */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 4/6] drm/xe/display: Runtime pm wrappers for display parent interface
2025-10-24 9:31 ` [PATCH v2 4/6] drm/xe/display: " Jouni Högander
@ 2025-10-24 12:27 ` Jani Nikula
2025-10-24 12:31 ` Jani Nikula
1 sibling, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:27 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe; +Cc: Jouni Högander
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> Implement runtime pm wrappers for xe driver and add them into display
> parent interface.
>
> v2:
> - move xe_display_rpm_interface code into xe_display_rpm.c
> - rename xe_rpm as xe_display_rpm
>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
> drivers/gpu/drm/xe/display/xe_display.c | 3 +
> drivers/gpu/drm/xe/display/xe_display_rpm.c | 76 +++++++++++++++++++++
> drivers/gpu/drm/xe/display/xe_display_rpm.h | 11 +++
> 3 files changed, 90 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/display/xe_display_rpm.h
>
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 0e38c96eb6def..be7f3c7ef5c3f 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -35,7 +35,9 @@
> #include "intel_hotplug.h"
> #include "intel_opregion.h"
> #include "skl_watermark.h"
> +#include "xe_display_rpm.h"
> #include "xe_module.h"
> +#include "xe_pm.h"
That's probably leftovers from the previous version?
Anyway,
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
> /* Ensure drm and display members are placed properly. */
> INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display);
> @@ -516,6 +518,7 @@ static void display_device_remove(struct drm_device *dev, void *arg)
> }
>
> static const struct intel_display_parent_interface parent = {
> + .rpm = &xe_display_rpm_interface,
> };
>
> /**
> diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.c b/drivers/gpu/drm/xe/display/xe_display_rpm.c
> index 3825376e98ccd..72a351e26a008 100644
> --- a/drivers/gpu/drm/xe/display/xe_display_rpm.c
> +++ b/drivers/gpu/drm/xe/display/xe_display_rpm.c
> @@ -1,6 +1,8 @@
> // SPDX-License-Identifier: MIT
> /* Copyright © 2025 Intel Corporation */
>
> +#include <drm/intel/display_parent_interface.h>
> +
> #include "intel_display_core.h"
> #include "intel_display_rpm.h"
> #include "xe_device.h"
> @@ -71,3 +73,77 @@ void intel_display_rpm_assert_unblock(struct intel_display *display)
> {
> /* FIXME */
> }
> +
> +static struct ref_tracker *xe_display_rpm_get(const struct drm_device *drm)
> +{
> + return xe_pm_runtime_resume_and_get(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
> +}
> +
> +static struct ref_tracker *xe_display_rpm_get_raw(const struct drm_device *drm)
> +{
> + return xe_display_rpm_get(drm);
> +}
> +
> +static struct ref_tracker *xe_display_rpm_get_if_in_use(const struct drm_device *drm)
> +{
> + return xe_pm_runtime_get_if_in_use(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
> +}
> +
> +static struct ref_tracker *xe_display_rpm_get_noresume(const struct drm_device *drm)
> +{
> + xe_pm_runtime_get_noresume(to_xe_device(drm));
> +
> + return INTEL_WAKEREF_DEF;
> +}
> +
> +static void xe_display_rpm_put(const struct drm_device *drm, struct ref_tracker *wakeref)
> +{
> + if (wakeref)
> + xe_pm_runtime_put(to_xe_device(drm));
> +}
> +
> +static void xe_display_rpm_put_raw(const struct drm_device *drm, struct ref_tracker *wakeref)
> +{
> + xe_display_rpm_put(drm, wakeref);
> +}
> +
> +static void xe_display_rpm_put_unchecked(const struct drm_device *drm)
> +{
> + xe_pm_runtime_put(to_xe_device(drm));
> +}
> +
> +static bool xe_display_rpm_suspended(const struct drm_device *drm)
> +{
> + struct xe_device *xe = to_xe_device(drm);
> +
> + return pm_runtime_suspended(xe->drm.dev);
> +}
> +
> +static void xe_display_rpm_assert_held(const struct drm_device *drm)
> +{
> + /* FIXME */
> +}
> +
> +static void xe_display_rpm_assert_block(const struct drm_device *drm)
> +{
> + /* FIXME */
> +}
> +
> +static void xe_display_rpm_assert_unblock(const struct drm_device *drm)
> +{
> + /* FIXME */
> +}
> +
> +const struct intel_display_rpm_interface xe_display_rpm_interface = {
> + .get = xe_display_rpm_get,
> + .get_raw = xe_display_rpm_get_raw,
> + .get_if_in_use = xe_display_rpm_get_if_in_use,
> + .get_noresume = xe_display_rpm_get_noresume,
> + .put = xe_display_rpm_put,
> + .put_raw = xe_display_rpm_put_raw,
> + .put_unchecked = xe_display_rpm_put_unchecked,
> + .suspended = xe_display_rpm_suspended,
> + .assert_held = xe_display_rpm_assert_held,
> + .assert_block = xe_display_rpm_assert_block,
> + .assert_unblock = xe_display_rpm_assert_unblock
> +};
> diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.h b/drivers/gpu/drm/xe/display/xe_display_rpm.h
> new file mode 100644
> index 0000000000000..0bf9d31e87c17
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/display/xe_display_rpm.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _XE_DISPLAY_RPM_H_
> +#define _XE_DISPLAY_RPM_H_
> +
> +extern const struct intel_display_rpm_interface xe_display_rpm_interface;
> +
> +#endif /* _XE_DISPLAY_RPM_H_ */
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v2 4/6] drm/xe/display: Runtime pm wrappers for display parent interface
2025-10-24 9:31 ` [PATCH v2 4/6] drm/xe/display: " Jouni Högander
2025-10-24 12:27 ` Jani Nikula
@ 2025-10-24 12:31 ` Jani Nikula
1 sibling, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:31 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe; +Cc: Jouni Högander
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> Implement runtime pm wrappers for xe driver and add them into display
> parent interface.
>
> v2:
> - move xe_display_rpm_interface code into xe_display_rpm.c
> - rename xe_rpm as xe_display_rpm
>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
> drivers/gpu/drm/xe/display/xe_display.c | 3 +
> drivers/gpu/drm/xe/display/xe_display_rpm.c | 76 +++++++++++++++++++++
> drivers/gpu/drm/xe/display/xe_display_rpm.h | 11 +++
> 3 files changed, 90 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/display/xe_display_rpm.h
>
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 0e38c96eb6def..be7f3c7ef5c3f 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -35,7 +35,9 @@
> #include "intel_hotplug.h"
> #include "intel_opregion.h"
> #include "skl_watermark.h"
> +#include "xe_display_rpm.h"
> #include "xe_module.h"
> +#include "xe_pm.h"
>
> /* Ensure drm and display members are placed properly. */
> INTEL_DISPLAY_MEMBER_STATIC_ASSERT(struct xe_device, drm, display);
> @@ -516,6 +518,7 @@ static void display_device_remove(struct drm_device *dev, void *arg)
> }
>
> static const struct intel_display_parent_interface parent = {
> + .rpm = &xe_display_rpm_interface,
> };
>
> /**
> diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.c b/drivers/gpu/drm/xe/display/xe_display_rpm.c
> index 3825376e98ccd..72a351e26a008 100644
> --- a/drivers/gpu/drm/xe/display/xe_display_rpm.c
> +++ b/drivers/gpu/drm/xe/display/xe_display_rpm.c
> @@ -1,6 +1,8 @@
> // SPDX-License-Identifier: MIT
> /* Copyright © 2025 Intel Corporation */
>
> +#include <drm/intel/display_parent_interface.h>
> +
> #include "intel_display_core.h"
> #include "intel_display_rpm.h"
> #include "xe_device.h"
> @@ -71,3 +73,77 @@ void intel_display_rpm_assert_unblock(struct intel_display *display)
> {
> /* FIXME */
> }
> +
> +static struct ref_tracker *xe_display_rpm_get(const struct drm_device *drm)
> +{
> + return xe_pm_runtime_resume_and_get(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
> +}
> +
> +static struct ref_tracker *xe_display_rpm_get_raw(const struct drm_device *drm)
> +{
> + return xe_display_rpm_get(drm);
Oh, just an observation, you could also just point both .get and
.get_raw at xe_display_rpm_get in the struct initialization. Dunno
what's easier on the reader. *shrug*
Ditto for put.
BR,
Jani.
> +}
> +
> +static struct ref_tracker *xe_display_rpm_get_if_in_use(const struct drm_device *drm)
> +{
> + return xe_pm_runtime_get_if_in_use(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
> +}
> +
> +static struct ref_tracker *xe_display_rpm_get_noresume(const struct drm_device *drm)
> +{
> + xe_pm_runtime_get_noresume(to_xe_device(drm));
> +
> + return INTEL_WAKEREF_DEF;
> +}
> +
> +static void xe_display_rpm_put(const struct drm_device *drm, struct ref_tracker *wakeref)
> +{
> + if (wakeref)
> + xe_pm_runtime_put(to_xe_device(drm));
> +}
> +
> +static void xe_display_rpm_put_raw(const struct drm_device *drm, struct ref_tracker *wakeref)
> +{
> + xe_display_rpm_put(drm, wakeref);
> +}
> +
> +static void xe_display_rpm_put_unchecked(const struct drm_device *drm)
> +{
> + xe_pm_runtime_put(to_xe_device(drm));
> +}
> +
> +static bool xe_display_rpm_suspended(const struct drm_device *drm)
> +{
> + struct xe_device *xe = to_xe_device(drm);
> +
> + return pm_runtime_suspended(xe->drm.dev);
> +}
> +
> +static void xe_display_rpm_assert_held(const struct drm_device *drm)
> +{
> + /* FIXME */
> +}
> +
> +static void xe_display_rpm_assert_block(const struct drm_device *drm)
> +{
> + /* FIXME */
> +}
> +
> +static void xe_display_rpm_assert_unblock(const struct drm_device *drm)
> +{
> + /* FIXME */
> +}
> +
> +const struct intel_display_rpm_interface xe_display_rpm_interface = {
> + .get = xe_display_rpm_get,
> + .get_raw = xe_display_rpm_get_raw,
> + .get_if_in_use = xe_display_rpm_get_if_in_use,
> + .get_noresume = xe_display_rpm_get_noresume,
> + .put = xe_display_rpm_put,
> + .put_raw = xe_display_rpm_put_raw,
> + .put_unchecked = xe_display_rpm_put_unchecked,
> + .suspended = xe_display_rpm_suspended,
> + .assert_held = xe_display_rpm_assert_held,
> + .assert_block = xe_display_rpm_assert_block,
> + .assert_unblock = xe_display_rpm_assert_unblock
> +};
> diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.h b/drivers/gpu/drm/xe/display/xe_display_rpm.h
> new file mode 100644
> index 0000000000000..0bf9d31e87c17
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/display/xe_display_rpm.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _XE_DISPLAY_RPM_H_
> +#define _XE_DISPLAY_RPM_H_
> +
> +extern const struct intel_display_rpm_interface xe_display_rpm_interface;
> +
> +#endif /* _XE_DISPLAY_RPM_H_ */
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 5/6] drm/i915/display: Use display parent interface for i915 runtime pm
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
` (3 preceding siblings ...)
2025-10-24 9:31 ` [PATCH v2 4/6] drm/xe/display: " Jouni Högander
@ 2025-10-24 9:31 ` Jouni Högander
2025-10-24 12:28 ` Jani Nikula
2025-10-24 9:31 ` [PATCH v2 6/6] drm/xe/display: Use display parent interface for xe " Jouni Högander
2025-10-24 13:34 ` ✗ i915.CI.BAT: failure for Use display parent interface for runtime pm (rev2) Patchwork
6 siblings, 1 reply; 15+ messages in thread
From: Jouni Högander @ 2025-10-24 9:31 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula, Jouni Högander
Start using display parent interface for i915 runtime pm. Doing the same
for xe is done in coming changes.
v2:
- use <> when including drm/intel/display_parent_interface.h
- drop checks for validity of rpm function pointers
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
.../gpu/drm/i915/display/intel_display_rpm.c | 32 ++++++++-----------
1 file changed, 13 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_rpm.c b/drivers/gpu/drm/i915/display/intel_display_rpm.c
index 56c4024201c16..3a6b86842b496 100644
--- a/drivers/gpu/drm/i915/display/intel_display_rpm.c
+++ b/drivers/gpu/drm/i915/display/intel_display_rpm.c
@@ -1,69 +1,63 @@
// SPDX-License-Identifier: MIT
/* Copyright © 2025 Intel Corporation */
+#include <drm/intel/display_parent_interface.h>
+
#include "i915_drv.h"
#include "intel_display_core.h"
#include "intel_display_rpm.h"
-#include "intel_runtime_pm.h"
-
-static struct intel_runtime_pm *display_to_rpm(struct intel_display *display)
-{
- struct drm_i915_private *i915 = to_i915(display->drm);
-
- return &i915->runtime_pm;
-}
struct ref_tracker *intel_display_rpm_get_raw(struct intel_display *display)
{
- return intel_runtime_pm_get_raw(display_to_rpm(display));
+ return display->parent->rpm->get_raw(display->drm);
}
void intel_display_rpm_put_raw(struct intel_display *display, struct ref_tracker *wakeref)
{
- intel_runtime_pm_put_raw(display_to_rpm(display), wakeref);
+ display->parent->rpm->put_raw(display->drm, wakeref);
}
struct ref_tracker *intel_display_rpm_get(struct intel_display *display)
{
- return intel_runtime_pm_get(display_to_rpm(display));
+ return display->parent->rpm->get(display->drm);
}
struct ref_tracker *intel_display_rpm_get_if_in_use(struct intel_display *display)
{
- return intel_runtime_pm_get_if_in_use(display_to_rpm(display));
+ return display->parent->rpm->get_if_in_use(display->drm);
}
struct ref_tracker *intel_display_rpm_get_noresume(struct intel_display *display)
{
- return intel_runtime_pm_get_noresume(display_to_rpm(display));
+ return display->parent->rpm->get_noresume(display->drm);
}
void intel_display_rpm_put(struct intel_display *display, struct ref_tracker *wakeref)
{
- intel_runtime_pm_put(display_to_rpm(display), wakeref);
+ display->parent->rpm->put(display->drm, wakeref);
}
void intel_display_rpm_put_unchecked(struct intel_display *display)
{
- intel_runtime_pm_put_unchecked(display_to_rpm(display));
+ display->parent->rpm->put_unchecked(display->drm);
}
bool intel_display_rpm_suspended(struct intel_display *display)
{
- return intel_runtime_pm_suspended(display_to_rpm(display));
+ return display->parent->rpm->suspended(display->drm);
}
void assert_display_rpm_held(struct intel_display *display)
{
- assert_rpm_wakelock_held(display_to_rpm(display));
+ display->parent->rpm->assert_held(display->drm);
}
void intel_display_rpm_assert_block(struct intel_display *display)
{
- disable_rpm_wakeref_asserts(display_to_rpm(display));
+ display->parent->rpm->assert_block(display->drm);
}
void intel_display_rpm_assert_unblock(struct intel_display *display)
{
- enable_rpm_wakeref_asserts(display_to_rpm(display));
+ display->parent->rpm->assert_unblock(display->drm);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 5/6] drm/i915/display: Use display parent interface for i915 runtime pm
2025-10-24 9:31 ` [PATCH v2 5/6] drm/i915/display: Use display parent interface for i915 runtime pm Jouni Högander
@ 2025-10-24 12:28 ` Jani Nikula
0 siblings, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:28 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe; +Cc: Jouni Högander
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> Start using display parent interface for i915 runtime pm. Doing the same
> for xe is done in coming changes.
>
> v2:
> - use <> when including drm/intel/display_parent_interface.h
> - drop checks for validity of rpm function pointers
>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
> .../gpu/drm/i915/display/intel_display_rpm.c | 32 ++++++++-----------
> 1 file changed, 13 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_rpm.c b/drivers/gpu/drm/i915/display/intel_display_rpm.c
> index 56c4024201c16..3a6b86842b496 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_rpm.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_rpm.c
> @@ -1,69 +1,63 @@
> // SPDX-License-Identifier: MIT
> /* Copyright © 2025 Intel Corporation */
>
> +#include <drm/intel/display_parent_interface.h>
> +
> #include "i915_drv.h"
I'm guessing you could remove this too.
Anyway,
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> #include "intel_display_core.h"
> #include "intel_display_rpm.h"
> -#include "intel_runtime_pm.h"
> -
> -static struct intel_runtime_pm *display_to_rpm(struct intel_display *display)
> -{
> - struct drm_i915_private *i915 = to_i915(display->drm);
> -
> - return &i915->runtime_pm;
> -}
>
> struct ref_tracker *intel_display_rpm_get_raw(struct intel_display *display)
> {
> - return intel_runtime_pm_get_raw(display_to_rpm(display));
> + return display->parent->rpm->get_raw(display->drm);
> }
>
> void intel_display_rpm_put_raw(struct intel_display *display, struct ref_tracker *wakeref)
> {
> - intel_runtime_pm_put_raw(display_to_rpm(display), wakeref);
> + display->parent->rpm->put_raw(display->drm, wakeref);
> }
>
> struct ref_tracker *intel_display_rpm_get(struct intel_display *display)
> {
> - return intel_runtime_pm_get(display_to_rpm(display));
> + return display->parent->rpm->get(display->drm);
> }
>
> struct ref_tracker *intel_display_rpm_get_if_in_use(struct intel_display *display)
> {
> - return intel_runtime_pm_get_if_in_use(display_to_rpm(display));
> + return display->parent->rpm->get_if_in_use(display->drm);
> }
>
> struct ref_tracker *intel_display_rpm_get_noresume(struct intel_display *display)
> {
> - return intel_runtime_pm_get_noresume(display_to_rpm(display));
> + return display->parent->rpm->get_noresume(display->drm);
> }
>
> void intel_display_rpm_put(struct intel_display *display, struct ref_tracker *wakeref)
> {
> - intel_runtime_pm_put(display_to_rpm(display), wakeref);
> + display->parent->rpm->put(display->drm, wakeref);
> }
>
> void intel_display_rpm_put_unchecked(struct intel_display *display)
> {
> - intel_runtime_pm_put_unchecked(display_to_rpm(display));
> + display->parent->rpm->put_unchecked(display->drm);
> }
>
> bool intel_display_rpm_suspended(struct intel_display *display)
> {
> - return intel_runtime_pm_suspended(display_to_rpm(display));
> + return display->parent->rpm->suspended(display->drm);
> }
>
> void assert_display_rpm_held(struct intel_display *display)
> {
> - assert_rpm_wakelock_held(display_to_rpm(display));
> + display->parent->rpm->assert_held(display->drm);
> }
>
> void intel_display_rpm_assert_block(struct intel_display *display)
> {
> - disable_rpm_wakeref_asserts(display_to_rpm(display));
> + display->parent->rpm->assert_block(display->drm);
> }
>
> void intel_display_rpm_assert_unblock(struct intel_display *display)
> {
> - enable_rpm_wakeref_asserts(display_to_rpm(display));
> + display->parent->rpm->assert_unblock(display->drm);
> }
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 6/6] drm/xe/display: Use display parent interface for xe runtime pm
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
` (4 preceding siblings ...)
2025-10-24 9:31 ` [PATCH v2 5/6] drm/i915/display: Use display parent interface for i915 runtime pm Jouni Högander
@ 2025-10-24 9:31 ` Jouni Högander
2025-10-24 12:28 ` Jani Nikula
2025-10-24 13:34 ` ✗ i915.CI.BAT: failure for Use display parent interface for runtime pm (rev2) Patchwork
6 siblings, 1 reply; 15+ messages in thread
From: Jouni Högander @ 2025-10-24 9:31 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula, Jouni Högander
Start using display parent interface for xe runtime pm.
v2: keep xe_display_rpm.c
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
drivers/gpu/drm/xe/Makefile | 1 +
drivers/gpu/drm/xe/display/xe_display_rpm.c | 65 ---------------------
2 files changed, 1 insertion(+), 65 deletions(-)
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 82c6b3d296769..a39caed9f3d35 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -256,6 +256,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
i915-display/intel_display_power.o \
i915-display/intel_display_power_map.o \
i915-display/intel_display_power_well.o \
+ i915-display/intel_display_rpm.o \
i915-display/intel_display_trace.o \
i915-display/intel_display_wa.o \
i915-display/intel_dkl_phy.o \
diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.c b/drivers/gpu/drm/xe/display/xe_display_rpm.c
index 72a351e26a008..977f1dafdde07 100644
--- a/drivers/gpu/drm/xe/display/xe_display_rpm.c
+++ b/drivers/gpu/drm/xe/display/xe_display_rpm.c
@@ -9,71 +9,6 @@
#include "xe_device_types.h"
#include "xe_pm.h"
-static struct xe_device *display_to_xe(struct intel_display *display)
-{
- return to_xe_device(display->drm);
-}
-
-struct ref_tracker *intel_display_rpm_get_raw(struct intel_display *display)
-{
- return intel_display_rpm_get(display);
-}
-
-void intel_display_rpm_put_raw(struct intel_display *display, struct ref_tracker *wakeref)
-{
- intel_display_rpm_put(display, wakeref);
-}
-
-struct ref_tracker *intel_display_rpm_get(struct intel_display *display)
-{
- return xe_pm_runtime_resume_and_get(display_to_xe(display)) ? INTEL_WAKEREF_DEF : NULL;
-}
-
-struct ref_tracker *intel_display_rpm_get_if_in_use(struct intel_display *display)
-{
- return xe_pm_runtime_get_if_in_use(display_to_xe(display)) ? INTEL_WAKEREF_DEF : NULL;
-}
-
-struct ref_tracker *intel_display_rpm_get_noresume(struct intel_display *display)
-{
- xe_pm_runtime_get_noresume(display_to_xe(display));
-
- return INTEL_WAKEREF_DEF;
-}
-
-void intel_display_rpm_put(struct intel_display *display, struct ref_tracker *wakeref)
-{
- if (wakeref)
- xe_pm_runtime_put(display_to_xe(display));
-}
-
-void intel_display_rpm_put_unchecked(struct intel_display *display)
-{
- xe_pm_runtime_put(display_to_xe(display));
-}
-
-bool intel_display_rpm_suspended(struct intel_display *display)
-{
- struct xe_device *xe = display_to_xe(display);
-
- return pm_runtime_suspended(xe->drm.dev);
-}
-
-void assert_display_rpm_held(struct intel_display *display)
-{
- /* FIXME */
-}
-
-void intel_display_rpm_assert_block(struct intel_display *display)
-{
- /* FIXME */
-}
-
-void intel_display_rpm_assert_unblock(struct intel_display *display)
-{
- /* FIXME */
-}
-
static struct ref_tracker *xe_display_rpm_get(const struct drm_device *drm)
{
return xe_pm_runtime_resume_and_get(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 6/6] drm/xe/display: Use display parent interface for xe runtime pm
2025-10-24 9:31 ` [PATCH v2 6/6] drm/xe/display: Use display parent interface for xe " Jouni Högander
@ 2025-10-24 12:28 ` Jani Nikula
0 siblings, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2025-10-24 12:28 UTC (permalink / raw)
To: Jouni Högander, intel-gfx, intel-xe; +Cc: Jouni Högander
On Fri, 24 Oct 2025, Jouni Högander <jouni.hogander@intel.com> wrote:
> Start using display parent interface for xe runtime pm.
>
> v2: keep xe_display_rpm.c
>
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/xe/Makefile | 1 +
> drivers/gpu/drm/xe/display/xe_display_rpm.c | 65 ---------------------
> 2 files changed, 1 insertion(+), 65 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index 82c6b3d296769..a39caed9f3d35 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -256,6 +256,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
> i915-display/intel_display_power.o \
> i915-display/intel_display_power_map.o \
> i915-display/intel_display_power_well.o \
> + i915-display/intel_display_rpm.o \
> i915-display/intel_display_trace.o \
> i915-display/intel_display_wa.o \
> i915-display/intel_dkl_phy.o \
> diff --git a/drivers/gpu/drm/xe/display/xe_display_rpm.c b/drivers/gpu/drm/xe/display/xe_display_rpm.c
> index 72a351e26a008..977f1dafdde07 100644
> --- a/drivers/gpu/drm/xe/display/xe_display_rpm.c
> +++ b/drivers/gpu/drm/xe/display/xe_display_rpm.c
> @@ -9,71 +9,6 @@
> #include "xe_device_types.h"
> #include "xe_pm.h"
>
> -static struct xe_device *display_to_xe(struct intel_display *display)
> -{
> - return to_xe_device(display->drm);
> -}
> -
> -struct ref_tracker *intel_display_rpm_get_raw(struct intel_display *display)
> -{
> - return intel_display_rpm_get(display);
> -}
> -
> -void intel_display_rpm_put_raw(struct intel_display *display, struct ref_tracker *wakeref)
> -{
> - intel_display_rpm_put(display, wakeref);
> -}
> -
> -struct ref_tracker *intel_display_rpm_get(struct intel_display *display)
> -{
> - return xe_pm_runtime_resume_and_get(display_to_xe(display)) ? INTEL_WAKEREF_DEF : NULL;
> -}
> -
> -struct ref_tracker *intel_display_rpm_get_if_in_use(struct intel_display *display)
> -{
> - return xe_pm_runtime_get_if_in_use(display_to_xe(display)) ? INTEL_WAKEREF_DEF : NULL;
> -}
> -
> -struct ref_tracker *intel_display_rpm_get_noresume(struct intel_display *display)
> -{
> - xe_pm_runtime_get_noresume(display_to_xe(display));
> -
> - return INTEL_WAKEREF_DEF;
> -}
> -
> -void intel_display_rpm_put(struct intel_display *display, struct ref_tracker *wakeref)
> -{
> - if (wakeref)
> - xe_pm_runtime_put(display_to_xe(display));
> -}
> -
> -void intel_display_rpm_put_unchecked(struct intel_display *display)
> -{
> - xe_pm_runtime_put(display_to_xe(display));
> -}
> -
> -bool intel_display_rpm_suspended(struct intel_display *display)
> -{
> - struct xe_device *xe = display_to_xe(display);
> -
> - return pm_runtime_suspended(xe->drm.dev);
> -}
> -
> -void assert_display_rpm_held(struct intel_display *display)
> -{
> - /* FIXME */
> -}
> -
> -void intel_display_rpm_assert_block(struct intel_display *display)
> -{
> - /* FIXME */
> -}
> -
> -void intel_display_rpm_assert_unblock(struct intel_display *display)
> -{
> - /* FIXME */
> -}
> -
> static struct ref_tracker *xe_display_rpm_get(const struct drm_device *drm)
> {
> return xe_pm_runtime_resume_and_get(to_xe_device(drm)) ? INTEL_WAKEREF_DEF : NULL;
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 15+ messages in thread
* ✗ i915.CI.BAT: failure for Use display parent interface for runtime pm (rev2)
2025-10-24 9:31 [PATCH v2 0/6] Use display parent interface for runtime pm Jouni Högander
` (5 preceding siblings ...)
2025-10-24 9:31 ` [PATCH v2 6/6] drm/xe/display: Use display parent interface for xe " Jouni Högander
@ 2025-10-24 13:34 ` Patchwork
6 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2025-10-24 13:34 UTC (permalink / raw)
To: Jouni Högander; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 5082 bytes --]
== Series Details ==
Series: Use display parent interface for runtime pm (rev2)
URL : https://patchwork.freedesktop.org/series/156309/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_17421 -> Patchwork_156309v2
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with Patchwork_156309v2 absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in Patchwork_156309v2, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/index.html
Participating hosts (45 -> 44)
------------------------------
Missing (1): fi-snb-2520m
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in Patchwork_156309v2:
### IGT changes ###
#### Possible regressions ####
* igt@i915_selftest@live@workarounds:
- bat-arlh-3: [PASS][1] -> [INCOMPLETE][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-arlh-3/igt@i915_selftest@live@workarounds.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-arlh-3/igt@i915_selftest@live@workarounds.html
Known issues
------------
Here are the changes found in Patchwork_156309v2 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@dmabuf@all-tests:
- bat-apl-1: [PASS][3] -> [ABORT][4] ([i915#12904]) +1 other test abort
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-apl-1/igt@dmabuf@all-tests.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-apl-1/igt@dmabuf@all-tests.html
* igt@i915_selftest@live:
- bat-arlh-3: [PASS][5] -> [INCOMPLETE][6] ([i915#14764] / [i915#14818] / [i915#14837] / [i915#15175])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-arlh-3/igt@i915_selftest@live.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-arlh-3/igt@i915_selftest@live.html
* igt@i915_selftest@live@workarounds:
- bat-arlh-2: [PASS][7] -> [DMESG-FAIL][8] ([i915#12061]) +1 other test dmesg-fail
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-arlh-2/igt@i915_selftest@live@workarounds.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-arlh-2/igt@i915_selftest@live@workarounds.html
- bat-dg2-9: [PASS][9] -> [DMESG-FAIL][10] ([i915#12061]) +1 other test dmesg-fail
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-dg2-9/igt@i915_selftest@live@workarounds.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-dg2-9/igt@i915_selftest@live@workarounds.html
#### Possible fixes ####
* igt@i915_selftest@live@workarounds:
- bat-mtlp-9: [DMESG-FAIL][11] ([i915#12061]) -> [PASS][12] +1 other test pass
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
#### Warnings ####
* igt@i915_selftest@live:
- bat-atsm-1: [DMESG-FAIL][13] ([i915#12061] / [i915#13929]) -> [DMESG-FAIL][14] ([i915#12061] / [i915#14204])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-atsm-1/igt@i915_selftest@live.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-atsm-1/igt@i915_selftest@live.html
* igt@i915_selftest@live@mman:
- bat-atsm-1: [DMESG-FAIL][15] ([i915#13929]) -> [DMESG-FAIL][16] ([i915#14204])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17421/bat-atsm-1/igt@i915_selftest@live@mman.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/bat-atsm-1/igt@i915_selftest@live@mman.html
[i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
[i915#12904]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12904
[i915#13929]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13929
[i915#14204]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14204
[i915#14764]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14764
[i915#14818]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14818
[i915#14837]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14837
[i915#15175]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15175
Build changes
-------------
* Linux: CI_DRM_17421 -> Patchwork_156309v2
CI-20190529: 20190529
CI_DRM_17421: c840596036111afb71465977a49618cd19ca6e8b @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_8596: 8596
Patchwork_156309v2: c840596036111afb71465977a49618cd19ca6e8b @ git://anongit.freedesktop.org/gfx-ci/linux
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_156309v2/index.html
[-- Attachment #2: Type: text/html, Size: 6290 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread