Fix cos initialization, handling the default case too.

Substitute the semicolon for the comma
that was expected in the cos_bw command line override.
Commas are not allowed within a multifield option.
The new format is cos_bw=%d:%d:%d:%d, where the sum of
the 4 decimal values must be less than or equal to 100.

Corrected probe-time initialization order.

Fixes: bec8901bfe9f ("event/dlb2: support ldb port specific COS")
Cc: timothy.mcdan...@intel.com

Signed-off-by: Timothy McDaniel <timothy.mcdan...@intel.com>
---
 drivers/event/dlb2/dlb2.c                  | 63 ++++++++++++----------
 drivers/event/dlb2/pf/base/dlb2_resource.c |  3 --
 drivers/event/dlb2/pf/dlb2_pf.c            |  4 ++
 3 files changed, 39 insertions(+), 31 deletions(-)

diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c
index 8a68c25c93..26af75beb8 100644
--- a/drivers/event/dlb2/dlb2.c
+++ b/drivers/event/dlb2/dlb2.c
@@ -170,10 +170,11 @@ dlb2_init_port_cos(struct dlb2_eventdev *dlb2, int 
*port_cos)
 {
        int q;
 
-       for (q = 0; q < DLB2_MAX_NUM_PORTS_ALL; q++) {
-               dlb2->ev_ports[q].cos_id = port_cos[q];
-               dlb2->cos_ports[port_cos[q]]++;
-       }
+       for (q = 0; q < DLB2_MAX_NUM_PORTS_ALL; q++)
+               if (port_cos[q] != DLB2_COS_DEFAULT) {
+                       dlb2->ev_ports[q].cos_id = port_cos[q];
+                       dlb2->cos_ports[port_cos[q]]++;
+               }
 }
 
 static void
