* All registers offset are 0 based index of a DWORD array
*/
+#define AHCI_HBA_CLASS 0x10601
+
#define HBA_RCAP 0
#define HBA_RGHC 1
#define HBA_RIS 2
#define HBA_RVER 4
#define HBA_RPBASE (0x40)
+#define HBA_RPSIZE (0x80 >> 2)
#define HBA_RPxCLB 0
#define HBA_RPxFB 2
#define HBA_RPxIS 4
#define HBA_RPxSNTF 15
#define HBA_RPxFBS 16
+#define HBA_PxCMD_FRE (1 << 4)
+#define HBA_PxCMD_ST (1)
+#define HBA_PxINTR_DMA (1 << 2)
+#define HBA_PxINTR_D2HR (1)
+
+#define HBA_RGHC_ACHI_ENABLE (1 << 31)
+#define HBA_RGHC_INTR_ENABLE (1 << 1)
+#define HBA_RGHC_RESET 1
+
+#define HBA_RPxSSTS_PWR(x) (((x) >> 8) & 0xf)
+#define HBA_RPxSSTS_IF(x) (((x) >> 4) & 0xf)
+#define HBA_RPxSSTS_PHYSTATE(x) ((x)&0xf)
+
typedef unsigned int hba_reg_t;
+struct ahci_port
+{
+ hba_reg_t* regs;
+ unsigned int ssts;
+ void* cmdlstv;
+ void* fisv;
+};
+
struct ahci_hba
{
volatile hba_reg_t* base;
unsigned int ports_num;
- unsigned int port_map;
+ unsigned int cmd_slots;
unsigned int version;
- hba_reg_t* ports[32];
+ struct ahci_port* ports[32];
};
+/**
+ * @brief 初始化AHCI与HBA
+ *
+ */
void
ahci_init();
+void
+ahci_list_device();
+
#endif /* __LUNAIX_AHCI_H */