aboutsummaryrefslogtreecommitdiff
path: root/hw/usb
diff options
context:
space:
mode:
authorPhil Dennis-Jordan <phil@philjordan.eu>2024-12-27 13:13:33 +0100
committerPhilippe Mathieu-Daudé <philmd@linaro.org>2025-01-13 17:21:46 +0100
commitef82ab692424c7fb42c3aeb6b65db68eade6213a (patch)
treef9e5769e1487be2331ea5f9757738d6ba6b89aeb /hw/usb
parentbb5b7fced6b5d3334ab20702fc846e47bb1fb731 (diff)
downloadqemu-ef82ab692424c7fb42c3aeb6b65db68eade6213a.zip
qemu-ef82ab692424c7fb42c3aeb6b65db68eade6213a.tar.gz
qemu-ef82ab692424c7fb42c3aeb6b65db68eade6213a.tar.bz2
hw/usb/hcd-xhci-pci: Use event ring 0 if mapping unsupported
The XHCI specification, section 4.17.1 specifies that "If the Number of Interrupters (MaxIntrs) field is greater than 1, then Interrupter Mapping shall be supported." and "If Interrupter Mapping is not supported, the Interrupter Target field shall be ignored by the xHC and all Events targeted at Interrupter 0." QEMU's XHCI device has so far not specially addressed this case, so we add a check to xhci_event() to redirect to event ring and interrupt 0 if mapping is disabled. Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20241227121336.25838-4-phil@philjordan.eu> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Diffstat (limited to 'hw/usb')
-rw-r--r--hw/usb/hcd-xhci.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index 7dc0994..00d5bc3 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -644,6 +644,10 @@ static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v)
dma_addr_t erdp;
unsigned int dp_idx;
+ if (xhci->numintrs == 1) {
+ v = 0;
+ }
+
if (v >= xhci->numintrs) {
DPRINTF("intr nr out of range (%d >= %d)\n", v, xhci->numintrs);
return;