xhci: order superspeed ports first
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
7bd3055ffd
commit
7bafd8889e
|
@ -498,6 +498,7 @@ typedef struct XHCIEvRingSeg {
|
||||||
enum xhci_flags {
|
enum xhci_flags {
|
||||||
XHCI_FLAG_USE_MSI = 1,
|
XHCI_FLAG_USE_MSI = 1,
|
||||||
XHCI_FLAG_USE_MSI_X,
|
XHCI_FLAG_USE_MSI_X,
|
||||||
|
XHCI_FLAG_SS_FIRST,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
|
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_LOW:
|
||||||
case USB_SPEED_FULL:
|
case USB_SPEED_FULL:
|
||||||
case USB_SPEED_HIGH:
|
case USB_SPEED_HIGH:
|
||||||
|
if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
|
||||||
|
index = uport->index + xhci->numports_3;
|
||||||
|
} else {
|
||||||
index = uport->index;
|
index = uport->index;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case USB_SPEED_SUPER:
|
case USB_SPEED_SUPER:
|
||||||
|
if (xhci_get_flag(xhci, XHCI_FLAG_SS_FIRST)) {
|
||||||
|
index = uport->index;
|
||||||
|
} else {
|
||||||
index = uport->index + xhci->numports_2;
|
index = uport->index + xhci->numports_2;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2972,7 +2981,11 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, unsigned size)
|
||||||
ret = 0x20425355; /* "USB " */
|
ret = 0x20425355; /* "USB " */
|
||||||
break;
|
break;
|
||||||
case 0x28: /* Supported Protocol:08 */
|
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;
|
break;
|
||||||
case 0x2c: /* Supported Protocol:0c */
|
case 0x2c: /* Supported Protocol:0c */
|
||||||
ret = 0x00000000; /* reserved */
|
ret = 0x00000000; /* reserved */
|
||||||
|
@ -2984,7 +2997,11 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg, unsigned size)
|
||||||
ret = 0x20425355; /* "USB " */
|
ret = 0x20425355; /* "USB " */
|
||||||
break;
|
break;
|
||||||
case 0x38: /* Supported Protocol:08 */
|
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;
|
break;
|
||||||
case 0x3c: /* Supported Protocol:0c */
|
case 0x3c: /* Supported Protocol:0c */
|
||||||
ret = 0x00000000; /* reserved */
|
ret = 0x00000000; /* reserved */
|
||||||
|
@ -3517,8 +3534,13 @@ static void usb_xhci_init(XHCIState *xhci)
|
||||||
for (i = 0; i < usbports; i++) {
|
for (i = 0; i < usbports; i++) {
|
||||||
speedmask = 0;
|
speedmask = 0;
|
||||||
if (i < xhci->numports_2) {
|
if (i < xhci->numports_2) {
|
||||||
|
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 = &xhci->ports[i];
|
||||||
port->portnr = i + 1;
|
port->portnr = i + 1;
|
||||||
|
}
|
||||||
port->uport = &xhci->uports[i];
|
port->uport = &xhci->uports[i];
|
||||||
port->speedmask =
|
port->speedmask =
|
||||||
USB_SPEED_MASK_LOW |
|
USB_SPEED_MASK_LOW |
|
||||||
|
@ -3528,8 +3550,13 @@ static void usb_xhci_init(XHCIState *xhci)
|
||||||
speedmask |= port->speedmask;
|
speedmask |= port->speedmask;
|
||||||
}
|
}
|
||||||
if (i < xhci->numports_3) {
|
if (i < xhci->numports_3) {
|
||||||
|
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 = &xhci->ports[i + xhci->numports_2];
|
||||||
port->portnr = i + 1 + xhci->numports_2;
|
port->portnr = i + 1 + xhci->numports_2;
|
||||||
|
}
|
||||||
port->uport = &xhci->uports[i];
|
port->uport = &xhci->uports[i];
|
||||||
port->speedmask = USB_SPEED_MASK_SUPER;
|
port->speedmask = USB_SPEED_MASK_SUPER;
|
||||||
snprintf(port->name, sizeof(port->name), "usb3 port #%d", i+1);
|
snprintf(port->name, sizeof(port->name), "usb3 port #%d", i+1);
|
||||||
|
@ -3788,6 +3815,8 @@ static const VMStateDescription vmstate_xhci = {
|
||||||
static Property xhci_properties[] = {
|
static Property xhci_properties[] = {
|
||||||
DEFINE_PROP_BIT("msi", XHCIState, flags, XHCI_FLAG_USE_MSI, true),
|
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("msix", XHCIState, flags, XHCI_FLAG_USE_MSI_X, true),
|
||||||
|
DEFINE_PROP_BIT("superspeed-ports-first",
|
||||||
|
XHCIState, flags, XHCI_FLAG_SS_FIRST, true),
|
||||||
DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
|
DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
|
||||||
DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
|
DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
|
||||||
DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4),
|
DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4),
|
||||||
|
|
|
@ -271,6 +271,10 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
||||||
.driver = "apic",\
|
.driver = "apic",\
|
||||||
.property = "version",\
|
.property = "version",\
|
||||||
.value = stringify(0x11),\
|
.value = stringify(0x11),\
|
||||||
|
},{\
|
||||||
|
.driver = "nec-usb-xhci",\
|
||||||
|
.property = "superspeed-ports-first",\
|
||||||
|
.value = "off",\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PC_COMPAT_1_7 \
|
#define PC_COMPAT_1_7 \
|
||||||
|
|
Loading…
Reference in a new issue