xref: /dpdk/drivers/common/cnxk/roc_ae.c (revision a8ebe94f8cc11cda874cd0353a47e78279699d10)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4 
5 #include "roc_api.h"
6 
7 #define AE_EC_GRP_TBL_NAME "ae_ec_grp_tbl"
8 
9 struct ae_ec_grp_tbl {
10 	uint64_t refcount;
11 	uint8_t ec_grp_tbl[];
12 };
13 
14 const struct roc_ae_ec_group ae_ec_grp[ROC_AE_EC_ID_PMAX] = {
15 	{
16 		.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
17 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
18 				   0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
19 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
20 			  .length = 24},
21 		.order = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
22 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
23 				   0x99, 0xDE, 0xF8, 0x36, 0x14, 0x6B,
24 				   0xC9, 0xB1, 0xB4, 0xD2, 0x28, 0x31},
25 			  .length = 24},
26 		.consta = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
27 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
28 				    0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
29 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC},
30 			   .length = 24},
31 		.constb = {.data = {0x64, 0x21, 0x05, 0x19, 0xE5, 0x9C,
32 				    0x80, 0xE7, 0x0F, 0xA7, 0xE9, 0xAB,
33 				    0x72, 0x24, 0x30, 0x49, 0xFE, 0xB8,
34 				    0xDE, 0xEC, 0xC1, 0x46, 0xB9, 0xB1},
35 			   .length = 24},
36 	},
37 	{
38 		.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
39 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
40 				   0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
41 				   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
42 			  .length = 28},
43 		.order = {.data = {0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
44 				   0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
45 				   0X16, 0XA2, 0XE0, 0XB8, 0XF0, 0X3E, 0X13,
46 				   0XDD, 0X29, 0X45, 0X5C, 0X5C, 0X2A, 0X3D},
47 			  .length = 28},
48 		.consta = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
49 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
50 				    0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
51 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE},
52 			   .length = 28},
53 		.constb = {.data = {0xB4, 0x05, 0x0A, 0x85, 0x0C, 0x04, 0xB3,
54 				    0xAB, 0xF5, 0x41, 0x32, 0x56, 0x50, 0x44,
55 				    0xB0, 0xB7, 0xD7, 0xBF, 0xD8, 0xBA, 0x27,
56 				    0x0B, 0x39, 0x43, 0x23, 0x55, 0xFF, 0xB4},
57 			   .length = 28},
58 	},
59 	{
60 		.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
61 				   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 				   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
63 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
64 				   0xFF, 0xFF, 0xFF, 0xFF},
65 			  .length = 32},
66 		.order = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
67 				   0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
68 				   0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7,
69 				   0x17, 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2,
70 				   0xFC, 0x63, 0x25, 0x51},
71 			  .length = 32},
72 		.consta = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
73 				    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 				    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
75 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
76 				    0xFF, 0xFF, 0xFF, 0xFC},
77 			   .length = 32},
78 		.constb = {.data = {0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93,
79 				    0xE7, 0xB3, 0xEB, 0xBD, 0x55, 0x76, 0x98,
80 				    0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC,
81 				    0x53, 0xB0, 0xF6, 0x3B, 0xCE, 0x3C, 0x3E,
82 				    0x27, 0xD2, 0x60, 0x4B},
83 			   .length = 32},
84 	},
85 	{.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
86 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
87 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
88 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
89 			    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
90 			    0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF},
91 		   .length = 48},
92 	 .order = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
93 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
94 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
95 			    0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF,
96 			    0x58, 0x1A, 0x0D, 0xB2, 0x48, 0xB0, 0xA7, 0x7A,
97 			    0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73},
98 		   .length = 48},
99 	 .consta = {.data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
100 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
101 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
102 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
103 			     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
104 			     0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC},
105 		    .length = 48},
106 	 .constb = {.data = {0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4,
107 			     0x98, 0x8E, 0x05, 0x6B, 0xE3, 0xF8, 0x2D, 0x19,
108 			     0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12,
109 			     0x03, 0x14, 0x08, 0x8F, 0x50, 0x13, 0x87, 0x5A,
110 			     0xC6, 0x56, 0x39, 0x8D, 0x8A, 0x2E, 0xD1, 0x9D,
111 			     0x2A, 0x85, 0xC8, 0xED, 0xD3, 0xEC, 0x2A, 0xEF},
112 		    .length = 48}},
113 	{.prime = {.data = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
114 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
115 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
116 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
117 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
118 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
119 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
120 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
121 			    0xFF, 0xFF},
122 		   .length = 66},
123 	 .order = {.data = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
124 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
125 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
126 			    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
127 			    0xFF, 0xFA, 0x51, 0x86, 0x87, 0x83, 0xBF, 0x2F,
128 			    0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09,
129 			    0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C,
130 			    0x47, 0xAE, 0xBB, 0x6F, 0xB7, 0x1E, 0x91, 0x38,
131 			    0x64, 0x09},
132 		   .length = 66},
133 	 .consta = {.data = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
134 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
135 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
136 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
137 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
138 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
139 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
140 			     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
141 			     0xFF, 0xFC},
142 		    .length = 66},
143 	 .constb = {.data = {0x00, 0x51, 0x95, 0x3E, 0xB9, 0x61, 0x8E, 0x1C,
144 			     0x9A, 0x1F, 0x92, 0x9A, 0x21, 0xA0, 0xB6, 0x85,
145 			     0x40, 0xEE, 0xA2, 0xDA, 0x72, 0x5B, 0x99, 0xB3,
146 			     0x15, 0xF3, 0xB8, 0xB4, 0x89, 0x91, 0x8E, 0xF1,
147 			     0x09, 0xE1, 0x56, 0x19, 0x39, 0x51, 0xEC, 0x7E,
148 			     0x93, 0x7B, 0x16, 0x52, 0xC0, 0xBD, 0x3B, 0xB1,
149 			     0xBF, 0x07, 0x35, 0x73, 0xDF, 0x88, 0x3D, 0x2C,
150 			     0x34, 0xF1, 0xEF, 0x45, 0x1F, 0xD4, 0x6B, 0x50,
151 			     0x3F, 0x00},
152 		    .length = 66},
153 	},
154 	{ /* ROC_AE_EC_ID_P160 */ },
155 	{ /* ROC_AE_EC_ID_P320 */ },
156 	{ /* ROC_AE_EC_ID_P512 */ },
157 	{
158 		.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
159 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
160 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
161 				   0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
162 				   0xFF, 0xFF, 0xFF, 0xFF},
163 			  .length = 32},
164 		.order = {.data = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
165 				   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
166 				   0xFF, 0xFF, 0x72, 0x03, 0xDF, 0x6B, 0x21,
167 				   0xC6, 0x05, 0x2B, 0x53, 0xBB, 0xF4, 0x09,
168 				   0x39, 0xD5, 0x41, 0x23},
169 			  .length = 32},
170 		.consta = {.data = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
171 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
172 				    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
173 				    0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
174 				    0xFF, 0xFF, 0xFF, 0xFC},
175 			   .length = 32},
176 		.constb = {.data = {0x28, 0xE9, 0xFA, 0x9E, 0x9D, 0x9F, 0x5E,
177 				    0x34, 0x4D, 0x5A, 0x9E, 0x4B, 0xCF, 0x65,
178 				    0x09, 0xA7, 0xF3, 0x97, 0x89, 0xF5, 0x15,
179 				    0xAB, 0x8F, 0x92, 0xDD, 0xBC, 0xBD, 0x41,
180 				    0x4D, 0x94, 0x0E, 0x93},
181 			   .length = 32},
182 	},
183 	{
184 		.prime = {.data = {0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
185 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
186 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
187 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
188 				   0xff, 0xff, 0xff, 0x7F},
189 			  .length = 32},
190 		.order = {.data = {0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12,
191 				   0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9,
192 				   0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
193 				   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 				   0x00, 0x00, 0x00, 0x10},
195 			  .length = 32},
196 		.consta = {.data = {0xa3, 0x78, 0x59, 0x13, 0xca, 0x4d, 0xeb,
197 				    0x75, 0xab, 0xd8, 0x41, 0x41, 0x4d, 0x0a,
198 				    0x70, 0x00, 0x98, 0xe8, 0x79, 0x77, 0x79,
199 				    0x40, 0xc7, 0x8c, 0x73, 0xfe, 0x6f, 0x2b,
200 				    0xee, 0x6c, 0x03, 0x52},
201 			   .length = 32},
202 	},
203 	{
204 		.prime = {.data = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
205 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
206 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
207 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
208 				   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
209 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
210 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
211 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
212 			  .length = 56},
213 		.order = {.data = {0xf3, 0x44, 0x58, 0xab, 0x92, 0xc2, 0x78,
214 				   0x23, 0x55, 0x8f, 0xc5, 0x8d, 0x72, 0xc2,
215 				   0x6c, 0x21, 0x90, 0x36, 0xd6, 0xae, 0x49,
216 				   0xdb, 0x4e, 0xc4, 0xe9, 0x23, 0xca, 0x7c,
217 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
218 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
219 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
220 				   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f},
221 			  .length = 56},
222 		.consta = {.data = {0x56, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff,
223 				    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
224 				    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
225 				    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
226 				    0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
227 				    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
228 				    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
229 				    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
230 			   .length = 56},
231 	},
232 };
233 
234 int
235 roc_ae_ec_grp_get(struct roc_ae_ec_group **tbl)
236 {
237 	const char name[] = AE_EC_GRP_TBL_NAME;
238 	struct ae_ec_grp_tbl *ec_grp;
239 	const struct plt_memzone *mz;
240 	int i, len = 0;
241 	uint8_t *data;
242 
243 	if (tbl == NULL)
244 		return -EINVAL;
245 
246 	len = sizeof(ae_ec_grp);
247 
248 	mz = plt_memzone_lookup(name);
249 	if (mz == NULL) {
250 		/* Create memzone first time */
251 		mz = plt_memzone_reserve_cache_align(
252 			name, len + sizeof(struct ae_ec_grp_tbl));
253 		if (mz == NULL)
254 			return -ENOMEM;
255 	}
256 
257 	ec_grp = mz->addr;
258 
259 	if (__atomic_fetch_add(&ec_grp->refcount, 1, __ATOMIC_SEQ_CST) != 0)
260 		return 0;
261 
262 	data = PLT_PTR_ADD(mz->addr, sizeof(uint64_t));
263 
264 	for (i = 0; i < ROC_AE_EC_ID_PMAX; i++) {
265 		memcpy(data, &ae_ec_grp[i], sizeof(struct roc_ae_ec_group));
266 		tbl[i] = (struct roc_ae_ec_group *)data;
267 		data += sizeof(struct roc_ae_ec_group);
268 	}
269 
270 	return 0;
271 }
272 
273 void
274 roc_ae_ec_grp_put(void)
275 {
276 	const char name[] = AE_EC_GRP_TBL_NAME;
277 	const struct plt_memzone *mz;
278 	struct ae_ec_grp_tbl *ec_grp;
279 
280 	mz = plt_memzone_lookup(name);
281 	if (mz == NULL)
282 		return;
283 
284 	ec_grp = mz->addr;
285 	/* Decrement number of devices using EC grp table */
286 	if (__atomic_fetch_sub(&ec_grp->refcount, 1, __ATOMIC_SEQ_CST) - 1 == 0)
287 		plt_memzone_free(mz);
288 }
289