diff options
Diffstat (limited to 'src/arch/amd64/acpi.c')
-rw-r--r-- | src/arch/amd64/acpi.c | 188 |
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; } |