Hi @all I just stumbled upon this patch while testing on POWER. RTE_IOVA_VA will not work for the sPAPR code since the dma window size is currently determined by the physical address only. I'm preparing a patch to address this.
Thanks, Jonas "dev" <[email protected]> wrote on 08/31/2017 05:26:16 AM: > From: Santosh Shukla <[email protected]> > To: [email protected] > Cc: [email protected], [email protected], > [email protected], [email protected], > [email protected], [email protected], > [email protected], [email protected], > [email protected], [email protected], > [email protected], [email protected], Santosh Shukla > <[email protected]> > Date: 08/31/2017 05:28 AM > Subject: [dpdk-dev] [PATCH v7 7/9] linuxapp/eal_vfio: honor iova > mode before mapping > Sent by: "dev" <[email protected]> > > Check iova mode and accordingly map iova to pa or va. > > Signed-off-by: Santosh Shukla <[email protected]> > Signed-off-by: Jerin Jacob <[email protected]> > Reviewed-by: Maxime Coquelin <[email protected]> > --- > lib/librte_eal/linuxapp/eal/eal_vfio.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/ > librte_eal/linuxapp/eal/eal_vfio.c > index c8a97b7e7..b32cd09a2 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_vfio.c > +++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c > @@ -706,7 +706,10 @@ vfio_type1_dma_map(int vfio_container_fd) > dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map); > dma_map.vaddr = ms[i].addr_64; > dma_map.size = ms[i].len; > - dma_map.iova = ms[i].phys_addr; > + if (rte_eal_iova_mode() == RTE_IOVA_VA) > + dma_map.iova = dma_map.vaddr; > + else > + dma_map.iova = ms[i].phys_addr; > dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE; > > ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map); > @@ -792,7 +795,10 @@ vfio_spapr_dma_map(int vfio_container_fd) > dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map); > dma_map.vaddr = ms[i].addr_64; > dma_map.size = ms[i].len; > - dma_map.iova = ms[i].phys_addr; > + if (rte_eal_iova_mode() == RTE_IOVA_VA) > + dma_map.iova = dma_map.vaddr; > + else > + dma_map.iova = ms[i].phys_addr; > dma_map.flags = VFIO_DMA_MAP_FLAG_READ | > VFIO_DMA_MAP_FLAG_WRITE; > > -- > 2.13.0 >

