Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / board-js2x / slof / OF.fs
diff --git a/qemu/roms/SLOF/board-js2x/slof/OF.fs b/qemu/roms/SLOF/board-js2x/slof/OF.fs
new file mode 100644 (file)
index 0000000..3e37735
--- /dev/null
@@ -0,0 +1,557 @@
+\ *****************************************************************************
+\ * Copyright (c) 2004, 2008 IBM Corporation
+\ * All rights reserved.
+\ * This program and the accompanying materials
+\ * are made available under the terms of the BSD License
+\ * which accompanies this distribution, and is available at
+\ * http://www.opensource.org/licenses/bsd-license.php
+\ *
+\ * Contributors:
+\ *     IBM Corporation - initial implementation
+\ ****************************************************************************/
+
+\ The master file.  Everything else is included into here.
+
+hex
+
+' ll-cr to cr
+
+\ as early as possible we want to know if it is js20, js21 or bimini
+\ u3 = js20; u4 = js21/bimini
+\ the difference if bimini or js21 will be done later depending if
+\ obsidian or citrine is found
+\ f8000000 is probably the place of the u3/u4 version
+f8000000 rl@ CONSTANT uni-n-version
+uni-n-version 4 rshift  dup 3 = CONSTANT u3?  4 = CONSTANT u4?
+\ if (f4000682 >> 4) == 1... it is a bimini...
+f4000682 rb@ 4 rshift 1 = CONSTANT bimini?
+
+\ to decide wether vga initialisation using bios emulation should be attempted,
+\ we need to know wether a vga-device was found during pci-scan.
+\ If it is found, this value will be set to the device's phandle
+0 value vga-device-node?
+
+\ planar-id reads back GPIO 29 30 31 and returns it as one value
+\ if planar-id >= 5 it should be GA2 else it is GA1 (JS20 only)
+defer planar-id  ( -- planar-id )
+
+: (planar-id)  ( -- planar-id)
+   \ default implementation of planar-id just returns 8
+   \ the highest possible planar id for JS20 is 7
+   8
+;
+
+' (planar-id) to planar-id
+
+#include "header.fs"
+
+\ I/O accesses.
+#include "io.fs"
+
+\ XXX: Enable first UART on JS20, scripts forget to do this.  Sigh.
+3 7 siocfg!  1 30 siocfg!
+
+#include "serial.fs"
+
+cr
+
+#include "base.fs"
+
+\ Little-endian accesses.  Also known as `wrong-endian'.
+#include <little-endian.fs>
+
+\ do not free-mem if address is not within the heap
+\ workaround for NVIDIA card
+: free-mem  (  addr len -- )
+   over heap-start heap-end within  IF
+      free-mem
+   ELSE
+      2drop
+   THEN
+;
+
+: #join  ( lo hi #bits -- x )  lshift or ;
+: #split ( x #bits -- lo hi )  2dup rshift dup >r swap lshift xor r> ;
+
+: blink ;
+
+: reset-dual-emit ;
+
+: console-clean-fifo ;
+
+: bootmsg-nvupdate ;
+
+: asm-cout 2drop drop ;
+
+#include "logging.fs"
+
+: log-string 2drop ;
+
+#include "bootmsg.fs"
+
+000 cp
+
+\ disable the nvram logging until we know if we are
+\ running from ram/takeover/js20 or in normal mode on js21
+: (nvramlog-write-byte)  drop ;
+' (nvramlog-write-byte) to nvramlog-write-byte
+
+#include "exception.fs"
+
+: mm-log-warning 2drop ;
+
+: write-mm-log ( data length type -- status )
+       3drop 0
+;
+
+080 cp
+
+#include "rtc.fs"
+
+100 cp
+
+\ Input line editing.
+#include "accept.fs"
+
+120 cp
+
+#include "dump.fs"
+
+cistack ciregs >r1 ! \ kernel wants a stack :-)
+
+#include "romfs.fs"
+
+140 cp
+#include "flash.fs"
+
+\ 1 temp; 0 perm; let's default to temp
+1 VALUE flashside?
+
+\ claim the memory used by copy of the flash
+flash-header  IF
+   romfs-base dup flash-image-size 0 claim drop
+THEN
+
+s" bootinfo" romfs-lookup drop c + l@ CONSTANT start-addr
+start-addr flash-addr <> CONSTANT takeover?
+
+takeover? u3? or 0=  IF
+   \ we want nvram logging to work
+   ['] .nvramlog-write-byte to nvramlog-write-byte
+THEN
+
+160 cp
+
+u4? IF f8002100 rl@ 0= ELSE false THEN  ?INCLUDE u4-mem.fs
+u3?  IF
+   planar-id 5 >=  IF
+      40000 to nvram-size
+   ELSE
+      \ change nvram-size to 8000 for GA1 blades
+      8000 to nvram-size
+   THEN
+THEN
+
+
+takeover?  IF
+   \ potentially coming from phype
+   u4?  IF
+      \ takeover on JS21 is using some nvram area
+      \ which might be available
+      \ on JS20 the nvram is too small and
+      \ we just overwrite the nvram
+      sec-nvram-base to nvram-base
+   THEN
+   sec-nvram-size to nvram-size
+   \ in takeover mode the nvram is probably not mapped
+   \ to the exact location where the nvram starts
+   \ doing a small check to see if we have a partition
+   \ starting with 70; this test is far from perfect but
+   \ takeover is not the most common mode of running slof
+   nvram-base rb@ 70 <>  IF  0 nvram-base rb!  THEN
+THEN
+
+200 cp
+
+#include <slof-logo.fs>
+#include <banner.fs>
+
+: .banner .slof-logo .banner ;
+
+\ Get the secondary CPUs into our own spinloop.
+f8000050 rl@ CONSTANT master-cpu
+\ cr .( The master cpu is #) master-cpu .
+
+VARIABLE cpu-mask
+: get-slave ( n -- online? )
+  0 3ff8 ! 18 lshift 30000000 or 48003f02 over l! icbi 10000 0 DO LOOP 3ff8 @ ;
+: mark-online ( n -- )  1 swap lshift cpu-mask @ or cpu-mask ! ;
+: get-slaves  40 0 DO i get-slave IF i mark-online THEN LOOP ;
+: cpu-report  ( -- )
+   cpu-mask @ 40 0  DO  dup 1 and  IF  ." #" i .  THEN  1 rshift  LOOP  drop
+;
+
+220 cp
+master-cpu mark-online get-slaves
+
+DEFER disable-watchdog ( -- )
+DEFER find-boot-sector ( -- )
+
+
+240 cp
+\ Timebase frequency, in Hz.
+\ -1 VALUE tb-frequency
+d# 14318378 VALUE tb-frequency   \ default value - needed for "ms" to work
+-1 VALUE cpu-frequency
+
+#include "helper.fs"
+260 cp
+
+#include <timebase.fs>
+
+270 cp
+
+#include <fcode/evaluator.fs>
+
+280 cp
+
+\ rtas-config is not used
+0 CONSTANT rtas-config
+
+#include "rtas.fs"
+290 cp
+s" update_flash.fs" included
+2a0 cp
+cpu-mask @ rtas-fetch-cpus drop
+
+: of-start-cpu rtas-start-cpu ;
+
+' power-off to halt
+' rtas-system-reboot to reboot
+
+: other-firmware  rtas-get-flashside 0= IF 1 ELSE 0 THEN rtas-set-flashside reboot ;
+: disable-boot-watchdog rtas-stop-bootwatchdog drop ;
+' disable-boot-watchdog to disable-watchdog
+
+true value bmc?
+false value debug-boot?
+
+\ for JS21/Bimini try to detect BMC... if kcs (io @ca8) status is not ff...
+u4? IF ca8 4 + io-c@ ff = IF false to bmc? true to debug-boot? THEN THEN
+
+VARIABLE memnode
+
+\ Hook to help loading our secondary boot loader.
+DEFER disk-read ( lba cnt addr -- )
+0 VALUE disk-off
+
+create vpd-cb 24 allot
+create vpd-bootlist 4 allot
+2c0 cp
+#include "ipmi-vpd.fs"
+2e0 cp
+#include <quiesce.fs>
+300 cp
+#include <usb/usb-static.fs>
+320 cp
+#include <scsi-loader.fs>
+#include <root.fs>
+360 cp
+#include "tree.fs"
+
+: .system-information  ( -- )
+   s"                   " type cr
+   s" SYSTEM INFORMATION" type cr
+   s"  Processor  = " type s" cpu" get-chosen  IF
+      drop l@ >r pvr@ s" pvr>name" r> $call-method type
+      s"  @ " type cpu-frequency d# 1000000 /
+      decimal . hex s" MHz" type
+   THEN  cr s"  I/O Bridge = " type u3?  IF
+      s" U3"  ELSE  s" U4"  THEN type
+   f8000000 rl@ 4 rshift s"  (" type 1 0.r s" ." type
+   f8000000 rl@ f and 1 0.r s" )" type cr
+   s"  SMP Size   = " type cpu-mask @ cnt-bits 1 0.r
+   s"  (" type cpu-report 8 emit s" )" type
+   cr s"  Boot-Date  = " type .date cr
+   s"  Memory     = " type s" memory" get-chosen  IF
+      drop l@ s" mem-report" rot $call-method  THEN
+   cr s"  Board Type = " type u3?  IF
+      s" JS20(GA" type planar-id 5 >=  IF
+         s" 2)" ELSE s" 1)" THEN type
+   ELSE bimini?  IF  s" Bimini"  ELSE  s" JS21"  THEN  type  THEN
+   s"  (" type .vpd-machine-type [char] / emit
+   .vpd-machine-serial [char] / emit
+   .vpd-hw-revision 8 emit  s" )" type cr
+   s"  MFG Date   = " type .vpd-manufacturer-date cr
+   s"  Part No.   = " type .vpd-part-number cr
+   s"  FRU No.    = " type .vpd-fru-number cr
+   s"  FRU Serial = " type .vpd-cardprefix-serial .vpd-card-serial cr
+   s"  UUID       = " type .vpd-uuid cr
+   s"  Flashside  = " type rtas-get-flashside 0=  IF
+      ." 0 (permanent)"
+   ELSE
+      ." 1 (temporary)" THEN cr
+   s"  Version    = " type 
+   takeover?  IF
+      romfs-base 38 + a type
+   ELSE
+      slof-build-id here swap rmove 
+      here slof-build-id nip type cr
+      s"  Build Date = " type bdate2human type
+   THEN
+   cr cr
+;
+
+800 cp
+
+#include "nvram.fs"
+takeover? not u4? and  IF
+   \ if were are not in takeover mode the nvram should look
+   \ something like this:
+   \ type  size  name
+   \ ========================
+   \  51  20000  ibm,CPU0log
+   \  51   5000  ibm,CPU1log
+   \  70   1000  common
+   \  7f  da000  <free-space>
+   \ the partition with the type 51 should have been added
+   \ by LLFW... if it does not exist then something went
+   \ wrong and we just destroy the whole thing
+   51 get-nvram-partition IF  0 0 nvram-c!  ELSE  2drop  THEN
+THEN
+
+880 cp
+
+\ dmesg/dmesg2 not available if running in takeover/ram mode or on js20
+: dmesg  ( -- )  u3? takeover? or 0=  IF  dmesg  THEN ;
+: dmesg2  ( -- )  u3? takeover? or 0=  IF  dmesg2  THEN ;
+
+#include "envvar.fs"
+check-for-nvramrc
+
+8a0 cp
+\ The client interface.
+#include "client.fs"
+\ ELF binary file format.
+#include "elf.fs"
+#include <loaders.fs>
+
+8a8 cp
+
+\ check wether a VGA device was found during pci scan, if it was
+\ try to initialize it and create the needed device-nodes
+0 value biosemu-vmem
+100000 value biosemu-vmem-size
+0 value screen-info
+
+: init-vga-devices  ( -- )
+   vga-device-node? 0= use-biosemu? 0= OR IF
+      EXIT
+   THEN
+   s" VGA Device found: " type vga-device-node? node>path type s"  initializing..." type cr
+   \ claim virtual memory for biosemu of 1MB
+   biosemu-vmem-size 4 claim to biosemu-vmem
+   \ claim memory for screen-info struct (140 bytes)
+   d# 140 4 claim to screen-info
+   \ remember current-node (it might be node 0 so we cannot use get-node)
+   current-node @
+   \ change into vga device node
+   vga-device-node? set-node
+   \ run biosemu to initialize the vga card
+   \ s" Time before biosemu:" type .date cr
+   vga-device-node? node>path ( pathstr len )
+   s" biosemu " biosemu-vmem $cathex ( pathstr len paramstr len )
+   20 char-cat \ add a space ( pathstr len paramstr len )
+   biosemu-vmem-size $cathex \ add VMEM Size ( pathstr len paramstr len )
+   20 char-cat \ add a space ( pathstr len paramstr len )
+   2swap $cat ( paramstr+path len )
+   biosemu-debug 0<> IF
+      20 char-cat biosemu-debug $cathex \ add biosemu-debug as param
+      ( paramstr+path+biosemu-debug len )
+   THEN
+   .(client-exec) IF
+      ." biosemu client exec failed!" cr
+      set-node                          \ restore old current-node
+      EXIT
+   THEN
+   \ s" Time after biosemu:" type .date cr
+   s" VGA initialization: detecting displays..." type cr
+   \ try to get info for two monitors
+   2 0 DO 
+      \ setup screen-info struct as input to get_vbe_info
+      s" DDC" 0 char-cat screen-info swap move \ null-terminated "DDC" as signature
+      d# 140 screen-info 4 + w! \ reserved size in bytes (see claim above)
+      i screen-info 6 + c! \ monitor number
+      \ 320 screen-info 7 + w! \ max. screen width (800)
+      500 screen-info 7 + w! \ max. screen width (1280)
+      \ following line would be the right thing to do, however environment seems not setup yet...
+      \ screen-#columns char-width * 500 min 280 max screen-info 7 + w! \ max. screen width, calculated from environment variable screen-#columns, but max. 1280, min. 640...
+      8 screen-info 9 + c! \ requested color depth (8bpp)
+      \ d# 16 screen-info 9 + c! \ requested color depth (16bpp)
+      \ execute get_vbe_info from load-base
+      \ s" Time before client exec:" type .date cr
+      \ since node>path overwrites strings created with s" 
+      \ we need to call it before assembling the parameter string
+      vga-device-node? node>path ( pathstr len )
+      s" get_vbe_info " biosemu-vmem $cathex ( pathstr len paramstr len )
+      20 char-cat \ add a space ( pathstr len paramstr len )
+      biosemu-vmem-size $cathex \ add VMEM Size ( pathstr len paramstr len )
+      20 char-cat \ add a space ( pathstr len paramstr len )
+      2swap $cat ( paramstr+path len )
+      20 char-cat
+      screen-info $cathex
+      .(client-exec) 0=
+      \ s" Time after client exec:" type .date cr
+      screen-info c@ 0<> AND IF
+        s"   display " type i . s" found..." type 
+        \ screen found
+        \ create device entry
+        get-node node>name \ get current nodes name (e.g. "vga") ( str len )
+        i \ put display-num on the stack ( str len displaynum )
+        new-device \ create new device
+           s" vga-display.fs" included
+        finish-device
+        s" created." type cr
+      THEN
+   LOOP
+   \ return to where we were before changing to vga device node
+   set-node
+   \ release the claimed memory
+   screen-info d# 140 release 
+   biosemu-vmem biosemu-vmem-size release
+
+   s" VGA initialization done." type cr
+;
+
+init-vga-devices
+
+: enable-framebuffer-output  ( -- )
+\ enable output on framebuffer
+   s" screen" find-alias ?dup  IF
+      \ we need to open/close the screen device once
+      \ before "ticking" display-emit to emit
+      open-dev close-node
+      s" display-emit" $find  IF 
+         to emit 
+      ELSE
+         2drop
+      THEN
+   THEN
+;
+
+enable-framebuffer-output
+
+8b0 cp
+
+\ do not let the usb scan overwrite the atapi cdrom alias
+\ pci-cdrom-num TO cdrom-alias-num
+usb-scan
+
+: create-aliases  ( -- )
+   s" net" s" net1" find-alias ?dup  IF  set-alias ELSE 2drop  THEN
+   s" disk" s" disk0" find-alias ?dup  IF  set-alias  ELSE  2drop  THEN
+   s" cdrom" s" cdrom0" find-alias ?dup  IF  set-alias  ELSE  2drop  THEN
+;
+
+create-aliases
+
+8ff cp
+
+.system-information
+
+: directserial
+u3? IF
+       s" /ht/isa/serial@3f8" io
+ELSE
+       s" direct-serial?" evaluate IF s" /ht/isa/serial@2f8" io ELSE s" /ht/isa/serial@3f8" io THEN
+THEN
+;
+
+directserial
+  
+\ on bimini we want to automatically enable screen and keyboard, if they are detected...
+bimini? IF
+   key? IF
+      cr ."    input available on current console input device, not switching input / output." cr
+   ELSE
+      \ this enables the framebuffer as primary output device
+      s" screen" find-alias  IF  drop
+         s" screen" output
+         \ at this point serial output is theoretically disabled
+         ."    screen detected and set as default output device" cr
+      THEN
+      \ enable USB keyboard
+      s" keyboard" find-alias  IF  drop
+         s" keyboard" input
+         \ at this point serial input is disabled
+         ."    keyboard detected and set as default input device" cr cr cr
+         s"   Press 's' to enter Open Firmware." type cr
+         500 ms
+      THEN
+   THEN
+THEN
+
+: .flashside
+   cr ." The currently active flashside is: "
+   rtas-get-flashside 0= IF ." 0 (permanent)" ELSE
+   ." 1 (temporary)" THEN
+;
+
+bmc? IF  disable-watchdog  THEN
+
+: flashsave  ( "{filename}" -- rc )
+  (parse-line) dup 0> IF
+    s" netsave "             \ command
+    get-flash-base $cathex   \ Flash base addr
+    s"  400000 " $cat        \ Flash size (4MB)
+    2swap $cat               \ add parameters from (parse-line)
+    evaluate
+  ELSE
+    cr
+    ." Usage: flashsave [bootp|dhcp,]filename[,siaddr][,ciaddr][,giaddr][,bootp-retries][,tftp-retries][,use_ci]"
+    cr 2drop
+  THEN
+;
+
+#include <vpd-bootlist.fs>
+
+\ for the blades we read the bootlist from the VPD
+bimini? takeover? or 0=  IF  ['] vpd-boot-import to read-bootlist  THEN
+
+\ for the bimini, we try to boot from disk, if it exists, 
+\ only if "boot-device" is not set in the nvram
+: bimini-bootlist
+   \ check nvram
+   s" boot-device" evaluate swap drop ( boot-device-strlen )
+   0= IF
+      \ no boot-device set in NVRAM, check if disk is available and set it...
+      \ clear boot-device list
+      0 0 set-boot-device
+      s" disk" find-alias ?dup IF
+         \ alias found, use it as default
+         add-boot-device
+      THEN
+   THEN
+;
+
+bimini? IF ['] bimini-bootlist to read-bootlist THEN
+
+#include <start-up.fs>
+
+#include <boot.fs>
+
+cr .(   Welcome to Open Firmware)
+cr
+#include "copyright-oss.fs"
+cr
+
+\ this CATCH is to ensure the code bellow always executes:  boot may ABORT!
+' start-it CATCH drop
+
+#include <history.fs>
+nvram-history? [IF]
+." loading shell history .. "
+history-load
+." done" cr
+[THEN]
+