chore: fix almost *ALL* warnings.
[lunaix-os.git] / lunaix-os / includes / hal / ahci / hba.h
index e7f8d01f7cfe5f0d04d8c4ff63879f94ac31e682..c3966281b6c919aaee943b5df3da8e7dd66e6516 100644 (file)
@@ -1,7 +1,9 @@
 #ifndef __LUNAIX_HBA_H
 #define __LUNAIX_HBA_H
 
-#include <stdint.h>
+#include <lunaix/blkio.h>
+#include <lunaix/buffer.h>
+#include <lunaix/types.h>
 
 #define HBA_RCAP 0
 #define HBA_RGHC 1
 #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,73 +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;
-    uint32_t alignment_offset;
-    uint32_t block_per_sec;
-    uint32_t capabilities;
+    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
@@ -141,8 +174,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 */