qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] hw/usb/vt82c686-uhci-pci: Use ISA instead of PCI interrupts


From: Jiaxun Yang
Subject: Re: [PATCH] hw/usb/vt82c686-uhci-pci: Use ISA instead of PCI interrupts
Date: Sun, 3 Oct 2021 17:24:08 +0100
User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.1.2



在 2021/10/3 17:12, BALATON Zoltan 写道:
This device is part of a sperio/ISA bridge chip and IRQs from it are
routed to an ISA interrupt set by the Interrupt Line PCI config
register. Change uhci_update_irq() to allow this and use it from
vt82c686-uhci-pci.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>

Just double checked kernel of fuloong2e which uses this bridge chip and
it's supposed to route UHCI IRQ to i8259.

Thanks.
- Jiaxun

---
Maybe bit of a hack but fixes USB interrupts on pegasos2 until
somebody has a better idea. I'm not sure about fuloong2e but the
VT82C686B docs say it also does the same routing IRQs to ISA PIC like
VT8231 used on pegasos2.

  hw/usb/hcd-uhci.c          | 12 +++++++++---
  hw/usb/hcd-uhci.h          |  1 +
  hw/usb/vt82c686-uhci-pci.c |  1 +
  3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index 0cb02a6432..8f28241f70 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -31,6 +31,7 @@
  #include "hw/usb/uhci-regs.h"
  #include "migration/vmstate.h"
  #include "hw/pci/pci.h"
+#include "hw/irq.h"
  #include "hw/qdev-properties.h"
  #include "qapi/error.h"
  #include "qemu/timer.h"
@@ -290,7 +291,7 @@ static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t 
td_addr)
static void uhci_update_irq(UHCIState *s)
  {
-    int level;
+    int level = 0;
      if (((s->status2 & 1) && (s->intr & (1 << 2))) ||
          ((s->status2 & 2) && (s->intr & (1 << 3))) ||
          ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||
@@ -298,10 +299,15 @@ static void uhci_update_irq(UHCIState *s)
          (s->status & UHCI_STS_HSERR) ||
          (s->status & UHCI_STS_HCPERR)) {
          level = 1;
+    }
+    if (s->isa_irqs) {
+        uint8_t irq = pci_get_byte(s->dev.config + PCI_INTERRUPT_LINE);
+        if (irq < ISA_NUM_IRQS) {
+            qemu_set_irq(isa_get_irq(NULL, irq), level);
+        }
      } else {
-        level = 0;
+        pci_set_irq(&s->dev, level);
      }
-    pci_set_irq(&s->dev, level);
  }
static void uhci_reset(DeviceState *dev)
diff --git a/hw/usb/hcd-uhci.h b/hw/usb/hcd-uhci.h
index e61d8fcb19..c91805a65e 100644
--- a/hw/usb/hcd-uhci.h
+++ b/hw/usb/hcd-uhci.h
@@ -59,6 +59,7 @@ typedef struct UHCIState {
      uint32_t frame_bytes;
      uint32_t frame_bandwidth;
      bool completions_only;
+    bool isa_irqs;
      UHCIPort ports[NB_PORTS];
/* Interrupts that should be raised at the end of the current frame. */
diff --git a/hw/usb/vt82c686-uhci-pci.c b/hw/usb/vt82c686-uhci-pci.c
index b109c21603..5c79e293ef 100644
--- a/hw/usb/vt82c686-uhci-pci.c
+++ b/hw/usb/vt82c686-uhci-pci.c
@@ -13,6 +13,7 @@ static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error 
**errp)
      /* USB legacy support  */
      pci_set_long(pci_conf + 0xc0, 0x00002000);
+ s->isa_irqs = true;
      usb_uhci_common_realize(dev, errp);
  }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]