Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / scsi-probe-helpers.fs
diff --git a/qemu/roms/SLOF/slof/fs/scsi-probe-helpers.fs b/qemu/roms/SLOF/slof/fs/scsi-probe-helpers.fs
new file mode 100644 (file)
index 0000000..6aec8b1
--- /dev/null
@@ -0,0 +1,95 @@
+\ This file is meant to be included by SCSI hosts to provide
+\ probing helpers - scsi-find-disks
+
+: wrapped-inquiry ( -- true | false )
+    inquiry 0= IF false EXIT THEN
+    \ Skip devices with PQ != 0
+    sector inquiry-data>peripheral c@ e0 and 0 =
+;
+
+: scsi-read-lun     ( addr -- lun true | false )
+    dup c@ C0 AND CASE
+       40 OF w@-be 3FFF AND TRUE ENDOF
+       0  OF w@-be          TRUE ENDOF
+       dup dup OF ." Unsupported LUN format = " . cr FALSE ENDOF
+    ENDCASE
+;
+
+: vscsi-report-luns ( -- array ndev )
+    \ array of pointers, up to 8 devices
+    dev-max-target 3 << alloc-mem dup
+    0                                    ( devarray devcur ndev )
+    dev-max-target 0 DO
+       i 0 dev-generate-srplun (set-target)
+       report-luns nip IF
+           sector l@                     ( devarray devcur ndev size )
+           sector 8 + swap               ( devarray devcur ndev lunarray size )
+           dup 8 + dup alloc-mem         ( devarray devcur ndev lunarray size size+ mem )
+           dup rot 0 fill                ( devarray devcur ndev lunarray size mem )
+           dup >r swap move r>           ( devarray devcur ndev mem )
+           dup sector l@ 3 >> 0 ?DO      ( devarray devcur ndev mem memcur )
+               dup dup scsi-read-lun IF
+                   j swap dev-generate-srplun  swap x! 8 +
+               ELSE
+                   2drop
+               THEN
+           LOOP drop
+           rot                           ( devarray ndev mem devcur )
+           dup >r x! r> 8 +              ( devarray ndev devcur )
+           swap 1 +
+       ELSE
+           dev-max-target 1 = IF
+               \ Some USB MSC devices do not implement report
+               \ luns. That will stall the bulk pipe. These devices are
+               \ single lun devices, report it accordingly
+
+               ( devarray devcur ndev )
+               16 alloc-mem ( devarray devcur ndev mem )
+               dup 16 0 fill ( devarray devcur ndev mem )
+               dup 0 0 dev-generate-srplun swap x!  ( devarray devcur ndev mem )
+               rot x!  ( devarray ndev )
+               1 +
+               UNLOOP EXIT
+           THEN
+       THEN
+    LOOP
+    nip
+;
+
+: make-media-alias ( $name srplun -- )
+    >r
+    get-next-alias ?dup IF
+        r> make-disk-alias
+    ELSE
+        r> drop
+    THEN
+;
+
+: scsi-find-disks      ( -- )
+    ."        SCSI: Looking for devices" cr
+    vscsi-report-luns
+    0 ?DO
+       dup x@
+       BEGIN
+           dup x@
+           dup 0= IF drop TRUE ELSE
+               (set-target) wrapped-inquiry IF
+                   ."           " current-target (u.) type ."  "
+                   \ XXX FIXME: Check top bits to ignore unsupported units
+                   \            and maybe provide better printout & more cases
+                   \ XXX FIXME: Actually check for LUNs
+                   sector inquiry-data>peripheral c@ CASE
+                       0   OF ." DISK     : " " disk"  current-target make-media-alias ENDOF
+                       5   OF ." CD-ROM   : " " cdrom" current-target make-media-alias ENDOF
+                       7   OF ." OPTICAL  : " " cdrom" current-target make-media-alias ENDOF
+                       e   OF ." RED-BLOCK: " " disk"  current-target make-media-alias ENDOF
+                       dup dup OF ." ? (" . 8 emit 29 emit 5 spaces ENDOF
+                   ENDCASE
+                   sector .inquiry-text cr
+               THEN
+               8 + FALSE
+           THEN
+       UNTIL drop
+       8 +
+    LOOP drop
+;