1 /*
2   This file is provided under a dual BSD/GPLv2 license.  When using or
3   redistributing this file, you may do so under either license.
4 
5   GPL LICENSE SUMMARY
6   Copyright(c) 2014 Intel Corporation.
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of version 2 of the GNU General Public License as
9   published by the Free Software Foundation.
10 
11   This program is distributed in the hope that it will be useful, but
12   WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   General Public License for more details.
15 
16   Contact Information:
17   qat-linux@intel.com
18 
19   BSD LICENSE
20   Copyright(c) 2014 Intel Corporation.
21   Redistribution and use in source and binary forms, with or without
22   modification, are permitted provided that the following conditions
23   are met:
24 
25     * Redistributions of source code must retain the above copyright
26       notice, this list of conditions and the following disclaimer.
27     * Redistributions in binary form must reproduce the above copyright
28       notice, this list of conditions and the following disclaimer in
29       the documentation and/or other materials provided with the
30       distribution.
31     * Neither the name of Intel Corporation nor the names of its
32       contributors may be used to endorse or promote products derived
33       from this software without specific prior written permission.
34 
35   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
39   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
45   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46 */
47 #ifndef __ICP_QAT_UCLO_H__
48 #define __ICP_QAT_UCLO_H__
49 
50 #define ICP_QAT_AC_895XCC_DEV_TYPE 0x00400000
51 #define ICP_QAT_AC_C62X_DEV_TYPE   0x01000000
52 #define ICP_QAT_AC_C3XXX_DEV_TYPE  0x02000000
53 #define ICP_QAT_UCLO_MAX_AE       12
54 #define ICP_QAT_UCLO_MAX_CTX      8
55 #define ICP_QAT_UCLO_MAX_UIMAGE   (ICP_QAT_UCLO_MAX_AE * ICP_QAT_UCLO_MAX_CTX)
56 #define ICP_QAT_UCLO_MAX_USTORE   0x4000
57 #define ICP_QAT_UCLO_MAX_XFER_REG 128
58 #define ICP_QAT_UCLO_MAX_GPR_REG  128
59 #define ICP_QAT_UCLO_MAX_LMEM_REG 1024
60 #define ICP_QAT_UCLO_AE_ALL_CTX   0xff
61 #define ICP_QAT_UOF_OBJID_LEN     8
62 #define ICP_QAT_UOF_FID 0xc6c2
63 #define ICP_QAT_UOF_MAJVER 0x4
64 #define ICP_QAT_UOF_MINVER 0x11
65 #define ICP_QAT_UOF_OBJS        "UOF_OBJS"
66 #define ICP_QAT_UOF_STRT        "UOF_STRT"
67 #define ICP_QAT_UOF_IMAG        "UOF_IMAG"
68 #define ICP_QAT_UOF_IMEM        "UOF_IMEM"
69 #define ICP_QAT_UOF_LOCAL_SCOPE     1
70 #define ICP_QAT_UOF_INIT_EXPR               0
71 #define ICP_QAT_UOF_INIT_REG                1
72 #define ICP_QAT_UOF_INIT_REG_CTX            2
73 #define ICP_QAT_UOF_INIT_EXPR_ENDIAN_SWAP   3
74 #define ICP_QAT_SUOF_OBJ_ID_LEN             8
75 #define ICP_QAT_SUOF_FID  0x53554f46
76 #define ICP_QAT_SUOF_MAJVER 0x0
77 #define ICP_QAT_SUOF_MINVER 0x1
78 #define ICP_QAT_SIMG_AE_INIT_SEQ_LEN    (50 * sizeof(unsigned long long))
79 #define ICP_QAT_SIMG_AE_INSTS_LEN       (0x4000 * sizeof(unsigned long long))
80 #define ICP_QAT_CSS_FWSK_MODULUS_LEN    256
81 #define ICP_QAT_CSS_FWSK_EXPONENT_LEN   4
82 #define ICP_QAT_CSS_FWSK_PAD_LEN        252
83 #define ICP_QAT_CSS_FWSK_PUB_LEN   (ICP_QAT_CSS_FWSK_MODULUS_LEN + \
84 				    ICP_QAT_CSS_FWSK_EXPONENT_LEN + \
85 				    ICP_QAT_CSS_FWSK_PAD_LEN)
86 #define ICP_QAT_CSS_SIGNATURE_LEN   256
87 #define ICP_QAT_CSS_AE_IMG_LEN     (sizeof(struct icp_qat_simg_ae_mode) + \
88 				    ICP_QAT_SIMG_AE_INIT_SEQ_LEN +         \
89 				    ICP_QAT_SIMG_AE_INSTS_LEN)
90 #define ICP_QAT_CSS_AE_SIMG_LEN    (sizeof(struct icp_qat_css_hdr) + \
91 				    ICP_QAT_CSS_FWSK_PUB_LEN + \
92 				    ICP_QAT_CSS_SIGNATURE_LEN + \
93 				    ICP_QAT_CSS_AE_IMG_LEN)
94 #define ICP_QAT_AE_IMG_OFFSET	   (sizeof(struct icp_qat_css_hdr) + \
95 				    ICP_QAT_CSS_FWSK_MODULUS_LEN + \
96 				    ICP_QAT_CSS_FWSK_EXPONENT_LEN + \
97 				    ICP_QAT_CSS_SIGNATURE_LEN)
98 #define ICP_QAT_CSS_MAX_IMAGE_LEN   0x40000
99 
100 #define ICP_QAT_CTX_MODE(ae_mode) ((ae_mode) & 0xf)
101 #define ICP_QAT_NN_MODE(ae_mode) (((ae_mode) >> 0x4) & 0xf)
102 #define ICP_QAT_SHARED_USTORE_MODE(ae_mode) (((ae_mode) >> 0xb) & 0x1)
103 #define RELOADABLE_CTX_SHARED_MODE(ae_mode) (((ae_mode) >> 0xc) & 0x1)
104 
105 #define ICP_QAT_LOC_MEM0_MODE(ae_mode) (((ae_mode) >> 0x8) & 0x1)
106 #define ICP_QAT_LOC_MEM1_MODE(ae_mode) (((ae_mode) >> 0x9) & 0x1)
107 
108 enum icp_qat_uof_mem_region {
109 	ICP_QAT_UOF_SRAM_REGION = 0x0,
110 	ICP_QAT_UOF_LMEM_REGION = 0x3,
111 	ICP_QAT_UOF_UMEM_REGION = 0x5
112 };
113 
114 enum icp_qat_uof_regtype {
115 	ICP_NO_DEST	= 0,
116 	ICP_GPA_REL	= 1,
117 	ICP_GPA_ABS	= 2,
118 	ICP_GPB_REL	= 3,
119 	ICP_GPB_ABS	= 4,
120 	ICP_SR_REL	= 5,
121 	ICP_SR_RD_REL	= 6,
122 	ICP_SR_WR_REL	= 7,
123 	ICP_SR_ABS	= 8,
124 	ICP_SR_RD_ABS	= 9,
125 	ICP_SR_WR_ABS	= 10,
126 	ICP_DR_REL	= 19,
127 	ICP_DR_RD_REL	= 20,
128 	ICP_DR_WR_REL	= 21,
129 	ICP_DR_ABS	= 22,
130 	ICP_DR_RD_ABS	= 23,
131 	ICP_DR_WR_ABS	= 24,
132 	ICP_LMEM	= 26,
133 	ICP_LMEM0	= 27,
134 	ICP_LMEM1	= 28,
135 	ICP_NEIGH_REL	= 31,
136 };
137 
138 enum icp_qat_css_fwtype {
139 	CSS_AE_FIRMWARE = 0,
140 	CSS_MMP_FIRMWARE = 1
141 };
142 
143 struct icp_qat_uclo_page {
144 	struct icp_qat_uclo_encap_page *encap_page;
145 	struct icp_qat_uclo_region *region;
146 	unsigned int flags;
147 };
148 
149 struct icp_qat_uclo_region {
150 	struct icp_qat_uclo_page *loaded;
151 	struct icp_qat_uclo_page *page;
152 };
153 
154 struct icp_qat_uclo_aeslice {
155 	struct icp_qat_uclo_region *region;
156 	struct icp_qat_uclo_page *page;
157 	struct icp_qat_uclo_page *cur_page[ICP_QAT_UCLO_MAX_CTX];
158 	struct icp_qat_uclo_encapme *encap_image;
159 	unsigned int ctx_mask_assigned;
160 	unsigned int new_uaddr[ICP_QAT_UCLO_MAX_CTX];
161 };
162 
163 struct icp_qat_uclo_aedata {
164 	unsigned int slice_num;
165 	unsigned int eff_ustore_size;
166 	struct icp_qat_uclo_aeslice ae_slices[ICP_QAT_UCLO_MAX_CTX];
167 };
168 
169 struct icp_qat_uof_encap_obj {
170 	char *beg_uof;
171 	struct icp_qat_uof_objhdr *obj_hdr;
172 	struct icp_qat_uof_chunkhdr *chunk_hdr;
173 	struct icp_qat_uof_varmem_seg *var_mem_seg;
174 };
175 
176 struct icp_qat_uclo_encap_uwblock {
177 	unsigned int start_addr;
178 	unsigned int words_num;
179 	uint64_t micro_words;
180 };
181 
182 struct icp_qat_uclo_encap_page {
183 	unsigned int def_page;
184 	unsigned int page_region;
185 	unsigned int beg_addr_v;
186 	unsigned int beg_addr_p;
187 	unsigned int micro_words_num;
188 	unsigned int uwblock_num;
189 	struct icp_qat_uclo_encap_uwblock *uwblock;
190 };
191 
192 struct icp_qat_uclo_encapme {
193 	struct icp_qat_uof_image *img_ptr;
194 	struct icp_qat_uclo_encap_page *page;
195 	unsigned int ae_reg_num;
196 	struct icp_qat_uof_ae_reg *ae_reg;
197 	unsigned int init_regsym_num;
198 	struct icp_qat_uof_init_regsym *init_regsym;
199 	unsigned int sbreak_num;
200 	struct icp_qat_uof_sbreak *sbreak;
201 	unsigned int uwords_num;
202 };
203 
204 struct icp_qat_uclo_init_mem_table {
205 	unsigned int entry_num;
206 	struct icp_qat_uof_initmem *init_mem;
207 };
208 
209 struct icp_qat_uclo_objhdr {
210 	char *file_buff;
211 	unsigned int checksum;
212 	unsigned int size;
213 };
214 
215 struct icp_qat_uof_strtable {
216 	unsigned int table_len;
217 	unsigned int reserved;
218 	uint64_t strings;
219 };
220 
221 struct icp_qat_uclo_objhandle {
222 	unsigned int prod_type;
223 	unsigned int prod_rev;
224 	struct icp_qat_uclo_objhdr *obj_hdr;
225 	struct icp_qat_uof_encap_obj encap_uof_obj;
226 	struct icp_qat_uof_strtable str_table;
227 	struct icp_qat_uclo_encapme ae_uimage[ICP_QAT_UCLO_MAX_UIMAGE];
228 	struct icp_qat_uclo_aedata ae_data[ICP_QAT_UCLO_MAX_AE];
229 	struct icp_qat_uclo_init_mem_table init_mem_tab;
230 	struct icp_qat_uof_batch_init *lm_init_tab[ICP_QAT_UCLO_MAX_AE];
231 	struct icp_qat_uof_batch_init *umem_init_tab[ICP_QAT_UCLO_MAX_AE];
232 	int uimage_num;
233 	int uword_in_bytes;
234 	int global_inited;
235 	unsigned int ae_num;
236 	unsigned int ustore_phy_size;
237 	void *obj_buf;
238 	uint64_t *uword_buf;
239 };
240 
241 struct icp_qat_uof_uword_block {
242 	unsigned int start_addr;
243 	unsigned int words_num;
244 	unsigned int uword_offset;
245 	unsigned int reserved;
246 };
247 
248 struct icp_qat_uof_filehdr {
249 	unsigned short file_id;
250 	unsigned short reserved1;
251 	char min_ver;
252 	char maj_ver;
253 	unsigned short reserved2;
254 	unsigned short max_chunks;
255 	unsigned short num_chunks;
256 };
257 
258 struct icp_qat_uof_filechunkhdr {
259 	char chunk_id[ICP_QAT_UOF_OBJID_LEN];
260 	unsigned int checksum;
261 	unsigned int offset;
262 	unsigned int size;
263 };
264 
265 struct icp_qat_uof_objhdr {
266 	unsigned int ac_dev_type;
267 	unsigned short min_cpu_ver;
268 	unsigned short max_cpu_ver;
269 	short max_chunks;
270 	short num_chunks;
271 	unsigned int reserved1;
272 	unsigned int reserved2;
273 };
274 
275 struct icp_qat_uof_chunkhdr {
276 	char chunk_id[ICP_QAT_UOF_OBJID_LEN];
277 	unsigned int offset;
278 	unsigned int size;
279 };
280 
281 struct icp_qat_uof_memvar_attr {
282 	unsigned int offset_in_byte;
283 	unsigned int value;
284 };
285 
286 struct icp_qat_uof_initmem {
287 	unsigned int sym_name;
288 	char region;
289 	char scope;
290 	unsigned short reserved1;
291 	unsigned int addr;
292 	unsigned int num_in_bytes;
293 	unsigned int val_attr_num;
294 };
295 
296 struct icp_qat_uof_init_regsym {
297 	unsigned int sym_name;
298 	char init_type;
299 	char value_type;
300 	char reg_type;
301 	unsigned char ctx;
302 	unsigned int reg_addr;
303 	unsigned int value;
304 };
305 
306 struct icp_qat_uof_varmem_seg {
307 	unsigned int sram_base;
308 	unsigned int sram_size;
309 	unsigned int sram_alignment;
310 	unsigned int sdram_base;
311 	unsigned int sdram_size;
312 	unsigned int sdram_alignment;
313 	unsigned int sdram1_base;
314 	unsigned int sdram1_size;
315 	unsigned int sdram1_alignment;
316 	unsigned int scratch_base;
317 	unsigned int scratch_size;
318 	unsigned int scratch_alignment;
319 };
320 
321 struct icp_qat_uof_gtid {
322 	char tool_id[ICP_QAT_UOF_OBJID_LEN];
323 	int tool_ver;
324 	unsigned int reserved1;
325 	unsigned int reserved2;
326 };
327 
328 struct icp_qat_uof_sbreak {
329 	unsigned int page_num;
330 	unsigned int virt_uaddr;
331 	unsigned char sbreak_type;
332 	unsigned char reg_type;
333 	unsigned short reserved1;
334 	unsigned int addr_offset;
335 	unsigned int reg_addr;
336 };
337 
338 struct icp_qat_uof_code_page {
339 	unsigned int page_region;
340 	unsigned int page_num;
341 	unsigned char def_page;
342 	unsigned char reserved2;
343 	unsigned short reserved1;
344 	unsigned int beg_addr_v;
345 	unsigned int beg_addr_p;
346 	unsigned int neigh_reg_tab_offset;
347 	unsigned int uc_var_tab_offset;
348 	unsigned int imp_var_tab_offset;
349 	unsigned int imp_expr_tab_offset;
350 	unsigned int code_area_offset;
351 };
352 
353 struct icp_qat_uof_image {
354 	unsigned int img_name;
355 	unsigned int ae_assigned;
356 	unsigned int ctx_assigned;
357 	unsigned int ac_dev_type;
358 	unsigned int entry_address;
359 	unsigned int fill_pattern[2];
360 	unsigned int reloadable_size;
361 	unsigned char sensitivity;
362 	unsigned char reserved;
363 	unsigned short ae_mode;
364 	unsigned short max_ver;
365 	unsigned short min_ver;
366 	unsigned short image_attrib;
367 	unsigned short reserved2;
368 	unsigned short page_region_num;
369 	unsigned short numpages;
370 	unsigned int reg_tab_offset;
371 	unsigned int init_reg_sym_tab;
372 	unsigned int sbreak_tab;
373 	unsigned int app_metadata;
374 };
375 
376 struct icp_qat_uof_objtable {
377 	unsigned int entry_num;
378 };
379 
380 struct icp_qat_uof_ae_reg {
381 	unsigned int name;
382 	unsigned int vis_name;
383 	unsigned short type;
384 	unsigned short addr;
385 	unsigned short access_mode;
386 	unsigned char visible;
387 	unsigned char reserved1;
388 	unsigned short ref_count;
389 	unsigned short reserved2;
390 	unsigned int xo_id;
391 };
392 
393 struct icp_qat_uof_code_area {
394 	unsigned int micro_words_num;
395 	unsigned int uword_block_tab;
396 };
397 
398 struct icp_qat_uof_batch_init {
399 	unsigned int ae;
400 	unsigned int addr;
401 	unsigned int *value;
402 	unsigned int size;
403 	struct icp_qat_uof_batch_init *next;
404 };
405 
406 struct icp_qat_suof_img_hdr {
407 	char          *simg_buf;
408 	unsigned long simg_len;
409 	char          *css_header;
410 	char          *css_key;
411 	char          *css_signature;
412 	char          *css_simg;
413 	unsigned long simg_size;
414 	unsigned int  ae_num;
415 	unsigned int  ae_mask;
416 	unsigned int  fw_type;
417 	unsigned long simg_name;
418 	unsigned long appmeta_data;
419 };
420 
421 struct icp_qat_suof_img_tbl {
422 	unsigned int num_simgs;
423 	struct icp_qat_suof_img_hdr *simg_hdr;
424 };
425 
426 struct icp_qat_suof_handle {
427 	unsigned int  file_id;
428 	unsigned int  check_sum;
429 	char          min_ver;
430 	char          maj_ver;
431 	char          fw_type;
432 	char          *suof_buf;
433 	unsigned int  suof_size;
434 	char          *sym_str;
435 	unsigned int  sym_size;
436 	struct icp_qat_suof_img_tbl img_table;
437 };
438 
439 struct icp_qat_fw_auth_desc {
440 	unsigned int   img_len;
441 	unsigned int   reserved;
442 	unsigned int   css_hdr_high;
443 	unsigned int   css_hdr_low;
444 	unsigned int   img_high;
445 	unsigned int   img_low;
446 	unsigned int   signature_high;
447 	unsigned int   signature_low;
448 	unsigned int   fwsk_pub_high;
449 	unsigned int   fwsk_pub_low;
450 	unsigned int   img_ae_mode_data_high;
451 	unsigned int   img_ae_mode_data_low;
452 	unsigned int   img_ae_init_data_high;
453 	unsigned int   img_ae_init_data_low;
454 	unsigned int   img_ae_insts_high;
455 	unsigned int   img_ae_insts_low;
456 };
457 
458 struct icp_qat_auth_chunk {
459 	struct icp_qat_fw_auth_desc fw_auth_desc;
460 	u64 chunk_size;
461 	u64 chunk_bus_addr;
462 };
463 
464 struct icp_qat_css_hdr {
465 	unsigned int module_type;
466 	unsigned int header_len;
467 	unsigned int header_ver;
468 	unsigned int module_id;
469 	unsigned int module_vendor;
470 	unsigned int date;
471 	unsigned int size;
472 	unsigned int key_size;
473 	unsigned int module_size;
474 	unsigned int exponent_size;
475 	unsigned int fw_type;
476 	unsigned int reserved[21];
477 };
478 
479 struct icp_qat_simg_ae_mode {
480 	unsigned int     file_id;
481 	unsigned short   maj_ver;
482 	unsigned short   min_ver;
483 	unsigned int     dev_type;
484 	unsigned short   devmax_ver;
485 	unsigned short   devmin_ver;
486 	unsigned int     ae_mask;
487 	unsigned int     ctx_enables;
488 	char             fw_type;
489 	char             ctx_mode;
490 	char             nn_mode;
491 	char             lm0_mode;
492 	char             lm1_mode;
493 	char             scs_mode;
494 	char             lm2_mode;
495 	char             lm3_mode;
496 	char             tindex_mode;
497 	unsigned char    reserved[7];
498 	char             simg_name[256];
499 	char             appmeta_data[256];
500 };
501 
502 struct icp_qat_suof_filehdr {
503 	unsigned int     file_id;
504 	unsigned int     check_sum;
505 	char             min_ver;
506 	char             maj_ver;
507 	char             fw_type;
508 	char             reserved;
509 	unsigned short   max_chunks;
510 	unsigned short   num_chunks;
511 };
512 
513 struct icp_qat_suof_chunk_hdr {
514 	char chunk_id[ICP_QAT_SUOF_OBJ_ID_LEN];
515 	u64 offset;
516 	u64 size;
517 };
518 
519 struct icp_qat_suof_strtable {
520 	unsigned int tab_length;
521 	unsigned int strings;
522 };
523 
524 struct icp_qat_suof_objhdr {
525 	unsigned int img_length;
526 	unsigned int reserved;
527 };
528 #endif
529