From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A6DBCC30653 for ; Tue, 25 Jun 2024 11:27:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=tfDd5bVGlZ3bO7ERdewY0eL5fBgvsY9Nm6laeeqxjOc=; b=0TsGEkTsYjQtnSE7ETFcs2jL/Z wc5KbNDY9bQ5LNyQYe9eZaxg/Sv/W/jBGwJLfZn/0iKPh2UJpDWHZ7oUEAeiRpTjwItkIj5Gcwlkq regYCvHCB9Rp5XZdrNz3t3mBwpPklFuf9p62yzs/G00qLqJ4ybKXR9D3ZYJ4eoQWV5DW4TCyBpWw/ MWEapUl0DVEzPxOEtldZ2y8jIOjR2mPDcqzcAMd+UrKwEcLBYjfcy/eMQUqhkRsZJtA5rs7GFyfZ8 8Yb/NxXy+q6h96CebStMtYJigJYaU8/FL6GplKT8yzI9e3nkst+xiIRH3BLG0v9pq9dzLizcDhDG6 +mBuljcg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sM4KU-00000002XZB-34KQ; Tue, 25 Jun 2024 11:27:18 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sM4KO-00000002XY8-2DDn for linux-arm-kernel@lists.infradead.org; Tue, 25 Jun 2024 11:27:14 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id B421ECE175D; Tue, 25 Jun 2024 11:27:10 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8153FC32781; Tue, 25 Jun 2024 11:27:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719314830; bh=zzrLgFHfkFUFx4FQA7l293B59+LWvaKIkSGrLRG/HoQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=vLSaoF5j3kRrpHLLGQOBjKAy8fabqTMjHscooWo+Cf0qVlm97HWZ4lcUHD2ltKPKr kVuMSIOGw7aaRJiXZG4t++d6Lz5tkAkMhuwK1MvbhK5yryIewBLyc2YJiwGWNnMol+ K0cnvR7u7zNUhuTLY8P7SLGHuq13WRfUCGJyymzVdHfN+0s9MllWZ2HDBmYI/ARd2n AV2qttBwbzZGzK5Pl39knyr0JpHaASLq9cOF1NuSWNGwwzNQQWdeowXbIEE7cc0ENz q0Jh+K1YcITaJ5Yg3cfKWHqbKIlM+CZ0Yacw8HhAz0aTucwFaE8AoF5RMLSCOUMlHf OaNOFFDWlcy5g== Date: Tue, 25 Jun 2024 12:27:04 +0100 From: Will Deacon To: Rob Clark Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Rob Clark , Robin Murphy , Joerg Roedel , Jason Gunthorpe , Boris Brezillon , Kevin Tian , Joao Martins , "moderated list:ARM SMMU DRIVERS" , "open list:IOMMU SUBSYSTEM" , open list Subject: Re: [PATCH v4 1/2] iommu/io-pgtable-arm: Add way to debug pgtable walk Message-ID: <20240625112703.GA10175@willie-the-truck> References: <20240523175227.117984-1-robdclark@gmail.com> <20240523175227.117984-2-robdclark@gmail.com> <20240624151401.GB8706@willie-the-truck> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240625_042712_943908_9E6A8E74 X-CRM114-Status: GOOD ( 27.39 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Mon, Jun 24, 2024 at 08:37:26AM -0700, Rob Clark wrote: > On Mon, Jun 24, 2024 at 8:14 AM Will Deacon wrote: > > > > On Thu, May 23, 2024 at 10:52:21AM -0700, Rob Clark wrote: > > > From: Rob Clark > > > > > > Add an io-pgtable method to walk the pgtable returning the raw PTEs that > > > would be traversed for a given iova access. > > > > > > Signed-off-by: Rob Clark > > > --- > > > drivers/iommu/io-pgtable-arm.c | 51 ++++++++++++++++++++++++++++------ > > > include/linux/io-pgtable.h | 4 +++ > > > 2 files changed, 46 insertions(+), 9 deletions(-) > > > > > > diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c > > > index f7828a7aad41..f47a0e64bb35 100644 > > > --- a/drivers/iommu/io-pgtable-arm.c > > > +++ b/drivers/iommu/io-pgtable-arm.c > > > @@ -693,17 +693,19 @@ static size_t arm_lpae_unmap_pages(struct io_pgtable_ops *ops, unsigned long iov > > > data->start_level, ptep); > > > } > > > > > > -static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, > > > - unsigned long iova) > > > +static int arm_lpae_pgtable_walk(struct io_pgtable_ops *ops, unsigned long iova, > > > + int (*cb)(void *cb_data, void *pte, int level), > > > + void *cb_data) > > > { > > > struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops); > > > arm_lpae_iopte pte, *ptep = data->pgd; > > > int lvl = data->start_level; > > > + int ret; > > > > > > do { > > > /* Valid IOPTE pointer? */ > > > if (!ptep) > > > - return 0; > > > + return -EFAULT; > > > > nit: -ENOENT might be a little better, as we're only checking against a > > NULL entry rather than strictly any faulting entry. > > > > > /* Grab the IOPTE we're interested in */ > > > ptep += ARM_LPAE_LVL_IDX(iova, lvl, data); > > > @@ -711,22 +713,52 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, > > > > > > /* Valid entry? */ > > > if (!pte) > > > - return 0; > > > + return -EFAULT; > > > > Same here (and at the end of the function). > > > > > + > > > + ret = cb(cb_data, &pte, lvl); > > > > Since pte is on the stack, rather than pointing into the actual pgtable, > > I think it would be clearer to pass it by value to the callback. > > fwiw, I passed it as a void* to avoid the pte size.. although I guess > it could be a union of all the possible pte types Can you just get away with a u64? Will