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" <dev-boun...@dpdk.org> wrote on 08/31/2017 05:26:16 AM: > From: Santosh Shukla <santosh.shu...@caviumnetworks.com> > To: dev@dpdk.org > Cc: tho...@monjalon.net, jerin.ja...@caviumnetworks.com, > hemant.agra...@nxp.com, olivier.m...@6wind.com, > maxime.coque...@redhat.com, sergio.gonzalez.mon...@intel.com, > bruce.richard...@intel.com, shreyansh.j...@nxp.com, > gaetan.ri...@6wind.com, anatoly.bura...@intel.com, > step...@networkplumber.org, acon...@redhat.com, Santosh Shukla > <santosh.shu...@caviumnetworks.com> > 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" <dev-boun...@dpdk.org> > > Check iova mode and accordingly map iova to pa or va. > > Signed-off-by: Santosh Shukla <santosh.shu...@caviumnetworks.com> > Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com> > Reviewed-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > 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 >