linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: cgagneraud@techworks.ie (Christian Gagneraud)
To: linux-arm-kernel@lists.infradead.org
Subject: Sparsemem  on EP93XX
Date: Sat, 03 Oct 2009 20:19:48 +0100	[thread overview]
Message-ID: <4AC7A3D4.3080408@techworks.ie> (raw)

Hi all,

I'm trying to get a TS72XX board working with sparsemem, but got 
unlucky so far. I've read all related threads in the archive and 
especially this one:
http://marc.info/?l=linux-arm&m=122754446724900&w=2

Here is the patch I've applied:

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 1c4119c..0f1d52f 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -288,6 +288,7 @@ config ARCH_EP93XX
         select CPU_ARM920T
         select ARM_AMBA
         select ARM_VIC
+       select ARCH_SPARSEMEM_ENABLE
         select GENERIC_GPIO
         select HAVE_CLK
         select COMMON_CLKDEV
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
index cefedf0..6be9d9b 100644
--- a/arch/arm/include/asm/memory.h
+++ b/arch/arm/include/asm/memory.h
@@ -125,8 +125,10 @@
   * private definitions which should NOT be used outside memory.h
   * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
   */
+#ifndef __phys_to_virt
  #define __virt_to_phys(x)      ((x) - PAGE_OFFSET + PHYS_OFFSET)
  #define __phys_to_virt(x)      ((x) - PHYS_OFFSET + PAGE_OFFSET)
+#endif

  /*
   * Convert a physical address to a Page Frame Number and back
diff --git a/arch/arm/mach-ep93xx/include/mach/memory.h 
b/arch/arm/mach-ep93xx/include/mach/memory.h
index 554064e..4cb3329 100644
--- a/arch/arm/mach-ep93xx/include/mach/memory.h
+++ b/arch/arm/mach-ep93xx/include/mach/memory.h
@@ -19,4 +19,34 @@
  #error "Kconfig bug: No EP93xx PHYS_OFFSET set"
  #endif

+#ifdef CONFIG_MACH_TS72XX
+/*
+ * Non-linear mapping like so:
+ * phys       => virt
+ * 0x00000000 => 0xc0000000
+ * 0x01000000 => 0xc1000000
+ * 0x04000000 => 0xc4000000
+ * 0x05000000 => 0xc5000000
+ * 0xe0000000 => 0xc8000000
+ * 0xe1000000 => 0xc9000000
+ * 0xe4000000 => 0xcc000000
+ * 0xe5000000 => 0xcd000000
+ *
+ * As suggested here: http://marc.info/?l=linux-arm&m=122754446724900&w=2
+ *
+ * Note that static inline functions won't work here because
+ * arch/arm/include/asm/memory.h uses "#ifndef __virt_to_phys" to 
check whether to
+ * use generic functions or not.
+ */
+#define __phys_to_virt(p)   \
+            (((p) & 0x07ffffff) | (((p) & 0xe0000000) ? 0x08000000 : 
0) | PAGE_OFFSET)
+
+#define __virt_to_phys(v)   \
+            (((v) & 0x07ffffff) | (((v) & 0x08000000) ? 0xe0000000 : 0 ))
+
+#define SECTION_SIZE_BITS 24
+#define MAX_PHYSMEM_BITS 32
+
+#endif /* CONFIG_ARCH_TS72XX */
+
  #endif

I have forced some early debugging and dump the meminfo passed by the 
bootloader in bootmem_init() (just to be sure of the mem config) and 
here is the output i got:

