From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59034) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XGoIk-0004Vy-SR for qemu-devel@nongnu.org; Mon, 11 Aug 2014 08:02:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XGoIe-0001n3-K0 for qemu-devel@nongnu.org; Mon, 11 Aug 2014 08:02:10 -0400 Message-ID: <53E8B0BB.60006@suse.de> Date: Mon, 11 Aug 2014 14:02:03 +0200 From: Alexander Graf MIME-Version: 1.0 References: <1406799254-25223-1-git-send-email-aik@ozlabs.ru> <1406799254-25223-10-git-send-email-aik@ozlabs.ru> In-Reply-To: <1406799254-25223-10-git-send-email-aik@ozlabs.ru> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH 09/10] spapr_pci_vfio: Enable DDW List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy , qemu-devel@nongnu.org Cc: Alex Williamson , qemu-ppc@nongnu.org On 31.07.14 11:34, Alexey Kardashevskiy wrote: > This implements DDW for VFIO. Host kernel support is required for this. > > Signed-off-by: Alexey Kardashevskiy > --- > hw/ppc/spapr_pci_vfio.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 75 insertions(+) > > diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c > index d3bddf2..dc443e2 100644 > --- a/hw/ppc/spapr_pci_vfio.c > +++ b/hw/ppc/spapr_pci_vfio.c > @@ -69,6 +69,77 @@ static void spapr_phb_vfio_finish_realize(sPAPRPHBState *sphb, Error **errp) > /* Register default 32bit DMA window */ > memory_region_add_subregion(&sphb->iommu_root, tcet->bus_offset, > spapr_tce_get_iommu(tcet)); > + > + sphb->ddw_supported = !!(info.flags & VFIO_IOMMU_SPAPR_TCE_FLAG_DDW); > +} > + > +static int spapr_pci_vfio_ddw_query(sPAPRPHBState *sphb, > + uint32_t *windows_available, > + uint32_t *page_size_mask) > +{ > + sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); > + struct vfio_iommu_spapr_tce_query query = { .argsz = sizeof(query) }; > + int ret; > + > + ret = vfio_container_ioctl(&sphb->iommu_as, svphb->iommugroupid, > + VFIO_IOMMU_SPAPR_TCE_QUERY, &query); > + if (ret) { > + return ret; > + } > + > + *windows_available = query.windows_available; > + *page_size_mask = query.page_size_mask; > + > + return ret; > +} > + > +static int spapr_pci_vfio_ddw_create(sPAPRPHBState *sphb, uint32_t page_shift, > + uint32_t window_shift, uint32_t liobn, > + sPAPRTCETable **ptcet) > +{ > + sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); > + struct vfio_iommu_spapr_tce_create create = { > + .argsz = sizeof(create), > + .page_shift = page_shift, > + .window_shift = window_shift, > + .start_addr = 0 > + }; > + int ret; > + > + ret = vfio_container_ioctl(&sphb->iommu_as, svphb->iommugroupid, > + VFIO_IOMMU_SPAPR_TCE_CREATE, &create); > + if (ret) { > + return ret; > + } > + > + *ptcet = spapr_tce_new_table(DEVICE(sphb), liobn, create.start_addr, > + page_shift, 1 << (window_shift - page_shift), I spot a 1 without ULL again - this time it might work out ok, but please just always use ULL when you pass around addresses. Please walk me though the abstraction levels on what each page size honoration means. If I use THP, what page size granularity can I use for TCE entries? Alex