spapr: Allow boot from vhost-*-scsi backends
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> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
		
							parent
							
								
									7032d92ac8
								
							
						
					
					
						commit
						c4e13492af
					
				@ -57,6 +57,7 @@
 | 
				
			|||||||
#include "hw/pci/pci.h"
 | 
					#include "hw/pci/pci.h"
 | 
				
			||||||
#include "hw/scsi/scsi.h"
 | 
					#include "hw/scsi/scsi.h"
 | 
				
			||||||
#include "hw/virtio/virtio-scsi.h"
 | 
					#include "hw/virtio/virtio-scsi.h"
 | 
				
			||||||
 | 
					#include "hw/virtio/vhost-scsi-common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "exec/address-spaces.h"
 | 
					#include "exec/address-spaces.h"
 | 
				
			||||||
#include "hw/usb.h"
 | 
					#include "hw/usb.h"
 | 
				
			||||||
@ -2384,6 +2385,7 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 | 
				
			|||||||
    ((type *)object_dynamic_cast(OBJECT(obj), (name)))
 | 
					    ((type *)object_dynamic_cast(OBJECT(obj), (name)))
 | 
				
			||||||
    SCSIDevice *d = CAST(SCSIDevice,  dev, TYPE_SCSI_DEVICE);
 | 
					    SCSIDevice *d = CAST(SCSIDevice,  dev, TYPE_SCSI_DEVICE);
 | 
				
			||||||
    sPAPRPHBState *phb = CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE);
 | 
					    sPAPRPHBState *phb = CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE);
 | 
				
			||||||
 | 
					    VHostSCSICommon *vsc = CAST(VHostSCSICommon, dev, TYPE_VHOST_SCSI_COMMON);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (d) {
 | 
					    if (d) {
 | 
				
			||||||
        void *spapr = CAST(void, bus->parent, "spapr-vscsi");
 | 
					        void *spapr = CAST(void, bus->parent, "spapr-vscsi");
 | 
				
			||||||
@ -2440,6 +2442,12 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 | 
				
			|||||||
        return g_strdup_printf("pci@%"PRIX64, phb->buid);
 | 
					        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;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user