feat: spec-compliant AHCI HBA initialization
[lunaix-os.git] / lunaix-os / includes / hal / ahci.h
1 #ifndef __LUNAIX_AHCI_H
2 #define __LUNAIX_AHCI_H
3
4 /*
5  * Macro naming rule:
6  *      HBA_R[xxx]
7  *          HBA Register [xxx]
8  *          e.g. HBA_RPxCLB is Register PxCLB
9  *
10  * All registers offset are 0 based index of a DWORD array
11  */
12
13 #define AHCI_HBA_CLASS 0x10601
14
15 #define HBA_RCAP 0
16 #define HBA_RGHC 1
17 #define HBA_RIS 2
18 #define HBA_RPI 3
19 #define HBA_RVER 4
20
21 #define HBA_RPBASE (0x40)
22 #define HBA_RPSIZE (0x80 >> 2)
23 #define HBA_RPxCLB 0
24 #define HBA_RPxFB 2
25 #define HBA_RPxIS 4
26 #define HBA_RPxIE 5
27 #define HBA_RPxCMD 6
28 #define HBA_RPxTFD 8
29 #define HBA_RPxSIG 9
30 #define HBA_RPxSSTS 10
31 #define HBA_RPxSCTL 11
32 #define HBA_RPxSERR 12
33 #define HBA_RPxSACT 13
34 #define HBA_RPxCI 14
35 #define HBA_RPxSNTF 15
36 #define HBA_RPxFBS 16
37
38 #define HBA_PxCMD_FRE (1 << 4)
39 #define HBA_PxCMD_ST (1)
40 #define HBA_PxINTR_DMA (1 << 2)
41 #define HBA_PxINTR_D2HR (1)
42
43 #define HBA_RGHC_ACHI_ENABLE (1 << 31)
44 #define HBA_RGHC_INTR_ENABLE (1 << 1)
45 #define HBA_RGHC_RESET 1
46
47 #define HBA_RPxSSTS_PWR(x) (((x) >> 8) & 0xf)
48 #define HBA_RPxSSTS_IF(x) (((x) >> 4) & 0xf)
49 #define HBA_RPxSSTS_PHYSTATE(x) ((x)&0xf)
50
51 typedef unsigned int hba_reg_t;
52
53 struct ahci_port
54 {
55     hba_reg_t* regs;
56     unsigned int ssts;
57     void* cmdlstv;
58     void* fisv;
59 };
60
61 struct ahci_hba
62 {
63     volatile hba_reg_t* base;
64     unsigned int ports_num;
65     unsigned int cmd_slots;
66     unsigned int version;
67     struct ahci_port* ports[32];
68 };
69
70 /**
71  * @brief 初始化AHCI与HBA
72  *
73  */
74 void
75 ahci_init();
76
77 void
78 ahci_list_device();
79
80 #endif /* __LUNAIX_AHCI_H */