Commit d4759903 authored by Dom Cobley's avatar Dom Cobley Committed by Liu Chuang
Browse files

drm/vc4: hdmi: Avoid hang with debug registers when suspended

stable inclusion
from stable-v6.6.64
commit c7d474974954d9af7e0092021223d58f2de128df
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBEDP5
CVE: CVE-2024-56683

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=c7d474974954d9af7e0092021223d58f2de128df



--------------------------------

[ Upstream commit 223ee2567a55e4f80315c768d2969e6a3b9fb23d ]

Trying to read /sys/kernel/debug/dri/1/hdmi1_regs
when the hdmi is disconnected results in a fatal system hang.

This is due to the pm suspend code disabling the dvp clock.
That is just a gate of the 108MHz clock in DVP_HT_RPI_MISC_CONFIG,
which results in accesses hanging AXI bus.

Protect against this.

Fixes: 25eb441d ("drm/vc4: hdmi: Add all the vc5 HDMI registers into the debugfs dumps")
Signed-off-by: default avatarDom Cobley <popcornmix@gmail.com>
Reviewed-by: default avatarMaxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240621152055.4180873-17-dave.stevenson@raspberrypi.com


Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarLiu Chuang <liuchuang40@huawei.com>
parent c2f1662c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -179,6 +179,8 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)
	if (!drm_dev_enter(drm, &idx))
		return -ENODEV;

	WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev));

	drm_print_regset32(&p, &vc4_hdmi->hdmi_regset);
	drm_print_regset32(&p, &vc4_hdmi->hd_regset);
	drm_print_regset32(&p, &vc4_hdmi->cec_regset);
@@ -188,6 +190,8 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)
	drm_print_regset32(&p, &vc4_hdmi->ram_regset);
	drm_print_regset32(&p, &vc4_hdmi->rm_regset);

	pm_runtime_put(&vc4_hdmi->pdev->dev);

	drm_dev_exit(idx);

	return 0;