7#ifndef X86_DRIVER_AHCI_H
8#define X86_DRIVER_AHCI_H
17#define AHCI_MAX_PORTS 32
43 uint8_t
rsv[0xA0 - 0x2C];
136_Static_assert(
sizeof(
HBA_CMD_HEADER) == 32,
"SIZEOF HBA_CMD_HEADER ISNT 32 BYTES! -- Misalignment check.");
137_Static_assert(
sizeof(
HBA_PRDT_ENTRY) == 16,
"PRDT must be 16 bytes");
138_Static_assert(offsetof(
HBA_CMD_TBL, prdt_entry) == 0x80,
"PRDT must start at offset 0x80 in CMD_TBL");
139_Static_assert(
sizeof(((
HBA_CMD_TBL*)0)->cfis) == 64,
"cfis must be 64 bytes");
146#define HBA_CMD_HDR_CFL_MASK 0x0000001Fu
147#define HBA_CMD_HDR_A_BIT (1u << 5)
148#define HBA_CMD_HDR_W_BIT (1u << 6)
149#define HBA_CMD_HDR_P_BIT (1u << 7)
150#define HBA_CMD_HDR_PRDTL_MASK 0xFFFF0000u
151#define ATA_DEV_BSY 0x80
152#define ATA_DEV_DRQ 0x08
153#define ATA_DEV_ERR 0x01
155#define ATA_CMD_READ_DMA_EX 0x25
156#define ATA_CMD_WRITE_DMA_EX 0x35
158#define AHCI_DEV_NULL 0
159#define AHCI_DEV_SATA 1
160#define AHCI_DEV_SEMB 2
162#define AHCI_DEV_SATAPI 4
164#define HBA_PORT_IPM_ACTIVE 1
165#define HBA_PORT_DET_PRESENT 3
167#define HBA_PxCMD_ST 0x0001
168#define HBA_PxCMD_FRE 0x0010
169#define HBA_PxCMD_FR 0x4000
170#define HBA_PxCMD_CR 0x8000
171#define HBA_PxIS_TFES (1 << 30)
173static inline void hba_cmd_hdr_set_cfl(
HBA_CMD_HEADER*
h, uint32_t cfl) {
188static inline void hba_cmd_hdr_set_prdtl(
HBA_CMD_HEADER*
h, uint32_t prdtl) {
192 return (
h->dw0 >> 16) & 0xFFFFu;
struct _FIS_REG_H2D FIS_REG_H2D
Register - Host to Device FIS (FIS_TYPE_REG_H2D)
BLOCK_DEVICE * ahci_get_block_device(int index)
Retrieve a pointer to the AHCI driver's BLOCK_DEVICE instance.
MTSTATUS ahci_init(void)
define AHCI_DEBUG_PRINT
struct _HBA_CMD_TBL HBA_CMD_TBL
Command Table: one per slot.
MTSTATUS ahci_write_sector(BLOCK_DEVICE *dev, uint32_t lba, const void *buf, size_t bytes)
Write a single bytes-byte sector to given LBA on a specific BLOCK_DEVICE.
struct _HBA_PRDT_ENTRY HBA_PRDT_ENTRY
Physical Region Descriptor Table Entry.
#define HBA_CMD_HDR_W_BIT
struct _HBA_CMD_HEADER HBA_CMD_HEADER
HBA Command Header (defines an AHCI Command)
volatile struct _HBA_PORT HBA_PORT
Per port registers at HBA_MEM + 0x100 + (port * 0x80)
MTSTATUS ahci_read_sector(BLOCK_DEVICE *dev, uint32_t lba, void *buf, size_t bytes)
Read a single bytes-byte sector from the given LBA on a specific BLOCK_DEVICE.
volatile struct _HBA_MEM HBA_MEM
AHCI Register layout (Global HBA Registers)
#define HBA_CMD_HDR_PRDTL_MASK
#define HBA_CMD_HDR_CFL_MASK
struct _BLOCK_DEVICE BLOCK_DEVICE
struct _ACPI_SDT_HEADER h
Register - Host to Device FIS (FIS_TYPE_REG_H2D)
HBA Command Header (defines an AHCI Command)
Command Table: one per slot.
HBA_PRDT_ENTRY prdt_entry[1]
AHCI Register layout (Global HBA Registers)
uint8_t venor[0x100 - 0xA0]
Per port registers at HBA_MEM + 0x100 + (port * 0x80)
Physical Region Descriptor Table Entry.