[SLOF] [PATCH] vio-vscsi: Support multiple channels / buses
Alexey Kardashevskiy
aik at ozlabs.ru
Thu Jan 10 10:59:47 AEDT 2019
On 10/01/2019 04:05, Thomas Huth wrote:
> The spapr-vscsi device of QEMU supports multiple channels (a.k.a. buses).
What about virtio-scsi?
> But when QEMU is started with a device on a bus > 0, SLOF fails to detect
> the device, so that the boot fails. For example:
>
> qemu-system-ppc64 -nodefaults -nographic -serial stdio -device spapr-vscsi \
> -blockdev driver=file,filename=/path/to/cdrom.iso,node-name=d1,read-only=on \
> -device scsi-cd,id=cd1,drive=d1,channel=6,scsi-id=5,lun=1
>
> Thus SLOF should scan the various channels for bootable SCSI devices, too.
> Since the common SLOF code for scanning SCSI devices has no meaning of
> "channels" or "bus", we simply fake the bus ID to be part of the target
> ID, so instead of supporting 64 targets = 64 devices, we now support
> 8 channel * 64 targets = 512 devices instead.
>
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1663160
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
> board-qemu/slof/vio-vscsi.fs | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/board-qemu/slof/vio-vscsi.fs b/board-qemu/slof/vio-vscsi.fs
> index be11b69..9395148 100644
> --- a/board-qemu/slof/vio-vscsi.fs
> +++ b/board-qemu/slof/vio-vscsi.fs
> @@ -481,14 +481,19 @@ TRUE VALUE first-time-init?
> \ SCSI scan at boot and child device support
> \ -----------------------------------------------------------
>
> -\ We use SRP luns of the form 8000 | (bus << 8) | (id << 5) | lun
> -\ in the top 16 bits of the 64-bit LUN
> : (set-target)
> to current-target
> ;
>
> -: dev-generate-srplun ( target lun -- )
> - swap 8 << 8000 or or 30 <<
> +\ We use SRP luns of the form 8000 | (target << 8) | (bus << 5) | lun
> +\ in the top 16 bits of the 64-bit LUN (i.e. the "Logical unit addressing
> +\ method" in SAM5). Since the generic scsi-probe code of SLOF does not
> +\ really care about buses, we assume that the upper 3 bits of the "target"
> +\ value are the "bus" field.
> +: dev-generate-srplun ( bus+target lun -- srplun )
> + swap dup 1 >> e0 and ( lun bus+target bus )
> + swap 3f and 8 << ( lun bus target )
> + 8000 or or or 30 <<
> ;
>
> \ We obtain here a unit address on the stack, since our #address-cells
> @@ -508,8 +513,9 @@ TRUE VALUE first-time-init?
> ;
>
> \ Report the amount of supported SCSI IDs - QEMU uses "max_target = 63"
> +\ and "max_channel = 7", we combine both to 64 * 8 = 512 devices
> : dev-max-target ( -- #max-target )
> - 40
> + 200
> ;
>
> " scsi-probe-helpers.fs" included
>
--
Alexey
More information about the SLOF
mailing list