aos/devices/ahci_port.dev
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

278 lines
7.8 KiB
Plaintext

/*
* Copyright (c) 2009, ETH Zurich. All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
* ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
*/
/*
* ahci_port.dev
*
* DESCRIPTION: AHCI (SATA) Host bus adaptor, per-port registers
*
* Section numbers refer to the Serial ATA Advanced Host Controller
* Interface (AHCI) specification 1.3, June 2008
*/
device ahci_port msbfirst (addr b) "AHCI port" {
// 3.3.1-2
// Low 10 bits mbz
register clb rw addr(b,0x00) "Command list base address" type(uint64);
// 3.3.3-4
// Low 10 bits mbz
register fb rw addr(b,0x08) "FIS base address" type(uint64);
// 3.3.5
register is addr(b,0x10) "Interrupt status" {
cpds 1 rw1c "Cold port detect";
tfes 1 rw1c "Task file error";
hbfs 1 rw1c "Host bus fatal error";
hbds 1 rw1c "Host bus data error";
ifs 1 rw1c "Interface fatal error";
infs 1 rw1c "Interface non-fatal error";
_ 1 rsvd;
ofs 1 rw1c "Overflow status";
ipms 1 rw1c "Incorrect port multiplier status";
prcs 1 ro "PhyRdy change status";
_ 14 rsvd;
dmps 1 rw1c "Device mechanical presence";
pcs 1 ro "Port connect change";
dps 1 rw1c "Descriptor processed";
ufs 1 ro "Unknown FIS interrupt";
sdbs 1 rw1c "Set device bits interrupt";
dss 1 rw1c "DMA setup FIS interrupt";
pss 1 rw1c "PIO setup FIS interrupt";
dhrs 1 rw1c "Device to host register FIS interrupt";
};
// 3.3.6
register ie addr(b,0x14) "Interrupt enable" {
cpde 1 rw "Cold port detect";
tfee 1 rw "Task file error";
hbfe 1 rw "Host bus fatal error";
hbde 1 rw "Host bus data error";
ife 1 rw "Interface fatal error";
infe 1 rw "Interface non-fatal error";
_ 1 rsvd;
ofe 1 rw "Overflow enable";
ipme 1 rw "Incorrect port multiplier status";
prce 1 ro "PhyRdy change status";
_ 14 rsvd;
dmpe 1 rw "Device mechanical presence";
pce 1 ro "Port connect change";
dpe 1 rw "Descriptor processed";
ufe 1 ro "Unknown FIS interrupt";
sdbe 1 rw "Set device bits interrupt";
dse 1 rw "DMA setup FIS interrupt";
pse 1 rw "PIO setup FIS interrupt";
dhre 1 rw "Device to host register FIS interrupt";
};
// 3.3.7
constants icct "Interface communication control" {
slumber = 0x6 "Slumber";
partial = 0x2 "Partial";
active = 0x1 "Active";
idle = 0x0 "No-Op / Idle";
};
register cmd addr(b,0x18) "Command and status" {
icc 4 rw type(icct) "Interface communication control";
asp 1 rw "Aggressive slumber / partial";
alpe 1 rw "Aggressive link power management enable";
dlae 1 rw "Drive LED on ATAPI enable";
atapi 1 rw "Device is ATAPI";
apste 1 rw "Automatic partial to slumber transitions enabled";
fbscp 1 ro "FIS-based switching capable port";
esp 1 ro "External SATA port";
cpd 1 ro "Cold presence detection";
mpsp 1 ro "Mechanical presence switch";
hpcp 1 ro "Hot plug capable port";
pma 1 rw "Port multiplier attached";
cps 1 ro "Cold presence state";
cr 1 ro "Command list running";
fr 1 ro "FIS receive running";
mpss 1 ro "Mechanical presence switch state";
ccs 5 ro "Current command slot";
_ 3 rsvd;
fre 1 rw "FIS receive enable";
clo 1 rw "Command list override";
pod 1 rw "Power on device";
sud 1 rw "Spin-up device";
st 1 rw "Start";
};
// 3.3.8
register tfd ro addr(b,0x20) "Task file data" {
_ 16 rsvd;
err 8 "Error";
bsy 1 ro "Indicates the interface is busy";
cs2 3 ro "Command specific";
drq 1 ro "Indicates a data transfer is requested";
cs1 2 ro "Command specific";
serr 1 ro "Indicates an error during the transfer.";
};
// 3.3.9
register sig ro addr(b,0x24) "Signature" {
lbah 8 "LBA high";
lbam 8 "LBA mid";
lbal 8 "LBA low";
sectors 8 "Sector count";
};
// 3.3.10
constants speed "Interface speed" {
gen1 = 0b0001 "Gen 1 (1.5 Gbps)";
gen2 = 0b0010 "Gen 2 (3 Gbps)";
gen3 = 0b0011 "Gen 3 (6 Gbps)";
};
constants dets "Device detection state" {
nodev = 0x0 "No device, no PHY";
nophy = 0x1 "Device detected, no PHY comm. established";
detect = 0x3 "Device detected and PHY comm. established";
offline = 0x4 "PHY in offline mode or loopback";
};
register ssts ro addr(b,0x28) "Serial ATA status" {
_ 20 rsvd;
ipm 4 type(icct) "Interface power management";
spd 4 type(speed) "Current interface speed";
det 4 type(dets) "Device detection";
};
// 3.3.11
constants ipmall "Interface transitions" {
noipm = 0x0 "No interface restrictions";
noprtl = 0x1 "Transitions to Partial state disabled";
noslmb = 0x2 "Transitions to Slumber state disabled";
noboth = 0x3 "Transitions to both Partial and Slumber disabled";
};
register sctl addr(b,0x2c) "Serial ATA control" {
_ 12 rsvd;
_ 4 rsvd "Port multiplier port (unused)";
_ 4 rsvd "Select power mgmt (unused)";
ipm 4 rw type(ipmall) "Interface power mgmt transitions allowed";
spd 4 rw type(speed) "Speed allowed";
det 4 rw type(dets) "Device detection initialization";
};
// 3.3.12
register serr rw1c addr(b,0x30) "Serial ATA error" {
_ 5 rsvd;
dx 1 "Exchanged";
df 1 "Unknown FIS type";
dt 1 "Transport state transition error";
ds 1 "Link sequence error";
dh 1 "Handshake error";
dc 1 "CRC error";
dd 1 "Disparity error";
db 1 "10b to 8b decode error";
dw 1 "Comm wake";
di 1 "Phy internal error";
dn 1 "PhyRdy change";
_ 4 rsvd;
ee 1 "Internal error";
ep 1 "Protocol error";
ec 1 "Persistent communication or data integrity error";
et 1 "Transient data integrity error";
_ 6 rsvd;
em 1 "Recovered communications error";
ei 1 "Recovered data integrity error";
};
// 3.3.13
register sact rw addr(b,0x34) "Serial ATA active" type(uint32);
// 3.3.14
register ci rw addr(b,0x38) "Command issue" type(uint32);
// 3.3.15
register sntf addr(b,0x3c) "Serial ATA notification" {
_ 16 mbz;
pmn 16 rw1c "PMN notify";
};
// 3.3.16
register fbs addr(b,0x40) "FIS-based switching control" {
_ 12 mbz;
dwe 4 ro "Device with error";
ado 4 ro "Active device optimization";
dev 4 rw "Device to issue";
_ 5 mbz;
sde 1 ro "Single device error";
dec 1 rw1c "Device error clear";
en 1 rw "Enable";
};
// 4.2.2 Command List Structure, elements are Command Headers
datatype chdr msbfirst(32) "Command Header" {
prdtl 16 "Physical region descriptor table length";
pmp 4 "Port multiplier port";
_ 1;
c 1 "Clear busy upon R_OK";
b 1 "BIST";
r 1 "Reset";
p 1 "Prefetchable";
w 1 "Write";
a 1 "ATAPI";
cfl 5 "Command FIS length";
prdbc 32 "Physical region descriptor byte count";
ctba 64 "Command table descriptor base address";
_ 32;
_ 32;
_ 32;
_ 32;
};
// 4.2.3.3 Physical Region Descriptor Table
datatype prd msbfirst(32) "Physical region descriptor" {
dba 32 "Data base address";
dbau 32 "Data base address upper";
_ 32;
i 1 "Interrupt on completion";
_ 9;
dbc 22 "Data byte count";
};
// 12.2
constants emtype "Enclosure message type" {
led = 0x0 "LED";
saf_te = 0x1 "SAF-TE";
ses_2 = 0x2 "SES-2";
sgpio = 0x3 "SGPOI (register-based interface";
};
datatype encmsg "Enclosure management message" {
_ 4;
mtype 4 type(emtype) "Message type";
dsize 8 "Data size";
msize 8 "Message size";
_ 8;
};
// 12.2.1
constants emledstate "Enclosure LED state" {
off = 0b000 "LED shall be off";
solid = 0b001 "LED shall be solid on";
vs1 = 0b100 "Vendor specific 1";
vs2 = 0b101 "Vendor specific 2";
vs3 = 0b110 "Vendor specific 3";
vs4 = 0b111 "Vendor specific 4";
};
datatype emledmsg "Enclosure LED message" {
_ 7;
fault 3 type(emledstate) "Vendor-specific LED (e.g. fault)";
locate 3 type(emledstate) "Vendor-specific LED (e.g. locate)";
activity 3 type(emledstate) "Activity LED";
_ 4;
pmi 4 "Port multiplier information";
_ 2;
vsm 1 "Vendor-specific enclosure message";
hbapn 5 "HBA port number for update";
};
};