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