xref: /OK3568_Linux_fs/kernel/drivers/crypto/marvell/octeontx/otx_cptpf_ucode.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun  * Marvell OcteonTX CPT driver
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2019 Marvell International Ltd.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify
7*4882a593Smuzhiyun  * it under the terms of the GNU General Public License version 2 as
8*4882a593Smuzhiyun  * published by the Free Software Foundation.
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef __OTX_CPTPF_UCODE_H
12*4882a593Smuzhiyun #define __OTX_CPTPF_UCODE_H
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/pci.h>
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include "otx_cpt_hw_types.h"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* CPT ucode name maximum length */
20*4882a593Smuzhiyun #define OTX_CPT_UCODE_NAME_LENGTH	64
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun  * On OcteonTX 83xx platform, only one type of engines is allowed to be
23*4882a593Smuzhiyun  * attached to an engine group.
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun #define OTX_CPT_MAX_ETYPES_PER_GRP	1
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* Default tar archive file names */
28*4882a593Smuzhiyun #define OTX_CPT_UCODE_TAR_FILE_NAME	"cpt8x-mc.tar"
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* CPT ucode alignment */
31*4882a593Smuzhiyun #define OTX_CPT_UCODE_ALIGNMENT		128
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* CPT ucode signature size */
34*4882a593Smuzhiyun #define OTX_CPT_UCODE_SIGN_LEN		256
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* Microcode version string length */
37*4882a593Smuzhiyun #define OTX_CPT_UCODE_VER_STR_SZ	44
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* Maximum number of supported engines/cores on OcteonTX 83XX platform */
40*4882a593Smuzhiyun #define OTX_CPT_MAX_ENGINES		64
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define OTX_CPT_ENGS_BITMASK_LEN	(OTX_CPT_MAX_ENGINES/(BITS_PER_BYTE * \
43*4882a593Smuzhiyun 					 sizeof(unsigned long)))
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* Microcode types */
46*4882a593Smuzhiyun enum otx_cpt_ucode_type {
47*4882a593Smuzhiyun 	OTX_CPT_AE_UC_TYPE =	1,  /* AE-MAIN */
48*4882a593Smuzhiyun 	OTX_CPT_SE_UC_TYPE1 =	20, /* SE-MAIN - combination of 21 and 22 */
49*4882a593Smuzhiyun 	OTX_CPT_SE_UC_TYPE2 =	21, /* Fast Path IPSec + AirCrypto */
50*4882a593Smuzhiyun 	OTX_CPT_SE_UC_TYPE3 =	22, /*
51*4882a593Smuzhiyun 				     * Hash + HMAC + FlexiCrypto + RNG + Full
52*4882a593Smuzhiyun 				     * Feature IPSec + AirCrypto + Kasumi
53*4882a593Smuzhiyun 				     */
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct otx_cpt_bitmap {
57*4882a593Smuzhiyun 	unsigned long bits[OTX_CPT_ENGS_BITMASK_LEN];
58*4882a593Smuzhiyun 	int size;
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun struct otx_cpt_engines {
62*4882a593Smuzhiyun 	int type;
63*4882a593Smuzhiyun 	int count;
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* Microcode version number */
67*4882a593Smuzhiyun struct otx_cpt_ucode_ver_num {
68*4882a593Smuzhiyun 	u8 nn;
69*4882a593Smuzhiyun 	u8 xx;
70*4882a593Smuzhiyun 	u8 yy;
71*4882a593Smuzhiyun 	u8 zz;
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun struct otx_cpt_ucode_hdr {
75*4882a593Smuzhiyun 	struct otx_cpt_ucode_ver_num ver_num;
76*4882a593Smuzhiyun 	u8 ver_str[OTX_CPT_UCODE_VER_STR_SZ];
77*4882a593Smuzhiyun 	__be32 code_length;
78*4882a593Smuzhiyun 	u32 padding[3];
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct otx_cpt_ucode {
82*4882a593Smuzhiyun 	u8 ver_str[OTX_CPT_UCODE_VER_STR_SZ];/*
83*4882a593Smuzhiyun 					      * ucode version in readable format
84*4882a593Smuzhiyun 					      */
85*4882a593Smuzhiyun 	struct otx_cpt_ucode_ver_num ver_num;/* ucode version number */
86*4882a593Smuzhiyun 	char filename[OTX_CPT_UCODE_NAME_LENGTH];	 /* ucode filename */
87*4882a593Smuzhiyun 	dma_addr_t dma;		/* phys address of ucode image */
88*4882a593Smuzhiyun 	dma_addr_t align_dma;	/* aligned phys address of ucode image */
89*4882a593Smuzhiyun 	void *va;		/* virt address of ucode image */
90*4882a593Smuzhiyun 	void *align_va;		/* aligned virt address of ucode image */
91*4882a593Smuzhiyun 	u32 size;		/* ucode image size */
92*4882a593Smuzhiyun 	int type;		/* ucode image type SE or AE */
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct tar_ucode_info_t {
96*4882a593Smuzhiyun 	struct list_head list;
97*4882a593Smuzhiyun 	struct otx_cpt_ucode ucode;/* microcode information */
98*4882a593Smuzhiyun 	const u8 *ucode_ptr;	/* pointer to microcode in tar archive */
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /* Maximum and current number of engines available for all engine groups */
102*4882a593Smuzhiyun struct otx_cpt_engs_available {
103*4882a593Smuzhiyun 	int max_se_cnt;
104*4882a593Smuzhiyun 	int max_ae_cnt;
105*4882a593Smuzhiyun 	int se_cnt;
106*4882a593Smuzhiyun 	int ae_cnt;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /* Engines reserved to an engine group */
110*4882a593Smuzhiyun struct otx_cpt_engs_rsvd {
111*4882a593Smuzhiyun 	int type;	/* engine type */
112*4882a593Smuzhiyun 	int count;	/* number of engines attached */
113*4882a593Smuzhiyun 	int offset;     /* constant offset of engine type in the bitmap */
114*4882a593Smuzhiyun 	unsigned long *bmap;		/* attached engines bitmap */
115*4882a593Smuzhiyun 	struct otx_cpt_ucode *ucode;	/* ucode used by these engines */
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun struct otx_cpt_mirror_info {
119*4882a593Smuzhiyun 	int is_ena;	/*
120*4882a593Smuzhiyun 			 * is mirroring enabled, it is set only for engine
121*4882a593Smuzhiyun 			 * group which mirrors another engine group
122*4882a593Smuzhiyun 			 */
123*4882a593Smuzhiyun 	int idx;	/*
124*4882a593Smuzhiyun 			 * index of engine group which is mirrored by this
125*4882a593Smuzhiyun 			 * group, set only for engine group which mirrors
126*4882a593Smuzhiyun 			 * another group
127*4882a593Smuzhiyun 			 */
128*4882a593Smuzhiyun 	int ref_count;	/*
129*4882a593Smuzhiyun 			 * number of times this engine group is mirrored by
130*4882a593Smuzhiyun 			 * other groups, this is set only for engine group
131*4882a593Smuzhiyun 			 * which is mirrored by other group(s)
132*4882a593Smuzhiyun 			 */
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun struct otx_cpt_eng_grp_info {
136*4882a593Smuzhiyun 	struct otx_cpt_eng_grps *g; /* pointer to engine_groups structure */
137*4882a593Smuzhiyun 	struct device_attribute info_attr; /* group info entry attr */
138*4882a593Smuzhiyun 	/* engines attached */
139*4882a593Smuzhiyun 	struct otx_cpt_engs_rsvd engs[OTX_CPT_MAX_ETYPES_PER_GRP];
140*4882a593Smuzhiyun 	/* Microcode information */
141*4882a593Smuzhiyun 	struct otx_cpt_ucode ucode[OTX_CPT_MAX_ETYPES_PER_GRP];
142*4882a593Smuzhiyun 	/* sysfs info entry name */
143*4882a593Smuzhiyun 	char sysfs_info_name[OTX_CPT_UCODE_NAME_LENGTH];
144*4882a593Smuzhiyun 	/* engine group mirroring information */
145*4882a593Smuzhiyun 	struct otx_cpt_mirror_info mirror;
146*4882a593Smuzhiyun 	int idx;	 /* engine group index */
147*4882a593Smuzhiyun 	bool is_enabled; /*
148*4882a593Smuzhiyun 			  * is engine group enabled, engine group is enabled
149*4882a593Smuzhiyun 			  * when it has engines attached and ucode loaded
150*4882a593Smuzhiyun 			  */
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun struct otx_cpt_eng_grps {
154*4882a593Smuzhiyun 	struct otx_cpt_eng_grp_info grp[OTX_CPT_MAX_ENGINE_GROUPS];
155*4882a593Smuzhiyun 	struct device_attribute ucode_load_attr;/* ucode load attr */
156*4882a593Smuzhiyun 	struct otx_cpt_engs_available avail;
157*4882a593Smuzhiyun 	struct mutex lock;
158*4882a593Smuzhiyun 	void *obj;
159*4882a593Smuzhiyun 	int engs_num;			/* total number of engines supported */
160*4882a593Smuzhiyun 	int eng_types_supported;	/* engine types supported SE, AE */
161*4882a593Smuzhiyun 	u8 eng_ref_cnt[OTX_CPT_MAX_ENGINES];/* engines reference count */
162*4882a593Smuzhiyun 	bool is_ucode_load_created;	/* is ucode_load sysfs entry created */
163*4882a593Smuzhiyun 	bool is_first_try; /* is this first try to create kcrypto engine grp */
164*4882a593Smuzhiyun 	bool is_rdonly;	/* do engine groups configuration can be modified */
165*4882a593Smuzhiyun };
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun int otx_cpt_init_eng_grps(struct pci_dev *pdev,
168*4882a593Smuzhiyun 			  struct otx_cpt_eng_grps *eng_grps, int pf_type);
169*4882a593Smuzhiyun void otx_cpt_cleanup_eng_grps(struct pci_dev *pdev,
170*4882a593Smuzhiyun 			      struct otx_cpt_eng_grps *eng_grps);
171*4882a593Smuzhiyun int otx_cpt_try_create_default_eng_grps(struct pci_dev *pdev,
172*4882a593Smuzhiyun 					struct otx_cpt_eng_grps *eng_grps,
173*4882a593Smuzhiyun 					int pf_type);
174*4882a593Smuzhiyun void otx_cpt_set_eng_grps_is_rdonly(struct otx_cpt_eng_grps *eng_grps,
175*4882a593Smuzhiyun 				    bool is_rdonly);
176*4882a593Smuzhiyun int otx_cpt_uc_supports_eng_type(struct otx_cpt_ucode *ucode, int eng_type);
177*4882a593Smuzhiyun int otx_cpt_eng_grp_has_eng_type(struct otx_cpt_eng_grp_info *eng_grp,
178*4882a593Smuzhiyun 				 int eng_type);
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #endif /* __OTX_CPTPF_UCODE_H */
181