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