Re: gpmc_cs_request() causes early boot hang

From: Mark Jackson
Date: Mon Sep 24 2012 - 06:51:36 EST


On 24/09/12 05:51, Mohammed, Afzal wrote:
>
> It seems you are using PSP Kernel.
>
> Invoking omap_init_gpmc before gpmc request should help.

Okay ... I'm now using earlyprintk and omap_init_gpmc(), but I still get boot hangs.

My test code is as follows:-

diff --git a/arch/arm/mach-omap2/board-am335xevm.c b/arch/arm/mach-omap2/board-am335xevm.c
index dc62ba2..be47e4f 100644
--- a/arch/arm/mach-omap2/board-am335xevm.c
+++ b/arch/arm/mach-omap2/board-am335xevm.c
@@ -4295,6 +4295,20 @@ static void __init am33xx_cpuidle_init(void)

}

+static void gpmc_test(void)
+{
+ unsigned long base = 0x12345678;
+
+ struct gpmc_devices_info gpmc_device[2] = {
+ { NULL, GPMC_DEVICE_NOR },
+ };
+
+ setup_pin_mux(gpmc_pin_mux);
+ omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
+ gpmc_cs_request(0, SZ_16M, &base);
+ printk(KERN_INFO "gpmc base @ 0x%08lx\n", base);
+}
+
static void __init am335x_evm_init(void)
{
am33xx_cpuidle_init();
@@ -4313,6 +4327,8 @@ static void __init am335x_evm_init(void)
/* Create an alias for gfx/sgx clock */
if (clk_add_alias("sgx_ck", NULL, "gfx_fclk", NULL))
pr_warn("failed to create an alias: gfx_fclk --> sgx_ck\n");
+
+ gpmc_test();
}

static void __init am335x_evm_map_io(void)

----

But this then fails with the following boot log:-

