@@ -22,6 +22,7 @@ extern "C" {
#include <odp/shared_memory.h>
#include <odp/plat/nic_types.h>
#include <odp/pci.h>
+#include <odp/shared_memory.h>
/** @ingroup odp_nic
* @{
@@ -210,3 +210,75 @@ void odp_nic_driver_register(odp_nic_driver_t *drv)
else
ODP_ERR("Maximum number of drivers exceeded... ");
}
+
+odp_nic_dev_t *odp_nic_dev_alloc(const char *unique_id, int private_sz,
+ int nb_rxqueues, int nb_txqueues,
+ odp_pktio_t pktio)
+{
+ odp_shm_t shm;
+ odp_nic_dev_t *dev;
+
+ char name[ODP_SHM_NAME_LEN];
+
+ dev = malloc(sizeof(odp_nic_dev_t));
+
+ /* allocate memory for data (global to the NIC): */
+ /* FIXME: this is a shared mem data struct in DPDK: don't
+ * fully understand why at this stage as it contains pointers
+ * ...needs review... */
+ snprintf(name, sizeof(name), "ETH_dev_data:%s", unique_id);
+ shm = odp_shm_lookup(name);
+ if (shm == ODP_SHM_INVALID) {
+ shm = odp_shm_reserve(name,
+ sizeof(odp_nic_dev_data_t),
+ ODP_CACHE_LINE_SIZE, 0);
+ }
+ dev->data = odp_shm_addr(shm);
+ if (!dev->data)
+ goto out1;
+
+ dev->data_shm = shm;
+
+ /* 1 port per ethernet device, matching the pktio entry index: */
+ dev->data->port_id = _odp_typeval(pktio);
+
+ /* allocate memory for driver private data: */
+ dev->data->dev_private = malloc(private_sz);
+ if (!dev->data->dev_private)
+ goto out2;
+
+ /* allocate memory for the rx queues: */
+ dev->data->rx_queues = malloc(sizeof(dev->data->rx_queues[0]) *
+ nb_rxqueues);
+ if (!dev->data->rx_queues)
+ goto out3;
+
+ /* allocate memory for the tx queues: */
+ dev->data->tx_queues = malloc(sizeof(dev->data->tx_queues[0])
+ * nb_txqueues);
+ if (!dev->data->tx_queues)
+ goto out4;
+
+ dev->data->nb_rx_queues = nb_rxqueues;
+ dev->data->nb_tx_queues = nb_txqueues;
+
+ return dev;
+
+out4:
+ free(dev->data->rx_queues);
+out3:
+ free(dev->data->dev_private);
+out2:
+ if (odp_shm_free(shm) < 0)
+ ODP_ERR("Shm free failed for ETH_dev_data");
+out1: return NULL;
+}
+
+void odp_nic_dev_free(odp_nic_dev_t *nic_dev)
+{
+ free(nic_dev->data->tx_queues);
+ free(nic_dev->data->rx_queues);
+ free(nic_dev->data->dev_private);
+ odp_shm_free(nic_dev->data_shm);
+ free(nic_dev);
+}
Function to allocate and free a Nic device are added here. The DPDK PMD drivers make use of a shared mem area (dev->data), which is kept here, but some question remains to be answered about its usage (dpdk hash of inspiration: 9702b2b53f250aa50973e6d86abce45b4a919eda) Signed-off-by: Christophe Milard <christophe.milard@linaro.org> --- platform/linux-generic/include/odp/nic.h | 1 + platform/linux-generic/odp_nic.c | 72 ++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+)