2 * (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering
4 * Copyright (C) 2006 Micronas GmbH
6 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/errno.h>
15 * List of statically defined buffers per SCC.
16 * The first entry in the table is the number of fixed buffers
17 * followed by the list of buffer IDs
19 static u32 buffer_list_0
[] = { 6, 120, 121, 122, 123, 139, 140 };
20 static u32 buffer_list_1
[] = { 6, 120, 121, 122, 123, 139, 140 };
21 static u32 buffer_list_2
[] = { 5, 124, 125, 126, 139, 140 };
22 static u32 buffer_list_3
[] = { 5, 124, 125, 126, 139, 140 };
23 static u32 buffer_list_4
[] = { 5, 124, 125, 126, 139, 140 };
24 static u32 buffer_list_5
[] = { 3, 127, 139, 140 };
25 static u32 buffer_list_6
[] = { 3, 127, 139, 140 };
26 static u32 buffer_list_7
[] = { 6, 128, 129, 130, 131, 139, 140 };
27 static u32 buffer_list_8
[] = { 6, 128, 129, 130, 131, 139, 140 };
28 static u32 buffer_list_9
[] = { 5, 124, 125, 126, 139, 140 };
29 static u32 buffer_list_10
[] = { 5, 124, 125, 126, 139, 140 };
30 static u32 buffer_list_11
[] = { 5, 124, 125, 126, 139, 140 };
31 static u32 buffer_list_12
[] = { 6, 132, 133, 134, 135, 139, 140 };
32 static u32 buffer_list_13
[] = { 6, 132, 133, 134, 135, 139, 140 };
33 static u32 buffer_list_14
[] = { 4, 137, 138, 139, 140 };
34 static u32 buffer_list_15
[] = { 6, 136, 136, 137, 138, 139, 140 };
36 /** Issue#7674 (new) - DP/DVP buffer assignment */
37 static u32 buffer_list_16
[] = { 6, 106, 108, 109, 107, 139, 140 };
38 static u32 buffer_list_17
[] = { 6, 106, 110, 107, 111, 139, 140 };
39 static u32 buffer_list_18
[] = { 6, 106, 113, 107, 114, 139, 140 };
40 static u32 buffer_list_19
[] = { 3, 112, 139, 140 };
41 static u32 buffer_list_20
[] = { 35, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
42 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
43 79, 80, 81, 82, 83, 84, 85, 86, 139, 140 };
44 static u32 buffer_list_21
[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
45 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
47 static u32 buffer_list_22
[] = { 81, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
48 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
49 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
50 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
51 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
52 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
53 73, 74, 75, 76, 77, 78, 139, 140 };
54 static u32 buffer_list_23
[] = { 29, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
55 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
57 static u32 buffer_list_24
[] = { 6, 90, 91, 92, 93, 139, 140 };
58 static u32 buffer_list_25
[] = { 18, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
59 100, 101, 102, 103, 104, 105, 139, 140 };
60 static u32 buffer_list_26
[] = { 5, 94, 95, 96, 139, 140 };
61 static u32 buffer_list_27
[] = { 5, 97, 98, 99, 139, 140 };
62 static u32 buffer_list_28
[] = { 5, 100, 101, 102, 139, 140 };
63 static u32 buffer_list_29
[] = { 5, 103, 104, 105, 139, 140 };
64 static u32 buffer_list_30
[] = { 10, 108, 109, 110, 111, 113, 114, 116, 117,
66 static u32 buffer_list_31
[] = { 13, 106, 107, 108, 109, 110, 111, 113, 114,
67 115, 116, 117, 139, 140 };
68 static u32 buffer_list_32
[] = { 13, 106, 107, 108, 109, 110, 111, 113, 114,
69 115, 116, 117, 139, 140 };
70 static u32 buffer_list_33
[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
71 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
73 static u32 buffer_list_34
[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
74 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
76 static u32 buffer_list_35
[] = { 28, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
77 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
79 static u32 buffer_list_36
[] = { 28, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
80 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
82 static u32 buffer_list_37
[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
83 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
85 static u32 buffer_list_38
[] = { 29, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
86 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
88 static u32 buffer_list_39
[] = { 91, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
89 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
90 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
91 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
92 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
93 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
94 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
95 85, 86, 118, 119, 139, 140 };
96 static u32 buffer_list_40
[] = { 0 };
99 * List of statically defined vcid.csize values.
100 * The first entry in the table is the number of possible csize values
101 * followed by the list of data path values in bits.
103 static u32 csize_list_0
[] = { 2, 0, 1 };
104 static u32 csize_list_1
[] = { 2, 0, 1 };
105 static u32 csize_list_2
[] = { 1, 1 };
106 static u32 csize_list_3
[] = { 1, 1 };
107 static u32 csize_list_4
[] = { 1, 1 };
108 static u32 csize_list_5
[] = { 1, 0 };
109 static u32 csize_list_6
[] = { 1, 0 };
110 static u32 csize_list_7
[] = { 1, 1 };
111 static u32 csize_list_8
[] = { 1, 1 };
112 static u32 csize_list_9
[] = { 1, 1 };
113 static u32 csize_list_10
[] = { 1, 1 };
114 static u32 csize_list_11
[] = { 1, 1 };
115 static u32 csize_list_12
[] = { 1, 1 };
116 static u32 csize_list_13
[] = { 1, 1 };
117 static u32 csize_list_14
[] = { 1, 2 };
118 static u32 csize_list_15
[] = { 1, 4 };
119 static u32 csize_list_16
[] = { 3, 0, 1, 2 };
120 static u32 csize_list_17
[] = { 3, 0, 1, 2 };
121 static u32 csize_list_18
[] = { 3, 0, 1, 2 };
122 static u32 csize_list_19
[] = { 1, 2 };
123 static u32 csize_list_20
[] = { 1, 0 };
124 static u32 csize_list_21
[] = { 1, 0 };
125 static u32 csize_list_22
[] = { 1, 2 };
126 static u32 csize_list_23
[] = { 1, 3 };
127 static u32 csize_list_24
[] = { 1, 3 };
128 static u32 csize_list_25
[] = { 1, 3 };
129 static u32 csize_list_26
[] = { 1, 0 };
130 static u32 csize_list_27
[] = { 1, 0 };
131 static u32 csize_list_28
[] = { 1, 0 };
132 static u32 csize_list_29
[] = { 1, 0 };
133 static u32 csize_list_30
[] = { 1, 2 };
134 static u32 csize_list_31
[] = { 1, 2 };
135 static u32 csize_list_32
[] = { 1, 2 };
136 static u32 csize_list_33
[] = { 1, 2 };
137 static u32 csize_list_34
[] = { 1, 2 };
138 static u32 csize_list_35
[] = { 1, 2 };
139 static u32 csize_list_36
[] = { 1, 2 };
140 static u32 csize_list_37
[] = { 2, 0, 1 };
141 static u32 csize_list_38
[] = { 1, 2 };
142 static u32 csize_list_39
[] = { 1, 3 };
143 static u32 csize_list_40
[] = { 1, 3 };
146 * SCC_Configuration table
148 static const struct scc_descriptor scc_descriptor_table
[] = {
149 /* scn scc_name profile SCC scc_id mci_id rd wr m p fh si cfg sta */
150 {"fe_", "fe_3dcomb_wr", STRM_P
, SCC0_BASE
, 0, 0, 0, 4, 1, 1, 0, 0, 0, 1,
151 buffer_list_0
, csize_list_0
},
152 {"fe_", "fe_3dcomb_rd", STRM_P
, SCC1_BASE
, 1, 18, 4, 0, 1, 1, 0, 1, 0,
153 1, buffer_list_1
, csize_list_1
},
154 {"di_", "di_tnr_wr", STRM_P
, SCC2_BASE
, 2, 1, 0, 3, 1, 1, 0, 2, 0, 1,
155 buffer_list_2
, csize_list_2
},
156 {"di_", "di_tnr_field_rd", STRM_P
, SCC3_BASE
, 3, 19, 3, 0, 1, 1, 0, 3,
157 0, 1, buffer_list_3
, csize_list_3
},
158 {"di_", "di_tnr_frame_rd", STRM_P
, SCC4_BASE
, 4, 20, 3, 0, 1, 1, 0, 4,
159 0, 1, buffer_list_4
, csize_list_4
},
160 {"di_", "di_mval_wr", STRM_P
, SCC5_BASE
, 5, 2, 0, 1, 1, 1, 0, 5, 0, 1,
161 buffer_list_5
, csize_list_5
},
162 {"di_", "di_mval_rd", STRM_P
, SCC6_BASE
, 6, 21, 1, 0, 1, 1, 0, 6, 0, 1,
163 buffer_list_6
, csize_list_6
},
164 {"rc_", "rc_frame_wr", STRM_P
, SCC7_BASE
, 7, 3, 0, 4, 1, 1, 0, 7, 0, 1,
165 buffer_list_7
, csize_list_7
},
166 {"rc_", "rc_frame0_rd", STRM_P
, SCC8_BASE
, 8, 22, 4, 0, 1, 1, 0, 8, 0,
167 1, buffer_list_8
, csize_list_8
},
168 {"opt", "opt_field0_rd", STRM_P
, SCC9_BASE
, 9, 23, 3, 0, 1, 1, 0, 9, 0,
169 1, buffer_list_9
, csize_list_9
},
170 {"opt", "opt_field1_rd", STRM_P
, SCC10_BASE
, 10, 24, 3, 0, 1, 1, 0, 10,
171 0, 1, buffer_list_10
, csize_list_10
},
172 {"opt", "opt_field2_rd", STRM_P
, SCC11_BASE
, 11, 25, 3, 0, 1, 1, 0, 11,
173 0, 1, buffer_list_11
, csize_list_11
},
174 {"pip", "pip_frame_wr", STRM_P
, SCC12_BASE
, 12, 4, 0, 4, 1, 1, 0, 12, 0,
175 1, buffer_list_12
, csize_list_12
},
176 {"pip", "pip_frame_rd", STRM_P
, SCC13_BASE
, 13, 26, 4, 0, 1, 1, 0, 13,
177 0, 1, buffer_list_13
, csize_list_13
},
178 {"dp_", "dp_agpu_rd", STRM_P
, SCC14_BASE
, 14, 27, 2, 0, 2, 1, 0, 14, 0,
179 1, buffer_list_14
, csize_list_14
},
180 {"ewa", "ewarp_rw", SRMD
, SCC15_BASE
, 15, 11, 1, 1, 0, 0, 0, -1, 0, 0,
181 buffer_list_15
, csize_list_15
},
182 {"dp_", "dp_osd_rd", STRM_P
, SCC16_BASE
, 16, 28, 3, 0, 2, 1, 0, 15, 0,
183 1, buffer_list_16
, csize_list_16
},
184 {"dp_", "dp_graphic_rd", STRM_P
, SCC17_BASE
, 17, 29, 3, 0, 2, 1, 0, 16,
185 0, 1, buffer_list_17
, csize_list_17
},
186 {"dvp", "dvp_osd_rd", STRM_P
, SCC18_BASE
, 18, 30, 2, 0, 2, 1, 0, 17, 0,
187 1, buffer_list_18
, csize_list_18
},
188 {"dvp", "dvp_vbi_rd", STRM_D
, SCC19_BASE
, 19, 31, 1, 0, 0, 1, 0, -1, 0,
189 0, buffer_list_19
, csize_list_19
},
190 {"tsi", "tsio_wr", STRM_P
, SCC20_BASE
, 20, 5, 0, 8, 2, 1, 1, -1, 0, 0,
191 buffer_list_20
, csize_list_20
},
192 {"tsi", "tsio_rd", STRM_P
, SCC21_BASE
, 21, 32, 4, 0, 2, 1, 1, -1, 0, 0,
193 buffer_list_21
, csize_list_21
},
194 {"tsd", "tsd_wr", SRMD
, SCC22_BASE
, 22, 6, 0, 64, 0, 0, 1, -1, 0, 0,
195 buffer_list_22
, csize_list_22
},
196 {"vd_", "vd_ud_st_rw", SRMD
, SCC23_BASE
, 23, 12, 2, 2, 0, 0, 1, -1, 0,
197 0, buffer_list_23
, csize_list_23
},
198 {"vd_", "vd_frr_rd", SRMD
, SCC24_BASE
, 24, 33, 4, 0, 0, 0, 0, -1, 0, 0,
199 buffer_list_24
, csize_list_24
},
200 {"vd_", "vd_frw_disp_wr", SRMD
, SCC25_BASE
, 25, 7, 0, 16, 0, 0, 0, -1,
201 0, 0, buffer_list_25
, csize_list_25
},
202 {"mr_", "mr_vd_m_y_rd", STRM_P
, SCC26_BASE
, 26, 34, 3, 0, 2, 1, 0, 18,
203 0, 1, buffer_list_26
, csize_list_26
},
204 {"mr_", "mr_vd_m_c_rd", STRM_P
, SCC27_BASE
, 27, 35, 3, 0, 2, 1, 0, 19,
205 0, 1, buffer_list_27
, csize_list_27
},
206 {"mr_", "mr_vd_s_y_rd", STRM_P
, SCC28_BASE
, 28, 36, 3, 0, 2, 1, 0, 20,
207 0, 1, buffer_list_28
, csize_list_28
},
208 {"mr_", "mr_vd_s_c_rd", STRM_P
, SCC29_BASE
, 29, 37, 3, 0, 2, 1, 0, 21,
209 0, 1, buffer_list_29
, csize_list_29
},
210 {"ga_", "ga_wr", STRM_P
, SCC30_BASE
, 30, 8, 0, 1, 1, 1, 0, -1, 1, 1,
211 buffer_list_30
, csize_list_30
},
212 {"ga_", "ga_src1_rd", STRM_P
, SCC31_BASE
, 31, 38, 1, 0, 1, 1, 0, -1, 1,
213 1, buffer_list_31
, csize_list_31
},
214 {"ga_", "ga_src2_rd", STRM_P
, SCC32_BASE
, 32, 39, 1, 0, 1, 1, 0, -1, 1,
215 1, buffer_list_32
, csize_list_32
},
216 {"ad_", "ad_rd", STRM_D
, SCC33_BASE
, 33, 40, 2, 0, 0, 1, 1, -1, 0, 0,
217 buffer_list_33
, csize_list_33
},
218 {"ad_", "ad_wr", STRM_D
, SCC34_BASE
, 34, 9, 0, 3, 0, 1, 1, -1, 0, 0,
219 buffer_list_34
, csize_list_34
},
220 {"abp", "abp_rd", STRM_D
, SCC35_BASE
, 35, 41, 5, 0, 0, 1, 1, -1, 0, 0,
221 buffer_list_35
, csize_list_35
},
222 {"abp", "abp_wr", STRM_D
, SCC36_BASE
, 36, 10, 0, 3, 0, 1, 1, -1, 0, 0,
223 buffer_list_36
, csize_list_36
},
224 {"ebi", "ebi_rw", STRM_P
, SCC37_BASE
, 37, 13, 4, 4, 2, 1, 1, -1, 0, 0,
225 buffer_list_37
, csize_list_37
},
226 {"usb", "usb_rw", SRMD
, SCC38_BASE
, 38, 14, 1, 1, 0, 0, 1, -1, 0, 0,
227 buffer_list_38
, csize_list_38
},
228 {"cpu", "cpu1_spdma_rw", SRMD
, SCC39_BASE
, 39, 15, 1, 1, 0, 0, 1, -1, 0,
229 0, buffer_list_39
, csize_list_39
},
230 {"cpu", "cpu1_bridge_rw", SRMD
, SCC40_BASE
, 40, 16, 0, 0, 0, 0, 0, -1,
231 0, 0, buffer_list_40
, csize_list_40
},
234 /* DMA state structures for read and write channels for each SCC */
236 static struct scc_dma_state scc_state_rd_0
[] = { {-1} };
237 static struct scc_dma_state scc_state_wr_0
[] = { {0}, {0}, {0}, {0} };
238 static struct scc_dma_state scc_state_rd_1
[] = { {0}, {0}, {0}, {0} };
239 static struct scc_dma_state scc_state_wr_1
[] = { {-1} };
240 static struct scc_dma_state scc_state_rd_2
[] = { {-1} };
241 static struct scc_dma_state scc_state_wr_2
[] = { {0}, {0}, {0} };
242 static struct scc_dma_state scc_state_rd_3
[] = { {0}, {0}, {0} };
243 static struct scc_dma_state scc_state_wr_3
[] = { {-1} };
244 static struct scc_dma_state scc_state_rd_4
[] = { {0}, {0}, {0} };
245 static struct scc_dma_state scc_state_wr_4
[] = { {-1} };
246 static struct scc_dma_state scc_state_rd_5
[] = { {-1} };
247 static struct scc_dma_state scc_state_wr_5
[] = { {0} };
248 static struct scc_dma_state scc_state_rd_6
[] = { {0} };
249 static struct scc_dma_state scc_state_wr_6
[] = { {-1} };
250 static struct scc_dma_state scc_state_rd_7
[] = { {-1} };
251 static struct scc_dma_state scc_state_wr_7
[] = { {0}, {0}, {0}, {0} };
252 static struct scc_dma_state scc_state_rd_8
[] = { {0}, {0}, {0}, {0} };
253 static struct scc_dma_state scc_state_wr_8
[] = { {-1} };
254 static struct scc_dma_state scc_state_rd_9
[] = { {0}, {0}, {0}, };
255 static struct scc_dma_state scc_state_wr_9
[] = { {-1} };
256 static struct scc_dma_state scc_state_rd_10
[] = { {0}, {0}, {0} };
257 static struct scc_dma_state scc_state_wr_10
[] = { {-1} };
258 static struct scc_dma_state scc_state_rd_11
[] = { {0}, {0}, {0} };
259 static struct scc_dma_state scc_state_wr_11
[] = { {-1} };
260 static struct scc_dma_state scc_state_rd_12
[] = { {-1} };
261 static struct scc_dma_state scc_state_wr_12
[] = { {0}, {0}, {0}, {0} };
262 static struct scc_dma_state scc_state_rd_13
[] = { {0}, {0}, {0}, {0} };
263 static struct scc_dma_state scc_state_wr_13
[] = { {-1} };
264 static struct scc_dma_state scc_state_rd_14
[] = { {0}, {0} };
265 static struct scc_dma_state scc_state_wr_14
[] = { {-1} };
266 static struct scc_dma_state scc_state_rd_15
[] = { {0} };
267 static struct scc_dma_state scc_state_wr_15
[] = { {0} };
268 static struct scc_dma_state scc_state_rd_16
[] = { {0}, {0}, {0} };
269 static struct scc_dma_state scc_state_wr_16
[] = { {-1} };
270 static struct scc_dma_state scc_state_rd_17
[] = { {0}, {0}, {0} };
271 static struct scc_dma_state scc_state_wr_17
[] = { {-1} };
272 static struct scc_dma_state scc_state_rd_18
[] = { {0}, {0} };
273 static struct scc_dma_state scc_state_wr_18
[] = { {-1} };
274 static struct scc_dma_state scc_state_rd_19
[] = { {0} };
275 static struct scc_dma_state scc_state_wr_19
[] = { {-1} };
276 static struct scc_dma_state scc_state_rd_20
[] = { {-1} };
277 static struct scc_dma_state scc_state_wr_20
[] = {
278 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} };
279 static struct scc_dma_state scc_state_rd_21
[] = { {0}, {0}, {0}, {0} };
280 static struct scc_dma_state scc_state_wr_21
[] = { {-1} };
281 static struct scc_dma_state scc_state_rd_22
[] = { {-1} };
282 static struct scc_dma_state scc_state_wr_22
[] = {
283 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
284 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
285 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
286 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
287 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} };
288 static struct scc_dma_state scc_state_rd_23
[] = { {0}, {0} };
289 static struct scc_dma_state scc_state_wr_23
[] = { {0}, {0} };
290 static struct scc_dma_state scc_state_rd_24
[] = { {0}, {0}, {0}, {0} };
291 static struct scc_dma_state scc_state_wr_24
[] = { {-1} };
292 static struct scc_dma_state scc_state_rd_25
[] = { {-1} };
293 static struct scc_dma_state scc_state_wr_25
[] = {
294 {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
296 static struct scc_dma_state scc_state_rd_26
[] = { {0}, {0}, {0} };
297 static struct scc_dma_state scc_state_wr_26
[] = { {-1} };
298 static struct scc_dma_state scc_state_rd_27
[] = { {0}, {0}, {0} };
299 static struct scc_dma_state scc_state_wr_27
[] = { {-1} };
300 static struct scc_dma_state scc_state_rd_28
[] = { {0}, {0}, {0} };
301 static struct scc_dma_state scc_state_wr_28
[] = { {-1} };
302 static struct scc_dma_state scc_state_rd_29
[] = { {0}, {0}, {0} };
303 static struct scc_dma_state scc_state_wr_29
[] = { {-1} };
304 static struct scc_dma_state scc_state_rd_30
[] = { {-1} };
305 static struct scc_dma_state scc_state_wr_30
[] = { {0} };
306 static struct scc_dma_state scc_state_rd_31
[] = { {0} };
307 static struct scc_dma_state scc_state_wr_31
[] = { {-1} };
308 static struct scc_dma_state scc_state_rd_32
[] = { {0} };
309 static struct scc_dma_state scc_state_wr_32
[] = { {-1} };
310 static struct scc_dma_state scc_state_rd_33
[] = { {0}, {0} };
311 static struct scc_dma_state scc_state_wr_33
[] = { {-1} };
312 static struct scc_dma_state scc_state_rd_34
[] = { {-1} };
313 static struct scc_dma_state scc_state_wr_34
[] = { {0}, {0}, {0} };
314 static struct scc_dma_state scc_state_rd_35
[] = { {0}, {0}, {0}, {0}, {0} };
315 static struct scc_dma_state scc_state_wr_35
[] = { {-1} };
316 static struct scc_dma_state scc_state_rd_36
[] = { {-1} };
317 static struct scc_dma_state scc_state_wr_36
[] = { {0}, {0}, {0} };
318 static struct scc_dma_state scc_state_rd_37
[] = { {0}, {0}, {0}, {0} };
319 static struct scc_dma_state scc_state_wr_37
[] = { {0}, {0}, {0}, {0} };
320 static struct scc_dma_state scc_state_rd_38
[] = { {0} };
321 static struct scc_dma_state scc_state_wr_38
[] = { {0} };
322 static struct scc_dma_state scc_state_rd_39
[] = { {0} };
323 static struct scc_dma_state scc_state_wr_39
[] = { {0} };
324 static struct scc_dma_state scc_state_rd_40
[] = { {-1} };
325 static struct scc_dma_state scc_state_wr_40
[] = { {-1} };
327 /* DMA state references to access from the driver */
328 static struct scc_dma_state
*scc_state_rd
[] = {
372 static struct scc_dma_state
*scc_state_wr
[] = {
416 static u32 scc_takeover_mode
= SCC_TO_IMMEDIATE
;
418 /* Change mode of the SPDMA for given direction */
419 static u32 scc_agu_mode_sp
= AGU_BYPASS
;
421 /* Change mode of the USB for given direction */
422 static u32 scc_agu_mode_usb
= AGU_BYPASS
;
424 static union scc_softwareconfiguration scc_software_configuration
[SCC_MAX
];
426 static u32 dma_fsm
[4][4] = {
427 /* DMA_CMD_RESET DMA_CMD_SETUP DMA_CMD_START DMA_CMD_STOP */
428 /* DMA_STATE_RESET */
429 {DMA_STATE_RESET
, DMA_STATE_SETUP
, DMA_STATE_ERROR
, DMA_STATE_ERROR
},
430 /* DMA_STATE_SETUP */
431 {DMA_STATE_RESET
, DMA_STATE_SETUP
, DMA_STATE_START
, DMA_STATE_SETUP
},
432 /* DMA_STATE_START */
433 {DMA_STATE_RESET
, DMA_STATE_ERROR
, DMA_STATE_START
, DMA_STATE_SETUP
},
434 /* DMA_STATE_ERROR */
435 {DMA_STATE_RESET
, DMA_STATE_ERROR
, DMA_STATE_ERROR
, DMA_STATE_ERROR
},
438 static void dma_state_process(struct scc_dma_state
*dma_state
, u32 cmd
)
440 dma_state
->dma_status
= dma_fsm
[dma_state
->dma_status
][cmd
];
441 dma_state
->dma_cmd
= cmd
;
444 static void dma_state_process_dma_command(struct scc_dma_state
*dma_state
,
447 dma_state
->dma_cmd
= dma_cmd
;
450 case DMA_START_FH_RESET
:
451 dma_state_process(dma_state
, DMA_CMD_START
);
454 dma_state_process(dma_state
, DMA_CMD_STOP
);
461 static void scc_takeover_dma(enum scc_id id
, u32 dma_id
, u32 drs
)
463 union scc_cmd dma_cmd
;
467 /* Prepare the takeover for the DMA channel */
468 dma_cmd
.bits
.action
= DMA_TAKEOVER
;
469 dma_cmd
.bits
.id
= dma_id
;
470 dma_cmd
.bits
.rid
= TO_DMA_CFG
; /* this is DMA_CFG register takeover */
471 if (drs
== DMA_WRITE
)
472 dma_cmd
.bits
.drs
= DMA_WRITE
;
474 reg_write(SCC_CMD(scc_descriptor_table
[id
].base_address
), dma_cmd
.reg
);
477 int scc_dma_cmd(enum scc_id id
, u32 cmd
, u32 dma_id
, u32 drs
)
479 union scc_cmd dma_cmd
;
480 struct scc_dma_state
*dma_state
;
482 if ((id
>= SCC_MAX
) || (id
< 0))
487 /* Prepare the takeover for the DMA channel */
488 dma_cmd
.bits
.action
= cmd
;
489 dma_cmd
.bits
.id
= dma_id
;
490 if (drs
== DMA_WRITE
) {
491 dma_cmd
.bits
.drs
= DMA_WRITE
;
492 dma_state
= &scc_state_wr
[id
][dma_id
];
494 dma_state
= &scc_state_rd
[id
][dma_id
];
497 dma_state
->scc_id
= id
;
498 dma_state
->dma_id
= dma_id
;
499 dma_state_process_dma_command(dma_state
, cmd
);
501 reg_write(SCC_CMD(scc_descriptor_table
[id
].base_address
), dma_cmd
.reg
);
506 int scc_set_usb_address_generation_mode(u32 agu_mode
)
508 if (AGU_ACTIVE
== agu_mode
) {
509 /* Ensure both DMAs are stopped */
510 scc_dma_cmd(SCC_USB_RW
, DMA_STOP
, 0, DMA_WRITE
);
511 scc_dma_cmd(SCC_USB_RW
, DMA_STOP
, 0, DMA_READ
);
513 agu_mode
= AGU_BYPASS
;
516 scc_agu_mode_usb
= agu_mode
;
521 int scc_setup_dma(enum scc_id id
, u32 buffer_tag
,
522 u32 type
, u32 fh_mode
, u32 drs
, u32 dma_id
)
524 struct scc_dma_state
*dma_state
;
525 int return_value
= 0;
526 union scc_dma_cfg dma_cfg
;
527 u32
*buffer_tag_list
= scc_descriptor_table
[id
].buffer_tag_list
;
528 u32 tag_count
, t
, t_valid
;
530 if ((id
>= SCC_MAX
) || (id
< 0))
533 /* if the register is only configured by hw, cannot write! */
534 if (1 == scc_descriptor_table
[id
].hw_dma_cfg
)
537 if (DMA_WRITE
== drs
) {
538 if (dma_id
>= scc_descriptor_table
[id
].p_dma_channels_wr
)
540 dma_state
= &scc_state_wr
[id
][dma_id
];
542 if (dma_id
>= scc_descriptor_table
[id
].p_dma_channels_rd
)
544 dma_state
= &scc_state_rd
[id
][dma_id
];
547 /* Compose the DMA configuration register */
548 tag_count
= buffer_tag_list
[0];
550 for (t
= 1; t
<= tag_count
; t
++) {
551 if (buffer_tag
== buffer_tag_list
[t
]) {
552 /* Tag found - validate */
562 * Read the register first -- two functions write into the register
563 * it does not make sense to read the DMA config back, because there
564 * are two register configuration sets (drs)
567 dma_cfg
.bits
.buffer_id
= buffer_tag
;
568 dma_state_process(dma_state
, DMA_CMD_SETUP
);
571 * This is Packet CFG set select - usable for TSIO, EBI and those SCCs
572 * which habe 2 packet configs
574 dma_cfg
.bits
.packet_cfg_id
=
575 scc_software_configuration
[id
].bits
.packet_select
;
577 if (type
== DMA_CYCLIC
)
578 dma_cfg
.bits
.buffer_type
= 1;
580 dma_cfg
.bits
.buffer_type
= 0;
582 if (fh_mode
== USE_FH
)
583 dma_cfg
.bits
.fh_mode
= 1;
585 dma_cfg
.bits
.fh_mode
= 0;
587 if (id
== SCC_CPU1_SPDMA_RW
)
588 dma_cfg
.bits
.agu_mode
= scc_agu_mode_sp
;
590 if (id
== SCC_USB_RW
)
591 dma_cfg
.bits
.agu_mode
= scc_agu_mode_usb
;
593 reg_write(SCC_DMA_CFG(scc_descriptor_table
[id
].base_address
),
596 /* The DMA_CFG needs a takeover! */
597 if (SCC_TO_IMMEDIATE
== scc_takeover_mode
)
598 scc_takeover_dma(id
, dma_id
, drs
);
600 /* if (buffer_tag is not used) */
601 dma_state
->buffer_tag
= buffer_tag
;
603 dma_state
->scc_id
= id
;
604 dma_state
->dma_id
= dma_id
;
609 int scc_enable(enum scc_id id
, u32 value
)
611 if ((id
>= SCC_MAX
) || (id
< 0))
615 scc_software_configuration
[id
].bits
.enable_status
= 0;
618 scc_software_configuration
[id
].bits
.enable_status
= 1;
620 reg_write(SCC_ENABLE(scc_descriptor_table
[id
].base_address
), value
);
625 static inline void ehb(void)
627 __asm__
__volatile__(
633 int scc_reset(enum scc_id id
, u32 value
)
635 if ((id
>= SCC_MAX
) || (id
< 0))
638 /* Invert value to the strait logic from the negative hardware logic */
644 /* Write the value to the register */
645 reg_write(SCC_RESET(scc_descriptor_table
[id
].base_address
), value
);
648 asm("sync"); /* request bus write queue flush */
649 ehb(); /* wait until previous bus commit instr has finished */
650 asm("nop"); /* wait for flush to occur */
651 asm("nop"); /* wait for flush to occur */