|
| 1 | +#ifndef _DEVICE_ACPI_H |
| 2 | +#define _DEVICE_ACPI_H |
| 3 | + |
| 4 | +#include <config.h> |
| 5 | +#include <stdint.h> |
| 6 | + |
| 7 | +/** |
| 8 | + * ACPI RSDP (Root System Description Pointer) 構造体 |
| 9 | + */ |
| 10 | +struct acpi_rsdp { |
| 11 | + char signature[8]; /* "RSD PTR " */ |
| 12 | + uint8_t checksum; |
| 13 | + char oem_id[6]; |
| 14 | + uint8_t revision; |
| 15 | + uint32_t rsdt_address; /* RSDT物理アドレス */ |
| 16 | +} __attribute__((packed)); |
| 17 | + |
| 18 | +/** |
| 19 | + * ACPI RSDP 2.0+ 拡張部分 |
| 20 | + */ |
| 21 | +struct acpi_rsdp_ext { |
| 22 | + struct acpi_rsdp rsdp; |
| 23 | + uint32_t length; |
| 24 | + uint64_t xsdt_address; |
| 25 | + uint8_t extended_checksum; |
| 26 | + uint8_t reserved[3]; |
| 27 | +} __attribute__((packed)); |
| 28 | + |
| 29 | +/** |
| 30 | + * ACPI SDT (System Description Table) ヘッダー |
| 31 | + */ |
| 32 | +struct acpi_sdt_header { |
| 33 | + char signature[4]; |
| 34 | + uint32_t length; |
| 35 | + uint8_t revision; |
| 36 | + uint8_t checksum; |
| 37 | + char oem_id[6]; |
| 38 | + char oem_table_id[8]; |
| 39 | + uint32_t oem_revision; |
| 40 | + uint32_t creator_id; |
| 41 | + uint32_t creator_revision; |
| 42 | +} __attribute__((packed)); |
| 43 | + |
| 44 | +/** |
| 45 | + * ACPI RSDT (Root System Description Table) |
| 46 | + */ |
| 47 | +struct acpi_rsdt { |
| 48 | + struct acpi_sdt_header header; |
| 49 | + uint32_t sdt_pointers[]; /* 可変長の配列 */ |
| 50 | +} __attribute__((packed)); |
| 51 | + |
| 52 | +/** |
| 53 | + * ACPI FADT (Fixed ACPI Description Table) - PM Timer用 |
| 54 | + */ |
| 55 | +struct acpi_fadt { |
| 56 | + struct acpi_sdt_header header; |
| 57 | + uint32_t firmware_ctrl; |
| 58 | + uint32_t dsdt; |
| 59 | + uint8_t reserved; |
| 60 | + uint8_t preferred_pm_profile; |
| 61 | + uint16_t sci_interrupt; |
| 62 | + uint32_t smi_command_port; |
| 63 | + uint8_t acpi_enable; |
| 64 | + uint8_t acpi_disable; |
| 65 | + uint8_t s4bios_req; |
| 66 | + uint8_t pstate_control; |
| 67 | + uint32_t pm1a_event_block; |
| 68 | + uint32_t pm1b_event_block; |
| 69 | + uint32_t pm1a_control_block; |
| 70 | + uint32_t pm1b_control_block; |
| 71 | + uint32_t pm2_control_block; |
| 72 | + uint32_t pm_timer_block; /* PM Timer I/Oポート */ |
| 73 | + uint32_t gpe0_block; |
| 74 | + uint32_t gpe1_block; |
| 75 | + uint8_t pm1_event_length; |
| 76 | + uint8_t pm1_control_length; |
| 77 | + uint8_t pm2_control_length; |
| 78 | + uint8_t pm_timer_length; /* PM Timer長(通常4バイト)*/ |
| 79 | + uint8_t gpe0_length; |
| 80 | + uint8_t gpe1_length; |
| 81 | + uint8_t gpe1_base; |
| 82 | + uint8_t cstate_control; |
| 83 | + uint16_t worst_c2_latency; |
| 84 | + uint16_t worst_c3_latency; |
| 85 | + uint16_t flush_size; |
| 86 | + uint16_t flush_stride; |
| 87 | + uint8_t duty_offset; |
| 88 | + uint8_t duty_width; |
| 89 | + uint8_t day_alarm; |
| 90 | + uint8_t month_alarm; |
| 91 | + uint8_t century; |
| 92 | + uint16_t boot_arch_flags; |
| 93 | + uint8_t reserved2; |
| 94 | + uint32_t flags; /* bit 8: TMR_VAL_EXT (32bit timer) */ |
| 95 | + /* 以降は拡張フィールド(省略可能) */ |
| 96 | +} __attribute__((packed)); |
| 97 | + |
| 98 | +/** |
| 99 | + * ACPI初期化 |
| 100 | + * @return 0: 成功, -1: 失敗 |
| 101 | + */ |
| 102 | +int acpi_init(void); |
| 103 | + |
| 104 | +/** |
| 105 | + * ACPI PM Timerから現在のカウント値を取得 |
| 106 | + * @return タイマーカウント値(3.579545 MHzでカウント) |
| 107 | + */ |
| 108 | +uint32_t acpi_timer_read(void); |
| 109 | + |
| 110 | +/** |
| 111 | + * ACPI PM Timerが利用可能かチェック |
| 112 | + * @return 1: 利用可能, 0: 利用不可 |
| 113 | + */ |
| 114 | +int acpi_timer_available(void); |
| 115 | + |
| 116 | +/** |
| 117 | + * システム起動からの経過時間をマイクロ秒で取得 |
| 118 | + * @return マイクロ秒 |
| 119 | + */ |
| 120 | +uint64_t acpi_get_uptime_us(void); |
| 121 | + |
| 122 | +/** |
| 123 | + * システム起動からの経過時間をミリ秒で取得 |
| 124 | + * @return ミリ秒 |
| 125 | + */ |
| 126 | +uint64_t acpi_get_uptime_ms(void); |
| 127 | + |
| 128 | +#endif /* _DEVICE_ACPI_H */ |
0 commit comments