drm/rockchip: tve: Fix shutdown panic when no bind

Unable to handle kernel access to user memory outside uaccess routines at virtual address 0000000000000830
Mem abort info:
  ESR = 0x96000005
  Exception class = DABT (current EL), IL = 32 bits
  SET = 0, FnV = 0
  EA = 0, S1PTW = 0
Data abort info:
  ISV = 0, ISS = 0x00000005
  CM = 0, WnR = 0
user pgtable: 4k pages, 39-bit VAs, pgdp = 00000000aaff8145
[0000000000000830] pgd=000000007a5c9003, pud=000000007a5c9003, pmd=0000000000000000
Internal error: Oops: 96000005 [#1] PREEMPT SMP
Modules linked in:
Process init (pid: 1, stack limit = 0x00000000722656e6)
CPU: 3 PID: 1 Comm: init Not tainted 4.19.232 #72
Hardware name: Rockchip RK3528 EVB1 DDR4 V10 Board (DT)
pstate: 60400005 (nZCv daif +PAN -UAO)
pc : __ll_sc___cmpxchg_case_acq_8+0x4/0x20
lr : mutex_lock+0x18/0x40
sp : ffffff800802bc60
x29: ffffff800802bc60 x28: ffffffc07c8e0000
x27: 0000000000000000 x26: 0000000000000000
x25: ffffff8009510d78 x24: ffffff8009cde040
x23: ffffffc07c9e3890 x22: ffffff8009d89000
x21: ffffff8009b73b30 x20: 0000000000000000
x19: 0000000000000830 x18: ffffffffffffffff
x17: 0000000000000000 x16: 0000000000000002
x15: ffffff80095ed278 x14: ffffff8089ce4196
x13: ffffff8009ce41b0 x12: ffffff8009ce45d0
x11: ffffff8009adf3b8 x10: 0000000005f5e0ff
x9 : 00000000ffffffd0 x8 : 6873203a73756c70
x7 : 0000000000000058 x6 : 0000000000000001
x5 : 0000000000000005 x4 : 0000000000000004
x3 : 0000000000000830 x2 : ffffffc07c8e0000
x1 : 0000000000000000 x0 : 0000000000000830
Call trace:
 __ll_sc___cmpxchg_case_acq_8+0x4/0x20
 rockchip_tve_shutdown+0x1c/0x38
 platform_drv_shutdown+0x20/0x30
 device_shutdown+0x118/0x200
 kernel_restart_prepare+0x34/0x40
 kernel_restart+0x14/0x78
 __se_sys_reboot+0x1cc/0x208
 __arm64_sys_reboot+0x18/0x20
 el0_svc_common.constprop.0+0x64/0x178
 el0_svc_handler+0x28/0x78
 el0_svc+0x8/0xc

Signed-off-by: Tao Huang <huangtao@rock-chips.com>
Change-Id: Ic1e85b963548e5e66ef78fae5af8dcc12e928fa2
This commit is contained in:
Tao Huang
2022-11-30 18:06:00 +08:00
parent 9368d30479
commit ea5fb26011

View File

@@ -483,7 +483,6 @@ static int rockchip_tve_bind(struct device *dev, struct device *master,
}
tve->enable = 0;
platform_set_drvdata(pdev, tve);
tve->drm_dev = drm_dev;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
tve->reg_phy_base = res->start;
@@ -544,6 +543,7 @@ static int rockchip_tve_bind(struct device *dev, struct device *master,
rockchip_drm_register_sub_dev(&tve->sub_dev);
pm_runtime_enable(dev);
dev_set_drvdata(dev, tve);
dev_dbg(tve->dev, "%s tv encoder probe ok\n", match->compatible);
return 0;
@@ -567,6 +567,7 @@ static void rockchip_tve_unbind(struct device *dev, struct device *master,
drm_encoder_cleanup(&tve->encoder);
pm_runtime_disable(dev);
dev_set_drvdata(dev, NULL);
}
static const struct component_ops rockchip_tve_component_ops = {
@@ -585,6 +586,9 @@ static void rockchip_tve_shutdown(struct platform_device *pdev)
{
struct rockchip_tve *tve = dev_get_drvdata(&pdev->dev);
if (!tve)
return;
mutex_lock(&tve->suspend_lock);
dev_dbg(tve->dev, "tve shutdown\n");