Hi Marek, On 11/21/19 7:11 PM, Marek Szyprowski wrote: > All top clocks on G3D path has to be enabled all the time to allow proper > G3D power domain operation. This is achieved by adding CRITICAL flag to > "mout_sw_aclk_g3d" clock, what keeps this clock and all its parents > enabled. > > This fixes following imprecise abort issue observed on Odroid XU3/XU4 > after enabling Panfrost driver by commit 1a5a85c56402 "ARM: dts: exynos: > Add Mali/GPU node on Exynos5420 and enable it on Odroid XU3/4"): > > panfrost 11800000.gpu: clock rate = 400000000 > panfrost 11800000.gpu: failed to get regulator: -517 > panfrost 11800000.gpu: regulator init failed -517 > Power domain G3D disable failed > ... > panfrost 11800000.gpu: clock rate = 400000000 > 8<--- cut here --- > Unhandled fault: imprecise external abort (0x1406) at 0x00000000 > pgd = (ptrval) > [00000000] *pgd=00000000 > Internal error: : 1406 [#1] PREEMPT SMP ARM > Modules linked in: > CPU: 7 PID: 53 Comm: kworker/7:1 Not tainted 5.4.0-rc8-next-20191119-00032-g56f1001191a6 #6923 > Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) > Workqueue: events deferred_probe_work_func > PC is at panfrost_gpu_soft_reset+0x94/0x110 > LR is at ___might_sleep+0x128/0x2dc > ... > [<c05c231c>] (panfrost_gpu_soft_reset) from [<c05c2704>] (panfrost_gpu_init+0x10/0x67c) > [<c05c2704>] (panfrost_gpu_init) from [<c05c15d0>] (panfrost_device_init+0x158/0x2cc) > [<c05c15d0>] (panfrost_device_init) from [<c05c0cb0>] (panfrost_probe+0x80/0x178) > [<c05c0cb0>] (panfrost_probe) from [<c05cfaa0>] (platform_drv_probe+0x48/0x9c) > [<c05cfaa0>] (platform_drv_probe) from [<c05cd20c>] (really_probe+0x1c4/0x474) > [<c05cd20c>] (really_probe) from [<c05cd694>] (driver_probe_device+0x78/0x1bc) > [<c05cd694>] (driver_probe_device) from [<c05cb374>] (bus_for_each_drv+0x74/0xb8) > [<c05cb374>] (bus_for_each_drv) from [<c05ccfa8>] (__device_attach+0xd4/0x16c) > [<c05ccfa8>] (__device_attach) from [<c05cc110>] (bus_probe_device+0x88/0x90) > [<c05cc110>] (bus_probe_device) from [<c05cc634>] (deferred_probe_work_func+0x4c/0xd0) > [<c05cc634>] (deferred_probe_work_func) from [<c0149df0>] (process_one_work+0x300/0x864) > [<c0149df0>] (process_one_work) from [<c014a3ac>] (worker_thread+0x58/0x5a0) > [<c014a3ac>] (worker_thread) from [<c0151174>] (kthread+0x12c/0x160) > [<c0151174>] (kthread) from [<c01010b4>] (ret_from_fork+0x14/0x20) > Exception stack(0xee03dfb0 to 0xee03dff8) > ... > Code: e594300c e5933020 e3130c01 1a00000f (ebefff50). > ---[ end trace badde2b74a65a540 ]--- > > In the above case, the Panfrost driver disables G3D clocks after failure > of getting the needed regulator and return with -EPROVE_DEFER code. This > causes G3D power domain disable failure and then, during second probe > an imprecise abort is triggered due to undefined power domain state. > > Fixes: 45f10dabb56b ("clk: samsung: exynos5420: Add SET_RATE_PARENT flag to clocks on G3D path") > Fixes: c9f7567aff31 ("clk: samsung: exynos542x: Move G3D subsystem clocks to its sub-CMU") > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > drivers/clk/samsung/clk-exynos5420.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c > index 3a991ca1ee36..89126ba66995 100644 > --- a/drivers/clk/samsung/clk-exynos5420.c > +++ b/drivers/clk/samsung/clk-exynos5420.c > @@ -712,7 +712,7 @@ static const struct samsung_mux_clock exynos5x_mux_clks[] __initconst = { > MUX(0, "mout_sw_aclk266_g2d", mout_sw_aclk266_g2d_p, > SRC_TOP12, 12, 1), > MUX_F(0, "mout_sw_aclk_g3d", mout_sw_aclk_g3d_p, SRC_TOP12, 16, 1, > - CLK_SET_RATE_PARENT, 0), > + CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 0), > MUX(0, "mout_sw_aclk300_jpeg", mout_sw_aclk300_jpeg_p, > SRC_TOP12, 20, 1), > MUX(CLK_MOUT_SW_ACLK300, "mout_sw_aclk300_disp1", > Acked-by: Chanwoo Choi <cw00.choi@xxxxxxxxxxx> -- Best Regards, Chanwoo Choi Samsung Electronics