From d6ff34208ce71e1eda7111dee56a3655d3e095da Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 6 May 2023 15:35:03 +0600 Subject: [PATCH] usb: Hook up USB interrupts to rest of the chipsets --- src/chipset/ali1543.c | 21 ++++++++++++++++++++- src/chipset/intel_piix.c | 17 +++++++++++++++-- src/chipset/stpc.c | 20 ++++++++++++++++++-- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/chipset/ali1543.c b/src/chipset/ali1543.c index b587f91b5..6d03b3a12 100644 --- a/src/chipset/ali1543.c +++ b/src/chipset/ali1543.c @@ -59,6 +59,7 @@ typedef struct ali1543_t { sff8038i_t *ide_controller[2]; smbus_ali7101_t *smbus; usb_t *usb; + usb_params_t usb_params; } ali1543_t; @@ -905,7 +906,11 @@ ali5237_write(int func, int addr, uint8_t val, void *priv) case 0x0c: /* Cache Line Size */ case 0x0d: /* Latency Timer */ + break; + case 0x3c: /* Interrupt Line Register */ + dev->usb_conf[addr] = val; + break; case 0x42: /* Test Mode Register */ dev->usb_conf[addr] = val & 0x10; @@ -1424,6 +1429,17 @@ ali7101_read(int func, int addr, void *priv) return ret; } +static void +ali5237_usb_raise_interrupt(void *priv) +{ + ali1543_t *dev = (ali1543_t *) priv; + + if (!dev->usb_dev_enable) + return; + + pci_set_irq(dev->usb_slot, PCI_INTA); +} + static void ali1543_reset(void *priv) { @@ -1574,7 +1590,10 @@ ali1543_init(const device_t *info) dev->smbus = device_add(&ali7101_smbus_device); /* USB */ - dev->usb = device_add(&usb_device); + dev->usb_params.parent_priv = dev; + dev->usb_params.smi_handle = NULL; + dev->usb_params.raise_interrupt = ali5237_usb_raise_interrupt; + dev->usb = device_add_parameters(&usb_device, &dev->usb_params); dev->type = info->local & 0xff; dev->offset = (info->local >> 8) & 0x7f; diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 718df8344..c6cfe8c9f 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -77,6 +77,7 @@ typedef struct _piix_ { piix_io_trap_t io_traps[26]; port_92_t *port_92; pc_timer_t fast_off_timer; + usb_params_t usb_params; } piix_t; #ifdef ENABLE_PIIX_LOG @@ -1425,6 +1426,14 @@ piix_fast_off_count(void *priv) dev->regs[0][0xaa] |= 0x20; } +static void +piix_usb_raise_interrupt(usb_t* usb, void *priv) +{ + piix_t *dev = (piix_t *) priv; + + pci_set_irq(dev->pci_slot, PCI_INTD); +} + static void piix_reset(void *p) { @@ -1569,8 +1578,12 @@ piix_init(const device_t *info) sff_set_irq_mode(dev->bm[1], 1, 2); } - if (dev->type >= 3) - dev->usb = device_add(&usb_device); + if (dev->type >= 3) { + dev->usb_params.parent_priv = dev; + dev->usb_params.smi_handle = NULL; + dev->usb_params.raise_interrupt = piix_usb_raise_interrupt; + dev->usb = device_add_parameters(&usb_device, &dev->usb_params); + } if (dev->type > 3) { dev->nvr = device_add(&piix4_nvr_device); diff --git a/src/chipset/stpc.c b/src/chipset/stpc.c index cd13af3f0..84720f802 100644 --- a/src/chipset/stpc.c +++ b/src/chipset/stpc.c @@ -65,7 +65,11 @@ typedef struct stpc_t { smram_t *smram; usb_t *usb; int ide_slot; + int usb_slot; sff8038i_t *bm[2]; + + /* Miscellaneous */ + usb_params_t usb_params; } stpc_t; typedef struct stpc_serial_t { @@ -870,6 +874,14 @@ stpc_setup(stpc_t *dev) pci_set_irq_routing(PCI_INTD, PCI_IRQ_DISABLED); } +static void +stpc_usb_raise_interrupt(usb_t* usb, void* priv) +{ + stpc_t *dev = (stpc_t *) priv; + + pci_set_irq(dev->usb_slot, PCI_INTA); +} + static void stpc_close(void *priv) { @@ -895,9 +907,13 @@ stpc_init(const device_t *info) pci_add_card(PCI_ADD_NORTHBRIDGE, stpc_nb_read, stpc_nb_write, dev); dev->ide_slot = pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_isab_read, stpc_isab_write, dev); if (dev->local == STPC_ATLAS) { + dev->usb_params.smi_handle = NULL; + dev->usb_params.raise_interrupt = stpc_usb_raise_interrupt; + dev->usb_params.parent_priv = dev; + dev->ide_slot = pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_ide_read, stpc_ide_write, dev); - dev->usb = device_add(&usb_device); - pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_usb_read, stpc_usb_write, dev); + dev->usb = device_add_parameters(&usb_device, &dev->usb_params); + dev->usb_slot = pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_usb_read, stpc_usb_write, dev); } dev->bm[0] = device_add_inst(&sff8038i_device, 1);