@@ -181,6 +182,17 @@ dlb2_init_cos_bw(struct dlb2_eventdev *dlb2,
                 struct dlb2_cos_bw *cos_bw)
 {
        int q;
+
+
+       /* If cos_bw not set, then split evenly */
+       if (cos_bw->val[0] == 0 && cos_bw->val[1] == 0 &&
+               cos_bw->val[2] == 0 && cos_bw->val[3] == 0) {
+               cos_bw->val[0] = 25;
+               cos_bw->val[1] = 25;
+               cos_bw->val[2] = 25;
+               cos_bw->val[3] = 25;
+       }
+
        for (q = 0; q < DLB2_COS_NUM_VALS; q++)
                dlb2->cos_bw[q] = cos_bw->val[q];
 
@@ -464,19 +476,15 @@ set_port_cos(const char *key __rte_unused,
        }
 
        /* command line override may take one of the following 3 forms:
-        * port_cos=all:<cos_id> ... all ports
         * port_cos=port-port:<cos_id> ... a range of ports
         * port_cos=port:<cos_id> ... just one port
         */
-       if (sscanf(value, "all:%d", &cos_id) == 1) {
-               first = 0;
-               last = DLB2_MAX_NUM_LDB_PORTS - 1;
-       } else if (sscanf(value, "%d-%d:%d", &first, &last, &cos_id) == 3) {
+       if (sscanf(value, "%d-%d:%d", &first, &last, &cos_id) == 3) {
                /* we have everything we need */
        } else if (sscanf(value, "%d:%d", &first, &cos_id) == 2) {
                last = first;
        } else {
-               DLB2_LOG_ERR("Error parsing ldb port port_cos devarg. Should be 
all:val, port-port:val, or port:val\n");
+               DLB2_LOG_ERR("Error parsing ldb port port_cos devarg. Should be 
port-port:val, or port:val\n");
                return -EINVAL;
        }
 
@@ -511,13 +519,13 @@ set_cos_bw(const char *key __rte_unused,
 
        /* format must be %d,%d,%d,%d */
 
-       if (sscanf(value, "%d,%d,%d,%d", &cos_bw->val[0], &cos_bw->val[1],
+       if (sscanf(value, "%d:%d:%d:%d", &cos_bw->val[0], &cos_bw->val[1],
                   &cos_bw->val[2], &cos_bw->val[3]) != 4) {
-               DLB2_LOG_ERR("Error parsing cos bandwidth devarg. Should be 
bw0,bw1,bw2,bw3 where all values combined are <= 100\n");
+               DLB2_LOG_ERR("Error parsing cos bandwidth devarg. Should be 
bw0:bw1:bw2:bw3 where all values combined are <= 100\n");
                return -EINVAL;
        }
        if (cos_bw->val[0] + cos_bw->val[1] + cos_bw->val[2] + cos_bw->val[3] > 
100) {
-               DLB2_LOG_ERR("Error parsing cos bandwidth devarg. Should be 
bw0,bw1,bw2,bw3  where all values combined are <= 100\n");
+               DLB2_LOG_ERR("Error parsing cos bandwidth devarg. Should be 
bw0:bw1:bw2:bw3  where all values combined are <= 100\n");
                return -EINVAL;
        }
 
@@ -781,9 +789,9 @@ dlb2_hw_create_sched_domain(struct dlb2_eventdev *dlb2,
 
        /* LDB ports */
 
-       /* tally of ports with non default COS */
-       cos_ports = dlb2->cos_ports[1] + dlb2->cos_ports[2] +
-                   dlb2->cos_ports[3];
+       /* tally of COS ports from cmd line */
+       cos_ports = dlb2->cos_ports[0] + dlb2->cos_ports[1] +
+                   dlb2->cos_ports[2] + dlb2->cos_ports[3];
 
        if (cos_ports > resources_asked->num_ldb_ports) {
                DLB2_LOG_ERR("dlb2: num_ldb_ports < nonzero cos_ports\n");
@@ -4552,6 +4560,17 @@ dlb2_primary_eventdev_probe(struct rte_eventdev *dev,
        evdev_dlb2_default_info.max_event_port_enqueue_depth =
                dlb2->max_enq_depth;
 
+       dlb2_init_queue_depth_thresholds(dlb2,
+                                        dlb2_args->qid_depth_thresholds.val);
+
+       dlb2_init_cq_weight(dlb2,
+                           dlb2_args->cq_weight.limit);
+
+       dlb2_init_port_cos(dlb2,
+                          dlb2_args->port_cos.cos_id);
+
+       dlb2_init_cos_bw(dlb2,
+                        &dlb2_args->cos_bw);
 
        err = dlb2_iface_open(&dlb2->qm_instance, name);
        if (err < 0) {
@@ -4623,18 +4642,6 @@ dlb2_primary_eventdev_probe(struct rte_eventdev *dev,
 
        dlb2_entry_points_init(dev);
 
-       dlb2_init_queue_depth_thresholds(dlb2,
-                                        dlb2_args->qid_depth_thresholds.val);
-
-       dlb2_init_cq_weight(dlb2,
-                           dlb2_args->cq_weight.limit);
-
-       dlb2_init_port_cos(dlb2,
-                          dlb2_args->port_cos.cos_id);
-
-       dlb2_init_cos_bw(dlb2,
-                        &dlb2_args->cos_bw);
-
        return 0;
 }
 
diff --git a/drivers/event/dlb2/pf/base/dlb2_resource.c 
b/drivers/event/dlb2/pf/base/dlb2_resource.c
index da1949c763..e73d289445 100644
--- a/drivers/event/dlb2/pf/base/dlb2_resource.c
+++ b/drivers/event/dlb2/pf/base/dlb2_resource.c
@@ -236,9 +236,6 @@ int dlb2_resource_init(struct dlb2_hw *hw, enum dlb2_hw_ver 
ver)
                hw->rsrcs.sn_groups[i].slot_use_bitmap = 0;
        }
 
-       for (i = 0; i < DLB2_NUM_COS_DOMAINS; i++)
-               hw->cos_reservation[i] = 100 / DLB2_NUM_COS_DOMAINS;
-
        return 0;
 
 unwind:
diff --git a/drivers/event/dlb2/pf/dlb2_pf.c b/drivers/event/dlb2/pf/dlb2_pf.c
index 086d4a1cc7..dd3f2b8ece 100644
--- a/drivers/event/dlb2/pf/dlb2_pf.c
+++ b/drivers/event/dlb2/pf/dlb2_pf.c
@@ -712,10 +712,14 @@ dlb2_eventdev_pci_init(struct rte_eventdev *eventdev)
                .max_enq_depth = DLB2_MAX_ENQUEUE_DEPTH
        };
        struct dlb2_eventdev *dlb2;
+       int q;
 
        DLB2_LOG_DBG("Enter with dev_id=%d socket_id=%d",
                     eventdev->data->dev_id, eventdev->data->socket_id);
 
+       for (q = 0; q < DLB2_MAX_NUM_PORTS_ALL; q++)
+               dlb2_args.port_cos.cos_id[q] = DLB2_COS_DEFAULT;
+
        dlb2_pf_iface_fn_ptrs_init();
 
        pci_dev = RTE_DEV_TO_PCI(eventdev->dev);
-- 
2.25.1

Reply via email to