From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753970AbbFECy6 (ORCPT ); Thu, 4 Jun 2015 22:54:58 -0400 Received: from mail-pa0-f50.google.com ([209.85.220.50]:34413 "EHLO mail-pa0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752486AbbFECy4 (ORCPT ); Thu, 4 Jun 2015 22:54:56 -0400 Message-ID: <55710F77.3080602@ozlabs.ru> Date: Fri, 05 Jun 2015 12:54:47 +1000 From: Alexey Kardashevskiy User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Gavin Shan CC: linuxppc-dev@lists.ozlabs.org, Alex Williamson , Benjamin Herrenschmidt , David Gibson , Paul Mackerras , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH kernel v11 21/34] powerpc/powernv/ioda2: Add TCE invalidation for all attached groups References: <1432889098-22924-1-git-send-email-aik@ozlabs.ru> <1432889098-22924-22-git-send-email-aik@ozlabs.ru> <20150605002748.GB17429@gwshan> In-Reply-To: <20150605002748.GB17429@gwshan> Content-Type: text/plain; charset=koi8-r; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/05/2015 10:27 AM, Gavin Shan wrote: > On Fri, May 29, 2015 at 06:44:45PM +1000, Alexey Kardashevskiy wrote: >> The iommu_table struct keeps a list of IOMMU groups it is used for. >> At the moment there is just a single group attached but further >> patches will add TCE table sharing. When sharing is enabled, TCE cache >> in each PE needs to be invalidated so does the patch. >> >> This does not change pnv_pci_ioda1_tce_invalidate() as there is no plan >> to enable TCE table sharing on PHBs older than IODA2. >> >> Signed-off-by: Alexey Kardashevskiy > > Reviewed-by: Gavin Shan > >> --- >> Changes: >> v10: >> * new to the series >> --- >> arch/powerpc/platforms/powernv/pci-ioda.c | 35 ++++++++++++++++++++----------- >> 1 file changed, 23 insertions(+), 12 deletions(-) >> >> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c >> index 3fd8b18..94fccc8 100644 >> --- a/arch/powerpc/platforms/powernv/pci-ioda.c >> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c >> @@ -24,6 +24,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> #include >> @@ -1764,23 +1765,15 @@ static inline void pnv_pci_ioda2_tce_invalidate_entire(struct pnv_ioda_pe *pe) >> __raw_writeq(cpu_to_be64(val), phb->ioda.tce_inval_reg); >> } >> >> -static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl, >> - unsigned long index, unsigned long npages, bool rm) >> +static void pnv_pci_ioda2_tce_do_invalidate(unsigned pe_number, bool rm, >> + __be64 __iomem *invalidate, unsigned shift, >> + unsigned long index, unsigned long npages) > > The better function name would be: pnv_pci_ioda2_do_tce_invalidate(), and Ok. > it seems we needn't "bool rm" any more since "invalidate" has been assigned > with virtual/real address by caller. We still need @rm here as different helpers are used for real and virt modes - __raw_rm_writeq and __raw_writeq. > > Thanks, > Gavin > >> { >> - struct iommu_table_group_link *tgl = list_first_entry_or_null( >> - &tbl->it_group_list, struct iommu_table_group_link, >> - next); >> - struct pnv_ioda_pe *pe = container_of(tgl->table_group, >> - struct pnv_ioda_pe, table_group); >> unsigned long start, end, inc; >> - __be64 __iomem *invalidate = rm ? >> - (__be64 __iomem *)pe->phb->ioda.tce_inval_reg_phys : >> - pe->phb->ioda.tce_inval_reg; >> - const unsigned shift = tbl->it_page_shift; >> >> /* We'll invalidate DMA address in PE scope */ >> start = 0x2ull << 60; >> - start |= (pe->pe_number & 0xFF); >> + start |= (pe_number & 0xFF); >> end = start; >> >> /* Figure out the start, end and step */ >> @@ -1798,6 +1791,24 @@ static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl, >> } >> } >> >> +static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl, >> + unsigned long index, unsigned long npages, bool rm) >> +{ >> + struct iommu_table_group_link *tgl; >> + >> + list_for_each_entry_rcu(tgl, &tbl->it_group_list, next) { >> + struct pnv_ioda_pe *pe = container_of(tgl->table_group, >> + struct pnv_ioda_pe, table_group); >> + __be64 __iomem *invalidate = rm ? >> + (__be64 __iomem *)pe->phb->ioda.tce_inval_reg_phys : >> + pe->phb->ioda.tce_inval_reg; >> + >> + pnv_pci_ioda2_tce_do_invalidate(pe->pe_number, rm, >> + invalidate, tbl->it_page_shift, >> + index, npages); >> + } >> +} >> + >> static int pnv_ioda2_tce_build(struct iommu_table *tbl, long index, >> long npages, unsigned long uaddr, >> enum dma_data_direction direction, >> -- >> 2.4.0.rc3.8.gfb3e7d5 >> > -- Alexey