1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 Intel Corporation 3 */ 4 5 #include "opdl_evdev.h" 6 #include "opdl_log.h" 7 8 static const char * const port_xstat_str[] = { 9 10 "claim_pkts_requested", 11 "claim_pkts_granted", 12 "claim_non_empty", 13 "claim_empty", 14 "total_cycles", 15 }; 16 17 18 void 19 opdl_xstats_init(struct rte_eventdev *dev) 20 { 21 uint32_t i, j; 22 23 struct opdl_evdev *device = opdl_pmd_priv(dev); 24 25 if (!device->do_validation) 26 return; 27 28 for (i = 0; i < device->max_port_nb; i++) { 29 struct opdl_port *port = &device->ports[i]; 30 31 for (j = 0; j < max_num_port_xstat; j++) { 32 uint32_t index = (i * max_num_port_xstat) + j; 33 34 /* Name */ 35 sprintf(device->port_xstat[index].stat.name, 36 "port_%02u_%s", 37 i, 38 port_xstat_str[j]); 39 40 /* ID */ 41 device->port_xstat[index].id = index; 42 43 /* Stats ptr */ 44 device->port_xstat[index].value = &port->port_stat[j]; 45 } 46 } 47 } 48 49 int 50 opdl_xstats_uninit(struct rte_eventdev *dev) 51 { 52 struct opdl_evdev *device = opdl_pmd_priv(dev); 53 54 if (!device->do_validation) 55 return 0; 56 57 memset(device->port_xstat, 58 0, 59 sizeof(device->port_xstat)); 60 61 return 0; 62 } 63 64 int 65 opdl_xstats_get_names(const struct rte_eventdev *dev, 66 enum rte_event_dev_xstats_mode mode, 67 uint8_t queue_port_id, 68 struct rte_event_dev_xstats_name *xstats_names, 69 unsigned int *ids, unsigned int size) 70 { 71 struct opdl_evdev *device = opdl_pmd_priv(dev); 72 73 if (!device->do_validation) 74 return -ENOTSUP; 75 76 if (mode == RTE_EVENT_DEV_XSTATS_DEVICE || 77 mode == RTE_EVENT_DEV_XSTATS_QUEUE) 78 return -EINVAL; 79 80 if (queue_port_id >= device->max_port_nb) 81 return -EINVAL; 82 83 if (size < max_num_port_xstat) 84 return max_num_port_xstat; 85 86 uint32_t port_idx = queue_port_id * max_num_port_xstat; 87 88 uint32_t j; 89 for (j = 0; j < max_num_port_xstat; j++) { 90 91 strcpy(xstats_names[j].name, 92 device->port_xstat[j + port_idx].stat.name); 93 ids[j] = device->port_xstat[j + port_idx].id; 94 } 95 96 return max_num_port_xstat; 97 } 98 99 int 100 opdl_xstats_get(const struct rte_eventdev *dev, 101 enum rte_event_dev_xstats_mode mode, 102 uint8_t queue_port_id, 103 const unsigned int ids[], 104 uint64_t values[], unsigned int n) 105 { 106 struct opdl_evdev *device = opdl_pmd_priv(dev); 107 108 if (!device->do_validation) 109 return -ENOTSUP; 110 111 if (mode == RTE_EVENT_DEV_XSTATS_DEVICE || 112 mode == RTE_EVENT_DEV_XSTATS_QUEUE) 113 return -EINVAL; 114 115 if (queue_port_id >= device->max_port_nb) 116 return -EINVAL; 117 118 if (n > max_num_port_xstat) 119 return -EINVAL; 120 121 uint32_t p_start = queue_port_id * max_num_port_xstat; 122 uint32_t p_finish = p_start + max_num_port_xstat; 123 124 uint32_t i; 125 for (i = 0; i < n; i++) { 126 if (ids[i] < p_start || ids[i] >= p_finish) 127 return -EINVAL; 128 129 values[i] = *(device->port_xstat[ids[i]].value); 130 } 131 132 return n; 133 } 134 135 uint64_t 136 opdl_xstats_get_by_name(const struct rte_eventdev *dev, 137 const char *name, unsigned int *id) 138 { 139 struct opdl_evdev *device = opdl_pmd_priv(dev); 140 141 if (!device->do_validation) 142 return -ENOTSUP; 143 144 uint32_t max_index = device->max_port_nb * max_num_port_xstat; 145 146 uint32_t i; 147 for (i = 0; i < max_index; i++) { 148 149 if (strncmp(name, 150 device->port_xstat[i].stat.name, 151 RTE_EVENT_DEV_XSTATS_NAME_SIZE) == 0) { 152 if (id != NULL) 153 *id = i; 154 if (device->port_xstat[i].value) 155 return *(device->port_xstat[i].value); 156 break; 157 } 158 } 159 return -EINVAL; 160 } 161 162 int 163 opdl_xstats_reset(struct rte_eventdev *dev, 164 enum rte_event_dev_xstats_mode mode, 165 int16_t queue_port_id, const uint32_t ids[], 166 uint32_t nb_ids) 167 { 168 struct opdl_evdev *device = opdl_pmd_priv(dev); 169 170 if (!device->do_validation) 171 return -ENOTSUP; 172 173 RTE_SET_USED(dev); 174 RTE_SET_USED(mode); 175 RTE_SET_USED(queue_port_id); 176 RTE_SET_USED(ids); 177 RTE_SET_USED(nb_ids); 178 179 return -ENOTSUP; 180 } 181