AHCI
| Member Type | Member Name |
|---|---|
uint8_t | fis_type |
uint8_t | pmport |
uint8_t | reserved1 |
uint8_t | c |
uint8_t | command |
uint8_t | featurel |
uint8_t | lba0 |
uint8_t | lba1 |
uint8_t | lba2 |
uint8_t | device |
uint8_t | lba3 |
uint8_t | lba4 |
uint8_t | lba5 |
uint8_t | featureh |
uint8_t | countl |
uint8_t | counth |
uint8_t | icc |
uint8_t | control |
uint8_t | reserved2[4] |
| Member Type | Member Name |
|---|---|
uint8_t | fis_type |
uint8_t | pmport |
uint8_t | rsv0 |
uint8_t | i |
uint8_t | rsv1 |
uint8_t | status |
uint8_t | error |
uint8_t | lba0 |
uint8_t | lba1 |
uint8_t | lba2 |
uint8_t | device |
uint8_t | lba3 |
uint8_t | lba4 |
uint8_t | lba5 |
uint8_t | rsv2 |
uint8_t | countl |
uint8_t | counth |
uint8_t | rsv3[2] |
uint8_t | rsv4[4] |
| Member Type | Member Name |
|---|---|
uint32_t | dba |
uint32_t | dbau |
uint32_t | reserved |
uint32_t | dbc |
uint32_t | reserved2 |
uint32_t | i |
| Member Type | Member Name |
|---|---|
uint8_t | cfis[AHCI_CMD_TABLE_FIS_SIZE] |
uint8_t | acmd[AHCI_CMD_TABLE_ATAPI_SIZE] |
uint8_t | reserved[48] |
struct ahci_prdt_entry | prdt_entry[] |
| Member Type | Member Name |
|---|---|
struct ahci_port | *port |
void | *cmd_list_base |
void | *fis |
struct ahci_cmd_table | **cmd_tables |
struct ahci_cmd_header | **cmd_hdrs |
uint32_t | slot_bitmap |
| Member Type | Member Name |
|---|---|
uint32_t | clb |
uint32_t | clbu |
uint32_t | fb |
uint32_t | fbu |
uint32_t | is |
uint32_t | ie |
uint32_t | cmd |
uint32_t | rsv0 |
uint32_t | tfd |
uint32_t | sig |
uint32_t | ssts |
uint32_t | sctl |
uint32_t | serr |
uint32_t | sact |
uint32_t | ci |
uint32_t | sntf |
uint32_t | fbs |
uint32_t | rsv1[11] |
uint32_t | vendor[4] |
| Member Type | Member Name |
|---|---|
uint8_t | type |
uint32_t | signature |
uint32_t | sectors |
uint16_t | sector_size |
struct ahci_controller | *ctrl |
uint64_t | port_count |
struct thread | *io_waiters[AHCI_MAX_PORTS][32] |
uint16_t | io_statuses[AHCI_MAX_PORTS][32] |
struct ahci_request | *io_requests[AHCI_MAX_PORTS][32] |
uint8_t | irq_num |
struct spinlock | lock |
struct ahci_full_port | regs[32] |
| Member Type | Member Name |
|---|---|
struct ahci_device | *device |
uint32_t | port |
uint16_t | sector_size |
| Member Type | Member Name |
|---|---|
uint32_t | cap |
uint32_t | ghc |
uint32_t | is |
uint32_t | pi |
uint32_t | vs |
uint32_t | ccc_ctl |
uint32_t | ccc_ports |
uint32_t | em_loc |
uint32_t | em_ctl |
uint32_t | cap2 |
uint32_t | bohc |
uint8_t | rsv[0xA0 - 0x2C] |
uint8_t | vendor[0x100 - 0xA0] |
| Member Type | Member Name |
|---|---|
uint8_t | cfl |
uint8_t | a |
uint8_t | w |
uint8_t | p |
uint8_t | r |
uint8_t | b |
uint8_t | c |
uint8_t | rsv0 |
uint8_t | pmp |
uint16_t | prdtl |
uint32_t | prdbc |
uint32_t | ctba |
uint32_t | ctbau |
uint32_t | rsv1[4] |
| Member Type | Member Name |
|---|---|
uint32_t | port |
uint32_t | slot |
uint64_t | lba |
void | *buffer |
uint64_t | size |
uint64_t | sector_count |
bool | write |
bool | trigger_completion |
bool | done |
int | status |
void | (*on_complete)(struct ahci_request *) |
void | *user_data |
voidahci_discover(struct ahci_controller*ctrl)uint32_tahci_find_slot(struct ahci_full_port*port)struct ahci_disk *ahci_setup_controller(struct ahci_controller*ctrl,uint32_t *d_cnt)voidahci_identify(struct ahci_disk*disk)voidahci_prepare_command(struct ahci_full_port*port,uint32_t slot,bool write,uint8_t *buf,uint64_t size)voidahci_setup_fis(struct ahci_cmd_table*cmd_tbl,uint8_t command,bool is_atapi)voidahci_send_command(struct ahci_disk*disk,struct ahci_full_port*port,struct ahci_request*req)struct ahci_disk *ahci_discover_device(uint8_t bus,uint8_t device,uint8_t function,uint32_t *out_disk_count)boolahci_write_sector(struct generic_disk*disk,uint64_t lba,uint8_t *in_buf,uint16_t cnt)boolahci_write_sector_async(struct generic_disk*disk,uint64_t lba,uint8_t *in_buf,uint16_t count,struct ahci_request*req)boolahci_read_sector(struct generic_disk*disk,uint64_t lba,uint8_t *out_buf,uint16_t cnt)boolahci_read_sector_async(struct generic_disk*disk,uint64_t lba,uint8_t *buf,uint16_t count,struct ahci_request*req)boolahci_read_sector_wrapper(struct generic_disk*disk,uint64_t lba,uint8_t *buf,uint64_t cnt)boolahci_read_sector_async_wrapper(struct generic_disk*disk,uint64_t lba,uint8_t *buf,uint64_t cnt,struct ahci_request*req)boolahci_write_sector_wrapper(struct generic_disk*disk,uint64_t lba,uint8_t *buf,uint64_t cnt)boolahci_write_sector_async_wrapper(struct generic_disk*disk,uint64_t lba,uint8_t *buf,uint64_t cnt,struct ahci_request*req)boolahci_submit_bio_request(struct generic_disk*disk,struct bio_request*bio)voidahci_do_coalesce(struct generic_disk*disk,struct bio_request*into,struct bio_request*from)boolahci_should_coalesce(struct generic_disk*disk,struct bio_request*a,struct bio_request*b)voidahci_reorder(struct generic_disk*disk)struct generic_disk *ahci_create_generic(struct ahci_disk*disk)voidahci_isr_handler(void *ctx,uint8_t vector,void *rsp)static inlinestruct ahci_port *ahci_get_port(struct ahci_device*dev,int n)
Defines
Section titled “Defines”AHCI_CMD_TIMEOUT_MS:5000 // Data commands (read/write)AHCI_IDENT_TIMEOUT_MS:10000 // Identify, flush cache, etc.AHCI_RESET_TIMEOUT_MS:30000 // Full controller reset or COMRESETAHCI_CAP:0x00 // Host CapabilitiesAHCI_GHC:0x04 // Global Host ControlAHCI_IS:0x08 // Interrupt StatusAHCI_PI:0x0C // Ports ImplementedAHCI_VS:0x10 // AHCI VersionAHCI_CCC_CTL:0x14 // Command Completion Coalescing ControlAHCI_CCC_PORTS:0x18 // CCC PortsAHCI_EM_LOC:0x1C // Enclosure Management LocationAHCI_EM_CTL:0x20 // Enclosure Management ControlAHCI_CAP2:0x24 // Host Capabilities ExtendedAHCI_BOHC:0x28 // BIOS/OS Handoff Control and StatusAHCI_PORT_BASE:0x100 // Base offset for port registersAHCI_PORT_SIZE:0x80 // Size of each port register setAHCI_MAX_PORTS:32AHCI_MAX_SLOTS:32AHCI_PORT_CLB:0x00 // Command List Base AddressAHCI_PORT_CLBU:0x04 // Command List Base Address UpperAHCI_PORT_FB:0x08 // FIS Base AddressAHCI_PORT_FBU:0x0C // FIS Base Address UpperAHCI_PORT_IS:0x10 // Interrupt StatusAHCI_PORT_IE:0x14 // Interrupt EnableAHCI_PORT_CMD:0x18 // Command and StatusAHCI_PORT_TFD:0x20 // Task File DataAHCI_PORT_SIG:0x24 // SignatureAHCI_PORT_SSTS:0x28 // SATA StatusAHCI_PORT_SCTL:0x2C // SATA ControlAHCI_PORT_SERR:0x30 // SATA ErrorAHCI_PORT_SACT:0x34 // SATA ActiveAHCI_PORT_CI:0x38 // Command IssueAHCI_PORT_SNTF:0x3C // SATA NotificationAHCI_DEV_NULL:0AHCI_DEV_SATA:1AHCI_DEV_BUSY:(1 << 30)AHCI_DEV_DRDY:0x40AHCI_DEV_SATAPI:2AHCI_DEV_SEMB:3AHCI_DEV_PM:4AHCI_CMD_TABLE_FIS_SIZE:64AHCI_CMD_TABLE_ATAPI_SIZE:16AHCI_MAX_PRDT_ENTRIES:65535AHCI_GHC_HR:(1U << 0)AHCI_GHC_AE:(1U << 31)AHCI_DET_NO_DEVICE:0x0AHCI_DET_PRESENT:0x3AHCI_IPM_NO_INTERFACE:0x0AHCI_IPM_ACTIVE:0x1AHCI_CMD_READ_DMA_EXT:0x25AHCI_CMD_WRITE_DMA_EXT:0x35AHCI_CMD_IDENTIFY:0xECAHCI_CMD_ST:(1U << 0) // StartAHCI_CMD_SUD:(1U << 1) // Spin-Up DeviceAHCI_CMD_FRE:(1U << 4) // FIS Receive EnableAHCI_CMD_FR:(1U << 14) // FIS Receive RunningAHCI_CMD_CR:(1U << 15) // Command List RunningAHCI_CMD_CLO:(1U << 3) // Command List OverrideAHCI_PORT_IPM_ACTIVE:1AHCI_PORT_DET_PRESENT:3AHCI_CMD_FLAGS_WRITE:(1 << 6)AHCI_CMD_FLAGS_PRDTL:1FIS_TYPE_REG_H2D:0x27FIS_REG_CMD:0x80LBA_MODE:0x40CONTROL_BIT:0x80AHCI_CMD_FLAGS_CFL_MASK:0x1FAHCI_CMD_FLAGS_W_BIT:0x40