[openfirmware] [commit] r3752 - in cpu: arm arm/mmp3 arm/olpc arm/olpc/4.0 x86/pc x86/pc/olpc

repository service svn at openfirmware.info
Tue Dec 30 01:53:51 CET 2014


Author: quozl
Date: Tue Dec 30 01:53:50 2014
New Revision: 3752
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3752

Log:
OLPC XO-4 - spin second core ready for new kernel, hack in a device tree change for the generic interrupt controller, but keep mmcore powered down.  #12297.

Added:
   cpu/arm/mmp3/gic.fth
Modified:
   cpu/arm/linux.fth
   cpu/arm/mmp3/dramrecal.fth
   cpu/arm/olpc/4.0/fw-version.fth
   cpu/arm/olpc/4.0/olpc.bth
   cpu/arm/olpc/build-fw.fth
   cpu/x86/pc/cpunode.fth
   cpu/x86/pc/olpc/gui.fth

Modified: cpu/arm/linux.fth
==============================================================================
--- cpu/arm/linux.fth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/arm/linux.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -107,6 +107,7 @@
 \      args-buf cscount set-parameters          ( )
 \   then
    disable-interrupts
+[ifdef] mmp3-gic  mmp3-gic  [then]
 
    linux-base linux-base  (init-program)    \ Starting address, SP
    0 to r0

Modified: cpu/arm/mmp3/dramrecal.fth
==============================================================================
--- cpu/arm/mmp3/dramrecal.fth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/arm/mmp3/dramrecal.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -125,7 +125,12 @@
 : idle-cfg-clr  ( mask -- )  h# 18 pmua-clr  ;
 : idle-cfg-set  ( mask -- )  h# 18 pmua-set  ;
 
-: cc4-set  ( mask -- )  h# 248 pmua-set  ;
+: cc2-set  ( mask -- )  h# 150 pmua-set  ;  \ PMUA_CC2_PJ
+: cc2-clr  ( mask -- )  h# 150 pmua-clr  ;
+
+: cc3-set  ( mask -- )  h# 188 pmua-set  ;  \ PMUA_CC3_PJ
+
+: cc4-set  ( mask -- )  h# 248 pmua-set  ;  \ PMUA_PJ_C0_CC4
 : cc4-clr  ( mask -- )  h# 248 pmua-clr  ;
 
 \ PXA2128_Registers_Manual_revF.pdf says to always write 0 to bits [14:0]
@@ -281,11 +286,69 @@
 
 alias do-wfi wfi
 
