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

repository service svn at openfirmware.info
Mon Nov 21 23:33:47 CET 2011


Author: wmb
Date: Mon Nov 21 23:33:47 2011
New Revision: 2696
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2696

Log:
OLPC XO-1.75 - Configurable sleep code, configured for manual memory controller wakeup

Modified:
   cpu/arm/mmp2/dramrecal.fth

Modified: cpu/arm/mmp2/dramrecal.fth
==============================================================================
--- cpu/arm/mmp2/dramrecal.fth	Mon Nov 21 05:09:15 2011	(r2695)
+++ cpu/arm/mmp2/dramrecal.fth	Mon Nov 21 23:33:47 2011	(r2696)
@@ -58,42 +58,92 @@
 end-code
 here ddr-recal - constant /ddr-recal
 
+\ create use-auto-mc-wake  \ Let the PMU automatically wake the memory controller
+create use-block           \ Block memory controller activity in low-level sleep code
+create use-self-refresh    \ Manually issue self-refresh enter/exit
+create use-drivers         \ Turn memory drivers off during sleep
+\ create use-phy-dll-reset \ Reset the PHY DLL upon wakeup
+create use-phy-dll-update  \ Update the PHY DLL upon wakeup
+create use-dram-dll-reset  \ Reset the DRAM DLL upon wakeup
+\ create use-delay2        \ Long delay upon wakeup
+\ create use-delay3        \ Short delay upon wakeup
+
 label ddr-self-refresh  ( r0:memctrl-va -- )
+[ifdef] use-gpio
+   mov     r4, #0xfe000000
+   orr     r4, r4, 0x19000   \ GPIO 3
+   mov     r1, 0x8           \ GPIO 3
+   str     r1, [r4, #0x18]   \ Set
+[then]
+
+[ifdef] use-block
    mov     r1, #0x1          \ Block all data requests
    str     r1, [r0, #0x7e0]  \ SDRAM_CTRL14
+[then]
 
-[ifdef] notdef2
+[ifdef] use-odt
    ldr   r2, [r0, #0x770]    \ SDRAM_CTRL7_SDRAM_ODT_CTRL2
    orr   r1, r2, #0x03000000 \ PAD_TERM_SWITCH_MODE: Termination disabled
    str   r1, [r0, #0x770]    \ SDRAM_CTRL7_SDRAM_ODT_CTRL2
 [then]
 
+[ifdef] use-self-refresh
    mov   r1, #0x40           \ Enter Self Refresh value
    str   r1, [r0, #0x120]    \ USER_INITIATED_COMMAND0
+[then]
 
+[ifdef] use-drivers
    ldr   r3, [r0, #0x1e0]    \ PHY_CTRL8
-   bic   r1, r3, #0x07700000 \ PHY_ADCM_ZPDRV: 0 PHY_ADCM_ZNDRV: 0 (Disable drivers 6:0)
+   bic   r1, r3, #0x0ff00000 \ PHY_ADCM_ZPDRV: f PHY_ADCM_ZNDRV: f (disable drivers)
    str   r1, [r0, #0x1e0]    \ PHY_CTRL8
+[then]
 
    dsb                       \ Data Synchronization Barrier
    wfi                       \ Wait for interrupt
 
-   str   r3, [r0, #0x1e0]    \ PHY_CTRL8 - restore previous value
+[ifdef] use-gpio
+   mov     r1, 0x8           \ GPIO 3
+   str     r1, [r4, #0x24]   \ Clr
+[then]
+
+[ifdef] use-drivers
+   str   r3, [r0, #0x1e0]    \ PHY_CTRL8 - restore previous value  (all drivers)
+[then]
+
+[ifdef] use-delay1
+   \ Delay to let the memory controller and DRAM DLLs settle
+   mov   r1, #0x600  begin  decs r1,1  0= until
+[then]
 
+[ifdef] use-phy-dll-reset
    mov   r1, #0x20000000     \ PHY_DLL_RESET
    str   r1, [r0, #0x240]    \ PHY_CTRL14
+[then]
 
+[ifdef] use-phy-dll-update
    mov   r1, #0x40000000     \ DLL_UPDATE_EN
    str   r1, [r0, #0x240]    \ PHY_CTRL14
+[then]
 
+[ifdef] use-dram-dll-reset
+   ldr   r1, [r0, #0x080]    \ PHY_CTRL1
+   orr   r1, r1, #0x40       \ DLL_RESET
+   str   r1, [r0, #0x080]    \ PHY_CTRL1
+   mov   r1, #0x100          \ USER_LMR0_REQ
+   orr   r1, r1, #0x03000000 \ CHIP_SELECT_0 | CHIP_SELECT_1
+   str   r1, [r0, #0x120]    \ USER_INITIATED_COMMAND0
+[then]
+
+[ifdef] use-self-refresh
    mov   r1, #0x80           \ Exit Self Refresh value
    str   r1, [r0, #0x120]    \ USER_INITIATED_COMMAND0
+[then]
 
-[ifdef] notdef2
+[ifdef] use-odt
    str   r2, [r0, #0x770]    \ SDRAM_CTRL7_SDRAM_ODT_CTRL2 - restore previous value
 [then]
 
-[ifdef] notdef
+[ifdef] use-zqcal
    mov   r1, #0x01000000       \ Chip select 0
    orr   r1, r1, #0x00001000   \ Initiate ZQ calibration long
    str   r1, [r0, #0x120]      \ USER_INITIATED_COMMAND0
@@ -107,11 +157,30 @@
    0= until
 [then]
 
-   \ Delay to let the memory controller and DRAM DLLs settle
-   mov   r1, #0x0300  begin  decs r1,1  0= until
+[ifdef] use-gpio
+   mov     r1, 0x8           \ GPIO 3
+   str     r1, [r4, #0x18]   \ Set
+[then]
+
+[ifdef] use-delay2
+   \ Delay to ensure that at least 512 DRAM NOP's happen before the first access
+   mov   r1, #0x600  begin  decs r1,1  0= until
+[then]
 
+[ifdef] use-delay3
+   \ Delay to ensure that at least 512 DRAM NOP's happen before the first access
+   mov   r1, #0x20  begin  decs r1,1  0= until
+[then]
+
+[ifdef] use-gpio
+   mov     r1, 0x8           \ GPIO 3
+   str     r1, [r4, #0x24]   \ Clr
+[then]
+
+[ifdef] use-block
    mov     r1, #0x0          \ Unblock data requests
    str     r1, [r0, #0x7e0]  \ SDRAM_CTRL14
+[then]
 
    mov     pc, lr
 end-code
@@ -662,7 +731,9 @@
    then
 
    h# 0020.0000 or                 ( apcr idle' )  \ PJ_DIS_MC_SW_REQ - disable idle entry using software register bits
+[ifdef] use-auto-mc-wake
    h# 0010.0000 or                 ( apcr idle' )  \ PJ_MC_WAKE_EN - wake memory controller when core wakes
+[then]
 
    0 h# b0 pmua!                   ( apcr idle )   \ PMUA_MC_HW_SLP_TYPE - self-refresh power down
 
@@ -736,6 +807,10 @@
 ;
 
 : str  ( -- )
+[ifdef] use-gpio
+   3 gpio-dir-out
+[then]
+
    disable-interrupts
    suspend-usb
    timers-sleep



More information about the openfirmware mailing list