From: "Michael S. Tsirkin" <mst@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org, Anthony Liguori <aliguori@amazon.com>
Subject: Re: [Qemu-devel] [PATCH] xhci: order superspeed ports first
Date: Mon, 26 May 2014 13:44:52 +0300 [thread overview]
Message-ID: <20140526104452.GA7796@redhat.com> (raw)
In-Reply-To: <1401096356-26762-1-git-send-email-kraxel@redhat.com>
On Mon, May 26, 2014 at 11:25:56AM +0200, Gerd Hoffmann wrote:
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> hw/usb/hcd-xhci.c | 44 ++++++++++++++++++++++++++++++++++++--------
> include/hw/i386/pc.h | 4 ++++
> 2 files changed, 40 insertions(+), 8 deletions(-)
>
> diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
> index 72308e0..3f1b7ce 100644
> --- a/hw/usb/hcd-xhci.c
> +++ b/hw/usb/hcd-xhci.c
> @@ -498,6 +498,7 @@ typedef struct XHCIEvRingSeg {
> enum xhci_flags {
> XHCI_FLAG_USE_MSI = 1,
> XHCI_FLAG_USE_MSI_X,
> + XHCI_FLAG_SS_FIRST,
> };
>
> static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
> @@ -714,10 +715,18 @@ static XHCIPort *xhci_lookup_port(XHCIState *xhci, struct USBPort *uport)
> case USB_SPEED_LOW:
> case USB_SPEED_FULL:
> case USB_SPEED_HIGH:
> - index = uport->index;
> + if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
> + index = uport->index + xhci->numports_3;
> + } else {
> + index = uport->index;
> + }
> break;
> case USB_SPEED_SUPER:
> - index = uport->index + xhci->numports_2;
> + if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
> + index = uport->index;
> + } else {
> + index = uport->index + xhci->numports_2;
> + }
> break;
> default:
> return NULL;
> @@ -2972,7 +2981,11 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, unsigned size)
> ret = 0x20425355; /* "USB " */
> break;
> case 0x28: /* Supported Protocol:08 */
> - ret = 0x00000001 | (xhci->numports_2<<8);
> + if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
> + ret = (xhci->numports_2<<8) | (xhci->numports_3+1);
> + } else {
> + ret = (xhci->numports_2<<8) | 1;
> + }
> break;
> case 0x2c: /* Supported Protocol:0c */
> ret = 0x00000000; /* reserved */
> @@ -2984,7 +2997,11 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, unsigned size)
> ret = 0x20425355; /* "USB " */
> break;
> case 0x38: /* Supported Protocol:08 */
> - ret = 0x00000000 | (xhci->numports_2+1) | (xhci->numports_3<<8);
> + if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
> + ret = (xhci->numports_3<<8) | 1;
> + } else {
> + ret = (xhci->numports_3<<8) | (xhci->numports_2+1);
> + }
> break;
> case 0x3c: /* Supported Protocol:0c */
> ret = 0x00000000; /* reserved */
> @@ -3517,8 +3534,13 @@ static void usb_xhci_init(XHCIState *xhci)
> for (i = 0; i < usbports; i++) {
> speedmask = 0;
> if (i < xhci->numports_2) {
> - port = &xhci->ports[i];
> - port->portnr = i + 1;
> + if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
> + port = &xhci->ports[i + xhci->numports_3];
> + port->portnr = i + 1 + xhci->numports_3;
> + } else {
> + port = &xhci->ports[i];
> + port->portnr = i + 1;
> + }
> port->uport = &xhci->uports[i];
> port->speedmask =
> USB_SPEED_MASK_LOW |
> @@ -3528,8 +3550,13 @@ static void usb_xhci_init(XHCIState *xhci)
> speedmask |= port->speedmask;
> }
> if (i < xhci->numports_3) {
> - port = &xhci->ports[i + xhci->numports_2];
> - port->portnr = i + 1 + xhci->numports_2;
> + if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
> + port = &xhci->ports[i];
> + port->portnr = i + 1;
> + } else {
> + port = &xhci->ports[i + xhci->numports_2];
> + port->portnr = i + 1 + xhci->numports_2;
> + }
> port->uport = &xhci->uports[i];
> port->speedmask = USB_SPEED_MASK_SUPER;
> snprintf(port->name, sizeof(port->name), "usb3 port #%d", i+1);
> @@ -3788,6 +3815,7 @@ static const VMStateDescription vmstate_xhci = {
> static Property xhci_properties[] = {
> DEFINE_PROP_BIT("msi", XHCIState, flags, XHCI_FLAG_USE_MSI, true),
> DEFINE_PROP_BIT("msix", XHCIState, flags, XHCI_FLAG_USE_MSI_X, true),
> + DEFINE_PROP_BIT("ss-first", XHCIState, flags, XHCI_FLAG_SS_FIRST, true),
> DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
> DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
> DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4),
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 32a7687..bc202de 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -271,6 +271,10 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
> .driver = "apic",\
> .property = "version",\
> .value = stringify(0x11),\
> + },{\
> + .driver = "nec-usb-xhci",\
> + .property = "ss-first",\
> + .value = "off",\
> }
>
> #define PC_COMPAT_1_7 \
Since this is a user-visible property, let's give it
a full name so it's easier to figure out what it does?
Alternatively let's start the name with "x-" to stress
it's an internal one for migration only.
> --
> 1.8.3.1
prev parent reply other threads:[~2014-05-26 10:46 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-26 9:25 [Qemu-devel] [PATCH] xhci: order superspeed ports first Gerd Hoffmann
2014-05-26 10:44 ` Michael S. Tsirkin [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=20140526104452.GA7796@redhat.com \
--to=mst@redhat.com \
--cc=aliguori@amazon.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.