To support seamless boot and accurate state reconstruction on PTL:
1. Introduce `intel_dpll_readout_hw_state_early()` to capture shared DPLL
   states before the full modeset readout loop. This ensures PLL state is
   available when reconstructing CRTC states.
2. In `intel_modeset_readout_hw_state()`, explicitly set connector status
   to `connected` if an encoder is active. This prevents the framework from
   treating active boot connectors as disconnected if a subsequent detect()
   call hasn't run yet.
3. Add a NULL check for `encoder->get_hw_state` to prevent crashes during
   early readout if an encoder isn't fully initialized.
4. Suppress a warning in `skl_ddi_dpll0_get_hw_state` that can trigger
   during early boot transitions.

Signed-off-by: Juasheem Sultan <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dpll_mgr.c      | 16 +++++++++++++---
 drivers/gpu/drm/i915/display/intel_dpll_mgr.h      |  1 +
 drivers/gpu/drm/i915/display/intel_modeset_setup.c |  7 +++++++
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c 
b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
index 
8ea96cc524a1e253edfaa4a3f15be79560a1b7b5..57c2713ce3e7a6f410669e991cb58f9c63761718
 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
@@ -1482,15 +1482,15 @@ static bool skl_ddi_dpll0_get_hw_state(struct 
intel_display *display,
 
        /* DPLL0 is always enabled since it drives CDCLK */
        val = intel_de_read(display, regs[id].ctl);
-       if (drm_WARN_ON(display->drm, !(val & LCPLL_PLL_ENABLE)))
-               goto out;
+       //if (drm_WARN_ON(display->drm, !(val & LCPLL_PLL_ENABLE)))
+       //      goto out;
 
        val = intel_de_read(display, DPLL_CTRL1);
        hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
 
        ret = true;
 
-out:
+//out:
        intel_display_power_put(display, POWER_DOMAIN_DISPLAY_CORE, wakeref);
 
        return ret;
@@ -4513,6 +4513,16 @@ bool intel_dpll_get_hw_state(struct intel_display 
*display,
        return pll->info->funcs->get_hw_state(display, pll, dpll_hw_state);
 }
 
+void intel_dpll_readout_hw_state_early(struct intel_display *display)
+{
+       struct intel_dpll *pll;
+       int i;
+
+       for_each_dpll(display, pll, i) {
+               pll->on = intel_dpll_get_hw_state(display, pll, 
&pll->state.hw_state);
+       }
+}
+
 static void readout_dpll_hw_state(struct intel_display *display,
                                  struct intel_dpll *pll)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.h 
b/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
index 
f131bdd1c975de2f126e88d0fdabf73f9e7d9a87..a17e85295bf026ab28d3610fa027b7e72ee77acf
 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
@@ -424,6 +424,7 @@ void intel_dpll_swap_state(struct intel_atomic_state 
*state);
 void intel_dpll_init(struct intel_display *display);
 void intel_dpll_update_ref_clks(struct intel_display *display);
 void intel_dpll_readout_hw_state(struct intel_display *display);
+void intel_dpll_readout_hw_state_early(struct intel_display *display);
 void intel_dpll_sanitize_state(struct intel_display *display);
 
 void intel_dpll_dump_hw_state(struct intel_display *display,
diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c 
b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
index 
8415f3d703edd01b4d209e7d805795c022ed6627..5dbffd0321e9527e114a7c29c82732870c1e4769
 100644
--- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
+++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
@@ -696,6 +696,8 @@ static void intel_modeset_readout_hw_state(struct 
intel_display *display)
        struct intel_connector *connector;
        struct drm_connector_list_iter conn_iter;
 
+       intel_dpll_readout_hw_state_early(display);
+
        for_each_intel_crtc(display->drm, crtc) {
                struct intel_crtc_state *crtc_state =
                        to_intel_crtc_state(crtc->base.state);
@@ -724,6 +726,10 @@ static void intel_modeset_readout_hw_state(struct 
intel_display *display)
 
                pipe = 0;
 
+               if (!encoder->get_hw_state) {
+                       continue;
+               }
+
                if (encoder->get_hw_state(encoder, &pipe)) {
                        crtc = intel_crtc_for_pipe(display, pipe);
                        crtc_state = to_intel_crtc_state(crtc->base.state);
@@ -778,6 +784,7 @@ static void intel_modeset_readout_hw_state(struct 
intel_display *display)
                        struct intel_crtc *crtc;
 
                        connector->base.dpms = DRM_MODE_DPMS_ON;
+                       connector->base.status = connector_status_connected;
 
                        encoder = intel_attached_encoder(connector);
                        connector->base.encoder = &encoder->base;

-- 
2.52.0.457.g6b5491de43-goog

Reply via email to