1 /*
2  * Copyright (C) 2008 Freescale Semiconductor, Inc.
3  *		Dave Liu <daveliu@freescale.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18  * MA 02111-1307 USA
19  *
20  */
21 
22 #ifndef __FIS_H__
23 #define __FIS_H__
24 /*
25 * Register - Host to Device FIS
26 */
27 typedef struct sata_fis_h2d {
28 	u8 fis_type;
29 	u8 pm_port_c;
30 	u8 command;
31 	u8 features;
32 	u8 lba_low;
33 	u8 lba_mid;
34 	u8 lba_high;
35 	u8 device;
36 	u8 lba_low_exp;
37 	u8 lba_mid_exp;
38 	u8 lba_high_exp;
39 	u8 features_exp;
40 	u8 sector_count;
41 	u8 sector_count_exp;
42 	u8 res1;
43 	u8 control;
44 	u8 res2[4];
45 } __attribute__ ((packed)) sata_fis_h2d_t;
46 
47 /*
48 * Register - Host to Device FIS for read/write FPDMA queued
49 */
50 typedef struct sata_fis_h2d_ncq {
51 	u8 fis_type;
52 	u8 pm_port_c;
53 	u8 command;
54 	u8 sector_count_low;
55 	u8 lba_low;
56 	u8 lba_mid;
57 	u8 lba_high;
58 	u8 device;
59 	u8 lba_low_exp;
60 	u8 lba_mid_exp;
61 	u8 lba_high_exp;
62 	u8 sector_count_high;
63 	u8 tag;
64 	u8 res1;
65 	u8 res2;
66 	u8 control;
67 	u8 res3[4];
68 } __attribute__ ((packed)) sata_fis_h2d_ncq_t;
69 
70 /*
71 * Register - Device to Host FIS
72 */
73 typedef struct sata_fis_d2h {
74 	u8 fis_type;
75 	u8 pm_port_i;
76 	u8 status;
77 	u8 error;
78 	u8 lba_low;
79 	u8 lba_mid;
80 	u8 lba_high;
81 	u8 device;
82 	u8 lba_low_exp;
83 	u8 lba_mid_exp;
84 	u8 lba_high_exp;
85 	u8 res1;
86 	u8 sector_count;
87 	u8 sector_count_exp;
88 	u8 res2[2];
89 	u8 res3[4];
90 } __attribute__ ((packed)) sata_fis_d2h_t;
91 
92 /*
93 * DMA Setup - Device to Host or Host to Device FIS
94 */
95 typedef struct sata_fis_dma_setup {
96 	u8 fis_type;
97 	u8 pm_port_dir_int_act;
98 	u8 res1;
99 	u8 res2;
100 	u32 dma_buffer_id_low;
101 	u32 dma_buffer_id_high;
102 	u32 res3;
103 	u32 dma_buffer_offset;
104 	u32 dma_transfer_count;
105 	u32 res4;
106 } __attribute__ ((packed)) sata_fis_dma_setup_t;
107 
108 /*
109 * PIO Setup - Device to Host FIS
110 */
111 typedef struct sata_fis_pio_setup {
112 	u8 fis_type;
113 	u8 pm_port_dir_int;
114 	u8 status;
115 	u8 error;
116 	u8 lba_low;
117 	u8 lba_mid;
118 	u8 lba_high;
119 	u8 res1;
120 	u8 lba_low_exp;
121 	u8 lba_mid_exp;
122 	u8 lba_high_exp;
123 	u8 res2;
124 	u8 sector_count;
125 	u8 sector_count_exp;
126 	u8 res3;
127 	u8 e_status;
128 	u16 transfer_count;
129 	u16 res4;
130 } __attribute__ ((packed)) sata_fis_pio_setup_t;
131 
132 /*
133 * Data - Host to Device or Device to Host FIS
134 */
135 typedef struct sata_fis_data {
136 	u8 fis_type;
137 	u8 pm_port;
138 	u8 res1;
139 	u8 res2;
140 	u32 data[2048];
141 } __attribute__ ((packed)) sata_fis_data_t;
142 
143 /* fis_type - SATA FIS type
144  */
145 enum sata_fis_type {
146 	SATA_FIS_TYPE_REGISTER_H2D		= 0x27,
147 	SATA_FIS_TYPE_REGISTER_D2H		= 0x34,
148 	SATA_FIS_TYPE_DMA_ACT_D2H		= 0x39,
149 	SATA_FIS_TYPE_DMA_SETUP_BI		= 0x41,
150 	SATA_FIS_TYPE_DATA_BI			= 0x46,
151 	SATA_FIS_TYPE_BIST_ACT_BI		= 0x58,
152 	SATA_FIS_TYPE_PIO_SETUP_D2H		= 0x5F,
153 	SATA_FIS_TYPE_SET_DEVICE_BITS_D2H	= 0xA1,
154 };
155 
156 #endif	/* __FIS_H__ */
157