81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include "hal/hal.h"
|
|
#include "kprintf.h"
|
|
#include "dlmalloc/malloc.h"
|
|
#include "compiler/attr.h"
|
|
#include "acpi.h"
|
|
#include "assert.h"
|
|
#include "util/util.h"
|
|
#include "bootinfo/bootinfo.h"
|
|
#include "uacpi/uacpi.h"
|
|
#include "uacpi/acpi.h"
|
|
#include "apic.h"
|
|
|
|
struct acpi_madt *MADT = NULL;
|
|
|
|
// uACPI
|
|
|
|
void uacpi_kernel_log(uacpi_log_level lvl, const uacpi_char *s) {
|
|
char *t = NULL;
|
|
switch (lvl) {
|
|
case UACPI_LOG_INFO: t = "Info"; break;
|
|
case UACPI_LOG_WARN: t = "Warn"; break;
|
|
case UACPI_LOG_DEBUG: t = "Dbg"; break;
|
|
case UACPI_LOG_ERROR: t = "Err"; break;
|
|
case UACPI_LOG_TRACE: t = "Trc"; break;
|
|
}
|
|
LOG("uACPI", "%s %s", t, s);
|
|
}
|
|
|
|
void uacpi_kernel_unmap(void *addr, uacpi_size len) {
|
|
// .
|
|
}
|
|
|
|
void *uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len) {
|
|
return (void *)(BOOT_INFO.hhdm_off + addr);
|
|
}
|
|
|
|
uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr *out) {
|
|
*out = BOOT_INFO.rsdp;
|
|
return UACPI_STATUS_OK;
|
|
}
|
|
|
|
void acpi_init(void) {
|
|
uacpi_status r;
|
|
|
|
size_t tmpbufsize = 0x1000;
|
|
void *tmpbuf = dlmalloc(tmpbufsize);
|
|
if (tmpbuf == NULL) {
|
|
ERR("hal", "could not allocate uACPI tmp buf\n");
|
|
hal_hang();
|
|
}
|
|
r = uacpi_setup_early_table_access(tmpbuf, tmpbufsize);
|
|
if (uacpi_unlikely_error(r)) {
|
|
ERR("hal", "uACPI init early table failed\n");
|
|
hal_hang();
|
|
}
|
|
|
|
LOG("hal", "acpi init\n");
|
|
}
|
|
|
|
uint8_t acpi_remapirq(uint8_t irq) {
|
|
uint64_t cur = (uint64_t)&MADT->entries;
|
|
uint64_t end = cur + MADT->hdr.length;
|
|
|
|
while (cur < end) {
|
|
struct acpi_entry_hdr *ent = (struct acpi_entry_hdr *)cur;
|
|
|
|
if (ent->type == ACPI_MADT_ENTRY_TYPE_INTERRUPT_SOURCE_OVERRIDE) {
|
|
struct acpi_madt_interrupt_source_override *override = (struct acpi_madt_interrupt_source_override *)ent;
|
|
if (override->source == irq) {
|
|
return override->gsi;
|
|
}
|
|
}
|
|
|
|
cur += ent->length;
|
|
}
|
|
|
|
return irq;
|
|
}
|