usb: start hooking up USB interrupts to chipsets
This commit is contained in:
@@ -83,6 +83,8 @@ typedef struct sis_5571_t {
|
|||||||
smram_t *smram;
|
smram_t *smram;
|
||||||
usb_t *usb;
|
usb_t *usb;
|
||||||
|
|
||||||
|
usb_params_t usb_params;
|
||||||
|
|
||||||
} sis_5571_t;
|
} sis_5571_t;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -638,6 +640,36 @@ pci_isa_bridge_read(int func, int addr, void *priv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sis_5571_usb_raise_interrupt(usb_t* usb, void* priv)
|
||||||
|
{
|
||||||
|
sis_5571_t *dev = (sis_5571_t *) priv;
|
||||||
|
|
||||||
|
if (dev->pci_conf_sb[0][0x68] & 0x80) {
|
||||||
|
/* TODO: Is the normal PCI interrupt inhibited when USB IRQ remapping is enabled? */
|
||||||
|
switch (dev->pci_conf_sb[0][0x68] & 0x0F) {
|
||||||
|
case 0x00:
|
||||||
|
case 0x01:
|
||||||
|
case 0x02:
|
||||||
|
case 0x08:
|
||||||
|
case 0x0d:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
picint(1 << dev->pci_conf_sb[0][0x68] & 0x0F);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pci_set_irq(dev->sb_pci_slot, PCI_INTA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t
|
||||||
|
sis_5571_usb_handle_smi(usb_t* usb, void* priv)
|
||||||
|
{
|
||||||
|
/* Left unimplemented for now. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sis_5571_reset(void *priv)
|
sis_5571_reset(void *priv)
|
||||||
{
|
{
|
||||||
@@ -722,7 +754,10 @@ sis_5571_init(const device_t *info)
|
|||||||
dev->ide_drive[1] = device_add_inst(&sff8038i_device, 2);
|
dev->ide_drive[1] = device_add_inst(&sff8038i_device, 2);
|
||||||
|
|
||||||
/* USB */
|
/* USB */
|
||||||
dev->usb = device_add(&usb_device);
|
dev->usb_params.parent_priv = dev;
|
||||||
|
dev->usb_params.raise_interrupt = sis_5571_usb_raise_interrupt;
|
||||||
|
dev->usb_params.smi_handle = sis_5571_usb_handle_smi;
|
||||||
|
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||||
|
|
||||||
sis_5571_reset(dev);
|
sis_5571_reset(dev);
|
||||||
|
|
||||||
|
@@ -28,6 +28,8 @@ typedef struct usb_t usb_t;
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
void (*raise_interrupt)(usb_t*, void*);
|
void (*raise_interrupt)(usb_t*, void*);
|
||||||
|
/* Handle (but do not raise) SMI. Returns 1 if SMI can be raised, 0 otherwise. */
|
||||||
|
uint8_t (*smi_handle)(usb_t*, void*);
|
||||||
void* parent_priv;
|
void* parent_priv;
|
||||||
} usb_params_t;
|
} usb_params_t;
|
||||||
|
|
||||||
|
@@ -80,6 +80,9 @@ static void
|
|||||||
usb_interrupt_ohci(usb_t* usb)
|
usb_interrupt_ohci(usb_t* usb)
|
||||||
{
|
{
|
||||||
if (usb->ohci_mmio[OHCI_HcControl + 1] & 1) {
|
if (usb->ohci_mmio[OHCI_HcControl + 1] & 1) {
|
||||||
|
if (usb->usb_params && usb->usb_params->smi_handle && !usb->usb_params->smi_handle(usb, usb->usb_params->parent_priv))
|
||||||
|
return;
|
||||||
|
|
||||||
smi_raise();
|
smi_raise();
|
||||||
}
|
}
|
||||||
else if (usb->usb_params != NULL) {
|
else if (usb->usb_params != NULL) {
|
||||||
|
Reference in New Issue
Block a user