Message ID | 1496678118-27350-2-git-send-email-felipe@nutanix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Jun 05, 2017 at 04:55:18PM +0100, Felipe Franciosi wrote: > The current implementation of spapr_get_fw_dev_path() doesn't take into > consideration vhost-*-scsi devices. This makes said devices unbootable > on PPC as SLOF is unable to work out the path to scan boot disks. > > This makes VMs bootable on spapr when using vhost-*-scsi by implementing > a disk path for VHostSCSICommon (which currently includes both > vhost-user-scsi and vhost-scsi). > > Signed-off-by: Felipe Franciosi <felipe@nutanix.com> > Signed-off-by: Mike Cui <cui@nutanix.com> Applied to ppc-for-2.10, thanks. > --- > hw/ppc/spapr.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index ab3aab1..1c87886 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -57,6 +57,7 @@ > #include "hw/pci/pci.h" > #include "hw/scsi/scsi.h" > #include "hw/virtio/virtio-scsi.h" > +#include "hw/virtio/vhost-scsi-common.h" > > #include "exec/address-spaces.h" > #include "hw/usb.h" > @@ -2388,6 +2389,7 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus, > ((type *)object_dynamic_cast(OBJECT(obj), (name))) > SCSIDevice *d = CAST(SCSIDevice, dev, TYPE_SCSI_DEVICE); > sPAPRPHBState *phb = CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE); > + VHostSCSICommon *vsc = CAST(VHostSCSICommon, dev, TYPE_VHOST_SCSI_COMMON); > > if (d) { > void *spapr = CAST(void, bus->parent, "spapr-vscsi"); > @@ -2444,6 +2446,12 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus, > return g_strdup_printf("pci@%"PRIX64, phb->buid); > } > > + if (vsc) { > + /* Same logic as virtio above */ > + unsigned id = 0x1000000 | (vsc->target << 16) | vsc->lun; > + return g_strdup_printf("disk@%"PRIX64, (uint64_t)id << 32); > + } > + > return NULL; > } >
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index ab3aab1..1c87886 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -57,6 +57,7 @@ #include "hw/pci/pci.h" #include "hw/scsi/scsi.h" #include "hw/virtio/virtio-scsi.h" +#include "hw/virtio/vhost-scsi-common.h" #include "exec/address-spaces.h" #include "hw/usb.h" @@ -2388,6 +2389,7 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus, ((type *)object_dynamic_cast(OBJECT(obj), (name))) SCSIDevice *d = CAST(SCSIDevice, dev, TYPE_SCSI_DEVICE); sPAPRPHBState *phb = CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE); + VHostSCSICommon *vsc = CAST(VHostSCSICommon, dev, TYPE_VHOST_SCSI_COMMON); if (d) { void *spapr = CAST(void, bus->parent, "spapr-vscsi"); @@ -2444,6 +2446,12 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus, return g_strdup_printf("pci@%"PRIX64, phb->buid); } + if (vsc) { + /* Same logic as virtio above */ + unsigned id = 0x1000000 | (vsc->target << 16) | vsc->lun; + return g_strdup_printf("disk@%"PRIX64, (uint64_t)id << 32); + } + return NULL; }