From: dirk.behme@de•bosch.com (Dirk Behme)
To: linux-arm-kernel@lists•infradead.org
Subject: imx6q restart is broken
Date: Wed, 8 Aug 2012 12:53:59 +0200 [thread overview]
Message-ID: <50224547.9020000@de.bosch.com> (raw)
In-Reply-To: <20120808101817.GA14718@S2101-09.ap.freescale.net>
On 08.08.2012 12:18, Shawn Guo wrote:
> Thanks Dirk for reporting that imx6q restart (reboot command) is broken.
>
> I tracked down the issue a little bit and found imx6q_restart hangs
> on the of_iomap/ioremap call. The following change, moving the call
> somewhere else than imx6q_restart, will just fix the problem.
>
> Does that mean ioremap call is not allowed in platform restart hook?
> I'm not sure about that, because I found it works just fine if I build
> imx_v6_v7_defconfig with V6 (imx3) platforms excluded (IOW, build a V7
> only kernel - imx5 and imx6), which is the case how I tested imx6q
> restart feature when I was adding it.
>
> To summarize, the imx6q_restart hangs at ioremap call on a V6 + V7
> kernel, while it works fine on a V7 only image. I need some help to
> understand that.
Some additional information from my debugging:
a) Having a JTAG debugger attached to the i.MX6 SabreLite board I use
(kernel built with imx_v6_v7_defconfig) the reboot does work. No hang.
This does mean I can't debug the reboot hang with a JTAG debugger.
Therefore I added some printk debugging:
b) Adding some printk statements [1] in the of_iomap/ioremap call, it
looks to me that the system hangs in
of_iomap() -> ... -> set_pte_at() -> set_pte_ext() /
cpu_v7_set_pte_ext() <= hang
On our system, set_pte_ext() is translated to cpu_v7_set_pte_ext() in
proc-v7-2level.S.
As cpu_v7_set_pte_ext() is assembly, I can't add additional printk's,
and JTAG doesn't work, so I don't have more details@the moment.
From this it looks like that cpu_v7_set_pte_ext() hangs if called from
within machine_restart() after machine_shutdown() was called (?).
Best regards
Dirk
[1] To be able to add some printk's to set_pte_at() which is a inline
function in pgtable.h, I copied this to ioremap.c:
--- a/lib/ioremap.c
+++ b/lib/ioremap.c
@@ -13,6 +13,19 @@
#include <asm/cacheflush.h>
#include <asm/pgtable.h>
+void set_pte_debug(struct mm_struct *mm, unsigned long addr,
+ pte_t *ptep, pte_t pteval)
+{
+ if (addr >= TASK_SIZE) {
+ printk("=> set_pte_debug #1\n");
+ set_pte_ext(ptep, pteval, 0);
+ printk("=> set_pte_debug #2\n");
+ } else {
+ __sync_icache_dcache(pteval);
+ set_pte_ext(ptep, pteval, PTE_EXT_NG);
+ }
+}
+
static int ioremap_pte_range(pmd_t *pmd, unsigned long addr,
unsigned long end, phys_addr_t phys_addr, pgprot_t prot)
{
@@ -25,7 +38,7 @@ static int ioremap_pte_range(pmd_t *pmd, unsigned long
addr,
return -ENOMEM;
do {
BUG_ON(!pte_none(*pte));
- set_pte_at(&init_mm, addr, pte, pfn_pte(pfn, prot));
+ set_pte_debug(&init_mm, addr, pte, pfn_pte(pfn, prot));
pfn++;
} while (pte++, addr += PAGE_SIZE, addr != end);
return 0;
With this I get:
# reboot -f
Restarting system.
=> set_pte_debug #1
-- no further output, hang, 'set_pte_debug #2' missing
> --8<---
>
> diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
> index 5ec0608..01e7489 100644
> --- a/arch/arm/mach-imx/mach-imx6q.c
> +++ b/arch/arm/mach-imx/mach-imx6q.c
> @@ -37,14 +37,10 @@
> #include <mach/cpuidle.h>
> #include <mach/hardware.h>
>
> +static void __iomem *wdog_base;
>
> void imx6q_restart(char mode, const char *cmd)
> {
> - struct device_node *np;
> - void __iomem *wdog_base;
> -
> - np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-wdt");
> - wdog_base = of_iomap(np, 0);
> if (!wdog_base)
> goto soft;
>
> @@ -159,6 +155,11 @@ static void __init imx6q_usb_init(void)
>
> static void __init imx6q_init_machine(void)
> {
> + struct device_node *np;
> +
> + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-wdt");
> + wdog_base = of_iomap(np, 0);
> +
> /*
> * This should be removed when all imx6q boards have pinctrl
> * states for devices defined in device tree.
next prev parent reply other threads:[~2012-08-08 10:53 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-08 10:18 imx6q restart is broken Shawn Guo
2012-08-08 10:53 ` Dirk Behme [this message]
2012-08-09 3:18 ` Hui Wang
2012-08-09 4:41 ` Shawn Guo
2012-08-09 6:32 ` Sascha Hauer
2012-08-09 8:06 ` Catalin Marinas
2012-08-09 8:18 ` Shawn Guo
2012-08-09 9:20 ` Russell King - ARM Linux
2012-08-09 12:01 ` Shawn Guo
2012-08-09 12:22 ` Shawn Guo
2012-08-09 13:57 ` Russell King - ARM Linux
2012-08-09 14:01 ` Russell King - ARM Linux
2012-08-09 14:24 ` Shawn Guo
2012-08-09 19:03 ` Matt Sealey
2012-08-09 21:07 ` Russell King - ARM Linux
2012-08-10 13:33 ` Matt Sealey
2012-08-10 13:53 ` Russell King - ARM Linux
2012-08-15 15:07 ` Rob Herring
2012-08-15 21:44 ` Russell King - ARM Linux
2012-08-16 2:31 ` Shawn Guo
2012-08-16 17:21 ` Matt Sealey
2012-08-16 22:34 ` Russell King - ARM Linux
2012-08-17 3:48 ` Shawn Guo
2012-08-17 8:11 ` Hui Wang
2012-08-19 15:26 ` Shawn Guo
2012-08-16 8:41 ` Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50224547.9020000@de.bosch.com \
--to=dirk.behme@de$(echo .)bosch.com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox