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
