xhci: allocate scratch pad buffers

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>
diff --git a/src/hw/usb-xhci.c b/src/hw/usb-xhci.c
index 14f243c..dc98e5d 100644
--- a/src/hw/usb-xhci.c
+++ b/src/hw/usb-xhci.c
@@ -711,6 +711,19 @@
     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);