42 lines
1.0 KiB
C++
42 lines
1.0 KiB
C++
#ifndef ARCH_ACPI_IOAPIC_HPP_
|
|
#define ARCH_ACPI_IOAPIC_HPP_
|
|
|
|
#include <stdint.h>
|
|
#include <socks/status.h>
|
|
#include <socks/queue.h>
|
|
|
|
namespace arch::acpi {
|
|
struct io_apic {
|
|
uint32_t *io_base = nullptr;
|
|
unsigned int io_first_irq = 0;
|
|
unsigned int io_nr_irq = 0;
|
|
struct queue_entry io_entry;
|
|
|
|
struct irq_entry {
|
|
uint64_t irq_vec : 8;
|
|
uint64_t irq_delivery : 3;
|
|
uint64_t irq_destmode : 1;
|
|
uint64_t irq_status : 1;
|
|
uint64_t irq_polarity : 1;
|
|
uint64_t irq_irr : 1;
|
|
uint64_t irq_triggermode : 1;
|
|
uint64_t irq_mask : 1;
|
|
uint64_t irq_resv : 39;
|
|
uint64_t irq_dest : 8;
|
|
};
|
|
|
|
io_apic(uint32_t *base, unsigned int first_irq);
|
|
|
|
uint32_t read(uint32_t reg);
|
|
void write(uint32_t reg, uint32_t val);
|
|
|
|
kern_status_t read_irq(unsigned int index, irq_entry &entry);
|
|
void write_irq(unsigned int index, const irq_entry &entry);
|
|
void map_irq(unsigned int src, unsigned int dest, unsigned int dest_cpu = 0);
|
|
void mask_irq(unsigned int vec);
|
|
void unmask_irq(unsigned int vec, unsigned int dest_cpu = (unsigned int)-1);
|
|
};
|
|
}
|
|
|
|
#endif
|