Blame 0350-xhci-prepare-xhci_runtime_-read-write-for-multiple-i.patch

Hans de Goede c8dfc6
From 8bbd489bb885f5799ebbc108022eee3b2d5a1682 Mon Sep 17 00:00:00 2001
Hans de Goede c8dfc6
From: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede c8dfc6
Date: Thu, 30 Aug 2012 17:15:12 +0200
Hans de Goede c8dfc6
Subject: [PATCH 350/366] xhci: prepare xhci_runtime_{read,write} for multiple
Hans de Goede c8dfc6
 interrupters
Hans de Goede c8dfc6
Hans de Goede c8dfc6
Prepare xhci runtime register access function for multiple interrupters.
Hans de Goede c8dfc6
Hans de Goede c8dfc6
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede c8dfc6
---
Hans de Goede c8dfc6
 hw/usb/hcd-xhci.c | 100 +++++++++++++++++++++++++++++++-----------------------
Hans de Goede c8dfc6
 1 file changed, 57 insertions(+), 43 deletions(-)
Hans de Goede c8dfc6
Hans de Goede c8dfc6
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
Hans de Goede c8dfc6
index ddc3825..68a19ab 100644
Hans de Goede c8dfc6
--- a/hw/usb/hcd-xhci.c
Hans de Goede c8dfc6
+++ b/hw/usb/hcd-xhci.c
Hans de Goede c8dfc6
@@ -2588,37 +2588,43 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val)
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
 static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg)
Hans de Goede c8dfc6
 {
Hans de Goede c8dfc6
-    XHCIInterrupter *intr = &xhci->intr[0];
Hans de Goede c8dfc6
-    uint32_t ret;
Hans de Goede c8dfc6
+    uint32_t ret = 0;
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-    switch (reg) {
Hans de Goede c8dfc6
-    case 0x00: /* MFINDEX */
Hans de Goede c8dfc6
-        ret = xhci_mfindex_get(xhci) & 0x3fff;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x20: /* IMAN */
Hans de Goede c8dfc6
-        ret = intr->iman;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x24: /* IMOD */
Hans de Goede c8dfc6
-        ret = intr->imod;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x28: /* ERSTSZ */
Hans de Goede c8dfc6
-        ret = intr->erstsz;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x30: /* ERSTBA low */
Hans de Goede c8dfc6
-        ret = intr->erstba_low;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x34: /* ERSTBA high */
Hans de Goede c8dfc6
-        ret = intr->erstba_high;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x38: /* ERDP low */
Hans de Goede c8dfc6
-        ret = intr->erdp_low;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    case 0x3c: /* ERDP high */
Hans de Goede c8dfc6
-        ret = intr->erdp_high;
Hans de Goede c8dfc6
-        break;
Hans de Goede c8dfc6
-    default:
Hans de Goede c8dfc6
-        fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg);
Hans de Goede c8dfc6
-        ret = 0;
Hans de Goede c8dfc6
+    if (reg < 0x20) {
Hans de Goede c8dfc6
+        switch (reg) {
Hans de Goede c8dfc6
+        case 0x00: /* MFINDEX */
Hans de Goede c8dfc6
+            ret = xhci_mfindex_get(xhci) & 0x3fff;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        default:
Hans de Goede c8dfc6
+            fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg);
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        }
Hans de Goede c8dfc6
+    } else {
Hans de Goede c8dfc6
+        int v = (reg - 0x20) / 0x20;
Hans de Goede c8dfc6
+        XHCIInterrupter *intr = &xhci->intr[v];
Hans de Goede c8dfc6
+        switch (reg & 0x1f) {
Hans de Goede c8dfc6
+        case 0x00: /* IMAN */
Hans de Goede c8dfc6
+            ret = intr->iman;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        case 0x04: /* IMOD */
Hans de Goede c8dfc6
+            ret = intr->imod;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        case 0x08: /* ERSTSZ */
Hans de Goede c8dfc6
+            ret = intr->erstsz;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        case 0x10: /* ERSTBA low */
Hans de Goede c8dfc6
+            ret = intr->erstba_low;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        case 0x14: /* ERSTBA high */
Hans de Goede c8dfc6
+            ret = intr->erstba_high;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        case 0x18: /* ERDP low */
Hans de Goede c8dfc6
+            ret = intr->erdp_low;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        case 0x1c: /* ERDP high */
Hans de Goede c8dfc6
+            ret = intr->erdp_high;
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        }
Hans de Goede c8dfc6
     }
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     trace_usb_xhci_runtime_read(reg, ret);
Hans de Goede c8dfc6
@@ -2627,43 +2633,51 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg)
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
 static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val)
