X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/bf870a1dde437a48ae40d092a14e164c861ea102..58f0877fc16da760e2ed6910648ec67e9afff890:/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 92a2b5a..c60536d 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 @@ -47,6 +49,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 @@ -62,6 +66,8 @@ 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; @@ -85,7 +91,7 @@ struct hba_cmdt uint8_t command_fis[64]; uint8_t atapi_cmd[16]; uint8_t reserved[0x30]; - struct hba_prdte entries[3]; + struct hba_prdte entries[HBA_MAX_PRDTE]; } __HBA_PACKED__; #define HBA_DEV_FEXTLBA 1 @@ -117,22 +123,28 @@ struct hba_device struct { int (*identify)(struct hba_device* dev); - int (*read_buffer)(struct hba_device* dev, - uint64_t lba, - void* buffer, - uint32_t size); - int (*write_buffer)(struct hba_device* dev, - uint64_t lba, - void* buffer, - uint32_t size); + 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; }; @@ -150,8 +162,14 @@ struct ahci_hba int hba_prepare_cmd(struct hba_port* port, struct hba_cmdt** cmdt, - struct hba_cmdh** cmdh, - void* buffer, - unsigned int size); + 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 */