diff options
Diffstat (limited to '')
-rw-r--r-- | kernel/src/arch/i686/acpi.c (renamed from kernel/src/acpi/acpi.c) | 67 |
1 files changed, 16 insertions, 51 deletions
diff --git a/kernel/src/acpi/acpi.c b/kernel/src/arch/i686/acpi.c index ef1fb76..7807558 100644 --- a/kernel/src/acpi/acpi.c +++ b/kernel/src/arch/i686/acpi.c @@ -3,11 +3,10 @@ #include <stdbool.h> #include <stddef.h> #include <stdint.h> -#include <sys.h> +#include <arch/i686/acpi.h> +#include <arch/i686/asm.h> -#include "acpi.h" -#include "boot/tag.h" -#include "print.h" +extern uintptr_t KERNEL_MAPPING; static struct RootSystemDescriptionTable *rsdt; static struct FixedACPIDescriptionTable *fadt; @@ -17,9 +16,7 @@ static uint16_t SLP_TYPb; static uint16_t SLP_EN; static uint16_t SCI_EN; -static bool is_init = false; - -bool checksum(uint8_t *data, size_t len) { +static bool checksum(uint8_t *data, size_t len) { unsigned char sum = 0; for (size_t i = 0; i < len; i++) sum += data[i]; @@ -39,7 +36,7 @@ static void *find_fadt(void) { return NULL; } -static int read_s5_addr(void) { +static void read_s5_addr(void) { uintptr_t ptr = fadt->dsdt; char *s5_addr = (void*) (ptr + 36); @@ -69,73 +66,41 @@ static int read_s5_addr(void) { SCI_EN = 1; } else { - errork("\\_S5 parse error."); - return 1; + panic("\\_S5 parse error."); } } else { - errork("\\_S5 not present."); - return 1; + panic("\\_S5 not present."); } - return 0; } -void acpi_init(void) { - - is_init = false; - - debugk("Loading ACPI"); - - struct BootTag *tag; - if(!get_boot_tag(ID_RSDP, &tag)) { - errork("Could not find RSDP"); - return; - } - - debugk("Loading RSDT"); +void acpi_init(void *ptr) { - struct RootSystemDescriptionPointer *rsdp = tag->data.rsdp; + struct RootSystemDescriptionPointer *rsdp = ptr; if (!checksum((uint8_t*) rsdp, sizeof(struct RootSystemDescriptionPointer))) { - errork("RSDP checksum failed to validate"); - return; + panic("RSDP checksum failed to validate"); } uintptr_t rsdt_ptr = rsdp->rsdt_address; rsdt = (void *) rsdt_ptr; if (!checksum((uint8_t*) &rsdt->header, rsdt->header.length)) { - errork("RSDT checksum failed to validate"); - return; + panic("RSDT checksum failed to validate"); } - debugk("Loading FADT"); - fadt = find_fadt(); if (fadt == NULL) { - errork("Could not find FADT"); - return; + panic("Could not find FADT"); } if (!checksum((uint8_t*) &fadt->header, fadt->header.length)) { - errork("FADT checksum failed to validate"); - return; + panic("FADT checksum failed to validate"); } - debugk("Reading \\_S5 Addr"); - - if (read_s5_addr()) { - return; - } + read_s5_addr(); outb(fadt->smi_command_port,fadt->acpi_enable); - - succek("ACPI has been loaded"); - is_init = true; } void acpi_poweroff(void) { - if (is_init) { - outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN); - panic("failed to shutdown"); - } else { - errork("Cannot shutdown, ACPI not loaded"); - } + outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN); + panic("failed to shutdown"); } |