All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Thomas Huth <thuth@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>,
	qemu-devel@nongnu.org, Alexander Graf <agraf@suse.de>,
	qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [PATCH for-2.9 v2] hw/ppc/spapr: Fix boot path of usb-host storage devices
Date: Thu, 15 Dec 2016 09:50:01 +1100	[thread overview]
Message-ID: <20161214225001.GK32647@umbus> (raw)
In-Reply-To: <1481751857-464-1-git-send-email-thuth@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 4892 bytes --]

On Wed, Dec 14, 2016 at 10:44:17PM +0100, Thomas Huth wrote:
> When passing through an USB storage device to a pseries guest, it
> is currently not possible to automatically boot from the device
> if the "bootindex" property has been specified, too (e.g. when using
> "-device nec-usb-xhci -device usb-host,hostbus=1,hostaddr=2,bootindex=0"
> at the command line). The problem is that QEMU builds a device tree path
> like "/pci@800000020000000/usb@0/usb-host@1" and passes it to SLOF
> in the /chosen/qemu,boot-list property. SLOF, however, probes the
> USB device, recognizes that it is a storage device and thus changes
> its name to "storage", and additionally adds a child node for the
> SCSI LUN, so the correct boot path in SLOF is something like
> "/pci@800000020000000/usb@0/storage@1/disk@101000000000000" instead.
> So when we detect an USB mass storage device with SCSI interface,
> we've got to adjust the firmware boot-device path properly that
> SLOF can automatically boot from the device.
> 
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1354177
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  v2: Improved the comment in spapr.c as requested by David

Applied to ppc-for-2.9. thanks.

> 
>  hw/ppc/spapr.c       | 13 +++++++++++++
>  hw/usb/host-libusb.c | 29 +++++++++++++++++++++++++++++
>  hw/usb/host-stub.c   |  5 +++++
>  include/hw/usb.h     |  1 +
>  4 files changed, 48 insertions(+)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 208ef7b..cd83b2c 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2185,6 +2185,19 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
>          }
>      }
>  
> +    /*
> +     * SLOF probes the USB devices, and if it recognizes that the device is a
> +     * storage device, it changes its name to "storage" instead of "usb-host",
> +     * and additionally adds a child node for the SCSI LUN, so the correct
> +     * boot path in SLOF is something like .../storage@1/disk@xxx" instead.
> +     */
> +    if (strcmp("usb-host", qdev_fw_name(dev)) == 0) {
> +        USBDevice *usbdev = CAST(USBDevice, dev, TYPE_USB_DEVICE);
> +        if (usb_host_dev_is_scsi_storage(usbdev)) {
> +            return g_strdup_printf("storage@%s/disk", usbdev->port->path);
> +        }
> +    }
> +
>      if (phb) {
>          /* Replace "pci" with "pci@800000020000000" */
>          return g_strdup_printf("pci@%"PRIX64, phb->buid);
> diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
> index bd81d71..7791c6d 100644
> --- a/hw/usb/host-libusb.c
> +++ b/hw/usb/host-libusb.c
> @@ -1707,6 +1707,35 @@ static void usb_host_auto_check(void *unused)
>      timer_mod(usb_auto_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 2000);
>  }
>  
> +/**
> + * Check whether USB host device has a USB mass storage SCSI interface
> + */
> +bool usb_host_dev_is_scsi_storage(USBDevice *ud)
> +{
> +    USBHostDevice *uhd = USB_HOST_DEVICE(ud);
> +    struct libusb_config_descriptor *conf;
> +    const struct libusb_interface_descriptor *intf;
> +    bool is_scsi_storage = false;
> +    int i;
> +
> +    if (!uhd || libusb_get_active_config_descriptor(uhd->dev, &conf) != 0) {
> +        return false;
> +    }
> +
> +    for (i = 0; i < conf->bNumInterfaces; i++) {
> +        intf = &conf->interface[i].altsetting[ud->altsetting[i]];
> +        if (intf->bInterfaceClass == LIBUSB_CLASS_MASS_STORAGE &&
> +            intf->bInterfaceSubClass == 6) {                 /* 6 means SCSI */
> +            is_scsi_storage = true;
> +            break;
> +        }
> +    }
> +
> +    libusb_free_config_descriptor(conf);
> +
> +    return is_scsi_storage;
> +}
> +
>  void hmp_info_usbhost(Monitor *mon, const QDict *qdict)
>  {
>      libusb_device **devs = NULL;
> diff --git a/hw/usb/host-stub.c b/hw/usb/host-stub.c
> index 6ba65a1..d0268ba 100644
> --- a/hw/usb/host-stub.c
> +++ b/hw/usb/host-stub.c
> @@ -46,3 +46,8 @@ USBDevice *usb_host_device_open(USBBus *bus, const char *devname)
>  {
>      return NULL;
>  }
> +
> +bool usb_host_dev_is_scsi_storage(USBDevice *ud)
> +{
> +    return false;
> +}
> diff --git a/include/hw/usb.h b/include/hw/usb.h
> index 847c9de..43838c9 100644
> --- a/include/hw/usb.h
> +++ b/include/hw/usb.h
> @@ -471,6 +471,7 @@ void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
>  /* usb-linux.c */
>  USBDevice *usb_host_device_open(USBBus *bus, const char *devname);
>  void hmp_info_usbhost(Monitor *mon, const QDict *qdict);
> +bool usb_host_dev_is_scsi_storage(USBDevice *usbdev);
>  
>  /* usb ports of the VM */
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

      reply	other threads:[~2016-12-15  0:24 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-14 21:44 [Qemu-devel] [PATCH for-2.9 v2] hw/ppc/spapr: Fix boot path of usb-host storage devices Thomas Huth
2016-12-14 22:50 ` David Gibson [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161214225001.GK32647@umbus \
    --to=david@gibson.dropbear.id.au \
    --cc=agraf@suse.de \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.