#include <string.h>
#include <errno.h>
+#include <ethdev_driver.h>
#include <rte_atomic.h>
#include <rte_branch_prediction.h>
#include <rte_cycles.h>
#define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \
((timeout_us) * rte_get_timer_hz() / 1000000 + rte_get_timer_cycles())
-/*
- * Each rte_memzone should have unique name.
- * To satisfy it, count number of allocations and add it to name.
- */
-extern rte_atomic64_t ena_alloc_cnt;
+const struct rte_memzone *
+ena_mem_alloc_coherent(struct rte_eth_dev_data *data, size_t size,
+ int socket_id, unsigned int alignment, void **virt_addr,
+ dma_addr_t *phys_addr);
#define ENA_MEM_ALLOC_COHERENT_ALIGNED( \
dmadev, size, virt, phys, mem_handle, alignment) \
do { \
- const struct rte_memzone *mz = NULL; \
- ENA_TOUCH(dmadev); \
- if ((size) > 0) { \
- char z_name[RTE_MEMZONE_NAMESIZE]; \
- snprintf(z_name, sizeof(z_name), \
- "ena_alloc_%" PRIi64 "", \
- rte_atomic64_add_return(&ena_alloc_cnt, 1)); \
- mz = rte_memzone_reserve_aligned(z_name, (size), \
- SOCKET_ID_ANY, RTE_MEMZONE_IOVA_CONTIG,\
- alignment); \
- mem_handle = mz; \
- } \
- if (mz == NULL) { \
- virt = NULL; \
- phys = 0; \
- } else { \
- memset(mz->addr, 0, (size)); \
- virt = mz->addr; \
- phys = mz->iova; \
- } \
+ void *virt_addr; \
+ dma_addr_t phys_addr; \
+ (mem_handle) = ena_mem_alloc_coherent((dmadev), (size), \
+ SOCKET_ID_ANY, (alignment), &virt_addr, &phys_addr); \
+ (virt) = virt_addr; \
+ (phys) = phys_addr; \
} while (0)
#define ENA_MEM_ALLOC_COHERENT(dmadev, size, virt, phys, mem_handle) \
ENA_MEM_ALLOC_COHERENT_ALIGNED(dmadev, size, virt, phys, \
#define ENA_MEM_ALLOC_COHERENT_NODE_ALIGNED( \
dmadev, size, virt, phys, mem_handle, node, dev_node, alignment) \
do { \
- const struct rte_memzone *mz = NULL; \
- ENA_TOUCH(dmadev); ENA_TOUCH(dev_node); \
- if ((size) > 0) { \
- char z_name[RTE_MEMZONE_NAMESIZE]; \
- snprintf(z_name, sizeof(z_name), \
- "ena_alloc_%" PRIi64 "", \
- rte_atomic64_add_return(&ena_alloc_cnt, 1)); \
- mz = rte_memzone_reserve_aligned(z_name, (size), \
- node, RTE_MEMZONE_IOVA_CONTIG, alignment); \
- mem_handle = mz; \
- } \
- if (mz == NULL) { \
- virt = NULL; \
- phys = 0; \
- } else { \
- memset(mz->addr, 0, (size)); \
- virt = mz->addr; \
- phys = mz->iova; \
- } \
+ void *virt_addr; \
+ dma_addr_t phys_addr; \
+ ENA_TOUCH(dev_node); \
+ (mem_handle) = ena_mem_alloc_coherent((dmadev), (size), \
+ (node), (alignment), &virt_addr, &phys_addr); \
+ (virt) = virt_addr; \
+ (phys) = phys_addr; \
} while (0)
#define ENA_MEM_ALLOC_COHERENT_NODE( \
dmadev, size, virt, phys, mem_handle, node, dev_node) \
}
ena_dev->reg_bar = adapter->regs;
- /* This is a dummy pointer for ena_com functions. */
- ena_dev->dmadev = adapter;
+ /* Pass device data as a pointer which can be passed to the IO functions
+ * by the ena_com (for example - the memory allocation).
+ */
+ ena_dev->dmadev = eth_dev->data;
adapter->id_number = adapters_found;
indirect_table);
}
+/*********************************************************************
+ * ena_plat_dpdk.h functions implementations
+ *********************************************************************/
+
+const struct rte_memzone *
+ena_mem_alloc_coherent(struct rte_eth_dev_data *data, size_t size,
+ int socket_id, unsigned int alignment, void **virt_addr,
+ dma_addr_t *phys_addr)
+{
+ char z_name[RTE_MEMZONE_NAMESIZE];
+ struct ena_adapter *adapter = data->dev_private;
+ const struct rte_memzone *memzone;
+ int rc;
+
+ rc = snprintf(z_name, RTE_MEMZONE_NAMESIZE, "ena_p%d_mz%" PRIu64 "",
+ data->port_id, adapter->memzone_cnt);
+ if (rc >= RTE_MEMZONE_NAMESIZE) {
+ PMD_DRV_LOG(ERR,
+ "Name for the ena_com memzone is too long. Port: %d, mz_num: %" PRIu64 "\n",
+ data->port_id, adapter->memzone_cnt);
+ goto error;
+ }
+ adapter->memzone_cnt++;
+
+ memzone = rte_memzone_reserve_aligned(z_name, size, socket_id,
+ RTE_MEMZONE_IOVA_CONTIG, alignment);
+ if (memzone == NULL) {
+ PMD_DRV_LOG(ERR, "Failed to allocate ena_com memzone: %s\n",
+ z_name);
+ goto error;
+ }
+
+ memset(memzone->addr, 0, size);
+ *virt_addr = memzone->addr;
+ *phys_addr = memzone->iova;
+
+ return memzone;
+
+error:
+ *virt_addr = NULL;
+ *phys_addr = 0;
+
+ return NULL;
+}
+
+
/*********************************************************************
* PMD configuration
*********************************************************************/