1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 #ifndef __ICP_QAT_UCLO_H__
4 #define __ICP_QAT_UCLO_H__
5 
6 #define ICP_QAT_AC_895XCC_DEV_TYPE 0x00400000
7 #define ICP_QAT_AC_C62X_DEV_TYPE 0x01000000
8 #define ICP_QAT_AC_C3XXX_DEV_TYPE 0x02000000
9 #define ICP_QAT_AC_200XX_DEV_TYPE 0x02000000
10 #define ICP_QAT_AC_C4XXX_DEV_TYPE 0x04000000
11 #define ICP_QAT_AC_4XXX_A_DEV_TYPE 0x08000000
12 #define ICP_QAT_UCLO_MAX_AE 32
13 #define ICP_QAT_UCLO_MAX_CTX 8
14 #define ICP_QAT_UCLO_MAX_CPPNUM 2
15 #define ICP_QAT_UCLO_MAX_UIMAGE (ICP_QAT_UCLO_MAX_AE * ICP_QAT_UCLO_MAX_CTX)
16 #define ICP_QAT_UCLO_MAX_USTORE 0x4000
17 #define ICP_QAT_UCLO_MAX_XFER_REG 128
18 #define ICP_QAT_UCLO_MAX_GPR_REG 128
19 #define ICP_QAT_UCLO_MAX_LMEM_REG 1024
20 #define ICP_QAT_UCLO_MAX_LMEM_REG_2X 1280
21 #define ICP_QAT_UCLO_AE_ALL_CTX 0xff
22 #define ICP_QAT_UOF_OBJID_LEN 8
23 #define ICP_QAT_UOF_FID 0xc6c2
24 #define ICP_QAT_UOF_MAJVER 0x4
25 #define ICP_QAT_UOF_MINVER 0x11
26 #define ICP_QAT_UOF_OBJS "UOF_OBJS"
27 #define ICP_QAT_UOF_STRT "UOF_STRT"
28 #define ICP_QAT_UOF_IMAG "UOF_IMAG"
29 #define ICP_QAT_UOF_IMEM "UOF_IMEM"
30 #define ICP_QAT_UOF_LOCAL_SCOPE 1
31 #define ICP_QAT_UOF_INIT_EXPR 0
32 #define ICP_QAT_UOF_INIT_REG 1
33 #define ICP_QAT_UOF_INIT_REG_CTX 2
34 #define ICP_QAT_UOF_INIT_EXPR_ENDIAN_SWAP 3
35 #define ICP_QAT_SUOF_OBJ_ID_LEN 8
36 #define ICP_QAT_SUOF_FID 0x53554f46
37 #define ICP_QAT_SUOF_MAJVER 0x0
38 #define ICP_QAT_SUOF_MINVER 0x1
39 #define ICP_QAT_SUOF_OBJ_NAME_LEN 128
40 #define ICP_QAT_MOF_OBJ_ID_LEN 8
41 #define ICP_QAT_MOF_OBJ_CHUNKID_LEN 8
42 #define ICP_QAT_MOF_FID 0x00666f6d
43 #define ICP_QAT_MOF_MAJVER 0x0
44 #define ICP_QAT_MOF_MINVER 0x1
45 #define ICP_QAT_MOF_SYM_OBJS "SYM_OBJS"
46 #define ICP_QAT_SUOF_OBJS "SUF_OBJS"
47 #define ICP_QAT_SUOF_IMAG "SUF_IMAG"
48 #define ICP_QAT_SIMG_AE_INIT_SEQ_LEN (50 * sizeof(unsigned long long))
49 #define ICP_QAT_SIMG_AE_INSTS_LEN (0x4000 * sizeof(unsigned long long))
50 
51 #define DSS_FWSK_MODULUS_LEN 384 // RSA3K
52 #define DSS_FWSK_EXPONENT_LEN 4
53 #define DSS_FWSK_PADDING_LEN 380
54 #define DSS_SIGNATURE_LEN 384 // RSA3K
55 
56 #define CSS_FWSK_MODULUS_LEN 256 // RSA2K
57 #define CSS_FWSK_EXPONENT_LEN 4
58 #define CSS_FWSK_PADDING_LEN 252
59 #define CSS_SIGNATURE_LEN 256 // RSA2K
60 
61 #define ICP_QAT_CSS_FWSK_MODULUS_LEN(ID)                                       \
62 	(IS_QAT_GEN4(ID) ? DSS_FWSK_MODULUS_LEN : CSS_FWSK_MODULUS_LEN)
63 
64 #define ICP_QAT_CSS_FWSK_EXPONENT_LEN(ID)                                      \
65 	(IS_QAT_GEN4(ID) ? DSS_FWSK_EXPONENT_LEN : CSS_FWSK_EXPONENT_LEN)
66 
67 #define ICP_QAT_CSS_FWSK_PAD_LEN(ID)                                           \
68 	(IS_QAT_GEN4(ID) ? DSS_FWSK_PADDING_LEN : CSS_FWSK_PADDING_LEN)
69 
70 #define ICP_QAT_CSS_FWSK_PUB_LEN(ID)                                           \
71 	(ICP_QAT_CSS_FWSK_MODULUS_LEN(ID) +                                    \
72 	 ICP_QAT_CSS_FWSK_EXPONENT_LEN(ID) + ICP_QAT_CSS_FWSK_PAD_LEN(ID))
73 
74 #define ICP_QAT_CSS_SIGNATURE_LEN(ID)                                          \
75 	(IS_QAT_GEN4(ID) ? DSS_SIGNATURE_LEN : CSS_SIGNATURE_LEN)
76 
77 #define ICP_QAT_CSS_AE_IMG_LEN                                                 \
78 	(sizeof(struct icp_qat_simg_ae_mode) + ICP_QAT_SIMG_AE_INIT_SEQ_LEN +  \
79 	 ICP_QAT_SIMG_AE_INSTS_LEN)
80 #define ICP_QAT_CSS_AE_SIMG_LEN(ID)                                            \
81 	(sizeof(struct icp_qat_css_hdr) + ICP_QAT_CSS_FWSK_PUB_LEN(ID) +       \
82 	 ICP_QAT_CSS_SIGNATURE_LEN(ID) + ICP_QAT_CSS_AE_IMG_LEN)
83 #define ICP_QAT_AE_IMG_OFFSET(ID)                                              \
84 	(sizeof(struct icp_qat_css_hdr) + ICP_QAT_CSS_FWSK_MODULUS_LEN(ID) +   \
85 	 ICP_QAT_CSS_FWSK_EXPONENT_LEN(ID) + ICP_QAT_CSS_SIGNATURE_LEN(ID))
86 #define ICP_QAT_CSS_MAX_IMAGE_LEN 0x40000
87 
88 #define ICP_QAT_CTX_MODE(ae_mode) ((ae_mode)&0xf)
89 #define ICP_QAT_NN_MODE(ae_mode) (((ae_mode) >> 0x4) & 0xf)
90 #define ICP_QAT_SHARED_USTORE_MODE(ae_mode) (((ae_mode) >> 0xb) & 0x1)
91 #define RELOADABLE_CTX_SHARED_MODE(ae_mode) (((ae_mode) >> 0xc) & 0x1)
92 
93 #define ICP_QAT_LOC_MEM0_MODE(ae_mode) (((ae_mode) >> 0x8) & 0x1)
94 #define ICP_QAT_LOC_MEM1_MODE(ae_mode) (((ae_mode) >> 0x9) & 0x1)
95 #define ICP_QAT_LOC_MEM2_MODE(ae_mode) (((ae_mode) >> 0x6) & 0x1)
96 #define ICP_QAT_LOC_MEM3_MODE(ae_mode) (((ae_mode) >> 0x7) & 0x1)
97 #define ICP_QAT_LOC_TINDEX_MODE(ae_mode) (((ae_mode) >> 0xe) & 0x1)
98 
99 enum icp_qat_uof_mem_region {
100 	ICP_QAT_UOF_SRAM_REGION = 0x0,
101 	ICP_QAT_UOF_LMEM_REGION = 0x3,
102 	ICP_QAT_UOF_UMEM_REGION = 0x5
103 };
104 
105 enum icp_qat_uof_regtype {
106 	ICP_NO_DEST = 0,
107 	ICP_GPA_REL = 1,
108 	ICP_GPA_ABS = 2,
109 	ICP_GPB_REL = 3,
110 	ICP_GPB_ABS = 4,
111 	ICP_SR_REL = 5,
112 	ICP_SR_RD_REL = 6,
113 	ICP_SR_WR_REL = 7,
114 	ICP_SR_ABS = 8,
115 	ICP_SR_RD_ABS = 9,
116 	ICP_SR_WR_ABS = 10,
117 	ICP_DR_REL = 19,
118 	ICP_DR_RD_REL = 20,
119 	ICP_DR_WR_REL = 21,
120 	ICP_DR_ABS = 22,
121 	ICP_DR_RD_ABS = 23,
122 	ICP_DR_WR_ABS = 24,
123 	ICP_LMEM = 26,
124 	ICP_LMEM0 = 27,
125 	ICP_LMEM1 = 28,
126 	ICP_NEIGH_REL = 31,
127 	ICP_LMEM2 = 61,
128 	ICP_LMEM3 = 62,
129 };
130 
131 enum icp_qat_css_fwtype { CSS_AE_FIRMWARE = 0, CSS_MMP_FIRMWARE = 1 };
132 
133 struct icp_qat_uclo_page {
134 	struct icp_qat_uclo_encap_page *encap_page;
135 	struct icp_qat_uclo_region *region;
136 	unsigned int flags;
137 };
138 
139 struct icp_qat_uclo_region {
140 	struct icp_qat_uclo_page *loaded;
141 	struct icp_qat_uclo_page *page;
142 };
143 
144 struct icp_qat_uclo_aeslice {
145 	struct icp_qat_uclo_region *region;
146 	struct icp_qat_uclo_page *page;
147 	struct icp_qat_uclo_page *cur_page[ICP_QAT_UCLO_MAX_CTX];
148 	struct icp_qat_uclo_encapme *encap_image;
149 	unsigned int ctx_mask_assigned;
150 	unsigned int new_uaddr[ICP_QAT_UCLO_MAX_CTX];
151 };
152 
153 struct icp_qat_uclo_aedata {
154 	unsigned int slice_num;
155 	unsigned int eff_ustore_size;
156 	struct icp_qat_uclo_aeslice ae_slices[ICP_QAT_UCLO_MAX_CTX];
157 	unsigned int shareable_ustore;
158 };
159 
160 struct icp_qat_uof_encap_obj {
161 	char *beg_uof;
162 	struct icp_qat_uof_objhdr *obj_hdr;
163 	struct icp_qat_uof_chunkhdr *chunk_hdr;
164 	struct icp_qat_uof_varmem_seg *var_mem_seg;
165 };
166 
167 struct icp_qat_uclo_encap_uwblock {
168 	unsigned int start_addr;
169 	unsigned int words_num;
170 	uint64_t micro_words;
171 };
172 
173 struct icp_qat_uclo_encap_page {
174 	unsigned int def_page;
175 	unsigned int page_region;
176 	unsigned int beg_addr_v;
177 	unsigned int beg_addr_p;
178 	unsigned int micro_words_num;
179 	unsigned int uwblock_num;
180 	struct icp_qat_uclo_encap_uwblock *uwblock;
181 };
182 
183 struct icp_qat_uclo_encapme {
184 	struct icp_qat_uof_image *img_ptr;
185 	struct icp_qat_uclo_encap_page *page;
186 	unsigned int ae_reg_num;
187 	struct icp_qat_uof_ae_reg *ae_reg;
188 	unsigned int init_regsym_num;
189 	struct icp_qat_uof_init_regsym *init_regsym;
190 	unsigned int sbreak_num;
191 	struct icp_qat_uof_sbreak *sbreak;
192 	unsigned int uwords_num;
193 };
194 
195 struct icp_qat_uclo_init_mem_table {
196 	unsigned int entry_num;
197 	struct icp_qat_uof_initmem *init_mem;
198 };
199 
200 struct icp_qat_uclo_objhdr {
201 	char *file_buff;
202 	unsigned int checksum;
203 	unsigned int size;
204 };
205 
206 struct icp_qat_uof_strtable {
207 	unsigned int table_len;
208 	unsigned int reserved;
209 	uint64_t strings;
210 };
211 
212 struct icp_qat_uclo_objhandle {
213 	unsigned int prod_type;
214 	unsigned int prod_rev;
215 	struct icp_qat_uclo_objhdr *obj_hdr;
216 	struct icp_qat_uof_encap_obj encap_uof_obj;
217 	struct icp_qat_uof_strtable str_table;
218 	struct icp_qat_uclo_encapme ae_uimage[ICP_QAT_UCLO_MAX_UIMAGE];
219 	struct icp_qat_uclo_aedata ae_data[ICP_QAT_UCLO_MAX_AE];
220 	struct icp_qat_uclo_init_mem_table init_mem_tab;
221 	struct icp_qat_uof_batch_init *lm_init_tab[ICP_QAT_UCLO_MAX_AE];
222 	struct icp_qat_uof_batch_init *umem_init_tab[ICP_QAT_UCLO_MAX_AE];
223 	int uimage_num;
224 	int uword_in_bytes;
225 	int global_inited;
226 	unsigned int ae_num;
227 	unsigned int ustore_phy_size;
228 	void *obj_buf;
229 	uint64_t *uword_buf;
230 };
231 
232 struct icp_qat_uof_uword_block {
233 	unsigned int start_addr;
234 	unsigned int words_num;
235 	unsigned int uword_offset;
236 	unsigned int reserved;
237 };
238 
239 struct icp_qat_uof_filehdr {
240 	unsigned short file_id;
241 	unsigned short reserved1;
242 	char min_ver;
243 	char maj_ver;
244 	unsigned short reserved2;
245 	unsigned short max_chunks;
246 	unsigned short num_chunks;
247 };
248 
249 struct icp_qat_uof_filechunkhdr {
250 	char chunk_id[ICP_QAT_UOF_OBJID_LEN];
251 	unsigned int checksum;
252 	unsigned int offset;
253 	unsigned int size;
254 };
255 
256 struct icp_qat_uof_objhdr {
257 	unsigned int ac_dev_type;
258 	unsigned short min_cpu_ver;
259 	unsigned short max_cpu_ver;
260 	short max_chunks;
261 	short num_chunks;
262 	unsigned int reserved1;
263 	unsigned int reserved2;
264 };
265 
266 struct icp_qat_uof_chunkhdr {
267 	char chunk_id[ICP_QAT_UOF_OBJID_LEN];
268 	unsigned int offset;
269 	unsigned int size;
270 };
271 
272 struct icp_qat_uof_memvar_attr {
273 	unsigned int offset_in_byte;
274 	unsigned int value;
275 };
276 
277 struct icp_qat_uof_initmem {
278 	unsigned int sym_name;
279 	char region;
280 	char scope;
281 	unsigned short reserved1;
282 	unsigned int addr;
283 	unsigned int num_in_bytes;
284 	unsigned int val_attr_num;
285 };
286 
287 struct icp_qat_uof_init_regsym {
288 	unsigned int sym_name;
289 	char init_type;
290 	char value_type;
291 	char reg_type;
292 	unsigned char ctx;
293 	unsigned int reg_addr;
294 	unsigned int value;
295 };
296 
297 struct icp_qat_uof_varmem_seg {
298 	unsigned int sram_base;
299 	unsigned int sram_size;
300 	unsigned int sram_alignment;
301 	unsigned int sdram_base;
302 	unsigned int sdram_size;
303 	unsigned int sdram_alignment;
304 	unsigned int sdram1_base;
305 	unsigned int sdram1_size;
306 	unsigned int sdram1_alignment;
307 	unsigned int scratch_base;
308 	unsigned int scratch_size;
309 	unsigned int scratch_alignment;
310 };
311 
312 struct icp_qat_uof_gtid {
313 	char tool_id[ICP_QAT_UOF_OBJID_LEN];
314 	int tool_ver;
315 	unsigned int reserved1;
316 	unsigned int reserved2;
317 };
318 
319 struct icp_qat_uof_sbreak {
320 	unsigned int page_num;
321 	unsigned int virt_uaddr;
322 	unsigned char sbreak_type;
323 	unsigned char reg_type;
324 	unsigned short reserved1;
325 	unsigned int addr_offset;
326 	unsigned int reg_addr;
327 };
328 
329 struct icp_qat_uof_code_page {
330 	unsigned int page_region;
331 	unsigned int page_num;
332 	unsigned char def_page;
333 	unsigned char reserved2;
334 	unsigned short reserved1;
335 	unsigned int beg_addr_v;
336 	unsigned int beg_addr_p;
337 	unsigned int neigh_reg_tab_offset;
338 	unsigned int uc_var_tab_offset;
339 	unsigned int imp_var_tab_offset;
340 	unsigned int imp_expr_tab_offset;
341 	unsigned int code_area_offset;
342 };
343 
344 struct icp_qat_uof_image {
345 	unsigned int img_name;
346 	unsigned int ae_assigned;
347 	unsigned int ctx_assigned;
348 	unsigned int ac_dev_type;
349 	unsigned int entry_address;
350 	unsigned int fill_pattern[2];
351 	unsigned int reloadable_size;
352 	unsigned char sensitivity;
353 	unsigned char reserved;
354 	unsigned short ae_mode;
355 	unsigned short max_ver;
356 	unsigned short min_ver;
357 	unsigned short image_attrib;
358 	unsigned short reserved2;
359 	unsigned short page_region_num;
360 	unsigned short numpages;
361 	unsigned int reg_tab_offset;
362 	unsigned int init_reg_sym_tab;
363 	unsigned int sbreak_tab;
364 	unsigned int app_metadata;
365 };
366 
367 struct icp_qat_uof_objtable {
368 	unsigned int entry_num;
369 };
370 
371 struct icp_qat_uof_ae_reg {
372 	unsigned int name;
373 	unsigned int vis_name;
374 	unsigned short type;
375 	unsigned short addr;
376 	unsigned short access_mode;
377 	unsigned char visible;
378 	unsigned char reserved1;
379 	unsigned short ref_count;
380 	unsigned short reserved2;
381 	unsigned int xo_id;
382 };
383 
384 struct icp_qat_uof_code_area {
385 	unsigned int micro_words_num;
386 	unsigned int uword_block_tab;
387 };
388 
389 struct icp_qat_uof_batch_init {
390 	unsigned int ae;
391 	unsigned int addr;
392 	unsigned int *value;
393 	unsigned int size;
394 	struct icp_qat_uof_batch_init *next;
395 };
396 
397 struct icp_qat_suof_img_hdr {
398 	const char *simg_buf;
399 	unsigned long simg_len;
400 	const char *css_header;
401 	const char *css_key;
402 	const char *css_signature;
403 	const char *css_simg;
404 	unsigned long simg_size;
405 	unsigned int ae_num;
406 	unsigned int ae_mask;
407 	unsigned int fw_type;
408 	unsigned long simg_name;
409 	unsigned long appmeta_data;
410 };
411 
412 struct icp_qat_suof_img_tbl {
413 	unsigned int num_simgs;
414 	struct icp_qat_suof_img_hdr *simg_hdr;
415 };
416 
417 struct icp_qat_suof_handle {
418 	unsigned int file_id;
419 	unsigned int check_sum;
420 	char min_ver;
421 	char maj_ver;
422 	char fw_type;
423 	const char *suof_buf;
424 	unsigned int suof_size;
425 	char *sym_str;
426 	unsigned int sym_size;
427 	struct icp_qat_suof_img_tbl img_table;
428 };
429 
430 struct icp_qat_fw_auth_desc {
431 	unsigned int img_len;
432 	unsigned int ae_mask;
433 	unsigned int css_hdr_high;
434 	unsigned int css_hdr_low;
435 	unsigned int img_high;
436 	unsigned int img_low;
437 	unsigned int signature_high;
438 	unsigned int signature_low;
439 	unsigned int fwsk_pub_high;
440 	unsigned int fwsk_pub_low;
441 	unsigned int img_ae_mode_data_high;
442 	unsigned int img_ae_mode_data_low;
443 	unsigned int img_ae_init_data_high;
444 	unsigned int img_ae_init_data_low;
445 	unsigned int img_ae_insts_high;
446 	unsigned int img_ae_insts_low;
447 };
448 
449 struct icp_qat_auth_chunk {
450 	struct icp_qat_fw_auth_desc fw_auth_desc;
451 	u64 chunk_size;
452 	u64 chunk_bus_addr;
453 };
454 
455 struct icp_qat_css_hdr {
456 	unsigned int module_type;
457 	unsigned int header_len;
458 	unsigned int header_ver;
459 	unsigned int module_id;
460 	unsigned int module_vendor;
461 	unsigned int date;
462 	unsigned int size;
463 	unsigned int key_size;
464 	unsigned int module_size;
465 	unsigned int exponent_size;
466 	unsigned int fw_type;
467 	unsigned int reserved[21];
468 };
469 
470 struct icp_qat_simg_ae_mode {
471 	unsigned int file_id;
472 	unsigned short maj_ver;
473 	unsigned short min_ver;
474 	unsigned int dev_type;
475 	unsigned short devmax_ver;
476 	unsigned short devmin_ver;
477 	unsigned int ae_mask;
478 	unsigned int ctx_enables;
479 	char fw_type;
480 	char ctx_mode;
481 	char nn_mode;
482 	char lm0_mode;
483 	char lm1_mode;
484 	char scs_mode;
485 	char lm2_mode;
486 	char lm3_mode;
487 	char tindex_mode;
488 	unsigned char reserved[7];
489 	char simg_name[256];
490 	char appmeta_data[256];
491 };
492 
493 struct icp_qat_suof_filehdr {
494 	unsigned int file_id;
495 	unsigned int check_sum;
496 	char min_ver;
497 	char maj_ver;
498 	char fw_type;
499 	char reserved;
500 	unsigned short max_chunks;
501 	unsigned short num_chunks;
502 };
503 
504 struct icp_qat_suof_chunk_hdr {
505 	char chunk_id[ICP_QAT_SUOF_OBJ_ID_LEN];
506 	u64 offset;
507 	u64 size;
508 };
509 
510 struct icp_qat_suof_strtable {
511 	unsigned int tab_length;
512 	unsigned int strings;
513 };
514 
515 struct icp_qat_suof_objhdr {
516 	unsigned int img_length;
517 	unsigned int reserved;
518 };
519 
520 struct icp_qat_mof_file_hdr {
521 	unsigned int file_id;
522 	unsigned int checksum;
523 	char min_ver;
524 	char maj_ver;
525 	unsigned short reserved;
526 	unsigned short max_chunks;
527 	unsigned short num_chunks;
528 };
529 
530 struct icp_qat_mof_chunkhdr {
531 	char chunk_id[ICP_QAT_MOF_OBJ_ID_LEN];
532 	u64 offset;
533 	u64 size;
534 };
535 
536 struct icp_qat_mof_str_table {
537 	unsigned int tab_len;
538 	unsigned int strings;
539 };
540 
541 struct icp_qat_mof_obj_hdr {
542 	unsigned short max_chunks;
543 	unsigned short num_chunks;
544 	unsigned int reserved;
545 };
546 
547 struct icp_qat_mof_obj_chunkhdr {
548 	char chunk_id[ICP_QAT_MOF_OBJ_CHUNKID_LEN];
549 	u64 offset;
550 	u64 size;
551 	unsigned int name;
552 	unsigned int reserved;
553 };
554 
555 struct icp_qat_mof_objhdr {
556 	char *obj_name;
557 	const char *obj_buf;
558 	unsigned int obj_size;
559 };
560 
561 struct icp_qat_mof_table {
562 	unsigned int num_objs;
563 	struct icp_qat_mof_objhdr *obj_hdr;
564 };
565 
566 struct icp_qat_mof_handle {
567 	unsigned int file_id;
568 	unsigned int checksum;
569 	char min_ver;
570 	char maj_ver;
571 	const char *mof_buf;
572 	u32 mof_size;
573 	char *sym_str;
574 	unsigned int sym_size;
575 	const char *uobjs_hdr;
576 	const char *sobjs_hdr;
577 	struct icp_qat_mof_table obj_table;
578 };
579 #endif
580