On Fri, 24 Oct 2025, Jouni Högander <[email protected]> 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 <[email protected]>
> ---
> 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