Hans de Goede c8dfc6
 {
Hans de Goede c8dfc6
-    XHCIInterrupter *intr = &xhci->intr[0];
Hans de Goede c8dfc6
+    int v = (reg - 0x20) / 0x20;
Hans de Goede c8dfc6
+    XHCIInterrupter *intr = &xhci->intr[v];
Hans de Goede c8dfc6
     trace_usb_xhci_runtime_write(reg, val);
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-    switch (reg) {
Hans de Goede c8dfc6
-    case 0x20: /* IMAN */
Hans de Goede c8dfc6
+    if (reg < 0x20) {
Hans de Goede c8dfc6
+        fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg);
Hans de Goede c8dfc6
+        return;
Hans de Goede c8dfc6
+    }
Hans de Goede c8dfc6
+
Hans de Goede c8dfc6
+    switch (reg & 0x1f) {
Hans de Goede c8dfc6
+    case 0x00: /* IMAN */
Hans de Goede c8dfc6
         if (val & IMAN_IP) {
Hans de Goede c8dfc6
             intr->iman &= ~IMAN_IP;
Hans de Goede c8dfc6
         }
Hans de Goede c8dfc6
         intr->iman &= ~IMAN_IE;
Hans de Goede c8dfc6
         intr->iman |= val & IMAN_IE;
Hans de Goede c8dfc6
-        xhci_intx_update(xhci);
Hans de Goede c8dfc6
-        xhci_msix_update(xhci, 0);
Hans de Goede c8dfc6
+        if (v == 0) {
Hans de Goede c8dfc6
+            xhci_intx_update(xhci);
Hans de Goede c8dfc6
+        }
Hans de Goede c8dfc6
+        xhci_msix_update(xhci, v);
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
-    case 0x24: /* IMOD */
Hans de Goede c8dfc6
+    case 0x04: /* IMOD */
Hans de Goede c8dfc6
         intr->imod = val;
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
-    case 0x28: /* ERSTSZ */
Hans de Goede c8dfc6
+    case 0x08: /* ERSTSZ */
Hans de Goede c8dfc6
         intr->erstsz = val & 0xffff;
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
-    case 0x30: /* ERSTBA low */
Hans de Goede c8dfc6
+    case 0x10: /* ERSTBA low */
Hans de Goede c8dfc6
         /* XXX NEC driver bug: it doesn't align this to 64 bytes
Hans de Goede c8dfc6
         intr->erstba_low = val & 0xffffffc0; */
Hans de Goede c8dfc6
         intr->erstba_low = val & 0xfffffff0;
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
-    case 0x34: /* ERSTBA high */
Hans de Goede c8dfc6
+    case 0x14: /* ERSTBA high */
Hans de Goede c8dfc6
         intr->erstba_high = val;
Hans de Goede c8dfc6
-        xhci_er_reset(xhci, 0);
Hans de Goede c8dfc6
+        xhci_er_reset(xhci, v);
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
-    case 0x38: /* ERDP low */
Hans de Goede c8dfc6
+    case 0x18: /* ERDP low */
Hans de Goede c8dfc6
         if (val & ERDP_EHB) {
Hans de Goede c8dfc6
             intr->erdp_low &= ~ERDP_EHB;
Hans de Goede c8dfc6
         }
Hans de Goede c8dfc6
         intr->erdp_low = (val & ~ERDP_EHB) | (intr->erdp_low & ERDP_EHB);
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
-    case 0x3c: /* ERDP high */
Hans de Goede c8dfc6
+    case 0x1c: /* ERDP high */
Hans de Goede c8dfc6
         intr->erdp_high = val;
Hans de Goede c8dfc6
-        xhci_events_update(xhci, 0);
Hans de Goede c8dfc6
+        xhci_events_update(xhci, v);
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
     default:
Hans de Goede c8dfc6
         fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg);
Hans de Goede c8dfc6
-- 
Hans de Goede c8dfc6
1.7.12
Hans de Goede c8dfc6