]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/media/pci/intel/ipu6/ipu6-fw-resources.c
UBUNTU: SAUCE: IPU6 driver release for kernel 5.13
[mirror_ubuntu-jammy-kernel.git] / drivers / media / pci / intel / ipu6 / ipu6-fw-resources.c
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2015 - 2021 Intel Corporation
3
4 #include <linux/err.h>
5 #include <linux/string.h>
6
7 #include "ipu-psys.h"
8 #include "ipu-fw-psys.h"
9 #include "ipu6-platform-resources.h"
10
11 /* resources table */
12
13 /*
14 * Cell types by cell IDs
15 */
16 const u8 ipu6_fw_psys_cell_types[IPU6_FW_PSYS_N_CELL_ID] = {
17 IPU6_FW_PSYS_SP_CTRL_TYPE_ID,
18 IPU6_FW_PSYS_VP_TYPE_ID,
19 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
20 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
21 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
22 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
23 IPU6_FW_PSYS_ACC_OSA_TYPE_ID,
24 IPU6_FW_PSYS_ACC_OSA_TYPE_ID,
25 IPU6_FW_PSYS_ACC_OSA_TYPE_ID,
26 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
27 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
28 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
29 IPU6_FW_PSYS_ACC_PSA_TYPE_ID,
30 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
31 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
32 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
33 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
34 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
35 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
36 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
37 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
38 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
39 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
40 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
41 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
42 IPU6_FW_PSYS_ACC_ISA_TYPE_ID,
43 IPU6_FW_PSYS_ACC_ISA_TYPE_ID, /* X2B_MD */
44 IPU6_FW_PSYS_ACC_ISA_TYPE_ID, /* ICA_MEDIUM */
45 IPU6_FW_PSYS_ACC_ISA_TYPE_ID, /* X2B_SVE_RGBIR */
46 IPU6_FW_PSYS_ACC_ISA_TYPE_ID, /* PAF */
47 IPU6_FW_PSYS_GDC_TYPE_ID,
48 IPU6_FW_PSYS_TNR_TYPE_ID,
49 };
50
51 const u16 ipu6_fw_num_dev_channels[IPU6_FW_PSYS_N_DEV_CHN_ID] = {
52 IPU6_FW_PSYS_DEV_CHN_DMA_EXT0_MAX_SIZE,
53 IPU6_FW_PSYS_DEV_CHN_DMA_EXT1_READ_MAX_SIZE,
54 IPU6_FW_PSYS_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE,
55 IPU6_FW_PSYS_DEV_CHN_DMA_INTERNAL_MAX_SIZE,
56 IPU6_FW_PSYS_DEV_CHN_DMA_ISA_MAX_SIZE,
57 };
58
59 const u16 ipu6_fw_psys_mem_size[IPU6_FW_PSYS_N_MEM_ID] = {
60 IPU6_FW_PSYS_VMEM0_MAX_SIZE,
61 IPU6_FW_PSYS_TRANSFER_VMEM0_MAX_SIZE,
62 IPU6_FW_PSYS_TRANSFER_VMEM1_MAX_SIZE,
63 IPU6_FW_PSYS_LB_VMEM_MAX_SIZE,
64 IPU6_FW_PSYS_BAMEM0_MAX_SIZE,
65 IPU6_FW_PSYS_DMEM0_MAX_SIZE,
66 IPU6_FW_PSYS_DMEM1_MAX_SIZE,
67 IPU6_FW_PSYS_DMEM2_MAX_SIZE,
68 IPU6_FW_PSYS_DMEM3_MAX_SIZE,
69 IPU6_FW_PSYS_PMEM0_MAX_SIZE
70 };
71
72 const u16 ipu6_fw_psys_dfms[IPU6_FW_PSYS_N_DEV_DFM_ID] = {
73 IPU6_FW_PSYS_DEV_DFM_BB_FULL_PORT_ID_MAX_SIZE,
74 IPU6_FW_PSYS_DEV_DFM_BB_EMPTY_PORT_ID_MAX_SIZE,
75 IPU6_FW_PSYS_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE,
76 IPU6_FW_PSYS_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE,
77 IPU6_FW_PSYS_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE,
78 IPU6_FW_PSYS_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE,
79 };
80
81 const u8
82 ipu6_fw_psys_c_mem[IPU6_FW_PSYS_N_CELL_ID][IPU6_FW_PSYS_N_MEM_TYPE_ID] = {
83 {
84 /* IPU6_FW_PSYS_SP0_ID */
85 IPU6_FW_PSYS_N_MEM_ID,
86 IPU6_FW_PSYS_N_MEM_ID,
87 IPU6_FW_PSYS_N_MEM_ID,
88 IPU6_FW_PSYS_DMEM0_ID,
89 IPU6_FW_PSYS_N_MEM_ID,
90 IPU6_FW_PSYS_N_MEM_ID,
91 IPU6_FW_PSYS_N_MEM_ID,
92 },
93 {
94 /* IPU6_FW_PSYS_SP1_ID */
95 IPU6_FW_PSYS_N_MEM_ID,
96 IPU6_FW_PSYS_N_MEM_ID,
97 IPU6_FW_PSYS_N_MEM_ID,
98 IPU6_FW_PSYS_DMEM1_ID,
99 IPU6_FW_PSYS_N_MEM_ID,
100 IPU6_FW_PSYS_N_MEM_ID,
101 IPU6_FW_PSYS_N_MEM_ID,
102 },
103 {
104 /* IPU6_FW_PSYS_VP0_ID */
105 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
106 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
107 IPU6_FW_PSYS_LB_VMEM_ID,
108 IPU6_FW_PSYS_DMEM3_ID,
109 IPU6_FW_PSYS_VMEM0_ID,
110 IPU6_FW_PSYS_BAMEM0_ID,
111 IPU6_FW_PSYS_PMEM0_ID,
112 },
113 {
114 /* IPU6_FW_PSYS_ACC1_ID BNLM */
115 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
116 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
117 IPU6_FW_PSYS_LB_VMEM_ID,
118 IPU6_FW_PSYS_N_MEM_ID,
119 IPU6_FW_PSYS_N_MEM_ID,
120 IPU6_FW_PSYS_N_MEM_ID,
121 IPU6_FW_PSYS_N_MEM_ID,
122 },
123 {
124 /* IPU6_FW_PSYS_ACC2_ID DM */
125 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
126 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
127 IPU6_FW_PSYS_LB_VMEM_ID,
128 IPU6_FW_PSYS_N_MEM_ID,
129 IPU6_FW_PSYS_N_MEM_ID,
130 IPU6_FW_PSYS_N_MEM_ID,
131 IPU6_FW_PSYS_N_MEM_ID,
132 },
133 {
134 /* IPU6_FW_PSYS_ACC3_ID ACM */
135 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
136 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
137 IPU6_FW_PSYS_LB_VMEM_ID,
138 IPU6_FW_PSYS_N_MEM_ID,
139 IPU6_FW_PSYS_N_MEM_ID,
140 IPU6_FW_PSYS_N_MEM_ID,
141 IPU6_FW_PSYS_N_MEM_ID,
142 },
143 {
144 /* IPU6_FW_PSYS_ACC4_ID GTC YUV1 */
145 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
146 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
147 IPU6_FW_PSYS_LB_VMEM_ID,
148 IPU6_FW_PSYS_N_MEM_ID,
149 IPU6_FW_PSYS_N_MEM_ID,
150 IPU6_FW_PSYS_N_MEM_ID,
151 IPU6_FW_PSYS_N_MEM_ID,
152 },
153 {
154 /* IPU6_FW_PSYS_ACC5_ID OFS pin main */
155 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
156 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
157 IPU6_FW_PSYS_N_MEM_ID,
158 IPU6_FW_PSYS_N_MEM_ID,
159 IPU6_FW_PSYS_N_MEM_ID,
160 IPU6_FW_PSYS_N_MEM_ID,
161 IPU6_FW_PSYS_N_MEM_ID,
162 },
163 {
164 /* IPU6_FW_PSYS_ACC6_ID OFS pin display */
165 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
166 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
167 IPU6_FW_PSYS_N_MEM_ID,
168 IPU6_FW_PSYS_N_MEM_ID,
169 IPU6_FW_PSYS_N_MEM_ID,
170 IPU6_FW_PSYS_N_MEM_ID,
171 IPU6_FW_PSYS_N_MEM_ID,
172 },
173 {
174 /* IPU6_FW_PSYS_ACC7_ID OFS pin pp */
175 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
176 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
177 IPU6_FW_PSYS_N_MEM_ID,
178 IPU6_FW_PSYS_N_MEM_ID,
179 IPU6_FW_PSYS_N_MEM_ID,
180 IPU6_FW_PSYS_N_MEM_ID,
181 IPU6_FW_PSYS_N_MEM_ID,
182 },
183 {
184 /* IPU6_FW_PSYS_ACC8_ID GAMMASTAR */
185 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
186 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
187 IPU6_FW_PSYS_LB_VMEM_ID,
188 IPU6_FW_PSYS_N_MEM_ID,
189 IPU6_FW_PSYS_N_MEM_ID,
190 IPU6_FW_PSYS_N_MEM_ID,
191 IPU6_FW_PSYS_N_MEM_ID,
192 },
193 {
194 /* IPU6_FW_PSYS_ACC9_ID GLTM */
195 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
196 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
197 IPU6_FW_PSYS_LB_VMEM_ID,
198 IPU6_FW_PSYS_N_MEM_ID,
199 IPU6_FW_PSYS_N_MEM_ID,
200 IPU6_FW_PSYS_N_MEM_ID,
201 IPU6_FW_PSYS_N_MEM_ID,
202 },
203 {
204 /* IPU6_FW_PSYS_ACC10_ID XNR */
205 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
206 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
207 IPU6_FW_PSYS_LB_VMEM_ID,
208 IPU6_FW_PSYS_N_MEM_ID,
209 IPU6_FW_PSYS_N_MEM_ID,
210 IPU6_FW_PSYS_N_MEM_ID,
211 IPU6_FW_PSYS_N_MEM_ID,
212 },
213 {
214 /* IPU6_FW_PSYS_ISA_ICA_ID */
215 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
216 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
217 IPU6_FW_PSYS_LB_VMEM_ID,
218 IPU6_FW_PSYS_N_MEM_ID,
219 IPU6_FW_PSYS_N_MEM_ID,
220 IPU6_FW_PSYS_N_MEM_ID,
221 IPU6_FW_PSYS_N_MEM_ID,
222 },
223 {
224 /* IPU6_FW_PSYS_ISA_LSC_ID */
225 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
226 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
227 IPU6_FW_PSYS_LB_VMEM_ID,
228 IPU6_FW_PSYS_N_MEM_ID,
229 IPU6_FW_PSYS_N_MEM_ID,
230 IPU6_FW_PSYS_N_MEM_ID,
231 IPU6_FW_PSYS_N_MEM_ID,
232 },
233 {
234 /* IPU6_FW_PSYS_ISA_DPC_ID */
235 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
236 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
237 IPU6_FW_PSYS_LB_VMEM_ID,
238 IPU6_FW_PSYS_N_MEM_ID,
239 IPU6_FW_PSYS_N_MEM_ID,
240 IPU6_FW_PSYS_N_MEM_ID,
241 IPU6_FW_PSYS_N_MEM_ID,
242 },
243 {
244 /* IPU6_FW_PSYS_ISA_SIS_A_ID */
245 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
246 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
247 IPU6_FW_PSYS_LB_VMEM_ID,
248 IPU6_FW_PSYS_N_MEM_ID,
249 IPU6_FW_PSYS_N_MEM_ID,
250 IPU6_FW_PSYS_N_MEM_ID,
251 IPU6_FW_PSYS_N_MEM_ID,
252 },
253 {
254 /* IPU6_FW_PSYS_ISA_SIS_B_ID */
255 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
256 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
257 IPU6_FW_PSYS_LB_VMEM_ID,
258 IPU6_FW_PSYS_N_MEM_ID,
259 IPU6_FW_PSYS_N_MEM_ID,
260 IPU6_FW_PSYS_N_MEM_ID,
261 IPU6_FW_PSYS_N_MEM_ID,
262 },
263 {
264 /* IPU6_FW_PSYS_ISA_B2B_ID */
265 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
266 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
267 IPU6_FW_PSYS_LB_VMEM_ID,
268 IPU6_FW_PSYS_N_MEM_ID,
269 IPU6_FW_PSYS_N_MEM_ID,
270 IPU6_FW_PSYS_N_MEM_ID,
271 IPU6_FW_PSYS_N_MEM_ID,
272 },
273 {
274 /* IPU6_FW_PSYS_ISA_B2R_ID and ISA_R2I_SIE */
275 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
276 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
277 IPU6_FW_PSYS_LB_VMEM_ID,
278 IPU6_FW_PSYS_N_MEM_ID,
279 IPU6_FW_PSYS_N_MEM_ID,
280 IPU6_FW_PSYS_N_MEM_ID,
281 IPU6_FW_PSYS_N_MEM_ID,
282 },
283 {
284 /* IPU6_FW_PSYS_ISA_R2I_DS_A_ID */
285 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
286 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
287 IPU6_FW_PSYS_LB_VMEM_ID,
288 IPU6_FW_PSYS_N_MEM_ID,
289 IPU6_FW_PSYS_N_MEM_ID,
290 IPU6_FW_PSYS_N_MEM_ID,
291 IPU6_FW_PSYS_N_MEM_ID,
292 },
293 {
294 /* IPU6_FW_PSYS_ISA_R2I_DS_B_ID */
295 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
296 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
297 IPU6_FW_PSYS_LB_VMEM_ID,
298 IPU6_FW_PSYS_N_MEM_ID,
299 IPU6_FW_PSYS_N_MEM_ID,
300 IPU6_FW_PSYS_N_MEM_ID,
301 IPU6_FW_PSYS_N_MEM_ID,
302 },
303 {
304 /* IPU6_FW_PSYS_ISA_AWB_ID */
305 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
306 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
307 IPU6_FW_PSYS_LB_VMEM_ID,
308 IPU6_FW_PSYS_N_MEM_ID,
309 IPU6_FW_PSYS_N_MEM_ID,
310 IPU6_FW_PSYS_N_MEM_ID,
311 IPU6_FW_PSYS_N_MEM_ID,
312 },
313 {
314 /* IPU6_FW_PSYS_ISA_AE_ID */
315 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
316 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
317 IPU6_FW_PSYS_LB_VMEM_ID,
318 IPU6_FW_PSYS_N_MEM_ID,
319 IPU6_FW_PSYS_N_MEM_ID,
320 IPU6_FW_PSYS_N_MEM_ID,
321 IPU6_FW_PSYS_N_MEM_ID,
322 },
323 {
324 /* IPU6_FW_PSYS_ISA_AF_ID */
325 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
326 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
327 IPU6_FW_PSYS_LB_VMEM_ID,
328 IPU6_FW_PSYS_N_MEM_ID,
329 IPU6_FW_PSYS_N_MEM_ID,
330 IPU6_FW_PSYS_N_MEM_ID,
331 IPU6_FW_PSYS_N_MEM_ID,
332 },
333 {
334 /* IPU6_FW_PSYS_ISA_DOL_ID */
335 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
336 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
337 IPU6_FW_PSYS_LB_VMEM_ID,
338 IPU6_FW_PSYS_N_MEM_ID,
339 IPU6_FW_PSYS_N_MEM_ID,
340 IPU6_FW_PSYS_N_MEM_ID,
341 IPU6_FW_PSYS_N_MEM_ID,
342 },
343 {
344 /* IPU6_FW_PSYS_ISA_X2B_MD_ID */
345 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
346 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
347 IPU6_FW_PSYS_LB_VMEM_ID,
348 IPU6_FW_PSYS_N_MEM_ID,
349 IPU6_FW_PSYS_N_MEM_ID,
350 IPU6_FW_PSYS_N_MEM_ID,
351 IPU6_FW_PSYS_N_MEM_ID,
352 },
353 {
354 /* IPU6_FW_PSYS_ISA_ICA_MEDIUM_ID */
355 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
356 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
357 IPU6_FW_PSYS_LB_VMEM_ID,
358 IPU6_FW_PSYS_N_MEM_ID,
359 IPU6_FW_PSYS_N_MEM_ID,
360 IPU6_FW_PSYS_N_MEM_ID,
361 IPU6_FW_PSYS_N_MEM_ID,
362 },
363 {
364 /* IPU6_FW_PSYS_ISA_X2B_SVE_RGBIR_ID */
365 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
366 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
367 IPU6_FW_PSYS_LB_VMEM_ID,
368 IPU6_FW_PSYS_N_MEM_ID,
369 IPU6_FW_PSYS_N_MEM_ID,
370 IPU6_FW_PSYS_N_MEM_ID,
371 IPU6_FW_PSYS_N_MEM_ID,
372 },
373 {
374 /* IPU6_FW_PSYS_ISA_PAF_ID */
375 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
376 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
377 IPU6_FW_PSYS_LB_VMEM_ID,
378 IPU6_FW_PSYS_N_MEM_ID,
379 IPU6_FW_PSYS_N_MEM_ID,
380 IPU6_FW_PSYS_N_MEM_ID,
381 IPU6_FW_PSYS_N_MEM_ID,
382 },
383 {
384 /* IPU6_FW_PSYS_BB_ACC_GDC0_ID */
385 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
386 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
387 IPU6_FW_PSYS_N_MEM_ID,
388 IPU6_FW_PSYS_N_MEM_ID,
389 IPU6_FW_PSYS_N_MEM_ID,
390 IPU6_FW_PSYS_N_MEM_ID,
391 IPU6_FW_PSYS_N_MEM_ID,
392 },
393 {
394 /* IPU6_FW_PSYS_BB_ACC_TNR_ID */
395 IPU6_FW_PSYS_TRANSFER_VMEM0_ID,
396 IPU6_FW_PSYS_TRANSFER_VMEM1_ID,
397 IPU6_FW_PSYS_N_MEM_ID,
398 IPU6_FW_PSYS_N_MEM_ID,
399 IPU6_FW_PSYS_N_MEM_ID,
400 IPU6_FW_PSYS_N_MEM_ID,
401 IPU6_FW_PSYS_N_MEM_ID,
402 }
403 };
404
405 static const struct ipu_fw_resource_definitions ipu6_defs = {
406 .cells = ipu6_fw_psys_cell_types,
407 .num_cells = IPU6_FW_PSYS_N_CELL_ID,
408 .num_cells_type = IPU6_FW_PSYS_N_CELL_TYPE_ID,
409
410 .dev_channels = ipu6_fw_num_dev_channels,
411 .num_dev_channels = IPU6_FW_PSYS_N_DEV_CHN_ID,
412
413 .num_ext_mem_types = IPU6_FW_PSYS_N_DATA_MEM_TYPE_ID,
414 .num_ext_mem_ids = IPU6_FW_PSYS_N_MEM_ID,
415 .ext_mem_ids = ipu6_fw_psys_mem_size,
416
417 .num_dfm_ids = IPU6_FW_PSYS_N_DEV_DFM_ID,
418
419 .dfms = ipu6_fw_psys_dfms,
420
421 .cell_mem_row = IPU6_FW_PSYS_N_MEM_TYPE_ID,
422 .cell_mem = &ipu6_fw_psys_c_mem[0][0],
423 };
424
425 const struct ipu_fw_resource_definitions *ipu6_res_defs = &ipu6_defs;
426
427 /********** Generic resource handling **********/
428
429 int ipu6_fw_psys_set_proc_dev_chn(struct ipu_fw_psys_process *ptr, u16 offset,
430 u16 value)
431 {
432 struct ipu6_fw_psys_process_ext *pm_ext;
433 u8 ps_ext_offset;
434
435 ps_ext_offset = ptr->process_extension_offset;
436 if (!ps_ext_offset)
437 return -EINVAL;
438
439 pm_ext = (struct ipu6_fw_psys_process_ext *)((u8 *)ptr + ps_ext_offset);
440
441 pm_ext->dev_chn_offset[offset] = value;
442
443 return 0;
444 }
445
446 int ipu6_fw_psys_set_proc_dfm_bitmap(struct ipu_fw_psys_process *ptr,
447 u16 id, u32 bitmap,
448 u32 active_bitmap)
449 {
450 struct ipu6_fw_psys_process_ext *pm_ext;
451 u8 ps_ext_offset;
452
453 ps_ext_offset = ptr->process_extension_offset;
454 if (!ps_ext_offset)
455 return -EINVAL;
456
457 pm_ext = (struct ipu6_fw_psys_process_ext *)((u8 *)ptr + ps_ext_offset);
458
459 pm_ext->dfm_port_bitmap[id] = bitmap;
460 pm_ext->dfm_active_port_bitmap[id] = active_bitmap;
461
462 return 0;
463 }
464
465 int ipu6_fw_psys_set_process_ext_mem(struct ipu_fw_psys_process *ptr,
466 u16 type_id, u16 mem_id, u16 offset)
467 {
468 struct ipu6_fw_psys_process_ext *pm_ext;
469 u8 ps_ext_offset;
470
471 ps_ext_offset = ptr->process_extension_offset;
472 if (!ps_ext_offset)
473 return -EINVAL;
474
475 pm_ext = (struct ipu6_fw_psys_process_ext *)((u8 *)ptr + ps_ext_offset);
476
477 pm_ext->ext_mem_offset[type_id] = offset;
478 pm_ext->ext_mem_id[type_id] = mem_id;
479
480 return 0;
481 }
482
483 static struct ipu_fw_psys_program_manifest *
484 get_program_manifest(const struct ipu_fw_psys_program_group_manifest *manifest,
485 const unsigned int program_index)
486 {
487 struct ipu_fw_psys_program_manifest *prg_manifest_base;
488 u8 *program_manifest = NULL;
489 u8 program_count;
490 unsigned int i;
491
492 program_count = manifest->program_count;
493
494 prg_manifest_base = (struct ipu_fw_psys_program_manifest *)
495 ((char *)manifest + manifest->program_manifest_offset);
496 if (program_index < program_count) {
497 program_manifest = (u8 *)prg_manifest_base;
498 for (i = 0; i < program_index; i++)
499 program_manifest +=
500 ((struct ipu_fw_psys_program_manifest *)
501 program_manifest)->size;
502 }
503
504 return (struct ipu_fw_psys_program_manifest *)program_manifest;
505 }
506
507 int ipu6_fw_psys_get_program_manifest_by_process(
508 struct ipu_fw_generic_program_manifest *gen_pm,
509 const struct ipu_fw_psys_program_group_manifest *pg_manifest,
510 struct ipu_fw_psys_process *process)
511 {
512 u32 program_id = process->program_idx;
513 struct ipu_fw_psys_program_manifest *pm;
514 struct ipu6_fw_psys_program_manifest_ext *pm_ext;
515
516 pm = get_program_manifest(pg_manifest, program_id);
517
518 if (!pm)
519 return -ENOENT;
520
521 if (pm->program_extension_offset) {
522 pm_ext = (struct ipu6_fw_psys_program_manifest_ext *)
523 ((u8 *)pm + pm->program_extension_offset);
524
525 gen_pm->dev_chn_size = pm_ext->dev_chn_size;
526 gen_pm->dev_chn_offset = pm_ext->dev_chn_offset;
527 gen_pm->ext_mem_size = pm_ext->ext_mem_size;
528 gen_pm->ext_mem_offset = (u16 *)pm_ext->ext_mem_offset;
529 gen_pm->is_dfm_relocatable = pm_ext->is_dfm_relocatable;
530 gen_pm->dfm_port_bitmap = pm_ext->dfm_port_bitmap;
531 gen_pm->dfm_active_port_bitmap =
532 pm_ext->dfm_active_port_bitmap;
533 }
534
535 memcpy(gen_pm->cells, pm->cells, sizeof(pm->cells));
536 gen_pm->cell_id = pm->cells[0];
537 gen_pm->cell_type_id = pm->cell_type_id;
538
539 return 0;
540 }
541
542 void ipu6_fw_psys_pg_dump(struct ipu_psys *psys,
543 struct ipu_psys_kcmd *kcmd, const char *note)
544 {
545 struct ipu_fw_psys_process_group *pg = kcmd->kpg->pg;
546 u32 pgid = pg->ID;
547 u8 processes = pg->process_count;
548 u16 *process_offset_table = (u16 *)((char *)pg + pg->processes_offset);
549 unsigned int p, chn, mem, mem_id;
550 unsigned int mem_type, max_mem_id, dev_chn;
551
552 if (ipu_ver == IPU_VER_6SE) {
553 mem_type = IPU6SE_FW_PSYS_N_DATA_MEM_TYPE_ID;
554 max_mem_id = IPU6SE_FW_PSYS_N_MEM_ID;
555 dev_chn = IPU6SE_FW_PSYS_N_DEV_CHN_ID;
556 } else if (ipu_ver == IPU_VER_6 || ipu_ver == IPU_VER_6EP) {
557 mem_type = IPU6_FW_PSYS_N_DATA_MEM_TYPE_ID;
558 max_mem_id = IPU6_FW_PSYS_N_MEM_ID;
559 dev_chn = IPU6_FW_PSYS_N_DEV_CHN_ID;
560 } else {
561 WARN(1, "%s ipu_ver:[%u] is unsupported!\n", __func__, ipu_ver);
562 return;
563 }
564
565 dev_dbg(&psys->adev->dev, "%s %s pgid %i has %i processes:\n",
566 __func__, note, pgid, processes);
567
568 for (p = 0; p < processes; p++) {
569 struct ipu_fw_psys_process *process =
570 (struct ipu_fw_psys_process *)
571 ((char *)pg + process_offset_table[p]);
572 struct ipu6_fw_psys_process_ext *pm_ext =
573 (struct ipu6_fw_psys_process_ext *)((u8 *)process
574 + process->process_extension_offset);
575 dev_dbg(&psys->adev->dev, "\t process %i size=%u",
576 p, process->size);
577 if (!process->process_extension_offset)
578 continue;
579
580 for (mem = 0; mem < mem_type; mem++) {
581 mem_id = pm_ext->ext_mem_id[mem];
582 if (mem_id != max_mem_id)
583 dev_dbg(&psys->adev->dev,
584 "\t mem type %u id %d offset=0x%x",
585 mem, mem_id,
586 pm_ext->ext_mem_offset[mem]);
587 }
588 for (chn = 0; chn < dev_chn; chn++) {
589 if (pm_ext->dev_chn_offset[chn] != (u16)(-1))
590 dev_dbg(&psys->adev->dev,
591 "\t dev_chn[%u]=0x%x\n",
592 chn, pm_ext->dev_chn_offset[chn]);
593 }
594 }
595 }