10 #include "qm_common.h"
11 #include "qm_soc_regs.h"
13 #define LAPIC_VECTOR_MASK (0xFF)
15 static void _ioapic_set_redtbl_entry(
unsigned int irq, uint64_t value)
17 unsigned int offset = QM_IOAPIC_REG_REDTBL + (irq * 2);
19 QM_IOAPIC->ioregsel.reg = offset;
20 QM_IOAPIC->iowin.reg = value & 0x00000000FFFFFFFF;
21 QM_IOAPIC->ioregsel.reg = offset + 1;
22 QM_IOAPIC->iowin.reg = (value & 0xFFFFFFFF00000000) >> 32;
26 static __inline__
int _ioapic_get_redtbl_size(
void)
30 QM_IOAPIC->ioregsel.reg = QM_IOAPIC_REG_VER;
31 max_entry_number = (QM_IOAPIC->iowin.reg & 0x00FF0000) >> 16;
33 return max_entry_number + 1;
36 static uint32_t _ioapic_get_redtbl_entry_lo(
unsigned int irq)
38 QM_IOAPIC->ioregsel.reg = QM_IOAPIC_REG_REDTBL + (irq * 2);
39 return QM_IOAPIC->iowin.reg;
42 static void _ioapic_set_redtbl_entry_lo(
unsigned int irq, uint32_t value)
44 QM_IOAPIC->ioregsel.reg = QM_IOAPIC_REG_REDTBL + (irq * 2);
45 QM_IOAPIC->iowin.reg = value;
51 static __inline__
void apic_init(
void)
57 QM_LAPIC->svr.reg |= BIT(8);
60 QM_LAPIC->lvtlint0.reg |= (BIT(8) | BIT(9) | BIT(10));
61 QM_LAPIC->lvtlint0.reg &= ~BIT(16);
64 QM_LAPIC->eoi.reg = 0;
67 size = _ioapic_get_redtbl_size();
68 for (i = 0; i < size; i++) {
69 _ioapic_set_redtbl_entry(i, BIT(16));
73 static __inline__
void ioapic_register_irq(
unsigned int irq,
78 value = _ioapic_get_redtbl_entry_lo(irq);
81 value &= ~LAPIC_VECTOR_MASK;
82 value |= (vector & LAPIC_VECTOR_MASK);
87 case QM_IRQ_RTC_0_INT:
88 case QM_IRQ_AONPT_0_INT:
89 case QM_IRQ_WDT_0_INT:
99 _ioapic_set_redtbl_entry_lo(irq, value);
102 static __inline__
void ioapic_mask_irq(
unsigned int irq)
104 uint32_t value = _ioapic_get_redtbl_entry_lo(irq);
108 _ioapic_set_redtbl_entry_lo(irq, value);
111 static __inline__
void ioapic_unmask_irq(
unsigned int irq)
113 uint32_t value = _ioapic_get_redtbl_entry_lo(irq);
117 _ioapic_set_redtbl_entry_lo(irq, value);