summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-07-02 15:09:50 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2019-07-03 10:09:58 +0100
commit8e9ecb3e1e3366559cd4ed5ab698c391f8236a37 (patch)
tree7745a5fdeeb71b4702896107a80289dc39b380a9 /drivers/gpu/drm/i915/display/intel_dpll_mgr.c
parent315ca4c408ed3bcfe3a204fec9f5c397a98e97a0 (diff)
drm/i915/display: Handle lost primary_port across suspend
icl-dsi is dying on suspend/resume at RIP: 0010:icl_update_active_dpll+0x2c/0xa0 [i915] which appears due to the loss of the time primary_port across suspend. Protect against the potential NULL dereference by assuming ICL_PORT_DPLL_DEFAULT unless the port is actively specified otherwise. Fixes: 24a7bfe0c2d7 ("drm/i915: Keep the TypeC port mode fixed when the port is active") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190702140950.7069-1-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_dpll_mgr.c')
-rw-r--r--drivers/gpu/drm/i915/display/intel_dpll_mgr.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
index 76a2c879efc2..f953971e7c3b 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
@@ -2883,21 +2883,16 @@ static void icl_update_active_dpll(struct intel_atomic_state *state,
struct intel_crtc_state *crtc_state =
intel_atomic_get_new_crtc_state(state, crtc);
struct intel_digital_port *primary_port;
- enum icl_port_dpll_id port_dpll_id;
+ enum icl_port_dpll_id port_dpll_id = ICL_PORT_DPLL_DEFAULT;
primary_port = encoder->type == INTEL_OUTPUT_DP_MST ?
enc_to_mst(&encoder->base)->primary :
enc_to_dig_port(&encoder->base);
- switch (primary_port->tc_mode) {
- case TC_PORT_TBT_ALT:
- port_dpll_id = ICL_PORT_DPLL_DEFAULT;
- break;
- case TC_PORT_DP_ALT:
- case TC_PORT_LEGACY:
+ if (primary_port &&
+ (primary_port->tc_mode == TC_PORT_DP_ALT ||
+ primary_port->tc_mode == TC_PORT_LEGACY))
port_dpll_id = ICL_PORT_DPLL_MG_PHY;
- break;
- }
icl_set_active_port_dpll(crtc_state, port_dpll_id);
}