5 #define AHCI_SIGNATURE_SATAPI 0xEB140101
6 #define AHCI_SIGNATURE_SATA 0x00000101
8 #define AHCI_HBA_ST 0x0001
9 #define AHCI_HBA_FRE 0x0010
10 #define AHCI_HBA_FR 0x4000
11 #define AHCI_HBA_CR 0x8000
13 #define AHCI_HBA_TFES (1 << 30)
15 typedef volatile struct {
16 uint32_t command_list_base_address_low;
17 uint32_t command_list_base_address_high;
18 uint32_t fis_base_address_low;
19 uint32_t fis_base_address_high;
20 uint32_t interrupt_status;
21 uint32_t interrupt_enable;
22 uint32_t command_and_status;
24 uint32_t task_file_data;
27 uint32_t sata_control;
30 uint32_t command_issue;
31 uint32_t sata_notification;
32 uint32_t fis_based_switch_control;
34 uint32_t reserved1[11];
38 typedef volatile struct {
40 uint32_t global_host_control;
41 uint32_t interrupt_status;
42 uint32_t port_implemented;
44 uint32_t command_completion_coalescing_control;
45 uint32_t command_completion_coalescing_ports;
46 uint32_t enclosure_management_location;
47 uint32_t enclosure_management_control;
48 uint32_t host_capabilities_extended;
49 uint32_t handoff_control_and_status;
51 char reserved[0xA0 - 0x2C];
52 char vendor[0x100 - 0xA0];
54 AHCI_HBA_PORT ports[0];
58 FIS_TYPE_REG_HOST_TO_DEVICE = 0x27,
59 FIS_TYPE_REG_DEVICE_TO_HOST = 0x34,
60 FIS_TYPE_DMA_ACTIVATE = 0x39,
61 FIS_TYPE_DMA_SETUP = 0x41,
64 FIS_TYPE_PIO_SETUP = 0x5F,
65 FIS_TYPE_DEV_BITS = 0xA1,
155 uint32_t DMAbufferID_low;
156 uint32_t DMAbufferID_high;
160 uint32_t DMAbufOffset;
161 uint32_t TransferCount;
215 volatile uint32_t prdbc;
240 typedef volatile struct {
254 uint8_t rsv[0x100-0xA0];
267 #define COMMAND_TABLE_PRDT_ENTRY_COUNT 8
273 AHCI_HBA_PRDT_ENTRY prdt_entry[COMMAND_TABLE_PRDT_ENTRY_COUNT];
276 #define COMMAND_LIST_ENTRY_COUNT 32
277 #define COMMAND_LIST_ENTRY_SIZE sizeof(AHCI_HBA_CMD_HEADER)
278 #define COMMAND_LIST_SIZE (COMMAND_LIST_ENTRY_COUNT * COMMAND_LIST_ENTRY_SIZE)
280 #define FIS_SIZE sizeof(AHCI_HBA_FIS)
282 #define COMMAND_TABLE_ENTRY_SIZE sizeof(HBA_CMD_TBL)
283 #define COMMAND_TABLE_SIZE (COMMAND_TABLE_ENTRY_SIZE * COMMAND_LIST_ENTRY_COUNT)
285 #define MEMORY_PER_AHCI_PORT (COMMAND_LIST_SIZE + FIS_SIZE + COMMAND_TABLE_SIZE)
288 #define AHCI_COMMAND_LIST(mem, port_num) (((size_t)mem) + (MEMORY_PER_AHCI_PORT * port_num))
289 #define AHCI_FIS(mem, port_num) (AHCI_COMMAND_LIST(mem, port_num) + COMMAND_LIST_SIZE)
290 #define AHCI_COMMAND_TABLE(mem, port_num) (AHCI_FIS(mem, port_num) + FIS_SIZE)
291 #define AHCI_COMMAND_TABLE_ENTRY(mem, port_num, i) (AHCI_COMMAND_TABLE(mem, port_num) + (i * COMMAND_TABLE_ENTRY_SIZE))
295 size_t command_list_addr_phys;
304 bool ahci_is_drive_attached(
size_t port_num);
305 int ahci_free_cmd_slot(
size_t port_num);
306 void ahci_start_cmd(
size_t port_num);
307 void ahci_stop_cmd(
size_t port_num);
308 void ahci_rebase_memory_for(
size_t port_num);
309 void ahci_eject_cdrom(
size_t port_num);
310 void ahci_read_sectors(
size_t port_num, uint64_t location,
size_t sector_count,
void* buffer);
311 void ahci_write_sectors(
size_t port_num,
size_t location,
size_t sector_count,
void* buffer);
312 void ahci_identify(
size_t port_num,
bool is_atapi);
Основные определения ядра
struct registers __attribute__((packed))
Структура данных пакета от мыши