xref: /OK3568_Linux_fs/u-boot/include/fis.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2008 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun  *		Dave Liu <daveliu@freescale.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __FIS_H__
9*4882a593Smuzhiyun #define __FIS_H__
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun * Register - Host to Device FIS
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun typedef struct sata_fis_h2d {
14*4882a593Smuzhiyun 	u8 fis_type;
15*4882a593Smuzhiyun 	u8 pm_port_c;
16*4882a593Smuzhiyun 	u8 command;
17*4882a593Smuzhiyun 	u8 features;
18*4882a593Smuzhiyun 	u8 lba_low;
19*4882a593Smuzhiyun 	u8 lba_mid;
20*4882a593Smuzhiyun 	u8 lba_high;
21*4882a593Smuzhiyun 	u8 device;
22*4882a593Smuzhiyun 	u8 lba_low_exp;
23*4882a593Smuzhiyun 	u8 lba_mid_exp;
24*4882a593Smuzhiyun 	u8 lba_high_exp;
25*4882a593Smuzhiyun 	u8 features_exp;
26*4882a593Smuzhiyun 	u8 sector_count;
27*4882a593Smuzhiyun 	u8 sector_count_exp;
28*4882a593Smuzhiyun 	u8 res1;
29*4882a593Smuzhiyun 	u8 control;
30*4882a593Smuzhiyun 	u8 res2[4];
31*4882a593Smuzhiyun } __attribute__ ((packed)) sata_fis_h2d_t;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun * Register - Host to Device FIS for read/write FPDMA queued
35*4882a593Smuzhiyun */
36*4882a593Smuzhiyun typedef struct sata_fis_h2d_ncq {
37*4882a593Smuzhiyun 	u8 fis_type;
38*4882a593Smuzhiyun 	u8 pm_port_c;
39*4882a593Smuzhiyun 	u8 command;
40*4882a593Smuzhiyun 	u8 sector_count_low;
41*4882a593Smuzhiyun 	u8 lba_low;
42*4882a593Smuzhiyun 	u8 lba_mid;
43*4882a593Smuzhiyun 	u8 lba_high;
44*4882a593Smuzhiyun 	u8 device;
45*4882a593Smuzhiyun 	u8 lba_low_exp;
46*4882a593Smuzhiyun 	u8 lba_mid_exp;
47*4882a593Smuzhiyun 	u8 lba_high_exp;
48*4882a593Smuzhiyun 	u8 sector_count_high;
49*4882a593Smuzhiyun 	u8 tag;
50*4882a593Smuzhiyun 	u8 res1;
51*4882a593Smuzhiyun 	u8 res2;
52*4882a593Smuzhiyun 	u8 control;
53*4882a593Smuzhiyun 	u8 res3[4];
54*4882a593Smuzhiyun } __attribute__ ((packed)) sata_fis_h2d_ncq_t;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun * Register - Device to Host FIS
58*4882a593Smuzhiyun */
59*4882a593Smuzhiyun typedef struct sata_fis_d2h {
60*4882a593Smuzhiyun 	u8 fis_type;
61*4882a593Smuzhiyun 	u8 pm_port_i;
62*4882a593Smuzhiyun 	u8 status;
63*4882a593Smuzhiyun 	u8 error;
64*4882a593Smuzhiyun 	u8 lba_low;
65*4882a593Smuzhiyun 	u8 lba_mid;
66*4882a593Smuzhiyun 	u8 lba_high;
67*4882a593Smuzhiyun 	u8 device;
68*4882a593Smuzhiyun 	u8 lba_low_exp;
69*4882a593Smuzhiyun 	u8 lba_mid_exp;
70*4882a593Smuzhiyun 	u8 lba_high_exp;
71*4882a593Smuzhiyun 	u8 res1;
72*4882a593Smuzhiyun 	u8 sector_count;
73*4882a593Smuzhiyun 	u8 sector_count_exp;
74*4882a593Smuzhiyun 	u8 res2[2];
75*4882a593Smuzhiyun 	u8 res3[4];
76*4882a593Smuzhiyun } __attribute__ ((packed)) sata_fis_d2h_t;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun * DMA Setup - Device to Host or Host to Device FIS
80*4882a593Smuzhiyun */
81*4882a593Smuzhiyun typedef struct sata_fis_dma_setup {
82*4882a593Smuzhiyun 	u8 fis_type;
83*4882a593Smuzhiyun 	u8 pm_port_dir_int_act;
84*4882a593Smuzhiyun 	u8 res1;
85*4882a593Smuzhiyun 	u8 res2;
86*4882a593Smuzhiyun 	u32 dma_buffer_id_low;
87*4882a593Smuzhiyun 	u32 dma_buffer_id_high;
88*4882a593Smuzhiyun 	u32 res3;
89*4882a593Smuzhiyun 	u32 dma_buffer_offset;
90*4882a593Smuzhiyun 	u32 dma_transfer_count;
91*4882a593Smuzhiyun 	u32 res4;
92*4882a593Smuzhiyun } __attribute__ ((packed)) sata_fis_dma_setup_t;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun /*
95*4882a593Smuzhiyun * PIO Setup - Device to Host FIS
96*4882a593Smuzhiyun */
97*4882a593Smuzhiyun typedef struct sata_fis_pio_setup {
98*4882a593Smuzhiyun 	u8 fis_type;
99*4882a593Smuzhiyun 	u8 pm_port_dir_int;
100*4882a593Smuzhiyun 	u8 status;
101*4882a593Smuzhiyun 	u8 error;
102*4882a593Smuzhiyun 	u8 lba_low;
103*4882a593Smuzhiyun 	u8 lba_mid;
104*4882a593Smuzhiyun 	u8 lba_high;
105*4882a593Smuzhiyun 	u8 res1;
106*4882a593Smuzhiyun 	u8 lba_low_exp;
107*4882a593Smuzhiyun 	u8 lba_mid_exp;
108*4882a593Smuzhiyun 	u8 lba_high_exp;
109*4882a593Smuzhiyun 	u8 res2;
110*4882a593Smuzhiyun 	u8 sector_count;
111*4882a593Smuzhiyun 	u8 sector_count_exp;
112*4882a593Smuzhiyun 	u8 res3;
113*4882a593Smuzhiyun 	u8 e_status;
114*4882a593Smuzhiyun 	u16 transfer_count;
115*4882a593Smuzhiyun 	u16 res4;
116*4882a593Smuzhiyun } __attribute__ ((packed)) sata_fis_pio_setup_t;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /*
119*4882a593Smuzhiyun * Data - Host to Device or Device to Host FIS
120*4882a593Smuzhiyun */
121*4882a593Smuzhiyun typedef struct sata_fis_data {
122*4882a593Smuzhiyun 	u8 fis_type;
123*4882a593Smuzhiyun 	u8 pm_port;
124*4882a593Smuzhiyun 	u8 res1;
125*4882a593Smuzhiyun 	u8 res2;
126*4882a593Smuzhiyun 	u32 data[2048];
127*4882a593Smuzhiyun } __attribute__ ((packed)) sata_fis_data_t;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* fis_type - SATA FIS type
130*4882a593Smuzhiyun  */
131*4882a593Smuzhiyun enum sata_fis_type {
132*4882a593Smuzhiyun 	SATA_FIS_TYPE_REGISTER_H2D		= 0x27,
133*4882a593Smuzhiyun 	SATA_FIS_TYPE_REGISTER_D2H		= 0x34,
134*4882a593Smuzhiyun 	SATA_FIS_TYPE_DMA_ACT_D2H		= 0x39,
135*4882a593Smuzhiyun 	SATA_FIS_TYPE_DMA_SETUP_BI		= 0x41,
136*4882a593Smuzhiyun 	SATA_FIS_TYPE_DATA_BI			= 0x46,
137*4882a593Smuzhiyun 	SATA_FIS_TYPE_BIST_ACT_BI		= 0x58,
138*4882a593Smuzhiyun 	SATA_FIS_TYPE_PIO_SETUP_D2H		= 0x5F,
139*4882a593Smuzhiyun 	SATA_FIS_TYPE_SET_DEVICE_BITS_D2H	= 0xA1,
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #endif	/* __FIS_H__ */
143