Using base address 0x00218000 and length 0x000ab888
Uncompressing Linux............................................... 
done, booting the kernel.
<5>Linux version 2.6.32-rc2-twm0.0 (cgagneraud at archeopterix) (gcc 
version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #23 Sat Oct 3 20:01:39 
IST 2
009
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=40007177
CPU: VIVT data cache, VIVT instruction cache
Machine: Technologic Systems TS-72xx SBC
Memory policy: ECC disabled, Data cache writeback
meminfo has 8 banks:
00: start = 0x00000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
01: start = 0x01000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
02: start = 0x04000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
03: start = 0x05000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
04: start = 0xE0000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
05: start = 0xE1000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
06: start = 0xE4000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
07: start = 0xE5000000
     size  = 0x00800000
     node  = 0x00000000
     hm    = 0x00000000
<6>bootmem::init_bootmem_core nid=0 start=0 map=18a end=e5800 
mapsize=1cb00
<6>bootmem::mark_bootmem_node nid=0 start=0 end=800 reserve=0 flags=0
<6>bootmem::__free nid=0 start=0 end=800
<6>bootmem::mark_bootmem_node nid=0 start=1000 end=1800 reserve=0 flags=0
<6>bootmem::__free nid=0 start=1000 end=1800
<6>bootmem::mark_bootmem_node nid=0 start=4000 end=4800 reserve=0 flags=0
<6>bootmem::__free nid=0 start=4000 end=4800
<6>bootmem::mark_bootmem_node nid=0 start=5000 end=5800 reserve=0 flags=0
<6>bootmem::__free nid=0 start=5000 end=5800
<6>bootmem::mark_bootmem_node nid=0 start=e0000 end=e0800 reserve=0 
flags=0
<6>bootmem::__free nid=0 start=e0000 end=e0800
<6>bootmem::mark_bootmem_node nid=0 start=e1000 end=e1800 reserve=0 
flags=0
<6>bootmem::__free nid=0 start=e1000 end=e1800
<6>bootmem::mark_bootmem_node nid=0 start=e4000 end=e4800 reserve=0 
flags=0
<6>bootmem::__free nid=0 start=e4000 end=e4800
<6>bootmem::mark_bootmem_node nid=0 start=e5000 end=e5800 reserve=0 
flags=0
<6>bootmem::__free nid=0 start=e5000 end=e5800
<6>bootmem::mark_bootmem_node nid=0 start=18a end=1a7 reserve=1 flags=0
<6>bootmem::__reserve nid=0 start=18a end=1a7 flags=0
<6>bootmem::mark_bootmem_node nid=0 start=8 end=18a reserve=1 flags=0
<6>bootmem::__reserve nid=0 start=8 end=18a flags=0
<6>bootmem::mark_bootmem_node nid=0 start=4 end=8 reserve=1 flags=0
<6>bootmem::__reserve nid=0 start=4 end=8 flags=0
<7>On node 0 totalpages: 16384
<6>bootmem::alloc_bootmem_core nid=0 size=1cb0000 [7344 pages] 
align=20 goal=e7ffffff limit=0
<6>bootmem::alloc_bootmem_core nid=0 size=1cb0000 [7344 pages] 
align=20 goal=0 limit=0
<1>bootmem alloc of 30081024 bytes failed!
<0>Kernel panic - not syncing: Out of memory
Backtrace:
[<c001c750>] (dump_backtrace+0x0/0x10c) from [<c0120c0c>] 
(dump_stack+0x18/0x1c)
  r7:00000020 r6:c01618d0 r5:00000000 r4:01cb0000
[<c0120bf4>] (dump_stack+0x0/0x1c) from [<c0120c5c>] (panic+0x4c/0x12c)
[<c0120c10>] (panic+0x0/0x12c) from [<c000f298>] 
(___alloc_bootmem+0x30/0x38)
  r3:ffffffff r2:c0156140 r1:600000d3 r0:c0144420
[<c000f268>] (___alloc_bootmem+0x0/0x38) from [<c000f310>] 
(___alloc_bootmem_node+0x70/0x74)
  r5:00000000 r4:c0017280
[<c000f2a0>] (___alloc_bootmem_node+0x0/0x74) from [<c000f3ec>] 
(__alloc_bootmem_node+0x44/0x90)
  r8:c0160de4 r7:01cb0000 r6:e7ffffff r5:00000020 r4:c0160de4
[<c000f3a8>] (__alloc_bootmem_node+0x0/0x90) from [<c0120a90>] 
(alloc_node_mem_map+0x74/0x90)
  r7:000e5800 r6:c0151ef0 r5:c0160de4 r4:00000000
[<c0120a1c>] (alloc_node_mem_map+0x0/0x90) from [<c000fb40>] 
(free_area_init_node+0x74/0x3d0)
  r5:000e5800 r4:00000000
[<c000facc>] (free_area_init_node+0x0/0x3d0) from [<c000aaa8>] 
(bootmem_init+0x22c/0x484)
[<c000a87c>] (bootmem_init+0x0/0x484) from [<c000ba70>] 
(paging_init+0x55c/0x758)
[<c000b514>] (paging_init+0x0/0x758) from [<c0009e8c>] 
(setup_arch+0x2e4/0x720)
[<c0009ba8>] (setup_arch+0x0/0x720) from [<c000898c>] 
(start_kernel+0x5c/0x264)
[<c0008930>] (start_kernel+0x0/0x264) from [<00008038>] (0x8038)
  r5:c0161728 r4:40007175

Then I tried digging into the code by following the backtrace, but 
couldn't spot anything!

If I force the machine to see only 32MB then it boots fine, I've done 
this by passing the mem=stuff on the command line.
I've even tried to force using 2 nodes by over-writing bank->node, 
first node for the low part, and second node for the upper part 
(0xeX000000) and it boots fine as well, the difference is that the 
kernel says that it sees 8 banks of 8MB each, but report only 32MB of 
free memory (only node 0 is used I guess).

Obviously, I've missed something, any helps are welcome.

Thanks,
Chris

             reply	other threads:[~2009-10-03 19:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-03 19:19 Christian Gagneraud [this message]
2009-10-03 19:41 ` Sparsemem on EP93XX Russell King - ARM Linux
2009-10-03 19:49   ` Christian Gagneraud
2009-10-03 19:54     ` Russell King - ARM Linux
2009-10-03 20:07       ` Christian Gagneraud
2009-10-03 19:55   ` Christian Gagneraud
2009-10-03 20:00     ` Russell King - ARM Linux
2009-10-03 20:06       ` Christian Gagneraud

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=4AC7A3D4.3080408@techworks.ie \
    --to=cgagneraud@techworks.ie \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
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;
as well as URLs for NNTP newsgroup(s).