On Tue, 09 Dec 2025, Dibin Moolakadan Subrahmanian
<[email protected]> wrote:
> Introduce a bitmask enum intel_dc3co_source to record which display
> features (PSR2, ALPM, LOBF) contribute to allowing DC3CO entry.
> The source tracking is added here and will be integrated into the DC3CO
> allow logic in follow-up commits.
> Signed-off-by: Dibin Moolakadan Subrahmanian
> <[email protected]>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 11 +++++++++++
> drivers/gpu/drm/i915/display/intel_display.h | 4 +++-
> drivers/gpu/drm/i915/display/intel_display_core.h | 1 +
> drivers/gpu/drm/i915/display/intel_display_power.h | 10 ++++++++++
> 4 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 205f55a87736..b14a1c9f80bd 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -6300,6 +6300,16 @@ bool intel_dc3co_allowed(struct intel_display *display)
> return display->power.dc3co_allow;
> }
>
> +void intel_dc3co_source_set(struct intel_display *display, enum
> intel_dc3co_source source)
> +{
> + display->power.dc3co_source |= source;
> +}
> +
> +void intel_dc3co_source_unset(struct intel_display *display, enum
> intel_dc3co_source source)
> +{
> + display->power.dc3co_source &= ~source;
> +}
> +
These don't belong in intel_display.[ch].
> static bool intel_dc3co_port_pipe_compatible(struct intel_dp *intel_dp,
> const struct intel_crtc_state
> *crtc_state)
> {
> @@ -6330,6 +6340,7 @@ static void intel_dc3co_allow_check(struct
> intel_atomic_state *state)
> bool allow = true;
>
> display->power.dc3co_allow = 0;
> + intel_dc3co_source_unset(display, DC3CO_SOURCE_ALL);
>
> if ((power_domains->allowed_dc_mask & DC_STATE_EN_UPTO_DC3CO) !=
> DC_STATE_EN_UPTO_DC3CO)
> return;
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> b/drivers/gpu/drm/i915/display/intel_display.h
> index 97987f082560..87bbf1f66209 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -46,6 +46,7 @@ struct intel_link_m_n;
> struct intel_plane;
> struct intel_plane_state;
> struct intel_power_domain_mask;
> +enum intel_dc3co_source;
>
> #define pipe_name(p) ((p) + 'A')
>
> @@ -561,5 +562,6 @@ bool assert_port_valid(struct intel_display *display,
> enum port port);
> bool intel_scanout_needs_vtd_wa(struct intel_display *display);
> int intel_crtc_num_joined_pipes(const struct intel_crtc_state *crtc_state);
> bool intel_dc3co_allowed(struct intel_display *display);
> -
> +void intel_dc3co_source_set(struct intel_display *display, enum
> intel_dc3co_source source);
> +void intel_dc3co_source_unset(struct intel_display *display, enum
> intel_dc3co_source source);
> #endif
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> b/drivers/gpu/drm/i915/display/intel_display_core.h
> index fa567c95029c..4ce34c567dbd 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -541,6 +541,7 @@ struct intel_display {
>
> /* mark dc3co entry is allowed*/
> bool dc3co_allow;
> + u32 dc3co_source;
> } power;
>
> struct {
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h
> b/drivers/gpu/drm/i915/display/intel_display_power.h
> index d616d5d09cbe..dde07f931963 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> @@ -131,6 +131,16 @@ struct intel_power_domain_mask {
> DECLARE_BITMAP(bits, POWER_DOMAIN_NUM);
> };
>
> +enum intel_dc3co_source {
> + DC3CO_SOURCE_NONE = 0,
> + DC3CO_SOURCE_PSR2 = BIT(0),
> + DC3CO_SOURCE_ALPM = BIT(1),
> + DC3CO_SOURCE_LOBF = BIT(2),
> + DC3CO_SOURCE_ALL = DC3CO_SOURCE_PSR2 |
> + DC3CO_SOURCE_ALPM |
> + DC3CO_SOURCE_LOBF,
> +};
> +
> struct i915_power_domains {
> /*
> * Power wells needed for initialization at driver init and suspend
--
Jani Nikula, Intel