summaryrefslogtreecommitdiff
path: root/kernel/src/arch/i686/acpi.c
diff options
context:
space:
mode:
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");
}