* [Qemu-devel] [PATCH] xhci: order superspeed ports first
@ 2014-05-26 9:25 Gerd Hoffmann
2014-05-26 10:44 ` Michael S. Tsirkin
0 siblings, 1 reply; 2+ messages in thread
From: Gerd Hoffmann @ 2014-05-26 9:25 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Anthony Liguori, Michael S. Tsirkin
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 \
--
1.8.3.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] xhci: order superspeed ports first
2014-05-26 9:25 [Qemu-devel] [PATCH] xhci: order superspeed ports first Gerd Hoffmann
@ 2014-05-26 10:44 ` Michael S. Tsirkin
0 siblings, 0 replies; 2+ messages in thread
From: Michael S. Tsirkin @ 2014-05-26 10:44 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: qemu-devel, Anthony Liguori
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-05-26 10:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-26 9:25 [Qemu-devel] [PATCH] xhci: order superspeed ports first Gerd Hoffmann
2014-05-26 10:44 ` Michael S. Tsirkin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).