xref: /dpdk/drivers/net/ntnic/include/flow_api.h (revision 7917b0d38e92e8b9ec5a870415b791420e10f11a)
136cf85c8SOleksandr Kolomeiets /*
236cf85c8SOleksandr Kolomeiets  * SPDX-License-Identifier: BSD-3-Clause
336cf85c8SOleksandr Kolomeiets  * Copyright(c) 2023 Napatech A/S
436cf85c8SOleksandr Kolomeiets  */
536cf85c8SOleksandr Kolomeiets 
636cf85c8SOleksandr Kolomeiets #ifndef _FLOW_API_H_
736cf85c8SOleksandr Kolomeiets #define _FLOW_API_H_
836cf85c8SOleksandr Kolomeiets 
91d3f62a0SOleksandr Kolomeiets #include <pthread.h>
101d3f62a0SOleksandr Kolomeiets 
110ea00f33SOleksandr Kolomeiets #include "ntlog.h"
120ea00f33SOleksandr Kolomeiets 
131d3f62a0SOleksandr Kolomeiets #include "flow_api_engine.h"
148df4a5f8SOleksandr Kolomeiets #include "hw_mod_backend.h"
151d3f62a0SOleksandr Kolomeiets #include "stream_binary_flow_api.h"
161d3f62a0SOleksandr Kolomeiets 
171d3f62a0SOleksandr Kolomeiets /*
181d3f62a0SOleksandr Kolomeiets  * Flow NIC and Eth port device management
191d3f62a0SOleksandr Kolomeiets  */
201d3f62a0SOleksandr Kolomeiets 
211d3f62a0SOleksandr Kolomeiets struct hw_mod_resource_s {
221d3f62a0SOleksandr Kolomeiets 	uint8_t *alloc_bm;      /* allocation bitmap */
231d3f62a0SOleksandr Kolomeiets 	uint32_t *ref;  /* reference counter for each resource element */
241d3f62a0SOleksandr Kolomeiets 	uint32_t resource_count;/* number of total available entries */
251d3f62a0SOleksandr Kolomeiets };
261d3f62a0SOleksandr Kolomeiets 
271d3f62a0SOleksandr Kolomeiets /*
281d3f62a0SOleksandr Kolomeiets  * Device Management API
291d3f62a0SOleksandr Kolomeiets  */
301d3f62a0SOleksandr Kolomeiets int flow_delete_eth_dev(struct flow_eth_dev *eth_dev);
311d3f62a0SOleksandr Kolomeiets 
321d3f62a0SOleksandr Kolomeiets struct flow_eth_dev {
331d3f62a0SOleksandr Kolomeiets 	/* NIC that owns this port device */
341d3f62a0SOleksandr Kolomeiets 	struct flow_nic_dev *ndev;
351d3f62a0SOleksandr Kolomeiets 	/* NIC port id */
361d3f62a0SOleksandr Kolomeiets 	uint8_t port;
371d3f62a0SOleksandr Kolomeiets 
381d3f62a0SOleksandr Kolomeiets 	/* 0th for exception */
391d3f62a0SOleksandr Kolomeiets 	struct flow_queue_id_s rx_queue[FLOW_MAX_QUEUES + 1];
401d3f62a0SOleksandr Kolomeiets 
411d3f62a0SOleksandr Kolomeiets 	/* VSWITCH has exceptions sent on queue 0 per design */
421d3f62a0SOleksandr Kolomeiets 	int num_queues;
431d3f62a0SOleksandr Kolomeiets 
441d3f62a0SOleksandr Kolomeiets 	struct flow_eth_dev *next;
451d3f62a0SOleksandr Kolomeiets };
468df4a5f8SOleksandr Kolomeiets 
4736cf85c8SOleksandr Kolomeiets /* registered NIC backends */
488df4a5f8SOleksandr Kolomeiets struct flow_nic_dev {
49*7917b0d3SOleksandr Kolomeiets 	uint8_t adapter_no;     /* physical adapter no in the host system */
50*7917b0d3SOleksandr Kolomeiets 	uint16_t ports; /* number of in-ports addressable on this NIC */
51*7917b0d3SOleksandr Kolomeiets 
521d3f62a0SOleksandr Kolomeiets 	struct hw_mod_resource_s res[RES_COUNT];/* raw NIC resource allocation table */
531d3f62a0SOleksandr Kolomeiets 	void *km_res_handle;
541d3f62a0SOleksandr Kolomeiets 	void *kcc_res_handle;
551d3f62a0SOleksandr Kolomeiets 
561d3f62a0SOleksandr Kolomeiets 	uint32_t flow_unique_id_counter;
571d3f62a0SOleksandr Kolomeiets 	/* linked list of all flows created on this NIC */
581d3f62a0SOleksandr Kolomeiets 	struct flow_handle *flow_base;
591d3f62a0SOleksandr Kolomeiets 
608df4a5f8SOleksandr Kolomeiets 	/* NIC backend API */
618df4a5f8SOleksandr Kolomeiets 	struct flow_api_backend_s be;
621d3f62a0SOleksandr Kolomeiets 	/* linked list of created eth-port devices on this NIC */
631d3f62a0SOleksandr Kolomeiets 	struct flow_eth_dev *eth_base;
641d3f62a0SOleksandr Kolomeiets 	pthread_mutex_t mtx;
651d3f62a0SOleksandr Kolomeiets 
661d3f62a0SOleksandr Kolomeiets 	/* next NIC linked list */
671d3f62a0SOleksandr Kolomeiets 	struct flow_nic_dev *next;
688df4a5f8SOleksandr Kolomeiets };
6936cf85c8SOleksandr Kolomeiets 
701d3f62a0SOleksandr Kolomeiets /*
711d3f62a0SOleksandr Kolomeiets  * Resources
721d3f62a0SOleksandr Kolomeiets  */
731d3f62a0SOleksandr Kolomeiets 
741d3f62a0SOleksandr Kolomeiets extern const char *dbg_res_descr[];
751d3f62a0SOleksandr Kolomeiets 
761d3f62a0SOleksandr Kolomeiets #define flow_nic_unset_bit(arr, x)                                                                \
771d3f62a0SOleksandr Kolomeiets 	do {                                                                                      \
781d3f62a0SOleksandr Kolomeiets 		size_t _temp_x = (x);                                                             \
791d3f62a0SOleksandr Kolomeiets 		arr[_temp_x / 8] &= (uint8_t)(~(1 << (_temp_x % 8)));                             \
801d3f62a0SOleksandr Kolomeiets 	} while (0)
811d3f62a0SOleksandr Kolomeiets 
821d3f62a0SOleksandr Kolomeiets #define flow_nic_is_bit_set(arr, x)                                                               \
831d3f62a0SOleksandr Kolomeiets 	({                                                                                        \
841d3f62a0SOleksandr Kolomeiets 		size_t _temp_x = (x);                                                             \
851d3f62a0SOleksandr Kolomeiets 		(arr[_temp_x / 8] & (uint8_t)(1 << (_temp_x % 8)));                               \
861d3f62a0SOleksandr Kolomeiets 	})
871d3f62a0SOleksandr Kolomeiets 
881d3f62a0SOleksandr Kolomeiets #define flow_nic_mark_resource_unused(_ndev, res_type, index)                                     \
891d3f62a0SOleksandr Kolomeiets 	do {                                                                                      \
901d3f62a0SOleksandr Kolomeiets 		typeof(res_type) _temp_res_type = (res_type);                                 \
911d3f62a0SOleksandr Kolomeiets 		size_t _temp_index = (index);                                                     \
921d3f62a0SOleksandr Kolomeiets 		NT_LOG(DBG, FILTER, "mark resource unused: %s idx %zu",                         \
931d3f62a0SOleksandr Kolomeiets 		       dbg_res_descr[_temp_res_type], _temp_index);                               \
941d3f62a0SOleksandr Kolomeiets 		flow_nic_unset_bit((_ndev)->res[_temp_res_type].alloc_bm, _temp_index);           \
951d3f62a0SOleksandr Kolomeiets 	} while (0)
961d3f62a0SOleksandr Kolomeiets 
971d3f62a0SOleksandr Kolomeiets #define flow_nic_is_resource_used(_ndev, res_type, index)                                         \
981d3f62a0SOleksandr Kolomeiets 	(!!flow_nic_is_bit_set((_ndev)->res[res_type].alloc_bm, index))
991d3f62a0SOleksandr Kolomeiets 
1001d3f62a0SOleksandr Kolomeiets void flow_nic_free_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int idx);
1011d3f62a0SOleksandr Kolomeiets 
1021d3f62a0SOleksandr Kolomeiets int flow_nic_deref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int index);
1031d3f62a0SOleksandr Kolomeiets 
10436cf85c8SOleksandr Kolomeiets #endif
105