diff options
Diffstat (limited to 'roms/SLOF/board-js2x/slof/OF.fs')
-rw-r--r-- | roms/SLOF/board-js2x/slof/OF.fs | 557 |
1 files changed, 557 insertions, 0 deletions
diff --git a/roms/SLOF/board-js2x/slof/OF.fs b/roms/SLOF/board-js2x/slof/OF.fs new file mode 100644 index 000000000..044a0c8ff --- /dev/null +++ b/roms/SLOF/board-js2x/slof/OF.fs @@ -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 comming 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] + |