6#include <sys/kassert.h>
28 { 0x80862922,
"ICH9", 0 },
41#define AHCI_CAP_S64A 0x80000000
42#define AHCI_CAP_SNCQ 0x40000000
44#define AHCI_GHC_AE 0x80000000
45#define AHCI_GHC_IE 0x00000002
46#define AHCI_GHC_HR 0x00000001
66#define AHCIPORT_CMD_ICCMASK 0xF0000000
67#define AHCIPORT_CMD_ICCSLUMBER 0x60000000
68#define AHCIPORT_CMD_ICCPARTIAL 0x20000000
69#define AHCIPORT_CMD_ICCACTIVE 0x10000000
70#define AHCIPORT_CMD_ICCIDLE 0x00000000
71#define AHCIPORT_CMD_ASP 0x08000000
72#define AHCIPORT_CMD_ALPE 0x04000000
73#define AHCIPORT_CMD_DLAE 0x02000000
74#define AHCIPORT_CMD_ATAPI 0x01000000
75#define AHCIPORT_CMD_CPD 0x00100000
76#define AHCIPORT_CMD_ISP 0x00080000
77#define AHCIPORT_CMD_HPCP 0x00040000
78#define AHCIPORT_CMD_PMA 0x00020000
79#define AHCIPORT_CMD_CPS 0x00010000
80#define AHCIPORT_CMD_CR 0x00008000
81#define AHCIPORT_CMD_FR 0x00004000
82#define AHCIPORT_CMD_ISS 0x00002000
83#define AHCIPORT_CMD_FRE 0x00000010
84#define AHCIPORT_CMD_CLO 0x00000008
85#define AHCIPORT_CMD_POD 0x00000004
86#define AHCIPORT_CMD_SUD 0x00000002
87#define AHCIPORT_CMD_ST 0x00000001
89#define AHCIPORT_TFD_BSY 0x00000080
90#define AHCIPORT_TFD_DRQ 0x00000004
91#define AHCIPORT_TFD_ERR 0x00000001
93#define AHCIPORT_SSTS_DETMASK 0x0000000F
94#define AHCIPORT_SSTS_DETNP 0x00000000
95#define AHCIPORT_SSTS_DETNOTEST 0x00000001
96#define AHCIPORT_SSTS_DETPE 0x00000003
97#define AHCIPORT_SSTS_DETNE 0x00000004
100#define AHCI_PORT_OFFSET 0x100
101#define AHCI_PORT_LENGTH 0x80
102#define AHCI_MAX_PORTS 8
103#define AHCI_MAX_CMDS 32
198 kprintf(
"Unsupported SATA Controller PROGIF=%02x\n", progif);
266 for (i = 0; i < sga->
len; i++)
290 if ((tfd == 0) && (p->
ci == 0)) {
308 memset(&fis, 0,
sizeof(fis));
319 kprintf(
"AHCI: Identify Issued Port %d\n", port);
322 kprintf(
"AHCI: Identify Succeeded Port %d\n", port);
340 if ((cmd & cmd_mask) != 0) {
342 for (tries = 0; tries < 2; tries++) {
347 if ((cmd & cmd_mask) != 0) {
348 kprintf(
"AHCI: failed to reset port %d\n", port);
358 p->
serr = 0xFFFFFFFF;
359 p->
serr = 0x00000000;
367 kprintf(
"AHCI: Device not present on port %d\n", port);
371 kprintf(
"AHCI: Phys communication not established on port %d\n", port);
375 kprintf(
"AHCI: Port %d not enabled\n", port);
407 if (ahci->
port[port] != 0) {
434 kprintf(
"AHCI: BAR%d base=%08x size=%08x %s\n",
452 kprintf(
"AHCI: Version %d.%d, Ports: 0x%08x\n",
453 vers >> 16, vers & 0xFFFF, ports);
460 kprintf(
"AHCI: Supports 64-bit Addressing\n");
462 kprintf(
"AHCI: Controller does not support 64-bit addressing!\n");
467 kprintf(
"AHCI: Supports NCQ\n");
470 hc->
ghc &= ~AHCI_GHC_IE;
478 if (ports & (1 << p))
AHCIPort * port[AHCI_MAX_PORTS]
void AHCI_DumpPort(AHCI *ahci, int port)
uint64_t AHCI_IssueCommand(AHCI *ahci, int port, SGArray *sga, void *cfis, int len)
AHCIRecvFIS * rfis[AHCI_MAX_PORTS]
#define AHCIPORT_SSTS_DETNP
void AHCI_IdentifyPort(AHCI *ahci, int port)
void AHCI_Configure(PCIDevice dev)
static AHCIDevice deviceList[]
AHCICommandHeader cmds[AHCI_MAX_CMDS]
void AHCI_Reset(AHCI *ahci)
#define AHCIPORT_SSTS_DETNOTEST
void AHCI_Init(uint32_t bus, uint32_t slot, uint32_t func)
void AHCI_ResetPort(AHCI *ahci, int port)
AHCICommandTable * ctbl[AHCI_MAX_PORTS][AHCI_MAX_CMDS]
void AHCI_Dump(AHCI *ahci)
AHCICommandList * clst[AHCI_MAX_PORTS]
void AHCI_WaitPort(AHCI *ahci, int port)
#define AHCIPORT_SSTS_DETMASK
#define AHCIPORT_SSTS_DETNE
#define AHCIPORT_CMD_ICCACTIVE
uint16_t PCI_GetVendorID(PCIDevice *dev)
uint16_t PCI_GetDeviceID(PCIDevice *dev)
void PCI_Configure(PCIDevice *dev)
uint8_t PCI_CfgRead8(PCIDevice *dev, uint32_t reg)
int kprintf(const char *fmt,...)
void Debug_PrintHex(const char *data, size_t length, off_t off, size_t limit)
void * PAlloc_AllocPage()
#define PCI_OFFSET_PROGIF
PCIBAR bars[PCI_MAX_BARS]
#define SATAFIS_CMD_IDENTIFY
#define SATAFIS_REG_H2D_FLAG_COMMAND
#define SATAFIS_TYPE_REG_H2D
SGEntry entries[SGARRAY_MAX_ENTRIES]
void * memset(void *dst, int c, size_t len)
void * memcpy(void *dst, const void *src, size_t len)