x86_64: move ACPI driver to kext
This commit is contained in:
41
kexts/drivers/bus/acpi/include/arch/acpi/io_apic.hpp
Normal file
41
kexts/drivers/bus/acpi/include/arch/acpi/io_apic.hpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#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
|
||||
43
kexts/drivers/bus/acpi/include/arch/acpi/local_apic.hpp
Normal file
43
kexts/drivers/bus/acpi/include/arch/acpi/local_apic.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef ARCH_ACPI_LOCAL_APIC_HPP_
|
||||
#define ARCH_ACPI_LOCAL_APIC_HPP_
|
||||
|
||||
#include <socks/status.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define APIC_LVT_INT_MASKED 0x10000
|
||||
#define APIC_LVT_TIMER_MODE_PERIODIC 0x20000
|
||||
|
||||
struct acpi_madt;
|
||||
|
||||
namespace arch::acpi {
|
||||
class local_apic {
|
||||
uint32_t *base_ = nullptr;
|
||||
|
||||
public:
|
||||
enum {
|
||||
EOI = 0xB0,
|
||||
IPI_STATUS = 0x280,
|
||||
IPI_ICR = 0x300,
|
||||
IPI_DEST = 0x310,
|
||||
LVT_TIMER = 0x320,
|
||||
TIMER_INITCOUNT = 0x380,
|
||||
TIMER_CURCOUNT = 0x390,
|
||||
TIMER_DIV = 0x3E0,
|
||||
};
|
||||
|
||||
local_apic(uint32_t *base = nullptr);
|
||||
|
||||
static kern_status_t find(struct acpi_madt *madt, local_apic& out);
|
||||
static local_apic& get(void);
|
||||
|
||||
uint32_t read(uint32_t reg);
|
||||
void write(uint32_t reg, uint32_t val);
|
||||
void ack();
|
||||
|
||||
uint32_t *ptr() const { return base_; }
|
||||
|
||||
void send_ipi(unsigned int dest, unsigned int data);
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user