123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- #pragma once
- #include "../block_device.h"
- #include "../../pci/pci.h"
- #include "../../../mm/mm.h"
- #define AHCI_MAPPING_BASE SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE+AHCI_MAPPING_OFFSET
- #define MAX_AHCI_DEVICES 100
- #define HBA_PxCMD_ST 0x0001
- #define HBA_PxCMD_FRE 0x0010
- #define HBA_PxCMD_FR 0x4000
- #define HBA_PxCMD_CR 0x8000
- #define ATA_DEV_BUSY 0x80
- #define ATA_DEV_DRQ 0x08
- #define ATA_CMD_READ_DMA_EXT 0x25
- #define ATA_CMD_WRITE_DMA_EXT 0x30
- #define HBA_PxIS_TFES (1 << 30)
- #define AHCI_SUCCESS 0
- #define E_NOEMPTYSLOT 1
- #define E_PORT_HUNG 2
- #define E_TASK_FILE_ERROR 3
- #define E_UNSUPPORTED_CMD 4
- extern struct block_device_operation ahci_operation;
- typedef enum
- {
- FIS_TYPE_REG_H2D = 0x27,
- FIS_TYPE_REG_D2H = 0x34,
- FIS_TYPE_DMA_ACT = 0x39,
- FIS_TYPE_DMA_SETUP = 0x41,
- FIS_TYPE_DATA = 0x46,
- FIS_TYPE_BIST = 0x58,
- FIS_TYPE_PIO_SETUP = 0x5F,
- FIS_TYPE_DEV_BITS = 0xA1,
- } FIS_TYPE;
- typedef struct tagFIS_REG_H2D
- {
-
- uint8_t fis_type;
- uint8_t pmport : 4;
- uint8_t rsv0 : 3;
- uint8_t c : 1;
- uint8_t command;
- uint8_t featurel;
-
- uint8_t lba0;
- uint8_t lba1;
- uint8_t lba2;
- uint8_t device;
-
- uint8_t lba3;
- uint8_t lba4;
- uint8_t lba5;
- uint8_t featureh;
-
- uint8_t countl;
- uint8_t counth;
- uint8_t icc;
- uint8_t control;
-
- uint8_t rsv1[4];
- } FIS_REG_H2D;
- typedef struct tagFIS_REG_D2H
- {
-
- uint8_t fis_type;
- uint8_t pmport : 4;
- uint8_t rsv0 : 2;
- uint8_t i : 1;
- uint8_t rsv1 : 1;
- uint8_t status;
- uint8_t error;
-
- uint8_t lba0;
- uint8_t lba1;
- uint8_t lba2;
- uint8_t device;
-
- uint8_t lba3;
- uint8_t lba4;
- uint8_t lba5;
- uint8_t rsv2;
-
- uint8_t countl;
- uint8_t counth;
- uint8_t rsv3[2];
-
- uint8_t rsv4[4];
- } FIS_REG_D2H;
- typedef struct tagFIS_DATA
- {
-
- uint8_t fis_type;
- uint8_t pmport : 4;
- uint8_t rsv0 : 4;
- uint8_t rsv1[2];
-
- uint32_t data[1];
- } FIS_DATA;
- typedef struct tagFIS_PIO_SETUP
- {
-
- uint8_t fis_type;
- uint8_t pmport : 4;
- uint8_t rsv0 : 1;
- uint8_t d : 1;
- uint8_t i : 1;
- uint8_t rsv1 : 1;
- uint8_t status;
- uint8_t error;
-
- uint8_t lba0;
- uint8_t lba1;
- uint8_t lba2;
- uint8_t device;
-
- uint8_t lba3;
- uint8_t lba4;
- uint8_t lba5;
- uint8_t rsv2;
-
- uint8_t countl;
- uint8_t counth;
- uint8_t rsv3;
- uint8_t e_status;
-
- uint16_t tc;
- uint8_t rsv4[2];
- } FIS_PIO_SETUP;
- typedef struct tagFIS_DMA_SETUP
- {
-
- uint8_t fis_type;
- uint8_t pmport : 4;
- uint8_t rsv0 : 1;
- uint8_t d : 1;
- uint8_t i : 1;
- uint8_t a : 1;
- uint8_t rsved[2];
-
- uint64_t DMAbufferID;
-
-
- uint32_t rsvd;
-
- uint32_t DMAbufOffset;
-
- uint32_t TransferCount;
-
- uint32_t resvd;
- } FIS_DMA_SETUP;
- typedef volatile struct tagHBA_PORT
- {
- uint64_t clb;
- uint64_t fb;
- uint32_t is;
- uint32_t ie;
- uint32_t cmd;
- uint32_t rsv0;
- uint32_t tfd;
- uint32_t sig;
- uint32_t ssts;
- uint32_t sctl;
- uint32_t serr;
- uint32_t sact;
- uint32_t ci;
- uint32_t sntf;
- uint32_t fbs;
- uint32_t rsv1[11];
- uint32_t vendor[4];
- } HBA_PORT;
- typedef volatile struct tagHBA_MEM
- {
-
- uint32_t cap;
- uint32_t ghc;
- uint32_t is;
- uint32_t pi;
- uint32_t vs;
- uint32_t ccc_ctl;
- uint32_t ccc_pts;
- uint32_t em_loc;
- uint32_t em_ctl;
- uint32_t cap2;
- uint32_t bohc;
-
-
- uint8_t rsv[0xA0-0x2C];
-
-
- uint8_t vendor[0x100-0xA0];
-
-
- HBA_PORT ports[32];
- } HBA_MEM;
-
- typedef volatile struct tagHBA_FIS
- {
-
- FIS_DMA_SETUP dsfis;
- uint8_t pad0[4];
-
-
- FIS_PIO_SETUP psfis;
- uint8_t pad1[12];
-
-
- FIS_REG_D2H rfis;
- uint8_t pad2[4];
-
-
-
-
-
- uint8_t ufis[64];
-
-
- uint8_t rsv[0x100-0xA0];
- } HBA_FIS;
- typedef struct tagHBA_CMD_HEADER
- {
-
- uint8_t cfl:5;
- uint8_t a:1;
- uint8_t w:1;
- uint8_t p:1;
-
- uint8_t r:1;
- uint8_t b:1;
- uint8_t c:1;
- uint8_t rsv0:1;
- uint8_t pmp:4;
-
- uint16_t prdtl;
-
-
- volatile
- uint32_t prdbc;
-
-
- uint64_t ctba;
-
-
- uint32_t rsv1[4];
- } HBA_CMD_HEADER;
- typedef struct tagHBA_PRDT_ENTRY
- {
- uint64_t dba;
- uint32_t rsv0;
-
-
- uint32_t dbc:22;
- uint32_t rsv1:9;
- uint32_t i:1;
- } HBA_PRDT_ENTRY;
- typedef struct tagHBA_CMD_TBL
- {
-
- uint8_t cfis[64];
-
-
- uint8_t acmd[16];
-
-
- uint8_t rsv[48];
-
-
- HBA_PRDT_ENTRY prdt_entry[1];
- } HBA_CMD_TBL;
- struct ahci_device_t
- {
- uint32_t type;
- struct pci_device_structure_header_t * dev_struct;
- HBA_MEM * hba_mem;
- }ahci_devices[MAX_AHCI_DEVICES];
- #define SATA_SIG_ATA 0x00000101
- #define SATA_SIG_ATAPI 0xEB140101
- #define SATA_SIG_SEMB 0xC33C0101
- #define SATA_SIG_PM 0x96690101
-
- #define AHCI_DEV_NULL 0
- #define AHCI_DEV_SATA 1
- #define AHCI_DEV_SEMB 2
- #define AHCI_DEV_PM 3
- #define AHCI_DEV_SATAPI 4
-
- #define HBA_PORT_IPM_ACTIVE 1
- #define HBA_PORT_DET_PRESENT 3
- struct block_device_request_queue ahci_req_queue;
- void ahci_init();
- static void ahci_probe_port(const uint32_t device_num);
- static bool ahci_read(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t count, uint64_t buf);
- static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t count,
- uint64_t buf);
|