mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
drm/bridge: synopsys: dw-hdmi-qp: Avoid enable hdcp when hdmi is disabled
If enable hdcp when hdmi is disabled, system will crash. Because hdmi regs can't be accessed when hdmi clk is disbaled. This patch fixes the following panic: Kernel panic - not syncing: Asynchronous SError Interrupt CPU: 7 PID: 2053 Comm: modetest Tainted: G O 6.1.75 #114 Hardware name: Rockchip RK3576 EVB1 V10 Board (DT) Call trace: dump_backtrace+0xf4/0x114 show_stack+0x18/0x24 dump_stack_lvl+0x6c/0x90 dump_stack+0x18/0x3c panic+0x14c/0x338 check_panic_on_warn+0x0/0x90 arm64_serror_panic+0x68/0x74 do_serror+0xc4/0xcc el1h_64_error_handler+0x34/0x48 el1h_64_error+0x78/0x7c regmap_mmio_read32le+0x10/0x20 _regmap_bus_reg_read+0x28/0x34 _regmap_read+0x18c/0x240 regmap_read+0x54/0x78 hdmi_readl+0x2c/0x58 dw_hdcp_qp_hdcp_start+0x10c/0x394 dw_hdmi_qp_hdcp_enable+0xd0/0x194 dw_hdmi_connector_atomic_commit+0x9c/0xc4 rockchip_drm_atomic_helper_commit_tail_rpm+0x220/0x2d8 commit_tail+0xa4/0x154 drm_atomic_helper_commit+0x1c4/0x1e4 drm_atomic_commit+0xa4/0xd0 drm_mode_obj_set_property_ioctl+0x140/0x474 drm_ioctl_kernel+0x80/0xf8 drm_ioctl+0x2d4/0x554 __arm64_sys_ioctl+0x90/0xc8 invoke_syscall+0x40/0x104 el0_svc_common+0xbc/0x168 do_el0_svc+0x1c/0x28 el0_svc+0x1c/0x68 el0t_64_sync_handler+0x68/0xb4 el0t_64_sync+0x164/0x168 Change-Id: I2ca288bf192f51ab14d1e369fe0a472e84508379 Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
This commit is contained in:
@@ -3057,12 +3057,13 @@ static void set_dw_hdmi_hdcp_enable(struct dw_hdmi_qp *hdmi,
|
||||
old_cp = old_state->content_protection;
|
||||
new_cp = new_state->content_protection;
|
||||
|
||||
DRM_DEV_DEBUG_DRIVER(hdmi->dev, "old cp:%llu new cp:%llu\n", old_cp, new_cp);
|
||||
if (old_cp != new_cp) {
|
||||
if (new_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
|
||||
old_cp == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
|
||||
dw_hdmi_qp_hdcp_enable(hdmi, new_state);
|
||||
else if (new_cp == DRM_MODE_CONTENT_PROTECTION_UNDESIRED &&
|
||||
old_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED)
|
||||
old_cp != DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
|
||||
dw_hdmi_qp_hdcp_disable(hdmi, new_state);
|
||||
}
|
||||
}
|
||||
@@ -3227,7 +3228,8 @@ static void dw_hdmi_connector_atomic_commit(struct drm_connector *connector,
|
||||
hdmi->update = false;
|
||||
}
|
||||
|
||||
set_dw_hdmi_hdcp_enable(hdmi, connector, state);
|
||||
if (!hdmi->disabled)
|
||||
set_dw_hdmi_hdcp_enable(hdmi, connector, state);
|
||||
}
|
||||
|
||||
void dw_hdmi_qp_set_output_type(struct dw_hdmi_qp *hdmi, u64 val)
|
||||
|
||||
Reference in New Issue
Block a user