bus/fslmc: support dynamic IOVA

This patch add support for dynamic iova detection for DPAA2
devices and use of virtual address in such cases.

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
This commit is contained in:
Hemant Agrawal 2017-12-08 10:51:16 +05:30 committed by Ferruh Yigit
parent 2aab833725
commit f7768afac1
7 changed files with 73 additions and 3 deletions

View File

@ -25,6 +25,7 @@
#define VFIO_IOMMU_GROUP_PATH "/sys/kernel/iommu_groups"
struct rte_fslmc_bus rte_fslmc_bus;
uint8_t dpaa2_virt_mode;
static void
cleanup_fslmc_device_list(void)
@ -274,6 +275,9 @@ rte_fslmc_probe(void)
}
}
if (rte_eal_iova_mode() == RTE_IOVA_VA)
dpaa2_virt_mode = 1;
return 0;
}
@ -320,12 +324,52 @@ rte_fslmc_driver_unregister(struct rte_dpaa2_driver *driver)
driver->fslmc_bus = NULL;
}
/*
* All device has iova as va
*/
static inline int
fslmc_all_device_support_iova(void)
{
int ret = 0;
struct rte_dpaa2_device *dev;
struct rte_dpaa2_driver *drv;
TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) {
ret = rte_fslmc_match(drv, dev);
if (ret)
continue;
/* if the driver is not supporting IOVA */
if (!(drv->drv_flags & RTE_DPAA2_DRV_IOVA_AS_VA))
return 0;
}
}
return 1;
}
/*
* Get iommu class of DPAA2 devices on the bus.
*/
static enum rte_iova_mode
rte_dpaa2_get_iommu_class(void)
{
bool is_vfio_noiommu_enabled = 1;
bool has_iova_va;
if (TAILQ_EMPTY(&rte_fslmc_bus.device_list))
return RTE_IOVA_DC;
/* check if all devices on the bus support Virtual addressing or not */
has_iova_va = fslmc_all_device_support_iova();
#ifdef VFIO_PRESENT
is_vfio_noiommu_enabled = rte_vfio_noiommu_is_enabled() == true ?
true : false;
#endif
if (has_iova_va && !is_vfio_noiommu_enabled)
return RTE_IOVA_VA;
return RTE_IOVA_PA;
}

View File

@ -223,7 +223,10 @@ int rte_fslmc_vfio_dmamap(void)
dma_map.size = memseg[i].len;
dma_map.vaddr = memseg[i].addr_64;
#ifdef RTE_LIBRTE_DPAA2_USE_PHYS_IOVA
dma_map.iova = memseg[i].iova;
if (rte_eal_iova_mode() == RTE_IOVA_VA)
dma_map.iova = dma_map.vaddr;
else
dma_map.iova = memseg[i].iova;
#else
dma_map.iova = dma_map.vaddr;
#endif

View File

@ -250,13 +250,19 @@ enum qbman_fd_format {
#define DPAA2_EQ_RESP_ALWAYS 1
#ifdef RTE_LIBRTE_DPAA2_USE_PHYS_IOVA
extern uint8_t dpaa2_virt_mode;
static void *dpaa2_mem_ptov(phys_addr_t paddr) __attribute__((unused));
/* todo - this is costly, need to write a fast coversion routine */
static void *dpaa2_mem_ptov(phys_addr_t paddr)
{
const struct rte_memseg *memseg = rte_eal_get_physmem_layout();
const struct rte_memseg *memseg;
int i;
if (dpaa2_virt_mode)
return (void *)paddr;
memseg = rte_eal_get_physmem_layout();
for (i = 0; i < RTE_MAX_MEMSEG && memseg[i].addr_64 != 0; i++) {
if (paddr >= memseg[i].iova &&
(char *)paddr < (char *)memseg[i].iova + memseg[i].len)
@ -269,9 +275,14 @@ static void *dpaa2_mem_ptov(phys_addr_t paddr)
static phys_addr_t dpaa2_mem_vtop(uint64_t vaddr) __attribute__((unused));
static phys_addr_t dpaa2_mem_vtop(uint64_t vaddr)
{
const struct rte_memseg *memseg = rte_eal_get_physmem_layout();
const struct rte_memseg *memseg;
int i;
if (dpaa2_virt_mode)
return vaddr;
memseg = rte_eal_get_physmem_layout();
for (i = 0; i < RTE_MAX_MEMSEG && memseg[i].addr_64 != 0; i++) {
if (vaddr >= memseg[i].addr_64 &&
vaddr < memseg[i].addr_64 + memseg[i].len)

View File

@ -89,3 +89,10 @@ DPDK_17.11 {
rte_dpaa2_intr_enable;
} DPDK_17.08;
DPDK_18.02 {
global:
dpaa2_virt_mode;
} DPDK_17.11;

View File

@ -36,6 +36,9 @@ extern "C" {
#define FSLMC_OBJECT_MAX_LEN 32 /**< Length of each device on bus */
/** Device driver supports IOVA as VA */
#define RTE_DPAA2_DRV_IOVA_AS_VA 0X0040
struct rte_dpaa2_driver;
/* DPAA2 Device and Driver lists for FSLMC bus */

View File

@ -2394,6 +2394,7 @@ cryptodev_dpaa2_sec_remove(struct rte_dpaa2_device *dpaa2_dev)
}
static struct rte_dpaa2_driver rte_dpaa2_sec_driver = {
.drv_flags = RTE_DPAA2_DRV_IOVA_AS_VA,
.drv_type = DPAA2_CRYPTO,
.driver = {
.name = "DPAA2 SEC PMD"

View File

@ -1977,6 +1977,7 @@ rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
}
static struct rte_dpaa2_driver rte_dpaa2_pmd = {
.drv_flags = RTE_DPAA2_DRV_IOVA_AS_VA,
.drv_type = DPAA2_ETH,
.probe = rte_dpaa2_probe,
.remove = rte_dpaa2_remove,