diff mbox

xhci: order superspeed ports first

Message ID 1401096356-26762-1-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann May 26, 2014, 9:25 a.m. UTC
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(-)

Comments

Michael S. Tsirkin May 26, 2014, 10:44 a.m. UTC | #1
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
diff mbox

Patch

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 \