Uncompressing Linux... done, booting the kernel.
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.2.28+ (mpfj@mpfj-nanobone) (gcc version 4.5.4 (Buildroot
2012.08-git-00388-g7019407) ) #127 Mon Sep 24 11:27:18 BST 2012
[ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=50c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] Machine: am335xevm
[ 0.000000] bootconsole [earlycon0] enabled
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] On node 0 totalpages: 65536
[ 0.000000] free_area_init_node: node 0, pgdat c044ca14, node_mem_map c04b1000
[ 0.000000] Normal zone: 512 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 65024 pages, LIFO batch:15
[ 0.000000] AM335X ES1.0 (sgx neon )
[ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[ 0.000000] pcpu-alloc: [0] 0
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024
[ 0.000000] Kernel command line: console=ttyO0,115200n8 earlyprintk debug root=/dev/mmcblk0p2 ro
rootfstype=ext2 rootwait ip=none
[ 0.000000] PID hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.000000] Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
[ 0.000000] Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Memory: 256MB = 256MB total
[ 0.000000] Memory: 255052k/255052k available, 7092k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xd0800000 - 0xff000000 ( 744 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xd0000000 ( 256 MB)
[ 0.000000] modules : 0xbf800000 - 0xc0000000 ( 8 MB)
[ 0.000000] .text : 0xc0008000 - 0xc03de0ec (3929 kB)
[ 0.000000] .init : 0xc03df000 - 0xc0404000 ( 148 kB)
[ 0.000000] .data : 0xc0404000 - 0xc044dd58 ( 296 kB)
[ 0.000000] .bss : 0xc044dd7c - 0xc04b0694 ( 395 kB)
[ 0.000000] NR_IRQS:396 nr_irqs:396 396
[ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[ 0.000000] Total of 128 interrupts on 1 active controller
[ 0.000000] OMAP clockevent source: GPTIMER2 at 24000000 Hz
[ 0.000000] OMAP clocksource: GPTIMER1 at 32768 Hz
[ 0.000000] sched_clock: 32 bits at 32kHz, resolution 30517ns, wraps every 131071999ms
[ 0.000000] Console: colour dummy device 80x30
[ 0.004943] Calibrating delay loop... 498.89 BogoMIPS (lpj=2494464)
[ 0.062072] pid_max: default: 32768 minimum: 301
[ 0.067047] Security Framework initialized
[ 0.071441] Mount-cache hash table entries: 512
[ 0.076599] Initializing cgroup subsys cpuacct
[ 0.081329] Initializing cgroup subsys devices
[ 0.085998] Initializing cgroup subsys freezer
[ 0.090728] CPU: Testing write buffer coherency: ok
[ 0.097045] devtmpfs: initialized
[ 0.102478] ttyO0 used as console in debug mode uart0 clocks will not be gated
[ 0.128417] omap_hwmod: gfx: failed to hardreset
[ 0.150238] omap_hwmod: pruss: failed to hardreset
[ 0.155822] print_constraints: dummy:
[ 0.160064] NET: Registered protocol family 16
[ 0.165985] OMAP GPIO hardware version 0.1
[ 0.171600] omap_mux_init: Add partition: #1: core, flags: 0
[ 0.179107] omap_i2c.1: alias fck already exists
[ 0.185028] Unable to handle kernel NULL pointer dereference at virtual address 00000010
[ 0.193481] pgd = c0004000
[ 0.196350] [00000010] *pgd=00000000
[ 0.200134] Internal error: Oops: 5 [#1]
[ 0.204254] Modules linked in:
[ 0.207489] CPU: 0 Not tainted (3.2.28+ #127)
[ 0.212463] PC is at gpmc_cs_reserved+0x14/0x20
[ 0.217224] LR is at gpmc_cs_request+0x35/0xd0
[ 0.221862] pc : [<c0015ff4>] lr : [<c0016085>] psr: 00000033
[ 0.221893] sp : cf837f58 ip : 00000000 fp : 00000000
[ 0.233886] r10: 00000000 r9 : 00000000 r8 : 00000000
[ 0.239349] r7 : 00000000 r6 : 01000000 r5 : fffffff0 r4 : 00000000
[ 0.246154] r3 : 00000000 r2 : cf837fa4 r1 : 01000000 r0 : 00000001
[ 0.252990] Flags: nzcv IRQs on FIQs on Mode SVC_32 ISA Thumb Segment kernel
[ 0.260772] Control: 50c5387d Table: 80004019 DAC: 00000015
[ 0.266784] Process swapper (pid: 1, stack limit = 0xcf8362f0)
[ 0.272888] Stack: (0xcf837f58 to 0xcf838000)
[ 0.277465] 7f40: 00000000 00000010
[ 0.285980] 7f60: cf837f94 c041e194 cf85dac0 c03e491b 00000010 cf837fa4 00000000 cf837f94
[ 0.294494] 7f80: c0403c50 c03e11a5 00000000 c03e7601 c014bf99 00000000 00000004 00000000
[ 0.303009] 7fa0: 00000000 12345678 c04037e0 c03e11b1 cf836000 c00086b9 0000018c c042a2dc
[ 0.311553] 7fc0: c000d071 c011a19f c042a32c c0055263 c042a32c c04037e0 c0403c50 c000d071
[ 0.320068] 7fe0: 00000033 c03df589 00000000 00000000 c03df529 c000d071 0b000ea3 4351a688
[ 0.328613] [<c0015ff4>] (gpmc_cs_reserved+0x14/0x20) from [<c0016085>] (gpmc_cs_request+0x35/0xd0)
[ 0.338043] [<c0016085>] (gpmc_cs_request+0x35/0xd0) from [<c03e7601>] (am335x_evm_init+0x12d/0x1ac)
[ 0.347564] [<c03e7601>] (am335x_evm_init+0x12d/0x1ac) from [<c03e11b1>] (customize_machine+0xd/0x14)
[ 0.357147] [<c03e11b1>] (customize_machine+0xd/0x14) from [<c00086b9>] (do_one_initcall+0x69/0x100)
[ 0.366668] [<c00086b9>] (do_one_initcall+0x69/0x100) from [<c03df589>] (kernel_init+0x61/0xd8)
[ 0.375762] [<c03df589>] (kernel_init+0x61/0xd8) from [<c000d071>] (kernel_thread_exit+0x1/0x6)
[ 0.384826] Code: fa03 f000 4b02 681b (691b) 4018
[ 0.389892] ---[ end trace 1b75b31a2719ed1c ]---
[ 0.394805] Kernel panic - not syncing: Attempted to kill init!

However, I have noticed that when I comment out the gpmc_cs_request(), my test printk() appears in
the boot log *before* the GPMC device appears to be initialised ...

...
[ 0.171569] omap_mux_init: Add partition: #1: core, flags: 0
[ 0.179077] omap_i2c.1: alias fck already exists
[ 0.184997] gpmc base @ 0x12345678
[ 0.188598] hw-breakpoint: debug architecture 0x4 unsupported.
[ 0.194915] omap2_mcspi.1: alias fck already exists
[ 0.200256] omap2_mcspi.2: alias fck already exists
...
[ 0.359680] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.366577] NET: Registered protocol family 1
[ 0.371673] omap-gpmc omap-gpmc: GPMC revision 6.0
[ 0.378356] audit: initializing netlink socket (disabled)
[ 0.384063] type=2000 audit(0.380:1): initialized
...

Surely omap-gpmc needs to be setup before any calls such as gpmc_cs_request() ?

Is there a method to delay my test code, or maybe get the omap-gpmc registered earlier ?

Cheers
Mark JACKSON
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/