hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
....@@ -316,30 +316,35 @@
316316
317317 block->fn_map[lf] = attach ? pcifunc : 0;
318318
319
- switch (block->type) {
320
- case BLKTYPE_NPA:
319
+ switch (block->addr) {
320
+ case BLKADDR_NPA:
321321 pfvf->npalf = attach ? true : false;
322322 num_lfs = pfvf->npalf;
323323 break;
324
- case BLKTYPE_NIX:
324
+ case BLKADDR_NIX0:
325
+ case BLKADDR_NIX1:
325326 pfvf->nixlf = attach ? true : false;
326327 num_lfs = pfvf->nixlf;
327328 break;
328
- case BLKTYPE_SSO:
329
+ case BLKADDR_SSO:
329330 attach ? pfvf->sso++ : pfvf->sso--;
330331 num_lfs = pfvf->sso;
331332 break;
332
- case BLKTYPE_SSOW:
333
+ case BLKADDR_SSOW:
333334 attach ? pfvf->ssow++ : pfvf->ssow--;
334335 num_lfs = pfvf->ssow;
335336 break;
336
- case BLKTYPE_TIM:
337
+ case BLKADDR_TIM:
337338 attach ? pfvf->timlfs++ : pfvf->timlfs--;
338339 num_lfs = pfvf->timlfs;
339340 break;
340
- case BLKTYPE_CPT:
341
+ case BLKADDR_CPT0:
341342 attach ? pfvf->cptlfs++ : pfvf->cptlfs--;
342343 num_lfs = pfvf->cptlfs;
344
+ break;
345
+ case BLKADDR_CPT1:
346
+ attach ? pfvf->cpt1_lfs++ : pfvf->cpt1_lfs--;
347
+ num_lfs = pfvf->cpt1_lfs;
343348 break;
344349 }
345350
....@@ -1035,7 +1040,30 @@
10351040 /* Get current count of a RVU block's LF/slots
10361041 * provisioned to a given RVU func.
10371042 */
1038
-static u16 rvu_get_rsrc_mapcount(struct rvu_pfvf *pfvf, int blktype)
1043
+u16 rvu_get_rsrc_mapcount(struct rvu_pfvf *pfvf, int blkaddr)
1044
+{
1045
+ switch (blkaddr) {
1046
+ case BLKADDR_NPA:
1047
+ return pfvf->npalf ? 1 : 0;
1048
+ case BLKADDR_NIX0:
1049
+ case BLKADDR_NIX1:
1050
+ return pfvf->nixlf ? 1 : 0;
1051
+ case BLKADDR_SSO:
1052
+ return pfvf->sso;
1053
+ case BLKADDR_SSOW:
1054
+ return pfvf->ssow;
1055
+ case BLKADDR_TIM:
1056
+ return pfvf->timlfs;
1057
+ case BLKADDR_CPT0:
1058
+ return pfvf->cptlfs;
1059
+ case BLKADDR_CPT1:
1060
+ return pfvf->cpt1_lfs;
1061
+ }
1062
+ return 0;
1063
+}
1064
+
1065
+/* Return true if LFs of block type are attached to pcifunc */
1066
+static bool is_blktype_attached(struct rvu_pfvf *pfvf, int blktype)
10391067 {
10401068 switch (blktype) {
10411069 case BLKTYPE_NPA:
....@@ -1043,15 +1071,16 @@
10431071 case BLKTYPE_NIX:
10441072 return pfvf->nixlf ? 1 : 0;
10451073 case BLKTYPE_SSO:
1046
- return pfvf->sso;
1074
+ return !!pfvf->sso;
10471075 case BLKTYPE_SSOW:
1048
- return pfvf->ssow;
1076
+ return !!pfvf->ssow;
10491077 case BLKTYPE_TIM:
1050
- return pfvf->timlfs;
1078
+ return !!pfvf->timlfs;
10511079 case BLKTYPE_CPT:
1052
- return pfvf->cptlfs;
1080
+ return pfvf->cptlfs || pfvf->cpt1_lfs;
10531081 }
1054
- return 0;
1082
+
1083
+ return false;
10551084 }
10561085
10571086 bool is_pffunc_map_valid(struct rvu *rvu, u16 pcifunc, int blktype)
....@@ -1064,7 +1093,7 @@
10641093 pfvf = rvu_get_pfvf(rvu, pcifunc);
10651094
10661095 /* Check if this PFFUNC has a LF of type blktype attached */
1067
- if (!rvu_get_rsrc_mapcount(pfvf, blktype))
1096
+ if (!is_blktype_attached(pfvf, blktype))
10681097 return false;
10691098
10701099 return true;
....@@ -1105,7 +1134,7 @@
11051134
11061135 block = &hw->block[blkaddr];
11071136
1108
- num_lfs = rvu_get_rsrc_mapcount(pfvf, block->type);
1137
+ num_lfs = rvu_get_rsrc_mapcount(pfvf, block->addr);
11091138 if (!num_lfs)
11101139 return;
11111140
....@@ -1179,6 +1208,58 @@
11791208 return rvu_detach_rsrcs(rvu, detach, detach->hdr.pcifunc);
11801209 }
11811210
1211
+static int rvu_get_nix_blkaddr(struct rvu *rvu, u16 pcifunc)
1212
+{
1213
+ struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
1214
+ int blkaddr = BLKADDR_NIX0, vf;
1215
+ struct rvu_pfvf *pf;
1216
+
1217
+ /* All CGX mapped PFs are set with assigned NIX block during init */
1218
+ if (is_pf_cgxmapped(rvu, rvu_get_pf(pcifunc))) {
1219
+ pf = rvu_get_pfvf(rvu, pcifunc & ~RVU_PFVF_FUNC_MASK);
1220
+ blkaddr = pf->nix_blkaddr;
1221
+ } else if (is_afvf(pcifunc)) {
1222
+ vf = pcifunc - 1;
1223
+ /* Assign NIX based on VF number. All even numbered VFs get
1224
+ * NIX0 and odd numbered gets NIX1
1225
+ */
1226
+ blkaddr = (vf & 1) ? BLKADDR_NIX1 : BLKADDR_NIX0;
1227
+ /* NIX1 is not present on all silicons */
1228
+ if (!is_block_implemented(rvu->hw, BLKADDR_NIX1))
1229
+ blkaddr = BLKADDR_NIX0;
1230
+ }
1231
+
1232
+ switch (blkaddr) {
1233
+ case BLKADDR_NIX1:
1234
+ pfvf->nix_blkaddr = BLKADDR_NIX1;
1235
+ break;
1236
+ case BLKADDR_NIX0:
1237
+ default:
1238
+ pfvf->nix_blkaddr = BLKADDR_NIX0;
1239
+ break;
1240
+ }
1241
+
1242
+ return pfvf->nix_blkaddr;
1243
+}
1244
+
1245
+static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc)
1246
+{
1247
+ int blkaddr;
1248
+
1249
+ switch (blktype) {
1250
+ case BLKTYPE_NIX:
1251
+ blkaddr = rvu_get_nix_blkaddr(rvu, pcifunc);
1252
+ break;
1253
+ default:
1254
+ return rvu_get_blkaddr(rvu, blktype, 0);
1255
+ };
1256
+
1257
+ if (is_block_implemented(rvu->hw, blkaddr))
1258
+ return blkaddr;
1259
+
1260
+ return -ENODEV;
1261
+}
1262
+
11821263 static void rvu_attach_block(struct rvu *rvu, int pcifunc,
11831264 int blktype, int num_lfs)
11841265 {
....@@ -1192,7 +1273,7 @@
11921273 if (!num_lfs)
11931274 return;
11941275
1195
- blkaddr = rvu_get_blkaddr(rvu, blktype, 0);
1276
+ blkaddr = rvu_get_attach_blkaddr(rvu, blktype, pcifunc);
11961277 if (blkaddr < 0)
11971278 return;
11981279
....@@ -1221,12 +1302,12 @@
12211302 struct rsrc_attach *req, u16 pcifunc)
12221303 {
12231304 struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
1305
+ int free_lfs, mappedlfs, blkaddr;
12241306 struct rvu_hwinfo *hw = rvu->hw;
12251307 struct rvu_block *block;
1226
- int free_lfs, mappedlfs;
12271308
12281309 /* Only one NPA LF can be attached */
1229
- if (req->npalf && !rvu_get_rsrc_mapcount(pfvf, BLKTYPE_NPA)) {
1310
+ if (req->npalf && !is_blktype_attached(pfvf, BLKTYPE_NPA)) {
12301311 block = &hw->block[BLKADDR_NPA];
12311312 free_lfs = rvu_rsrc_free_count(&block->lf);
12321313 if (!free_lfs)
....@@ -1239,8 +1320,11 @@
12391320 }
12401321
12411322 /* Only one NIX LF can be attached */
1242
- if (req->nixlf && !rvu_get_rsrc_mapcount(pfvf, BLKTYPE_NIX)) {
1243
- block = &hw->block[BLKADDR_NIX0];
1323
+ if (req->nixlf && !is_blktype_attached(pfvf, BLKTYPE_NIX)) {
1324
+ blkaddr = rvu_get_attach_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
1325
+ if (blkaddr < 0)
1326
+ return blkaddr;
1327
+ block = &hw->block[blkaddr];
12441328 free_lfs = rvu_rsrc_free_count(&block->lf);
12451329 if (!free_lfs)
12461330 goto fail;
....@@ -1260,7 +1344,7 @@
12601344 pcifunc, req->sso, block->lf.max);
12611345 return -EINVAL;
12621346 }
1263
- mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->type);
1347
+ mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->addr);
12641348 free_lfs = rvu_rsrc_free_count(&block->lf);
12651349 /* Check if additional resources are available */
12661350 if (req->sso > mappedlfs &&
....@@ -1276,7 +1360,7 @@
12761360 pcifunc, req->sso, block->lf.max);
12771361 return -EINVAL;
12781362 }
1279
- mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->type);
1363
+ mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->addr);
12801364 free_lfs = rvu_rsrc_free_count(&block->lf);
12811365 if (req->ssow > mappedlfs &&
12821366 ((req->ssow - mappedlfs) > free_lfs))
....@@ -1291,7 +1375,7 @@
12911375 pcifunc, req->timlfs, block->lf.max);
12921376 return -EINVAL;
12931377 }
1294
- mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->type);
1378
+ mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->addr);
12951379 free_lfs = rvu_rsrc_free_count(&block->lf);
12961380 if (req->timlfs > mappedlfs &&
12971381 ((req->timlfs - mappedlfs) > free_lfs))
....@@ -1306,7 +1390,7 @@
13061390 pcifunc, req->cptlfs, block->lf.max);
13071391 return -EINVAL;
13081392 }
1309
- mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->type);
1393
+ mappedlfs = rvu_get_rsrc_mapcount(pfvf, block->addr);
13101394 free_lfs = rvu_rsrc_free_count(&block->lf);
13111395 if (req->cptlfs > mappedlfs &&
13121396 ((req->cptlfs - mappedlfs) > free_lfs))
....@@ -1942,7 +2026,7 @@
19422026
19432027 block = &rvu->hw->block[blkaddr];
19442028 num_lfs = rvu_get_rsrc_mapcount(rvu_get_pfvf(rvu, pcifunc),
1945
- block->type);
2029
+ block->addr);
19462030 if (!num_lfs)
19472031 return;
19482032 for (slot = 0; slot < num_lfs; slot++) {