Re: kexec on rk3399
From: Felipe Balbi <balbi@kernel.org>
Date: 2019-08-15 06:00:22
Also in:
linux-rockchip, linux-usb, lkml
Hi, Vicente Bergas [off-list ref] writes:
quoted hunk ↗ jump to hunk
quoted
Vicente Bergas [off-list ref] writes:quoted
On Monday, July 22, 2019 4:31:27 PM CEST, Vicente Bergas wrote:quoted
Hi, i have been running linux on rk3399 booted with kexec fine until 5.2 From 5.2 onwards, there are memory corruption issues as reported here: http://lkml.iu.edu/hypermail/linux/kernel/1906.2/07211.html kexec has been identified as the principal reason for the issues. It turns out that kexec has never worked reliably on this platform, ...Thank you all for your suggestions on where the issue could be. It seems that it was the USB driver. Now using v5.2.8 booted with kexec from v5.2.8 with a workaround and so far so good. It is being tested on the Sapphire board. The workaround is:--- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c@@ -133,6 +133,13 @@ return 0; } +static void dwc3_of_simple_shutdown(struct platform_device *pdev) +{ + struct dwc3_of_simple *simple = platform_get_drvdata(pdev); + + reset_control_assert(simple->resets); +} + static int __maybe_unused dwc3_of_simple_runtime_suspend(struct device*dev) { struct dwc3_of_simple *simple = dev_get_drvdata(dev);@@ -190,6 +197,7 @@ static struct platform_driver dwc3_of_simple_driver = { .probe = dwc3_of_simple_probe, .remove = dwc3_of_simple_remove, + .shutdown = dwc3_of_simple_shutdown, .driver = { .name = "dwc3-of-simple", .of_match_table = of_dwc3_simple_match,If this patch is OK after review i can resubmit it as a pull request.not a pull request, just send a patch using git send-emailquoted
Should a similar change be applied to drivers/usb/dwc3/core.c ?Is it necessary? We haven't had any bug reports regarding that. Also, if we have reset control support in the core driver, why do we need it in of_simple? Seems like of_simple could just rely on what core does.the workaround has been tested patching only core.c with--- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c@@ -1561,6 +1561,13 @@ return 0; } +static void dwc3_shutdown(struct platform_device *pdev) +{ + struct dwc3 *dwc = platform_get_drvdata(pdev); + + reset_control_assert(dwc->reset); +} + #ifdef CONFIG_PM static int dwc3_core_init_for_resume(struct dwc3 *dwc) {@@ -1866,6 +1873,7 @@ static struct platform_driver dwc3_driver = { .probe = dwc3_probe, .remove = dwc3_remove, + .shutdown = dwc3_shutdown, .driver = { .name = "dwc3", .of_match_table = of_match_ptr(of_dwc3_match),and leaving dwc3-of-simple.c as is, the issue persisted.
That's because your reset controller is not passed to dwc3 core, only to your glue layer. -- balbi _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel