Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / scsi-probe-helpers.fs
1 \ This file is meant to be included by SCSI hosts to provide
2 \ probing helpers - scsi-find-disks
3
4 : wrapped-inquiry ( -- true | false )
5     inquiry 0= IF false EXIT THEN
6     \ Skip devices with PQ != 0
7     sector inquiry-data>peripheral c@ e0 and 0 =
8 ;
9
10 : scsi-read-lun     ( addr -- lun true | false )
11     dup c@ C0 AND CASE
12         40 OF w@-be 3FFF AND TRUE ENDOF
13         0  OF w@-be          TRUE ENDOF
14         dup dup OF ." Unsupported LUN format = " . cr FALSE ENDOF
15     ENDCASE
16 ;
17
18 : vscsi-report-luns ( -- array ndev )
19     \ array of pointers, up to 8 devices
20     dev-max-target 3 << alloc-mem dup
21     0                                    ( devarray devcur ndev )
22     dev-max-target 0 DO
23         i 0 dev-generate-srplun (set-target)
24         report-luns nip IF
25             sector l@                     ( devarray devcur ndev size )
26             sector 8 + swap               ( devarray devcur ndev lunarray size )
27             dup 8 + dup alloc-mem         ( devarray devcur ndev lunarray size size+ mem )
28             dup rot 0 fill                ( devarray devcur ndev lunarray size mem )
29             dup >r swap move r>           ( devarray devcur ndev mem )
30             dup sector l@ 3 >> 0 ?DO      ( devarray devcur ndev mem memcur )
31                 dup dup scsi-read-lun IF
32                     j swap dev-generate-srplun  swap x! 8 +
33                 ELSE
34                     2drop
35                 THEN
36             LOOP drop
37             rot                           ( devarray ndev mem devcur )
38             dup >r x! r> 8 +              ( devarray ndev devcur )
39             swap 1 +
40         ELSE
41             dev-max-target 1 = IF
42                 \ Some USB MSC devices do not implement report
43                 \ luns. That will stall the bulk pipe. These devices are
44                 \ single lun devices, report it accordingly
45
46                 ( devarray devcur ndev )
47                 16 alloc-mem ( devarray devcur ndev mem )
48                 dup 16 0 fill ( devarray devcur ndev mem )
49                 dup 0 0 dev-generate-srplun swap x!  ( devarray devcur ndev mem )
50                 rot x!  ( devarray ndev )
51                 1 +
52                 UNLOOP EXIT
53             THEN
54         THEN
55     LOOP
56     nip
57 ;
58
59 : make-media-alias ( $name srplun -- )
60     >r
61     get-next-alias ?dup IF
62         r> make-disk-alias
63     ELSE
64         r> drop
65     THEN
66 ;
67
68 : scsi-find-disks      ( -- )
69     ."        SCSI: Looking for devices" cr
70     vscsi-report-luns
71     0 ?DO
72         dup x@
73         BEGIN
74             dup x@
75             dup 0= IF drop TRUE ELSE
76                 (set-target) wrapped-inquiry IF
77                     ."           " current-target (u.) type ."  "
78                     \ XXX FIXME: Check top bits to ignore unsupported units
79                     \            and maybe provide better printout & more cases
80                     \ XXX FIXME: Actually check for LUNs
81                     sector inquiry-data>peripheral c@ CASE
82                         0   OF ." DISK     : " " disk"  current-target make-media-alias ENDOF
83                         5   OF ." CD-ROM   : " " cdrom" current-target make-media-alias ENDOF
84                         7   OF ." OPTICAL  : " " cdrom" current-target make-media-alias ENDOF
85                         e   OF ." RED-BLOCK: " " disk"  current-target make-media-alias ENDOF
86                         dup dup OF ." ? (" . 8 emit 29 emit 5 spaces ENDOF
87                     ENDCASE
88                     sector .inquiry-text cr
89                 THEN
90                 8 + FALSE
91             THEN
92         UNTIL drop
93         8 +
94     LOOP drop
95 ;