Some PIC and ACPI IRQ fixes.
This commit is contained in:
@@ -128,14 +128,14 @@ acpi_update_irq(acpi_t *dev)
|
|||||||
else if (dev->irq_mode == 2)
|
else if (dev->irq_mode == 2)
|
||||||
pci_set_mirq(5, dev->mirq_is_level, &dev->irq_state);
|
pci_set_mirq(5, dev->mirq_is_level, &dev->irq_state);
|
||||||
else
|
else
|
||||||
pci_set_mirq(PCI_DIRQ_BASE | dev->irq_line, 1, &dev->irq_state);
|
picintlevel(1 << dev->irq_line, &dev->irq_state);
|
||||||
} else {
|
} else {
|
||||||
if (dev->irq_mode == 1)
|
if (dev->irq_mode == 1)
|
||||||
pci_clear_irq(dev->slot, dev->irq_pin, &dev->irq_state);
|
pci_clear_irq(dev->slot, dev->irq_pin, &dev->irq_state);
|
||||||
else if (dev->irq_mode == 2)
|
else if (dev->irq_mode == 2)
|
||||||
pci_clear_mirq(5, dev->mirq_is_level, &dev->irq_state);
|
pci_clear_mirq(5, dev->mirq_is_level, &dev->irq_state);
|
||||||
else
|
else
|
||||||
pci_clear_mirq(PCI_DIRQ_BASE | dev->irq_line, 1, &dev->irq_state);
|
picintclevel(1 << dev->irq_line, &dev->irq_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
acpi_timer_update(dev, (dev->regs.pmen & TMROF_EN) && !(dev->regs.pmsts & TMROF_STS));
|
acpi_timer_update(dev, (dev->regs.pmen & TMROF_EN) && !(dev->regs.pmsts & TMROF_STS));
|
||||||
|
25
src/pic.c
25
src/pic.c
@@ -630,6 +630,7 @@ picint_common(uint16_t num, int level, int set, uint8_t *irq_state)
|
|||||||
int raise;
|
int raise;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
uint8_t slaves = 0;
|
uint8_t slaves = 0;
|
||||||
|
uint16_t lines = 0x0000;
|
||||||
|
|
||||||
/* Make sure to ignore all slave IRQ's, and in case of AT+,
|
/* Make sure to ignore all slave IRQ's, and in case of AT+,
|
||||||
translate IRQ 2 to IRQ 9. */
|
translate IRQ 2 to IRQ 9. */
|
||||||
@@ -659,7 +660,7 @@ picint_common(uint16_t num, int level, int set, uint8_t *irq_state)
|
|||||||
if (num & 0x0100)
|
if (num & 0x0100)
|
||||||
acpi_rtc_status = !!set;
|
acpi_rtc_status = !!set;
|
||||||
|
|
||||||
if (set) {
|
if (set) {
|
||||||
if (smi_irq_mask & num) {
|
if (smi_irq_mask & num) {
|
||||||
smi_raise();
|
smi_raise();
|
||||||
smi_irq_status |= num;
|
smi_irq_status |= num;
|
||||||
@@ -709,8 +710,12 @@ picint_common(uint16_t num, int level, int set, uint8_t *irq_state)
|
|||||||
if (level) {
|
if (level) {
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
b = (uint8_t) (1 << i);
|
b = (uint8_t) (1 << i);
|
||||||
if (((num >> 8) & b) && ((!!*irq_state) != !!set))
|
if ((num >> 8) & b) {
|
||||||
pic2.lines[i]--;
|
if ((!!*irq_state) != !!set)
|
||||||
|
pic2.lines[i]--;
|
||||||
|
if (pic2.lines[i] == 0)
|
||||||
|
lines |= ((uint16_t) b << 8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!!*irq_state) != !!set)
|
if ((!!*irq_state) != !!set)
|
||||||
@@ -721,15 +726,20 @@ picint_common(uint16_t num, int level, int set, uint8_t *irq_state)
|
|||||||
if ((num & 0x1000) && mouse_latch)
|
if ((num & 0x1000) && mouse_latch)
|
||||||
latched_irqs &= 0xefff;
|
latched_irqs &= 0xefff;
|
||||||
|
|
||||||
pic2.irr &= ~(num >> 8);
|
if (!level || lines)
|
||||||
|
pic2.irr &= ~(num >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num & 0x00ff) {
|
if (num & 0x00ff) {
|
||||||
if (level) {
|
if (level) {
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
b = (uint8_t) (1 << i);
|
b = (uint8_t) (1 << i);
|
||||||
if ((num & b) && ((!!*irq_state) != !!set))
|
if (num & b) {
|
||||||
pic.lines[i]--;
|
if ((!!*irq_state) != !!set)
|
||||||
|
pic.lines[i]--;
|
||||||
|
if (pic.lines[i] == 0)
|
||||||
|
lines |= ((uint16_t) b << 8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!!*irq_state) != !!set)
|
if ((!!*irq_state) != !!set)
|
||||||
@@ -740,7 +750,8 @@ picint_common(uint16_t num, int level, int set, uint8_t *irq_state)
|
|||||||
if (kbd_latch && (num & 0x0002))
|
if (kbd_latch && (num & 0x0002))
|
||||||
latched_irqs &= 0xfffd;
|
latched_irqs &= 0xfffd;
|
||||||
|
|
||||||
pic.irr &= ~(num & 0x00ff);
|
if (!level || lines)
|
||||||
|
pic.irr &= ~(num & 0x00ff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user