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
38struct 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
62struct 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
86void sata_h2d_fis_new(struct sata_fis_reg_h2d* fis, uint8_t command, uint64_t lba, uint16_t sectors);
87void sata_h2d_fis_init(struct sata_fis_reg_h2d* fis);
88void sata_h2d_set_command(struct sata_fis_reg_h2d* fis, uint8_t command);
89void sata_h2d_set_feature(struct sata_fis_reg_h2d* fis, uint8_t feature);
90void sata_h2d_set_lba28(struct sata_fis_reg_h2d* fis, uint32_t lba);
91void sata_h2d_set_lba48(struct sata_fis_reg_h2d* fis, uint64_t lba);
92void sata_h2d_set_count(struct sata_fis_reg_h2d* fis, uint16_t count);
93
94
95#endif // _AHCI_SATA_FIS_H
96