-: unused-cores-off  ( -- )
+\ a reset handler for second core
+code spin
+   mrs  r0, cpsr
+   bic  r0, r0, #0x1f
+   orr  r0, r0, #0xd3
+   msr  cpsr,r0
+
+   mov  r0, #0                          \ set up for MCR
+   mcr  p15, 0, r0, cr8, cr7, 0         \ invalidate TLBs
+   mcr  p15, 0, r0, cr7, cr5, 0         \ invalidate icache
+   mcr  p15, 0, r0, cr7, cr5, 6         \ invalidate BP array
+   mcr  p15, 0, r0, cr7, cr10, 4        \ DSB
+   mcr  p15, 0, r0, cr7, cr5, 4         \ ISB
+
+   mrc  p15, 0, r0, cr1, cr0, 0
+   bic  r0, r0, #0x00002000             \ clear bits 13 (--V-)
+   bic  r0, r0, #0x00000007             \ clear bits 2:0 (-CAM)
+   orr  r0, r0, #0x00000002             \ set bit 1 (--A-) Align
+   orr  r0, r0, #0x00000800             \ set bit 11 (Z---) BTB
+   bic  r0, r0, #0x00001000             \ set bit 12 (I) I-cache
+   mcr  p15, 0, r0, cr1, cr0, 0
+
+   set  r1,#0xd4019018                  \ physical address of gpio set register
+   mov  r0,#0x400                       \ mask for port bit, storage led
+   str  r0,[r1]
+
+   set  r1,#0xd4282c24                  \ address of __sw_branch register
+   mov  r0,#0x0
+   str  r0,[r1]                         \ clear register
+   begin
+      mov  r3, #0x4000                  \ delay loop constant
+      begin
+         subs  r3, r3, #1               \ delay loop
+      = until
+      ldr  r0, [r1]                     \ read __sw_branch register
+      cmp  r0, #0x0                     \ contains an address?
+      movne  pc, r0                     \ yes, then branch
+   again                                \ infinite loop
+c;
+
+: enable-smp  ( -- )
+   ['] spin >physical 0  hw-install-handler  0 d# 4096 sync-cache
+
+   h# 8 cc3-set  \ moltres timerclk domain software reset, release
+
+   \ moltres peripheral space configuration register
+   h# e000.0000 h# 94 ciu!  \ set periphbase_addr
+   h# ffff.e001 h# 9c ciu!  \ set periphbase_size, set periphbase_enable
+
+   \ enable all clocks
+   h# ffff.ffff h# 0024 mpmu!  \ MPMU_CGR_SP
+   h# ffff.ffff h# 1024 mpmu!  \ MPMU_CGR_PJ
+   h# 3.ffff h# dc pmua!       \ PMUA_GLB_CLK_CTRL
+
+   h# 2000.0000 h# 200 pmua!  \ PMUA_PJ_IDLE_CFG2, stay powered on WFI
+   0 h# d428.2c24 l!  \ clear __sw_branch register
+   h# 0200.0000 cc2-clr d# 1 ms h# 0200.0000 cc2-set  \ reset mpcore2
+;
+
+: unused-core-off  ( -- )  \ mmcore
    h# e320f003 0 instruction!  \ Put WFI instruction in reset vector
-   h# 2000.0062 h# 200 pmua!   \ PMUA_PJ_IDLE_CFG2 - mpcore2 deep sleep on WFI
-   h# 2000.0062 h# 204 pmua!   \ PMUA_PJ_IDLE_CFG3 - mmcore deep sleep on WFI
-   h# 150 pmua@ h# 0600.0000 or h# 150 pmua!  \ PMUA_CC2_PJ - unreset mpcore2 & mmcore
+   h# 2000.0062 h# 204 pmua!   \ PMUA_PJ_IDLE_CFG3, power down on WFI
+   h# 0400.0000 cc2-set        \ release reset
 ;
 
 \ LICENSE_BEGIN

Added: cpu/arm/mmp3/gic.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/arm/mmp3/gic.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -0,0 +1,133 @@
+purpose: Generic Interrupt Controller node for Marvell MMP3
+
+0 0  " e0001000"  " /" begin-package
+  " interrupt-controller" device-name
+  " arm,arm11mp-gic" +compatible
+  0 0 " interrupt-controller" property
+  1 " #address-cells" integer-property
+  1 " #size-cells" integer-property
+  3 " #interrupt-cells" integer-property
+  h# e0001000 encode-int  h# 1000 encode-int encode+
+  h# e0000100 encode-int encode+  h# 100 encode-int encode+  " reg" property
+
+  : encode-unit  ( phys -- adr len )  push-hex (u.) pop-base  ;
+  : decode-unit  ( adr len -- phys )  push-hex $number if 0  then pop-base  ;
+
+  : make-gmux-node  ( statreg maskreg irq# #irqs )
+     new-device
+     " interrupt-controller" name             ( maskreg statreg irq# #irqs )
+     " mrvl,intc-nr-irqs" integer-property    ( maskreg statreg irq# )
+     0 encode-int  rot encode-int encode+
+     1 encode-int encode+
+     " interrupts" property                 ( maskreg statreg )
+     >r  4 encode-reg  r> 4 encode-reg encode+  " reg" property  ( )
+     " mrvl,mmp3-mux-intc" +compatible
+     0 0 " interrupt-controller" property
+     1 " #interrupt-cells" integer-property
+     " mux status" encode-string  " mux mask" encode-string  encode+ " reg-names" property
+     finish-device
+  ;
+
+  \ create mux nodes
+  h# 150 h# 168     4     4 make-gmux-node \ intcmux4 - USB_CHARGER, PMIC, SPMI, CHRG_DTC_OUT
+  h# 154 h# 16c     5     2 make-gmux-node \ intcmux5 - RTC_ALARM, RTC
+  h# 1bc h# 1a4     6     3 make-gmux-node \ intcmux6 - ETHERNET, res, HSI_INT_3
+  h# 1c0 h# 1a8     8     4 make-gmux-node \ intcmux8 - GC2000, res, GC300, MOLTRES_NGIC_2
+  h# 158 h# 170 d# 17     5 make-gmux-node \ intcmux17 - TWSI2,3,4,5,6
+  h# 1c4 h# 1ac d# 18     3 make-gmux-node \ intcmux18 - Res, HSI_INT_2, MOLTRES_NGIC_1
+  h# 1c8 h# 1b0 d# 30     2 make-gmux-node \ intcmux30 - ISP_DMA, DXO_ISP
+  h# 15c h# 174 d# 35 d# 31 make-gmux-node \ intcmux35 - MOLTRES_(various)  (different from MMP2)
+  h# 1cc h# 1b4 d# 42     2 make-gmux-node \ intcmux42 - CCIC2, CCIC1
+  h# 160 h# 178 d# 51     2 make-gmux-node \ intcmux51 - SSP1_SRDY, SSP3_SRDY
+  h# 184 h# 17c d# 55     4 make-gmux-node \ intcmux55 - MMC5, res, res, HSI_INT_1
+  h# 188 h# 180 d# 57 d# 20 make-gmux-node \ intcmux57 - (various)
+  h# 1d0 h# 1b8 d# 58     5 make-gmux-node \ intcmux58 - MSP_CARD, KERMIT_INT_0, KERMIT_INT_1, res, HSI_INT_0
+  h# 128 h# 11c d# 48 d# 24 make-gmux-node \ DMA mux - 16 PDMA, 4 ADMA, 2 VDMA channels
+end-package
+
+dev /
+  " /interrupt-controller at e0001000" encode-phandle " interrupt-parent" property
+dend
+
+: irqdef ( irq# -- )
+  0 encode-int
+  rot encode-int encode+
+  1 encode-int encode+
+  " interrupts" property
+;
+
+: irqdef2 ( irq# irq# -- )
+  swap
+  0 encode-int
+  rot encode-int encode+
+  1 encode-int encode+
+  0 encode-int encode+
+  rot encode-int encode+
+  1 encode-int encode+
+  " interrupts" property
+;
+
+\ modify all irqs to use 3 cells instead of 1
+dev /timer  d irqdef  dend
+\ dev /wakeup-rtc  1 0 irqdef2  dend
+\ dev /thermal  b irqdef  dend
+\ dev /audio  2 irqdef  dend
+dev /sspa  3 irqdef  dend
+\ dev /adma at c0ffd800  12 13 irqdef2  dend
+\ dev /adma at c0ffd900  14 15 irqdef2  dend
+\ dev /camera  1 irqdef  dend
+dev /ap-sp  28 irqdef  dend
+dev /usb  2c irqdef  dend
+dev /ec-spi 14 irqdef  dend
+\ dev /sd/sdhci at d4217000  0 irqdef  dend
+dev /sd/sdhci at d4280000  27 irqdef  dend
+dev /sd/sdhci at d4281000  35 irqdef  dend
+dev /sd/sdhci at d4280800  34 irqdef  dend
+\ dev /gpu  0 2 irqdef2  dend
+dev /display  29 irqdef  dend
+dev /vmeta  1a irqdef  dend
+dev /flash  0 irqdef  dend
+dev /uart at d4016000  2e irqdef  dend
+dev /uart at d4030000  1b irqdef  dend
+dev /uart at d4017000  1c irqdef  dend
+dev /uart at d4018000  18 irqdef  dend
+dev /i2c at d4034000  4 irqdef  dend
+dev /i2c at d4033000  2 irqdef  dend
+dev /i2c at d4031000  0 irqdef  dend
+dev /i2c at d4011000  7 irqdef  dend
+dev /dma  30 irqdef  dend
+dev /gpio  31 irqdef  dend
+
+\ modify all mux irq users to not point to ICU node
+dev /sd/sdhci at d4217000
+  " /interrupt-controller at e0001000/interrupt-controller at 184" encode-phandle " interrupt-parent" property
+dend
+dev /camera at d420a000
+  " /interrupt-controller at e0001000/interrupt-controller at 1cc" encode-phandle " interrupt-parent" property
+dend
+dev /adma at c0ffd800
+  " /interrupt-controller at e0001000/interrupt-controller at 128" encode-phandle " interrupt-parent" property
+dend
+dev /adma at c0ffd900
+  " /interrupt-controller at e0001000/interrupt-controller at 128" encode-phandle " interrupt-parent" property
+dend
+dev /thermal
+  " /interrupt-controller at e0001000/interrupt-controller at 188" encode-phandle " interrupt-parent" property
+dend
+dev /wakeup-rtc
+  " /interrupt-controller at e0001000/interrupt-controller at 154" encode-phandle " interrupt-parent" property
+dend
+dev /gpu
+  " /interrupt-controller at e0001000/interrupt-controller at 1c0" encode-phandle " interrupt-parent" property
+dend
+dev /i2c at d4034000
+  " /interrupt-controller at e0001000/interrupt-controller at 158" encode-phandle " interrupt-parent" property
+dend
+dev /i2c at d4033000
+  " /interrupt-controller at e0001000/interrupt-controller at 158" encode-phandle " interrupt-parent" property
+dend
+dev /i2c at d4031000
+  " /interrupt-controller at e0001000/interrupt-controller at 158" encode-phandle " interrupt-parent" property
+dend
+
+: mmp3-gic  ." mmp3-gic" cr  ;  \ 92ms

Modified: cpu/arm/olpc/4.0/fw-version.fth
==============================================================================
--- cpu/arm/olpc/4.0/fw-version.fth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/arm/olpc/4.0/fw-version.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -1,7 +1,7 @@
 \ The overall firmware revision
 macro: FW_PREFIX Q7
-macro: FW_MAJOR B
-macro: FW_MINOR 43
+macro: FW_MAJOR C
+macro: FW_MINOR 00
 
 \ Create a 2-character build/fw-suffix file to personalize your test builds
 " fw-suffix" $file-exists?  [if]

Modified: cpu/arm/olpc/4.0/olpc.bth
==============================================================================
--- cpu/arm/olpc/4.0/olpc.bth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/arm/olpc/4.0/olpc.bth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -75,6 +75,7 @@
 \   " fw.img"   " firmware"  $add-dropin
    " resetvec.img"  " reset" $add-dropin
 
+   " ${BP}/cpu/arm/mmp3/gic.fth" " mmp3-gic-" $add-dropin
 \   " ${BP}/dev/usb2/hcd/ehci/build/ehci.fc"	" class0c0320"      $add-deflated-dropin
    " ${BP}/dev/usb2/device/hub/build/hub.fc"     " usb,class9"      $add-deflated-dropin
    " ${BP}/dev/usb2/device/generic/build/generic.fc"  " usbdevice"  $add-deflated-dropin

Modified: cpu/arm/olpc/build-fw.fth
==============================================================================
--- cpu/arm/olpc/build-fw.fth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/arm/olpc/build-fw.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -254,6 +254,7 @@
 : wlan-reset  ( -- )  wlan-reset-gpio# gpio-clr  d# 20 ms  wlan-reset-gpio# gpio-set  ;
 
 fload ${BP}/ofw/core/fdt.fth
+[ifdef] mmp3  autoload: mmp3-gic-  defines: mmp3-gic  [then]
 fload ${BP}/cpu/arm/linux.fth
 
 \ Create the alias unless it already exists
@@ -617,6 +618,11 @@
 
 [ifdef] mmp3
 fload ${BP}/cpu/arm/mmp3/dramrecal.fth
+: linux-hook-smp ( -- )
+   [ ' linux-hook behavior compile, ]  \ Chain to old behavior
+   enable-smp
+;
+' linux-hook-smp to linux-hook
 [then]
 [ifdef] mmp2
 fload ${BP}/cpu/arm/mmp2/dramrecal.fth
@@ -889,7 +895,7 @@
 
    " probe-" do-drop-in
 
-   [ifdef] unused-cores-off  unused-cores-off  [then]
+   [ifdef] unused-core-off  unused-core-off  [then]
    show-child
 
    update-ec-flash?  if

Modified: cpu/x86/pc/cpunode.fth
==============================================================================
--- cpu/x86/pc/cpunode.fth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/x86/pc/cpunode.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -29,6 +29,16 @@
 
 finish-device
 
+[ifdef] olpc-cl4
+new-device
+   " cpu" device-name
+   " cpu" device-type
+   1 " reg" integer-property
+   : open true ;
+   : close ;
+finish-device
+[then]
+
 end-package
 
 stand-init: CPU nodes

Modified: cpu/x86/pc/olpc/gui.fth
==============================================================================
--- cpu/x86/pc/olpc/gui.fth	Mon Dec  8 01:24:07 2014	(r3751)
+++ cpu/x86/pc/olpc/gui.fth	Tue Dec 30 01:53:50 2014	(r3752)
@@ -498,15 +498,16 @@
    " bigx" $show-centered
 ;
 
-: linux-hook-unfreeze
-   [ ' linux-hook behavior compile, ]
-;
-: linux-hook-freeze
+defer show-going-hook  ' noop to show-going-hook
+
+: linux-hook-gui
    [ ' linux-hook behavior compile, ]
-   show-going
+   show-going-hook
 ;
-: freeze    ( -- )  ['] linux-hook-freeze   to linux-hook  ;
-: unfreeze  ( -- )  ['] linux-hook-unfreeze to linux-hook  ;
+' linux-hook-gui to linux-hook
+
+: freeze    ( -- )  ['] show-going  to show-going-hook  ;
+: unfreeze  ( -- )  ['] noop  to show-going-hook  ;
 
 
 \ LICENSE_BEGIN



More information about the openfirmware mailing list