Untested. Anyone who tried to get xhci run on real hardware is welcome to test whenever this patch improves things.
Signed-off-by: Gerd Hoffmann kraxel@redhat.com --- src/hw/usb-xhci.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/src/hw/usb-xhci.c b/src/hw/usb-xhci.c index 66ce3c4..6c24855 100644 --- a/src/hw/usb-xhci.c +++ b/src/hw/usb-xhci.c @@ -710,6 +710,19 @@ configure_xhci(void *data) writel(&xhci->ir->erstba_high, 0); xhci->evts->cs = 1;
+ reg = readl(&xhci->caps->hcsparams2); + u32 spb = reg >> 27; + if (spb) { + dprintf(3, "%s: setup %d scratch pad buffers\n", __func__, spb); + u64 *spba = memalign_high(64, sizeof(*spba) * spb); + void *pad = memalign_high(4096, 4096 * spb); + int i; + for (i = 0; i < spb; i++) + spba[i] = (u32)pad + (i * 4096); + xhci->devs[0].ptr_low = (u32)spba; + xhci->devs[0].ptr_high = 0; + } + reg = readl(&xhci->op->usbcmd); reg |= XHCI_CMD_RS; writel(&xhci->op->usbcmd, reg);