summaryrefslogtreecommitdiff
path: root/src/arch/amd64/acpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/amd64/acpi.c')
-rw-r--r--src/arch/amd64/acpi.c188
1 files changed, 94 insertions, 94 deletions
diff --git a/src/arch/amd64/acpi.c b/src/arch/amd64/acpi.c
index 732add7..83f2014 100644
--- a/src/arch/amd64/acpi.c
+++ b/src/arch/amd64/acpi.c
@@ -65,79 +65,79 @@ struct xsdt {
// generic address structure
struct gas {
- uint8_t address_space;
- uint8_t bit_width;
- uint8_t bit_offset;
- uint8_t access_size;
- uint64_t address;
+ uint8_t address_space;
+ uint8_t bit_width;
+ uint8_t bit_offset;
+ uint8_t access_size;
+ uint64_t address;
};
// fixed acpi description table
struct fadt {
- struct acpi_header h;
- uint32_t firmware_ctrl;
- uint32_t dsdt;
+ struct acpi_header h;
+ uint32_t firmware_ctrl;
+ uint32_t dsdt;
- // field used in ACPI 1.0; no longer in use, for compatibility only
- uint8_t reserved;
+ // field used in ACPI 1.0; no longer in use, for compatibility only
+ uint8_t reserved;
- uint8_t preferred_power_management_profile;
- uint16_t sci_interrupt;
- uint32_t smi_command_port;
- uint8_t acpi_enable;
- uint8_t acpi_disable;
- uint8_t s4bios_req;
- uint8_t pstate_control;
- uint32_t pm1_a_event_block;
- uint32_t pm1_b_event_block;
- uint32_t pm1_a_control_block;
- uint32_t pm1_b_control_block;
- uint32_t pm2_control_block;
- uint32_t pm_timer_block;
- uint32_t gpe0_block;
- uint32_t gpe1_block;
- uint8_t pm1_event_length;
- uint8_t pm1_control_length;
- uint8_t pm2_control_length;
- uint8_t pm_timer_length;
- uint8_t gpe0_length;
- uint8_t gpe1_length;
- uint8_t gpe1_base;
- uint8_t cstate_control;
- uint16_t worst_c2_latency;
- uint16_t worst_c3_latency;
- uint16_t flush_size;
- uint16_t flush_stride;
- uint8_t duty_offset;
- uint8_t duty_width;
- uint8_t day_alarm;
- uint8_t month_alarm;
- uint8_t century;
+ uint8_t preferred_power_management_profile;
+ uint16_t sci_interrupt;
+ uint32_t smi_command_port;
+ uint8_t acpi_enable;
+ uint8_t acpi_disable;
+ uint8_t s4bios_req;
+ uint8_t pstate_control;
+ uint32_t pm1_a_event_block;
+ uint32_t pm1_b_event_block;
+ uint32_t pm1_a_control_block;
+ uint32_t pm1_b_control_block;
+ uint32_t pm2_control_block;
+ uint32_t pm_timer_block;
+ uint32_t gpe0_block;
+ uint32_t gpe1_block;
+ uint8_t pm1_event_length;
+ uint8_t pm1_control_length;
+ uint8_t pm2_control_length;
+ uint8_t pm_timer_length;
+ uint8_t gpe0_length;
+ uint8_t gpe1_length;
+ uint8_t gpe1_base;
+ uint8_t cstate_control;
+ uint16_t worst_c2_latency;
+ uint16_t worst_c3_latency;
+ uint16_t flush_size;
+ uint16_t flush_stride;
+ uint8_t duty_offset;
+ uint8_t duty_width;
+ uint8_t day_alarm;
+ uint8_t month_alarm;
+ uint8_t century;
- // reserved in ACPI 1.0; used since ACPI 2.0+
- uint16_t boot_architecture_flags;
+ // reserved in ACPI 1.0; used since ACPI 2.0+
+ uint16_t boot_architecture_flags;
- uint8_t reserved_2;
- uint32_t flags;
+ uint8_t reserved_2;
+ uint32_t flags;
- // 12 byte structure; see below for details
- struct gas reset_reg;
+ // 12 byte structure; see below for details
+ struct gas reset_reg;
- uint8_t reset_value;
- uint8_t reserved_3[3];
+ uint8_t reset_value;
+ uint8_t reserved_3[3];
- // 64bit pointers - Available on ACPI 2.0+
- uint64_t x_firmware_control;
- uint64_t x_dsdt;
+ // 64bit pointers - Available on ACPI 2.0+
+ uint64_t x_firmware_control;
+ uint64_t x_dsdt;
- struct gas x_pm1_a_event_block;
- struct gas x_pm1_b_event_block;
- struct gas x_pm1_a_control_block;
- struct gas x_pm1_b_control_block;
- struct gas x_pm2_control_block;
- struct gas x_pm_timer_block;
- struct gas x_gpe0_block;
- struct gas x_gpe1_block;
+ struct gas x_pm1_a_event_block;
+ struct gas x_pm1_b_event_block;
+ struct gas x_pm1_a_control_block;
+ struct gas x_pm1_b_control_block;
+ struct gas x_pm2_control_block;
+ struct gas x_pm_timer_block;
+ struct gas x_gpe0_block;
+ struct gas x_gpe1_block;
};
struct acpi_state {
@@ -154,49 +154,49 @@ struct acpi_state {
};
static bool checksum(uint8_t *data, size_t len) {
- unsigned char sum = 0;
- for (size_t i = 0; i < len; i++)
- sum += data[i];
- return sum == 0;
+ unsigned char sum = 0;
+ for (size_t i = 0; i < len; i++)
+ sum += data[i];
+ return sum == 0;
}
static int read_s5_addr(struct acpi_state *state) {
serial_out_str("a");
- uintptr_t ptr = state->fadt.dsdt;
- char *s5_addr = (void*) (ptr + 36);
+ uintptr_t ptr = state->fadt.dsdt;
+ char *s5_addr = (void*) (ptr + 36);
serial_out_str("a");
- int dsdt_len = *((int*) (ptr+1)) - 36;
- while (0 < dsdt_len--) {
- if ( memcmp(s5_addr, "_S5_", 4) == 0)
- break;
- s5_addr++;
- }
+ int dsdt_len = *((int*) (ptr+1)) - 36;
+ while (0 < dsdt_len--) {
+ if ( memcmp(s5_addr, "_S5_", 4) == 0)
+ break;
+ s5_addr++;
+ }
- if (dsdt_len > 0) {
- // check for valid AML structure
- if ( ( *(s5_addr-1) == 0x08 || ( *(s5_addr-2) == 0x08 && *(s5_addr-1) == '\\') ) && *(s5_addr+4) == 0x12 ) {
- s5_addr += 5;
- s5_addr += ((*s5_addr &0xC0)>>6) +2; // calculate PkgLength size
+ if (dsdt_len > 0) {
+ // check for valid AML structure
+ if ( ( *(s5_addr-1) == 0x08 || ( *(s5_addr-2) == 0x08 && *(s5_addr-1) == '\\') ) && *(s5_addr+4) == 0x12 ) {
+ s5_addr += 5;
+ s5_addr += ((*s5_addr &0xC0)>>6) +2; // calculate PkgLength size
- if (*s5_addr == 0x0A)
- s5_addr++; // skip byteprefix
- state->SLP_TYPa = *(s5_addr)<<10;
- s5_addr++;
+ if (*s5_addr == 0x0A)
+ s5_addr++; // skip byteprefix
+ state->SLP_TYPa = *(s5_addr)<<10;
+ s5_addr++;
- if (*s5_addr == 0x0A)
- s5_addr++; // skip byteprefix
- state->SLP_TYPb = *(s5_addr)<<10;
+ if (*s5_addr == 0x0A)
+ s5_addr++; // skip byteprefix
+ state->SLP_TYPb = *(s5_addr)<<10;
- state->SLP_EN = 1<<13;
- state->SCI_EN = 1;
+ state->SLP_EN = 1<<13;
+ state->SCI_EN = 1;
- } else {
+ } else {
return -1;
- }
- } else {
- return -1;
- }
+ }
+ } else {
+ return -1;
+ }
return -1;
}
@@ -302,12 +302,12 @@ int acpi_init(void *rootsdp) {
if (!ret)
return ret;
- outb(state.fadt.smi_command_port,state.fadt.acpi_enable);
+ outb(state.fadt.smi_command_port,state.fadt.acpi_enable);
return 0;
}
int acpi_shutdown(void) {
- outw((unsigned int) state.fadt.pm1_a_control_block, state.SLP_TYPb | state.SLP_EN);
+ outw((unsigned int) state.fadt.pm1_a_control_block, state.SLP_TYPb | state.SLP_EN);
return -1;
}