Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
ahci_reg.hpp
Go to the documentation of this file.
1#ifndef __AHCI__AHCI_REG_HPP__
2#define __AHCI__AHCI_REG_HPP__
3
4#include <type.h>
5
6typedef volatile struct {
7 uint32_t clb; // 0x00, command list base address, 1K-byte aligned
8 uint32_t clbu; // 0x04, command list base address upper 32 bits
9 uint32_t fb; // 0x08, FIS base address, 256-byte aligned
10 uint32_t fbu; // 0x0C, FIS base address upper 32 bits
11 uint32_t is; // 0x10, interrupt status
12 uint32_t ie; // 0x14, interrupt enable
13 uint32_t cmd; // 0x18, command and status
14 uint32_t rsv0; // 0x1C, Reserved
15 uint32_t tfd; // 0x20, task file data
16 uint32_t sig; // 0x24, signature
17 uint32_t ssts; // 0x28, SATA status (SCR0:SStatus)
18 uint32_t sctl; // 0x2C, SATA control (SCR2:SControl)
19 uint32_t serr; // 0x30, SATA error (SCR1:SError)
20 uint32_t sact; // 0x34, SATA active (SCR3:SActive)
21 uint32_t ci; // 0x38, command issue
22 uint32_t sntf; // 0x3C, SATA notification (SCR4:SNotification)
23 uint32_t fbs; // 0x40, FIS-based switch control
24 uint32_t rsv1[11]; // 0x44 ~ 0x6F, Reserved
25 uint32_t vendor[4]; // 0x70 ~ 0x7F, vendor specific
27
28typedef volatile struct {
35
36typedef volatile struct {
37 uint32_t cap; // 0x00, Host capability
38 uint32_t ghc; // 0x04, Global host control
39 uint32_t is; // 0x08, Interrupt status
40 uint32_t pi; // 0x0C, Port implemented
41 uint32_t vs; // 0x10, Version
42 uint32_t ccc_ctl; // 0x14, Command completion coalescing control
43 uint32_t ccc_pts; // 0x18, Command completion coalescing ports
44 uint32_t em_loc; // 0x1C, Enclosure management location
45 uint32_t em_ctl; // 0x20, Enclosure management control
46 uint32_t cap2; // 0x24, Host capabilities extended
47 uint32_t bohc; // 0x28, BIOS/OS handoff control and status
48
49 // 0x2C - 0x9F, Reserved
50 uint8_t rsv[0xA0 - 0x2C];
51
52 // 0xA0 - 0xFF, Vendor specific registers
53 uint8_t vendor[0x100 - 0xA0];
54
55 // 0x100 - 0x10FF, Port control registers
57} __attribute__((packed)) ahci_op_t;
58
59// ========== Device Signatures ==========
60#define AHCI_SIG_ATA 0x00000101 // SATA drive
61#define AHCI_SIG_ATAPI 0xEB140101 // SATAPI drive
62#define AHCI_SIG_SEMB 0xC33C0101 // Enclosure management bridge
63#define AHCI_SIG_PM 0x96690101 // Port multiplier
64
65// ========== SATA Status Register Bits ==========
66#define HBA_PxSSTS_DET_MASK 0xF
67#define HBA_PxSSTS_DET_NONE 0x0 // No device detected
68#define HBA_PxSSTS_DET_PRESENT 0x1 // Device present, no PHY
69#define HBA_PxSSTS_DET_ESTABLISHED 0x3 // Device present and PHY established
70#define HBA_PxSSTS_DET_OFFLINE 0x4 // PHY offline
71
72#define HBA_PxSSTS_SPD_MASK (0xF << 4)
73#define HBA_PxSSTS_SPD_NONE (0x0 << 4)
74#define HBA_PxSSTS_SPD_GEN1 (0x1 << 4) // Gen 1 (1.5 Gbps)
75#define HBA_PxSSTS_SPD_GEN2 (0x2 << 4) // Gen 2 (3.0 Gbps)
76#define HBA_PxSSTS_SPD_GEN3 (0x3 << 4) // Gen 3 (6.0 Gbps)
77
78#define HBA_PxSSTS_IPM_MASK (0xF << 8)
79#define HBA_PxSSTS_IPM_NONE (0x0 << 8)
80#define HBA_PxSSTS_IPM_ACTIVE (0x1 << 8)
81#define HBA_PxSSTS_IPM_PARTIAL (0x2 << 8)
82#define HBA_PxSSTS_IPM_SLUMBER (0x6 << 8)
83
84#define ATA_DEV_BUSY 0x80
85#define ATA_DEV_DRQ 0x08
86
87typedef enum {
88 FIS_TYPE_REG_H2D = 0x27, // Register FIS - host to device
89 FIS_TYPE_REG_D2H = 0x34, // Register FIS - device to host
90 FIS_TYPE_DMA_ACT = 0x39, // DMA activate FIS - device to host
91 FIS_TYPE_DMA_SETUP = 0x41, // DMA setup FIS - bidirectional
92 FIS_TYPE_DATA = 0x46, // Data FIS - bidirectional
93 FIS_TYPE_BIST = 0x58, // BIST activate FIS - bidirectional
94 FIS_TYPE_PIO_SETUP = 0x5F, // PIO setup FIS - device to host
95 FIS_TYPE_DEV_BITS = 0xA1, // Set device bits FIS - device to host
96} FIS_TYPE;
97
98typedef enum
99 : int { AHCI_DEV_NULL = 0, // Tidak ada device
100 AHCI_DEV_SATA, // SATA drive
101 AHCI_DEV_SATAPI, // SATAPI drive (CD/DVD)
102 AHCI_DEV_SEMB, // Enclosure management bridge
103 AHCI_DEV_PM // Port multiplier
105
106typedef struct {
107 uint32_t dba; // Data base address
108 uint32_t dbau; // Data base address upper 32 bits
109 uint32_t rsv0; // Reserved
110
111 // DW3
112 uint32_t dbc : 22; // Byte count, 4M max
113 uint32_t rsv1 : 9; // Reserved
115} __attribute__((packed)) ahci_prdt_t;
116
117typedef struct {
118 // DW0
119 uint8_t cfl : 5; // Command FIS length in DWORDS, 2 ~ 16
120 uint8_t a : 1; // ATAPI
121 uint8_t w : 1; // Write, 1: H2D, 0: D2H
122 uint8_t p : 1; // Prefetchable
123
124 uint8_t r : 1; // Reset
125 uint8_t b : 1; // BIST
126 uint8_t c : 1; // Clear busy upon R_OK
127 uint8_t rsv0 : 1; // Reserved
128 uint8_t pmp : 4; // Port multiplier port
129
130 uint16_t prdtl; // Physical region descriptor table length in entries
131
132 // DW1
133 volatile uint32_t
134 prdbc; // Physical region descriptor byte count transferred
135
136 // DW2, 3
137 uint32_t ctba; // Command table descriptor base address
138 uint32_t ctbau; // Command table descriptor base address upper 32 bits
139
140 // DW4 - 7
141 uint32_t rsv1[4]; // Reserved
142} ahci_cmd_t;
143
144typedef struct {
147 uint8_t rsv[48];
148 ahci_prdt_t prdt[];
149} __attribute__((packed)) ahci_cmd_tbl_t;
150
151typedef struct {
152 // DWORD 0
153 uint8_t fis_type; // FIS_TYPE_REG_H2D
154
155 uint8_t pmport : 4; // Port multiplier
156 uint8_t rsv0 : 3; // Reserved
157 uint8_t c : 1; // 1: Command, 0: Control
158
159 uint8_t command; // Command register
160 uint8_t featurel; // Feature register, 7:0
161
162 // DWORD 1
163 uint8_t lba0; // LBA low register, 7:0
164 uint8_t lba1; // LBA mid register, 15:8
165 uint8_t lba2; // LBA high register, 23:16
166 uint8_t device; // Device register
167
168 // DWORD 2
169 uint8_t lba3; // LBA register, 31:24
170 uint8_t lba4; // LBA register, 39:32
171 uint8_t lba5; // LBA register, 47:40
172 uint8_t featureh; // Feature register, 15:8
173
174 // DWORD 3
175 uint8_t countl; // Count register, 7:0
176 uint8_t counth; // Count register, 15:8
177 uint8_t icc; // Isochronous command completion
178 uint8_t control; // Control register
179
180 // DWORD 4
181 uint8_t rsv1[4]; // Reserved
183
184#endif //__AHCI__AHCI_REG_HPP__
ahci_device_type_t
Definition ahci_reg.hpp:99
@ AHCI_DEV_SEMB
Definition ahci_reg.hpp:102
@ AHCI_DEV_NULL
Definition ahci_reg.hpp:99
@ AHCI_DEV_SATA
Definition ahci_reg.hpp:100
@ AHCI_DEV_SATAPI
Definition ahci_reg.hpp:101
@ AHCI_DEV_PM
Definition ahci_reg.hpp:103
FIS_TYPE
Definition ahci_reg.hpp:87
@ FIS_TYPE_DMA_ACT
Definition ahci_reg.hpp:90
@ FIS_TYPE_PIO_SETUP
Definition ahci_reg.hpp:94
@ FIS_TYPE_REG_H2D
Definition ahci_reg.hpp:88
@ FIS_TYPE_BIST
Definition ahci_reg.hpp:93
@ FIS_TYPE_DEV_BITS
Definition ahci_reg.hpp:95
@ FIS_TYPE_DATA
Definition ahci_reg.hpp:92
@ FIS_TYPE_DMA_SETUP
Definition ahci_reg.hpp:91
@ FIS_TYPE_REG_D2H
Definition ahci_reg.hpp:89
typedef __attribute__
Definition msi.c:47
uint32_t em_loc
Definition ahci_reg.hpp:44
uint32_t ccc_ctl
Definition ahci_reg.hpp:42
uint32_t is
Definition ahci_reg.hpp:39
uint8_t cfis[64]
Definition ahci_reg.hpp:145
uint32_t bohc
Definition ahci_reg.hpp:47
uint32_t dbau
Definition ahci_reg.hpp:108
uint32_t vs
Definition ahci_reg.hpp:41
uint32_t ccc_pts
Definition ahci_reg.hpp:43
uint8_t rsv[0xA0 - 0x2C]
Definition ahci_reg.hpp:50
uint8_t vendor[0x100 - 0xA0]
Definition ahci_reg.hpp:53
uint32_t pi
Definition ahci_reg.hpp:40
uint32_t ghc
Definition ahci_reg.hpp:38
uint32_t rsv0
Definition ahci_reg.hpp:109
uint8_t acmd[16]
Definition ahci_reg.hpp:146
uint32_t em_ctl
Definition ahci_reg.hpp:45
ahci_prdt_t prdt[]
Definition ahci_reg.hpp:148
uint32_t dba
Definition ahci_reg.hpp:107
uint32_t dbc
Definition ahci_reg.hpp:112
uint32_t rsv1
Definition ahci_reg.hpp:113
ahci_port_t ports[1]
Definition ahci_reg.hpp:56
uint32_t cap
Definition ahci_reg.hpp:37
uint32_t cap2
Definition ahci_reg.hpp:46
uint16_t prdtl
Definition ahci_reg.hpp:130
uint8_t rsv0
Definition ahci_reg.hpp:127
uint8_t r
Definition ahci_reg.hpp:124
uint8_t w
Definition ahci_reg.hpp:121
uint8_t c
Definition ahci_reg.hpp:126
uint8_t p
Definition ahci_reg.hpp:122
uint8_t pmp
Definition ahci_reg.hpp:128
uint8_t cfl
Definition ahci_reg.hpp:119
uint32_t rsv1[4]
Definition ahci_reg.hpp:141
uint32_t ctba
Definition ahci_reg.hpp:137
uint8_t a
Definition ahci_reg.hpp:120
volatile uint32_t prdbc
Definition ahci_reg.hpp:134
uint8_t b
Definition ahci_reg.hpp:125
uint32_t ctbau
Definition ahci_reg.hpp:138
uint8_t fis_type
Definition ahci_reg.hpp:153
uint8_t rsv1[4]
Definition ahci_reg.hpp:181
uint8_t control
Definition ahci_reg.hpp:178
uint8_t featurel
Definition ahci_reg.hpp:160
uint8_t command
Definition ahci_reg.hpp:159
uint8_t featureh
Definition ahci_reg.hpp:172
uint8_t ahci_enable
Definition ahci_reg.hpp:33
uint8_t mrsm
Definition ahci_reg.hpp:31
uint32_t reserved
Definition ahci_reg.hpp:32
uint8_t int_enable
Definition ahci_reg.hpp:30
uint8_t reset
Definition ahci_reg.hpp:29
uint32_t ie
Definition ahci_reg.hpp:12
uint32_t is
Definition ahci_reg.hpp:11
uint32_t sctl
Definition ahci_reg.hpp:18
uint32_t sact
Definition ahci_reg.hpp:20
uint32_t fbs
Definition ahci_reg.hpp:23
uint32_t cmd
Definition ahci_reg.hpp:13
uint32_t fb
Definition ahci_reg.hpp:9
uint32_t ci
Definition ahci_reg.hpp:21
uint32_t sntf
Definition ahci_reg.hpp:22
uint32_t clbu
Definition ahci_reg.hpp:8
uint32_t ssts
Definition ahci_reg.hpp:17
uint32_t rsv0
Definition ahci_reg.hpp:14
uint32_t clb
Definition ahci_reg.hpp:7
uint32_t rsv1[11]
Definition ahci_reg.hpp:24
uint32_t serr
Definition ahci_reg.hpp:19
uint32_t vendor[4]
Definition ahci_reg.hpp:25
uint32_t fbu
Definition ahci_reg.hpp:10
uint32_t tfd
Definition ahci_reg.hpp:15
uint32_t sig
Definition ahci_reg.hpp:16
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
unsigned char uint8_t
Definition type.h:7