New upstream version 18.02
[deb_dpdk.git] / drivers / event / opdl / opdl_evdev_xstats.c
diff --git a/drivers/event/opdl/opdl_evdev_xstats.c b/drivers/event/opdl/opdl_evdev_xstats.c
new file mode 100644 (file)
index 0000000..0e6c6bd
--- /dev/null
@@ -0,0 +1,180 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2017 Intel Corporation
+ */
+
+#include "opdl_evdev.h"
+#include "opdl_log.h"
+
+static const char * const port_xstat_str[] = {
+
+       "claim_pkts_requested",
+       "claim_pkts_granted",
+       "claim_non_empty",
+       "claim_empty",
+       "total_cycles",
+};
+
+
+void
+opdl_xstats_init(struct rte_eventdev *dev)
+{
+       uint32_t i, j;
+
+       struct opdl_evdev *device = opdl_pmd_priv(dev);
+
+       if (!device->do_validation)
+               return;
+
+       for (i = 0; i < device->max_port_nb; i++) {
+               struct opdl_port *port = &device->ports[i];
+
+               for (j = 0; j < max_num_port_xstat; j++) {
+                       uint32_t index = (i * max_num_port_xstat) + j;
+
+                       /* Name */
+                       sprintf(device->port_xstat[index].stat.name,
+                              "port_%02u_%s",
+                              i,
+                              port_xstat_str[j]);
+
+                       /* ID */
+                       device->port_xstat[index].id = index;
+
+                       /* Stats ptr */
+                       device->port_xstat[index].value = &port->port_stat[j];
+               }
+       }
+}
+
+int
+opdl_xstats_uninit(struct rte_eventdev *dev)
+{
+       struct opdl_evdev *device = opdl_pmd_priv(dev);
+
+       if (!device->do_validation)
+               return 0;
+
+       memset(device->port_xstat,
+              0,
+              sizeof(device->port_xstat));
+
+       return 0;
+}
+
+int
+opdl_xstats_get_names(const struct rte_eventdev *dev,
+               enum rte_event_dev_xstats_mode mode,
+               uint8_t queue_port_id,
+               struct rte_event_dev_xstats_name *xstats_names,
+               unsigned int *ids, unsigned int size)
+{
+       struct opdl_evdev *device = opdl_pmd_priv(dev);
+
+       if (!device->do_validation)
+               return -ENOTSUP;
+
+       if (mode == RTE_EVENT_DEV_XSTATS_DEVICE ||
+                       mode == RTE_EVENT_DEV_XSTATS_QUEUE)
+               return -EINVAL;
+
+       if (queue_port_id >= device->max_port_nb)
+               return -EINVAL;
+
+       if (size < max_num_port_xstat)
+               return max_num_port_xstat;
+
+       uint32_t port_idx = queue_port_id * max_num_port_xstat;
+
+       uint32_t j;
+       for (j = 0; j < max_num_port_xstat; j++) {
+
+               strcpy(xstats_names[j].name,
+                               device->port_xstat[j + port_idx].stat.name);
+               ids[j] = device->port_xstat[j + port_idx].id;
+       }
+
+       return max_num_port_xstat;
+}
+
+int
+opdl_xstats_get(const struct rte_eventdev *dev,
+               enum rte_event_dev_xstats_mode mode,
+               uint8_t queue_port_id,
+               const unsigned int ids[],
+               uint64_t values[], unsigned int n)
+{
+       struct opdl_evdev *device = opdl_pmd_priv(dev);
+
+       if (!device->do_validation)
+               return -ENOTSUP;
+
+       if (mode == RTE_EVENT_DEV_XSTATS_DEVICE ||
+                       mode == RTE_EVENT_DEV_XSTATS_QUEUE)
+               return -EINVAL;
+
+       if (queue_port_id >= device->max_port_nb)
+               return -EINVAL;
+
+       if (n > max_num_port_xstat)
+               return -EINVAL;
+
+       uint32_t p_start = queue_port_id * max_num_port_xstat;
+       uint32_t p_finish = p_start + max_num_port_xstat;
+
+       uint32_t i;
+       for (i = 0; i < n; i++) {
+               if (ids[i] < p_start || ids[i] >= p_finish)
+                       return -EINVAL;
+
+               values[i] = *(device->port_xstat[ids[i]].value);
+       }
+
+       return n;
+}
+
+uint64_t
+opdl_xstats_get_by_name(const struct rte_eventdev *dev,
+               const char *name, unsigned int *id)
+{
+       struct opdl_evdev *device = opdl_pmd_priv(dev);
+
+       if (!device->do_validation)
+               return -ENOTSUP;
+
+       uint32_t max_index = device->max_port_nb * max_num_port_xstat;
+
+       uint32_t i;
+       for (i = 0; i < max_index; i++) {
+
+               if (strncmp(name,
+                          device->port_xstat[i].stat.name,
+                          RTE_EVENT_DEV_XSTATS_NAME_SIZE) == 0) {
+                       if (id != NULL)
+                               *id = i;
+                       if (device->port_xstat[i].value)
+                               return *(device->port_xstat[i].value);
+                       break;
+               }
+       }
+       return -EINVAL;
+}
+
+int
+opdl_xstats_reset(struct rte_eventdev *dev,
+               enum rte_event_dev_xstats_mode mode,
+               int16_t queue_port_id, const uint32_t ids[],
+               uint32_t nb_ids)
+{
+       struct opdl_evdev *device = opdl_pmd_priv(dev);
+
+       if (!device->do_validation)
+               return -ENOTSUP;
+
+       RTE_SET_USED(dev);
+       RTE_SET_USED(mode);
+       RTE_SET_USED(queue_port_id);
+       RTE_SET_USED(ids);
+       RTE_SET_USED(nb_ids);
+
+       return -ENOTSUP;
+}