X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/df61e9d0fec3d5e75820e27e7a2459d132364585..45e1f8b055043e54be35462852ab6649d634da7c:/lunaix-os/includes/hal/ahci/hba.h diff --git a/lunaix-os/includes/hal/ahci/hba.h b/lunaix-os/includes/hal/ahci/hba.h index 19f76cd..c396628 100644 --- a/lunaix-os/includes/hal/ahci/hba.h +++ b/lunaix-os/includes/hal/ahci/hba.h @@ -1,7 +1,9 @@ #ifndef __LUNAIX_HBA_H #define __LUNAIX_HBA_H -#include +#include +#include +#include #define HBA_RCAP 0 #define HBA_RGHC 1 @@ -31,11 +33,23 @@ #define HBA_PxCMD_FR (1 << 14) #define HBA_PxCMD_ST (1) #define HBA_PxINTR_DMA (1 << 2) -#define HBA_PxINTR_D2HR (1) +#define HBA_PxINTR_DHR (1) +#define HBA_PxINTR_DPS (1 << 5) +#define HBA_PxINTR_TFE (1 << 30) +#define HBA_PxINTR_HBF (1 << 29) +#define HBA_PxINTR_HBD (1 << 28) +#define HBA_PxINTR_IF (1 << 27) +#define HBA_PxINTR_NIF (1 << 26) +#define HBA_PxINTR_OF (1 << 24) #define HBA_PxTFD_ERR (1) #define HBA_PxTFD_BSY (1 << 7) #define HBA_PxTFD_DRQ (1 << 3) +#define HBA_FATAL \ + (HBA_PxINTR_TFE | HBA_PxINTR_HBF | HBA_PxINTR_HBD | HBA_PxINTR_IF) + +#define HBA_NONFATAL (HBA_PxINTR_NIF | HBA_PxINTR_OF) + #define HBA_RGHC_ACHI_ENABLE (1 << 31) #define HBA_RGHC_INTR_ENABLE (1 << 1) #define HBA_RGHC_RESET 1 @@ -44,6 +58,8 @@ #define HBA_RPxSSTS_IF(x) (((x) >> 4) & 0xf) #define HBA_RPxSSTS_PHYSTATE(x) ((x)&0xf) +#define hba_clear_reg(reg) (reg) = -1 + #define HBA_DEV_SIG_ATAPI 0xeb140101 #define HBA_DEV_SIG_ATA 0x00000101 @@ -59,70 +75,90 @@ typedef unsigned int hba_reg_t; #define HBA_CMDH_CLR_BUSY (1 << 10) #define HBA_CMDH_PRDT_LEN(entries) (((entries)&0xffff) << 16) +#define HBA_MAX_PRDTE 4 + struct hba_cmdh { - uint16_t options; - uint16_t prdt_len; - uint32_t transferred_size; - uint32_t cmd_table_base; - uint32_t reserved[5]; + u16_t options; + u16_t prdt_len; + u32_t transferred_size; + u32_t cmd_table_base; + u32_t reserved[5]; } __HBA_PACKED__; #define HBA_PRDTE_BYTE_CNT(cnt) ((cnt & 0x3FFFFF) | 0x1) struct hba_prdte { - uint32_t data_base; - uint32_t reserved[2]; - uint32_t byte_count; + u32_t data_base; + u32_t reserved[2]; + u32_t byte_count; } __HBA_PACKED__; struct hba_cmdt { - uint8_t command_fis[64]; - uint8_t atapi_cmd[16]; - uint8_t reserved[0x30]; - struct hba_prdte entries[3]; + u8_t command_fis[64]; + u8_t atapi_cmd[16]; + u8_t reserved[0x30]; + struct hba_prdte entries[HBA_MAX_PRDTE]; } __HBA_PACKED__; #define HBA_DEV_FEXTLBA 1 #define HBA_DEV_FATAPI (1 << 1) struct hba_port; +struct ahci_hba; struct hba_device { char serial_num[20]; char model[40]; - uint32_t flags; - uint64_t max_lba; - uint32_t block_size; - uint64_t wwn; - uint8_t cbd_size; - uint8_t last_error; - uint8_t last_status; + u32_t flags; + lba_t max_lba; + u32_t block_size; + u64_t wwn; + u8_t cbd_size; + struct + { + u8_t sense_key; + u8_t error; + u8_t status; + u8_t reserve; + } last_result; + u32_t alignment_offset; + u32_t block_per_sec; + u32_t capabilities; + struct hba_port* port; + struct ahci_hba* hba; struct { - int (*identify)(struct hba_port* port); - int (*read_buffer)(struct hba_port* port, - uint64_t lba, - void* buffer, - uint32_t size); - int (*write_buffer)(struct hba_port* port, - uint64_t lba, - void* buffer, - uint32_t size); + int (*identify)(struct hba_device* dev); + void (*submit)(struct hba_device* dev, struct blkio_req* io_req); } ops; }; +struct hba_cmd_state +{ + struct hba_cmdt* cmd_table; + void* state_ctx; +}; + +struct hba_cmd_context +{ + struct hba_cmd_state* issued[32]; + u32_t tracked_ci; +}; + struct hba_port { volatile hba_reg_t* regs; unsigned int ssts; struct hba_cmdh* cmdlst; + struct hba_cmd_context cmdctx; void* fis; struct hba_device* device; + struct ahci_hba* hba; }; struct ahci_hba @@ -136,9 +172,16 @@ struct ahci_hba }; int -hba_alloc_slot(struct hba_port* port, - struct hba_cmdt** cmdt, - struct hba_cmdh** cmdh, - uint16_t header_options); +hba_prepare_cmd(struct hba_port* port, + struct hba_cmdt** cmdt, + struct hba_cmdh** cmdh); + +int +hba_bind_vbuf(struct hba_cmdh* cmdh, + struct hba_cmdt* cmdt, + struct vecbuf* vbuf); + +int +hba_bind_sbuf(struct hba_cmdh* cmdh, struct hba_cmdt* cmdt, struct membuf mbuf); #endif /* __LUNAIX_HBA_H */