xref: /dpdk/drivers/common/cnxk/roc_ae.c (revision f4d66aef)
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 int
roc_ae_ec_grp_get(struct roc_ae_ec_group ** tbl)155 roc_ae_ec_grp_get(struct roc_ae_ec_group **tbl)
156 {
157 	const char name[] = AE_EC_GRP_TBL_NAME;
158 	struct ae_ec_grp_tbl *ec_grp;
159 	const struct plt_memzone *mz;
160 	int i, len = 0;
161 	uint8_t *data;
162 
163 	if (tbl == NULL)
164 		return -EINVAL;
165 
166 	len = sizeof(ae_ec_grp);
167 
168 	mz = plt_memzone_lookup(name);
169 	if (mz == NULL) {
170 		/* Create memzone first time */
171 		mz = plt_memzone_reserve_cache_align(
172 			name, len + sizeof(struct ae_ec_grp_tbl));
173 		if (mz == NULL)
174 			return -ENOMEM;
175 	}
176 
177 	ec_grp = mz->addr;
178 
179 	if (__atomic_fetch_add(&ec_grp->refcount, 1, __ATOMIC_SEQ_CST) != 0)
180 		return 0;
181 
182 	data = PLT_PTR_ADD(mz->addr, sizeof(uint64_t));
183 
184 	for (i = 0; i < ROC_AE_EC_ID_PMAX; i++) {
185 		memcpy(data, &ae_ec_grp[i], sizeof(struct roc_ae_ec_group));
186 		tbl[i] = (struct roc_ae_ec_group *)data;
187 		data += sizeof(struct roc_ae_ec_group);
188 	}
189 
190 	return 0;
191 }
192 
193 void
roc_ae_ec_grp_put(void)194 roc_ae_ec_grp_put(void)
195 {
196 	const char name[] = AE_EC_GRP_TBL_NAME;
197 	const struct plt_memzone *mz;
198 	struct ae_ec_grp_tbl *ec_grp;
199 
200 	mz = plt_memzone_lookup(name);
201 	if (mz == NULL)
202 		return;
203 
204 	ec_grp = mz->addr;
205 	/* Decrement number of devices using EC grp table */
206 	if (__atomic_sub_fetch(&ec_grp->refcount, 1, __ATOMIC_SEQ_CST) == 0)
207 		plt_memzone_free(mz);
208 }
209