diff options
Diffstat (limited to 'qemu/roms/SLOF/board-js2x/slof/citrine.fs')
-rw-r--r-- | qemu/roms/SLOF/board-js2x/slof/citrine.fs | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/board-js2x/slof/citrine.fs b/qemu/roms/SLOF/board-js2x/slof/citrine.fs new file mode 100644 index 000000000..ad6777699 --- /dev/null +++ b/qemu/roms/SLOF/board-js2x/slof/citrine.fs @@ -0,0 +1,245 @@ +\ ***************************************************************************** +\ * 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 +\ ****************************************************************************/ + + +\ Citrine storage controller. +2dup type + +device-name s" ide" device-type + + +3 encode-int s" #address-cells" property +0 encode-int s" #size-cells" property + +: decode-unit 3 hex-decode-unit ; +: encode-unit 3 hex-encode-unit ; + + +: >ioa [ 10 config-l@ -10 and ] LITERAL + ; +: ioa@ >ioa rl@-le ; +: ioa! >ioa rl!-le ; + + +\ Clear request completion doorbell. +2 228 ioa! + +\ status +CREATE ioasa 200 allot ioasa 200 erase \ can reduce to 8 later + +\ request/response queue +CREATE rrq 100 allot rrq 100 erase \ can be smaller + +\ data descriptor +CREATE ioadl 8 allot + +\ control block +CREATE ioarcb 80 allot ioarcb 80 erase +ioarcb dup l! +60708090 ioarcb c + l! \ user handle +ioadl ioarcb 2c + l! \ read ioadl +ioasa ioarcb 34 + l! 200 ioarcb 38 + w! + +\ ioa config data (max. 16 devices) +CREATE ioacfg 404 allot ioacfg 404 erase +CREATE setsupbuff 2c allot + setsupbuff 2c erase + 2c setsupbuff w! + 1 setsupbuff 3 + c! + +: wait-ready ( -- ) + 82800000 214 ioa! + 80000000 BEGIN dup 224 ioa@ cr .s dup 8000000 and IF + cr ." Unit check on SAS-Controller detected" + cr 42c ioa@ . + 8 110 ioa! + BEGIN cr 0 config-l@ dup . ffffffff <> UNTIL +\ ABORT" Unit check on SAS-Controller detected" + THEN + and + UNTIL drop +; + +\ wait-ready + +: wait-ioa ( int-mask -- ) BEGIN dup 224 ioa@ and UNTIL drop ; +: init-ioa ( -- ) 82800000 214 ioa! 80000000 wait-ioa ; +: do-request ( -- ) ioasa 20 erase ioarcb 404 ioa! + 2 wait-ioa 2 228 ioa! +; + +: setup-ioarcb ( rsrc type addr len -- ) + tuck 49000000 or ioadl l! ioadl 4 + l! \ setup ioadl + ioarcb 20 + l! ioadl ioarcb 2c + l! 8 ioarcb 30 + l! \ set len, ioadl addr + ioarcb 3e + c! ioarcb 8 + l! \ set type and resource + ioarcb 40 + 40 erase ; + +: setup-wrioarcb ( rsrc type addr len -- ) + tuck 49000000 or ioadl l! ioadl 4 + l! \ setup ioadl + ioarcb 1C + l! ioadl ioarcb 24 + l! 8 ioarcb 28 + l! \ set len, ioadl addr + ioarcb 3e + c! ioarcb 8 + l! \ set type and resource + ioarcb 40 + 40 erase ; + +: setup-idrrq ( rrq len -- ) + c4 ioarcb 42 + c! 8 lshift ioarcb 48 + l! ioarcb 44 + l! ; +: do-idrrq ( -- ) -1 1 0 0 setup-ioarcb rrq 100 setup-idrrq do-request ; + +: setup-query ( len -- ) c5 ioarcb 42 + c! 8 lshift ioarcb 48 + l! ; +: do-query ( -- ) -1 1 ioacfg 404 setup-ioarcb 404 setup-query do-request ; + +: setup-startUnit ( -- ) 1b ioarcb 42 + c! 3 ioarcb 46 + c! ; +: do-startUnit ( hndl -- ) 0 0 0 setup-ioarcb setup-startUnit do-request ; + +: setup-setsupported ( len -- ) 80 ioarcb 40 + c! fb ioarcb 42 + c! 8 lshift ioarcb 48 + l! ; +: do-setsupported ( -- ) -1 1 setsupbuff 2c setup-wrioarcb 2c setup-setsupported do-request ; + +\ ******************************** +\ read capacity +\ ******************************** +CREATE cap 8 allot + +: setup-cap ( -- ) 25 ioarcb 42 + c! cap 8 erase ; +: do-cap ( rsrc addr -- ) + >r 0 r> 8 setup-ioarcb setup-cap do-request ; + +: .id ( id -- ) ." @" lwsplit 2 0.r ." ," wbsplit 2 0.r ." ," 2 0.r ; + +: .cap ( rsrc -- ) + cap do-cap cap l@ cap 4 + l@ * d# 50000000 + d# 100000000 / + base @ >r decimal d# 10 /mod 4 .r ." ." 0 .r ." GB" r> base ! ; + +\ ******************************** +\ Test Unit Ready +\ ******************************** +: setup-test-unit-ready ( -- ) + 00 ioarcb 42 + c! \ SCSI cmd: Test-Unit-Ready +; + +: do-test-unit-ready ( rsrc -- ) + 0 0 0 setup-ioarcb ( rsrc type addr len -- ) + setup-test-unit-ready + do-request +; + +\ ******************************** +\ Check devices +\ ******************************** +: check-device ( ioacfg-entry -- ) + dup 2 + w@ 2001 and 0<> \ generic or raid disk + IF \ is an IOA resource ? + dup 8 + l@ ( ioacfg-entry rsrc ) \ get resource handle + 8 0 + DO ( ioacfg-entry rsrc ) + dup do-test-unit-ready ( ioacfg-entry rsrc ) + ioasa l@ 0= \ read returned status + IF + LEAVE + THEN + LOOP + drop ( ioacfg-entry ) + THEN + drop ( ) +; + +: check-devices ( -- ) + ioacfg 4 + ( ioacfg-entry ) \ config block for 16 devices + ioacfg c@ 0 \ amount of detected devices + ?DO + dup + check-device ( ioacfg-entry ) + 40 + + LOOP + drop +; + +\ ******************************** +\ Show Devices +\ ******************************** +: show-device ( ioacfg-entry -- ) + cr ." " dup 2 + w@ + dup 8000 and IF ." Controller :" THEN + dup 2000 and IF ." Disk (RAID Member):" THEN + dup 0002 and IF ." Disk (Volume Set) :" THEN + 0001 and IF ." Disk (Generic) :" THEN + space dup 4 + l@ ffffff and dup ffffff <> IF + .id + ELSE drop 9 spaces THEN space + dup 1c + 8 type space dup 24 + 10 type + dup 2 + w@ 8000 and 0= IF + space dup 8 + l@ .cap + THEN drop +; + +: show-devices ( -- ) + ioacfg 4 + ioacfg c@ 0 + ?DO dup show-device 40 + LOOP drop +; + +: setup-read ( lba len -- ) \ len is in blocks + 28 ioarcb 42 + c! + swap ioarcb 44 + l! + 8 lshift ioarcb 48 + l! +; + +: do-read ( hndl lba len addr -- ) \ len is in blocks + over >r rot >r swap 0 -rot 200 * ( 0 hndl addr len* ) + setup-ioarcb r> r> ( lba len ) + setup-read do-request +; + +: make-subnode ( rsrc-type rsrc-handle id -- ) + rot 2 and IF \ only device which are part of a RAID should be started + over do-startUnit \ at least on citrine there are problems starting + \ Generic SCSI devices + THEN do-setsupported + dup ffffff <> IF + \ we need max-#blocks for citrine-disk.fs + ( rsrc id ) + over cap do-cap cap l@ ( rsrc id max-#blocks ) + swap rot swap ( max-#block rsrc id ) \ this is what citrine-disk.fs expects... + s" citrine-disk.fs" included + ELSE + 2drop + THEN +; + +: make-subnodes ( -- ) + ioacfg 4 + ioacfg c@ 0 ?DO dup 2 + w@ dup ( ioacfg rsrc-type rsrc-type ) + A000 \ 8000 = Resource Subtype is IOA Focal Point. + \ 2000 = Device is a member of a data redundancy group (eg. RAID). + \ (1000 = Device is designated for use as a hot spare. + \ Unfortunately obsidian reports disk which are not part of + \ of a RAID also as hot space even if they are not.) + \ all these devices should not appeat in DT + \ SIS40 page 60 + and 0= IF + swap dup ( rsrc-type ioacfg ioacfg ) + 8 + l@ over 4 + l@ ( rsrc-type ioacfg rsrc-handle rsrc-addr ) + ffffff and 2swap swap 2swap ( ioacfg rsrc-type rsrc-handle rsrc-addr ) + make-subnode ELSE drop THEN 40 + LOOP drop ; + +: do-it ( -- ) + init-ioa do-idrrq + do-query + check-devices + show-devices +; + +: setup-shutdown ( -- ) + f7 ioarcb 42 + c! 0 ioarcb 48 + l! 0 ioarcb 44 + l! ; +: do-shutdown ( -- ) -1 1 0 0 setup-ioarcb setup-shutdown do-request ; + +: open true ; +: close ; + +: start ['] do-it CATCH IF cr ." Citrine disabled" ELSE make-subnodes THEN ; + +cr start cr cr |