Initial import of block device refactoring.
[barrelfish] / lib / blk / blk_ahci / sata_fis.h
1 /*
2  * Copyright (c) 2011 ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #ifndef _AHCI_SATA_FIS_H
11 #define _AHCI_SATA_FIS_H
12
13 #include <stdint.h>
14
15 #define SATA_FIS_TYPE_H2D       0x27 // Register FIS - Host to Device
16 #define SATA_FIS_TYPE_D2H       0x34 // Register FIS - Device to Host
17 #define SATA_FIS_TYPE_DMAA      0x39 // DMA Activate FIS - Device to Host
18 #define SATA_FIS_TYPE_DMAS      0x41 // DMA Setup FIS - Bi-directional
19 #define SATA_FIS_TYPE_DATA      0x46 // Data FIS - Bi-directional
20 #define SATA_FIS_TYPE_BIST      0x58 // BIST Activate FIS - Bi-directional
21 #define SATA_FIS_TYPE_PIO       0x5F // PIO Setup FIS - Device to Host
22 #define SATA_FIS_TYPE_SDB       0xA1 // Set Device Bits FIS - Device to Host
23
24 #define ATA_CMD_READ_PIO          0x20
25 #define ATA_CMD_READ_PIO_EXT      0x24
26 #define ATA_CMD_READ_DMA          0xC8
27 #define ATA_CMD_READ_DMA_EXT      0x25
28 #define ATA_CMD_WRITE_PIO         0x30
29 #define ATA_CMD_WRITE_PIO_EXT     0x34
30 #define ATA_CMD_WRITE_DMA         0xCA
31 #define ATA_CMD_WRITE_DMA_EXT     0x35
32 #define ATA_CMD_CACHE_FLUSH       0xE7
33 #define ATA_CMD_CACHE_FLUSH_EXT   0xEA
34 #define ATA_CMD_PACKET            0xA0
35 #define ATA_CMD_IDENTIFY_PACKET   0xA1
36 #define ATA_CMD_IDENTIFY          0xEC
37
38 struct sata_fis_reg_h2d {
39         unsigned char type;
40         unsigned char specialstuff;
41         unsigned char command;
42         unsigned char feature;
43
44         unsigned char lba0;
45         unsigned char lba1;
46         unsigned char lba2;
47         unsigned char device;
48
49         unsigned char lba3;
50         unsigned char lba4;
51         unsigned char lba5;
52         unsigned char featureh;
53
54         unsigned char countl;
55         unsigned char counth;
56         unsigned char icc;
57         unsigned char control;
58
59         unsigned char reserved[4];
60 };
61
62 struct sata_fis_reg_d2h {
63         unsigned char type;
64         unsigned char specialstuff;
65         unsigned char status;
66         unsigned char error;
67
68         unsigned char lba0;
69         unsigned char lba1;
70         unsigned char lba2;
71         unsigned char device;
72
73         unsigned char lba3;
74         unsigned char lba4;
75         unsigned char lba5;
76         unsigned char reserved;
77
78         unsigned char countl;
79         unsigned char counth;
80         unsigned char reserved2[2];
81
82         unsigned char reserved3[4];
83 };
84
85
86 void sata_h2d_fis_new(struct sata_fis_reg_h2d* fis, uint8_t command, uint64_t lba, uint16_t sectors);
87 void sata_h2d_fis_init(struct sata_fis_reg_h2d* fis);
88 void sata_h2d_set_command(struct sata_fis_reg_h2d* fis, uint8_t command);
89 void sata_h2d_set_feature(struct sata_fis_reg_h2d* fis, uint8_t feature);
90 void sata_h2d_set_lba28(struct sata_fis_reg_h2d* fis, uint32_t lba);
91 void sata_h2d_set_lba48(struct sata_fis_reg_h2d* fis, uint64_t lba);
92 void sata_h2d_set_count(struct sata_fis_reg_h2d* fis, uint16_t count);
93
94
95 #endif // _AHCI_SATA_FIS_H