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:
Algea Cao
2024-08-12 16:01:29 +08:00
committed by Tao Huang
parent f6253df6f9
commit 5f25916775

View File

@@ -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)