@@ -235,6 +235,47 @@ sso_hws_link_modify(uint8_t hws, uintptr_t base, struct plt_bitmap *bmp, uint16_
}
}
+static int
+sso_hws_link_modify_af(struct dev *dev, uint8_t hws, struct plt_bitmap *bmp, uint16_t hwgrp[],
+ uint16_t n, uint8_t set, uint16_t enable)
+{
+ struct mbox *mbox = mbox_get(dev->mbox);
+ struct ssow_chng_mship *req;
+ int rc, i;
+
+ req = mbox_alloc_msg_ssow_chng_mship(mbox);
+ if (req == NULL) {
+ rc = mbox_process(mbox);
+ if (rc) {
+ mbox_put(mbox);
+ return -EIO;
+ }
+ req = mbox_alloc_msg_ssow_chng_mship(mbox);
+ if (req == NULL) {
+ mbox_put(mbox);
+ return -ENOSPC;
+ }
+ }
+ req->enable = enable;
+ req->set = set;
+ req->hws = hws;
+ req->nb_hwgrps = n;
+ for (i = 0; i < n; i++)
+ req->hwgrps[i] = hwgrp[i];
+ rc = mbox_process(mbox);
+ mbox_put(mbox);
+ if (rc == MBOX_MSG_INVALID)
+ return rc;
+ if (rc)
+ return -EIO;
+
+ for (i = 0; i < n; i++)
+ enable ? plt_bitmap_set(bmp, hwgrp[i]) :
+ plt_bitmap_clear(bmp, hwgrp[i]);
+
+ return 0;
+}
+
static int
sso_msix_fill(struct roc_sso *roc_sso, uint16_t nb_hws, uint16_t nb_hwgrp)
{
@@ -300,31 +341,55 @@ roc_sso_ns_to_gw(uint64_t base, uint64_t ns)
int
roc_sso_hws_link(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[], uint16_t nb_hwgrp,
- uint8_t set)
+ uint8_t set, bool use_mbox)
{
- struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev;
- struct sso *sso;
+ struct sso *sso = roc_sso_to_sso_priv(roc_sso);
+ struct dev *dev = &sso->dev;
uintptr_t base;
+ int rc;
- sso = roc_sso_to_sso_priv(roc_sso);
+ if (!nb_hwgrp)
+ return 0;
+
+ if (use_mbox && roc_model_is_cn10k()) {
+ rc = sso_hws_link_modify_af(dev, hws, sso->link_map[hws], hwgrp, nb_hwgrp, set, 1);
+ if (rc == MBOX_MSG_INVALID)
+ goto lf_access;
+ if (rc < 0)
+ return 0;
+ goto done;
+ }
+lf_access:
base = dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20 | hws << 12);
sso_hws_link_modify(hws, base, sso->link_map[hws], hwgrp, nb_hwgrp, set, 1);
-
+done:
return nb_hwgrp;
}
int
-roc_sso_hws_unlink(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[], uint16_t nb_hwgrp,
- uint8_t set)
+roc_sso_hws_unlink(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[],
+ uint16_t nb_hwgrp, uint8_t set, bool use_mbox)
{
- struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev;
- struct sso *sso;
+ struct sso *sso = roc_sso_to_sso_priv(roc_sso);
+ struct dev *dev = &sso->dev;
uintptr_t base;
+ int rc;
- sso = roc_sso_to_sso_priv(roc_sso);
+ if (!nb_hwgrp)
+ return 0;
+
+ if (use_mbox && roc_model_is_cn10k()) {
+ rc = sso_hws_link_modify_af(dev, hws, sso->link_map[hws], hwgrp, nb_hwgrp, set, 0);
+ if (rc == MBOX_MSG_INVALID)
+ goto lf_access;
+ if (rc < 0)
+ return 0;
+ goto done;
+ }
+lf_access:
base = dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20 | hws << 12);
sso_hws_link_modify(hws, base, sso->link_map[hws], hwgrp, nb_hwgrp, set, 0);
-
+done:
return nb_hwgrp;
}
@@ -85,9 +85,9 @@ int __roc_api roc_sso_hwgrp_set_priority(struct roc_sso *roc_sso,
uint8_t affinity, uint8_t priority);
uint64_t __roc_api roc_sso_ns_to_gw(uint64_t base, uint64_t ns);
int __roc_api roc_sso_hws_link(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[],
- uint16_t nb_hwgrp, uint8_t set);
+ uint16_t nb_hwgrp, uint8_t set, bool use_mbox);
int __roc_api roc_sso_hws_unlink(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[],
- uint16_t nb_hwgrp, uint8_t set);
+ uint16_t nb_hwgrp, uint8_t set, bool use_mbox);
int __roc_api roc_sso_hwgrp_hws_link_status(struct roc_sso *roc_sso,
uint8_t hws, uint16_t hwgrp);
uintptr_t __roc_api roc_sso_hws_base_get(struct roc_sso *roc_sso, uint8_t hws);
@@ -71,7 +71,7 @@ cn10k_sso_hws_link(void *arg, void *port, uint16_t *map, uint16_t nb_link, uint8
struct cnxk_sso_evdev *dev = arg;
struct cn10k_sso_hws *ws = port;
- return roc_sso_hws_link(&dev->sso, ws->hws_id, map, nb_link, profile);
+ return roc_sso_hws_link(&dev->sso, ws->hws_id, map, nb_link, profile, 0);
}
static int
@@ -80,7 +80,7 @@ cn10k_sso_hws_unlink(void *arg, void *port, uint16_t *map, uint16_t nb_link, uin
struct cnxk_sso_evdev *dev = arg;
struct cn10k_sso_hws *ws = port;
- return roc_sso_hws_unlink(&dev->sso, ws->hws_id, map, nb_link, profile);
+ return roc_sso_hws_unlink(&dev->sso, ws->hws_id, map, nb_link, profile, 0);
}
static void
@@ -111,7 +111,7 @@ cn10k_sso_hws_release(void *arg, void *hws)
for (i = 0; i < CNXK_SSO_MAX_PROFILES; i++)
for (j = 0; j < dev->nb_event_queues; j++)
- roc_sso_hws_unlink(&dev->sso, ws->hws_id, &j, 1, i);
+ roc_sso_hws_unlink(&dev->sso, ws->hws_id, &j, 1, i, 0);
memset(ws, 0, sizeof(*ws));
}
@@ -25,12 +25,12 @@ cn9k_sso_hws_link(void *arg, void *port, uint16_t *map, uint16_t nb_link, uint8_
if (dev->dual_ws) {
dws = port;
rc = roc_sso_hws_link(&dev->sso, CN9K_DUAL_WS_PAIR_ID(dws->hws_id, 0), map, nb_link,
- profile);
+ profile, 0);
rc |= roc_sso_hws_link(&dev->sso, CN9K_DUAL_WS_PAIR_ID(dws->hws_id, 1), map,
- nb_link, profile);
+ nb_link, profile, 0);
} else {
ws = port;
- rc = roc_sso_hws_link(&dev->sso, ws->hws_id, map, nb_link, profile);
+ rc = roc_sso_hws_link(&dev->sso, ws->hws_id, map, nb_link, profile, 0);
}
return rc;
@@ -47,12 +47,12 @@ cn9k_sso_hws_unlink(void *arg, void *port, uint16_t *map, uint16_t nb_link, uint
if (dev->dual_ws) {
dws = port;
rc = roc_sso_hws_unlink(&dev->sso, CN9K_DUAL_WS_PAIR_ID(dws->hws_id, 0), map,
- nb_link, profile);
+ nb_link, profile, 0);
rc |= roc_sso_hws_unlink(&dev->sso, CN9K_DUAL_WS_PAIR_ID(dws->hws_id, 1), map,
- nb_link, profile);
+ nb_link, profile, 0);
} else {
ws = port;
- rc = roc_sso_hws_unlink(&dev->sso, ws->hws_id, map, nb_link, profile);
+ rc = roc_sso_hws_unlink(&dev->sso, ws->hws_id, map, nb_link, profile, 0);
}
return rc;
@@ -100,9 +100,9 @@ cn9k_sso_hws_release(void *arg, void *hws)
for (i = 0; i < dev->nb_event_queues; i++) {
for (k = 0; k < CNXK_SSO_MAX_PROFILES; k++) {
roc_sso_hws_unlink(&dev->sso, CN9K_DUAL_WS_PAIR_ID(dws->hws_id, 0),
- &i, 1, k);
+ &i, 1, k, 0);
roc_sso_hws_unlink(&dev->sso, CN9K_DUAL_WS_PAIR_ID(dws->hws_id, 1),
- &i, 1, k);
+ &i, 1, k, 0);
}
}
memset(dws, 0, sizeof(*dws));
@@ -110,7 +110,7 @@ cn9k_sso_hws_release(void *arg, void *hws)
ws = hws;
for (i = 0; i < dev->nb_event_queues; i++)
for (k = 0; k < CNXK_SSO_MAX_PROFILES; k++)
- roc_sso_hws_unlink(&dev->sso, ws->hws_id, &i, 1, k);
+ roc_sso_hws_unlink(&dev->sso, ws->hws_id, &i, 1, k, 0);
memset(ws, 0, sizeof(*ws));
}
}