[openfirmware] [commit] r3268 - cpu/arm/mmp2

repository service svn at openfirmware.info
Sat Sep 1 20:48:30 CEST 2012


Author: wmb
Date: Sat Sep  1 20:48:30 2012
New Revision: 3268
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3268

Log:
OLPC XO-4 - in the early startup memory sizing code, avoid accessing memory controller registers whose clock is turned off, thus avoiding potential hangs.

Modified:
   cpu/arm/mmp2/initmmu.fth

Modified: cpu/arm/mmp2/initmmu.fth
==============================================================================
--- cpu/arm/mmp2/initmmu.fth	Fri Aug 31 21:08:16 2012	(r3267)
+++ cpu/arm/mmp2/initmmu.fth	Sat Sep  1 20:48:30 2012	(r3268)
@@ -236,35 +236,49 @@
 
 [ifdef] mmp3
    \ MMP3 memory controller - 2 banks, MMAP registers at 0x10 and 0x14
-   ldr    r2,[r1,#0x10]    \ MMAP0 register
-   ands   r3,r2,#1         \ Test CS_VALID
-   movne  r3,#0x10000      \ Scale factor for memory size
-   movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
-   movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
-   addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
-
-   ldr    r2,[r1,#0x14]    \ MMAP1 register
-   ands   r3,r2,#1         \ Test CS_VALID
-   movne  r3,#0x10000      \ Scale factor for memory size
-   movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
-   movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
-   addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
-
-   add    r1,r1,#0x10000   \ Memory controller base address d0010000
-
-   ldr    r2,[r1,#0x10]    \ MMAP0 register
-   ands   r3,r2,#1         \ Test CS_VALID
-   movne  r3,#0x10000      \ Scale factor for memory size
-   movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
-   movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
-   addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
-
-   ldr    r2,[r1,#0x14]    \ MMAP1 register
-   ands   r3,r2,#1         \ Test CS_VALID
-   movne  r3,#0x10000      \ Scale factor for memory size
-   movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
-   movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
-   addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
+
+   \ Don't access a memory controller whose clock is in reset; it will hang
+   set    r2, #0xd428286c  \ PMUA_BUS_CLK_RES_CTRL
+   ldr    r2,[r2]          \ Register value
+   tst    r2,#0x1          \ MC_RST bit
+   0<> if
+
+      ldr    r2,[r1,#0x10]    \ MMAP0 register
+      ands   r3,r2,#1         \ Test CS_VALID
+      movne  r3,#0x10000      \ Scale factor for memory size
+      movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
+      movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
+      addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
+
+      ldr    r2,[r1,#0x14]    \ MMAP1 register
+      ands   r3,r2,#1         \ Test CS_VALID
+      movne  r3,#0x10000      \ Scale factor for memory size
+      movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
+      movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
+      addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
+   then
+
+   \ Don't access a memory controller whose clock is in reset; it will hang
+   set    r2, #0xd428286c  \ PMUA_BUS_CLK_RES_CTRL
+   ldr    r2,[r2]          \ Register value
+   tst    r2,#0x2          \ MC2_RST bit
+   0<> if
+      add    r1,r1,#0x10000   \ Memory controller base address d0010000
+
+      ldr    r2,[r1,#0x10]    \ MMAP0 register
+      ands   r3,r2,#1         \ Test CS_VALID
+      movne  r3,#0x10000      \ Scale factor for memory size
+      movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
+      movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
+      addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
+
+      ldr    r2,[r1,#0x14]    \ MMAP1 register
+      ands   r3,r2,#1         \ Test CS_VALID
+      movne  r3,#0x10000      \ Scale factor for memory size
+      movne  r2,r2,lsl #11    \ Clear high bits above AREA_LENGTH field
+      movne  r2,r2,lsr #27    \ Move AREA_LENGTH to LSB
+      addne  r0,r0,r3,lsl r2  \ Compute bank size and add to accumulator
+   then
 [else]
    \ MMP2 memory controller - 1 bank, MMAP registers at 0x100 and 0x110
    ldr    r2,[r1,#0x100]   \ MMAP0 register



More information about the openfirmware mailing list