Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp4559091imw; Tue, 12 Jul 2022 10:01:17 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sbB5x09GgDAIS8rGiveRuKtCB71uKjxm4y7DMS5WxjLGcg5mcwwVFYRsI2n3B+DOolAs0x X-Received: by 2002:a17:906:ef8b:b0:72b:45a2:2232 with SMTP id ze11-20020a170906ef8b00b0072b45a22232mr15564160ejb.484.1657645276994; Tue, 12 Jul 2022 10:01:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657645276; cv=none; d=google.com; s=arc-20160816; b=HGnaxD0EaaT7omjWdy8rgQgbYVCMellbO5OYIlh5u1pEFi7nKzx9C6EW5Uf+6woqrr fDTSvjFFo1JP6+ghkhUrg7Gcw1hFDoqEByxibWtpEN6egO+MGAKEE7AJltbJpC7oxXZf EvdWSIZdbdiS+meYQ+tXXnfzMzSdh2Bxrl/ldySeDxmhoOBN8eL02podMs228uzGlgon DW9U5XGR6BQqT9KJMIANkK6yAnU2y/bWxooufY5vqGdN8gRrRAdBShGMBPSOTkaRoiJ9 RlRJrwNZNv2TMqPKvv14IHqb+46NbKgrqHHqHTCImG59yGlovdIwGOAabjXIpMQEuq/A pAqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:cms-type:content-transfer-encoding :in-reply-to:from:cc:to:content-language:subject:user-agent :mime-version:date:message-id:dkim-signature:dkim-filter; bh=NJt7nZ2HQ656KF0F/OFwNRnrm4HZdikHfEPoDRU4JP4=; b=eOkxRBG6lb/TavJRVtPresChPzw1KsqpInDR6TEPR04BvCgQEaPVZcu2CSL8cAxV0C 3Xz9j+amZRQw5AJkOV8YXNu/7EFIm/gmkJKrxkM7HsblLCkEMixk9Ew1QMx57MW59H5n xV3p5QLhqIG3/Z0rDfPLMUkkp+yKfIzNqIDchtXRAcDjTXx0/SAV/T94g71XLQu79/jc eM5rfUBeZ6X6/QFRBI44OXAz/4+V5DqFX0js9UolLaBrMG33oTOwoAPh8JAKzbb5RK27 Yplh0tYcD2fRYIxqGBhMGmpqJckAESff6HWWoJBy1S+aIEeHb+1kNpp2AMU6YqIktssS OjzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=sazKX9XC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h19-20020a0564020e9300b0042e0b28922asi13745143eda.7.2022.07.12.10.00.47; Tue, 12 Jul 2022 10:01:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=sazKX9XC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232831AbiGLPoA (ORCPT + 99 others); Tue, 12 Jul 2022 11:44:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229813AbiGLPn5 (ORCPT ); Tue, 12 Jul 2022 11:43:57 -0400 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A60D9BB7E4 for ; Tue, 12 Jul 2022 08:43:55 -0700 (PDT) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20220712154354euoutp012cc6abdc19102ce7d025a3f725983957~BH1-jXqRc2545725457euoutp01J for ; Tue, 12 Jul 2022 15:43:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20220712154354euoutp012cc6abdc19102ce7d025a3f725983957~BH1-jXqRc2545725457euoutp01J DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1657640634; bh=NJt7nZ2HQ656KF0F/OFwNRnrm4HZdikHfEPoDRU4JP4=; h=Date:Subject:To:Cc:From:In-Reply-To:References:From; b=sazKX9XCZrc48fzTcdeT0kyY/uTpqdLEMW7OdQLPKcSqkmu4nyKI2cUuZDs1A/lqu XRRFFsJ6cT8Y18UELsHoYW/MUMyPmTfRc/ECmPTzzg8MdAlhe4u4TJo37XitQK9Xsx omYYOso1Nw/pxj42ceFum4s2TIn7+Q6JsEkIQtoo= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20220712154354eucas1p2d97c3e4f252bbfee44d0e3a67ec69439~BH1-Rpt3R2077320773eucas1p2H; Tue, 12 Jul 2022 15:43:54 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 31.DD.09580.AB69DC26; Tue, 12 Jul 2022 16:43:54 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20220712154353eucas1p29b1f000b81193fd4e8db445745787c18~BH1_ze6HL2495424954eucas1p2P; Tue, 12 Jul 2022 15:43:53 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20220712154353eusmtrp2b3fc49efa65d614bf0d1dafb4ca352f1~BH1_yhPfr0891508915eusmtrp2u; Tue, 12 Jul 2022 15:43:53 +0000 (GMT) X-AuditID: cbfec7f5-9c3ff7000000256c-cb-62cd96ba8df4 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id ED.7F.09095.9B69DC26; Tue, 12 Jul 2022 16:43:53 +0100 (BST) Received: from [106.210.134.192] (unknown [106.210.134.192]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20220712154352eusmtip27bf3672ea67b7091b079f1263a2a85d3~BH1_AJ2oO1504615046eusmtip2N; Tue, 12 Jul 2022 15:43:52 +0000 (GMT) Message-ID: <8810c840-3eeb-42f3-3975-e79d73548098@samsung.com> Date: Tue, 12 Jul 2022 17:43:52 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 Subject: Re: [PATCH v2 4/7] iommu/exynos: Use lookup based approach to access registers Content-Language: en-US To: Sam Protsenko , Krzysztof Kozlowski Cc: Joerg Roedel , Will Deacon , Robin Murphy , Janghyuck Kim , Cho KyongHo , Daniel Mentz , David Virag , Sumit Semwal , iommu@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org From: Marek Szyprowski In-Reply-To: <20220710230603.13526-5-semen.protsenko@linaro.org> Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrIKsWRmVeSWpSXmKPExsWy7djPc7q7pp1NMuh7zW4xoaOVyeLXFwuL zXOKLTpnb2C32Pt6K7vFpsfXWC0u75rDZjHj/D4mi3+9BxktDn54wmrxvA/IPXX3M7vF8feP GS1a7pg68Hk8OTiPyWPNvDWMHjtn3WX3WLCp1GPTqk42jzvX9rB5bF5S7/Fi80xGj74tqxg9 Pm+SC+CK4rJJSc3JLEst0rdL4Mp40jmFuWBqVMWaGQ9ZGhhb3bsYOTkkBEwkPnXPYQaxhQRW MEo86+DtYuQCsr8wSjRMPcYE4XxmlOjsXMgM03Hy6lY2iI7ljBIXJ7pBFH1klLh1bzoLSIJX wE7idft7oAYODhYBVYmfp9wgwoISJ2c+ASsRFUiWOHf2KtgcYYFIiU0HTrKC2MwC4hK3nsxn ArFFBNIkrv67zwoyn1lgB7PE1zk3wZrZBAwlut52gTVzCjhI3Jy1BqpZXmL7W5B3uIAOXc0p sfHgHnaIq10kvjy9yARhC0u8Or4FKi4j8X8nyDYOIDtf4u8MY4hwhcS112ugHraWuHPuFxtI CbOApsT6XfoQYUeJLd1dLBCdfBI33gpCXMAnMWnbdGaIMK9ER5sQRLWaxKzj6+B2HrxwiXkC o9IspECZheT5WUh+mYWwdwEjyypG8dTS4tz01GLjvNRyveLE3OLSvHS95PzcTYzAVHf63/Gv OxhXvPqod4iRiYPxEKMEB7OSCO+fs6eShHhTEiurUovy44tKc1KLDzFKc7AoifMmZ25IFBJI TyxJzU5NLUgtgskycXBKNTAFGb7fpz0lWabUw/So7RflsIX1rnP+tb6xndyi/VbK6r/jEpbr 56pqk6LjlOe8fVK2cm+Iomw4g6mZSZvViapb1nEsSvPPTA05v0JedcvNBrl8R/UMYdO5fXbH WLWPGhd/d/Dd1SrL475VV4jRuTipfFVZ7PJt+55Gbm5xW/p13pmQKd5eSolzeT33vM1YvoRT 4a7xcm2GioanLsqT9u2UmznP6P/dZ6mdr9fs6WiWWKci+NN3ztSC1trGnre5IlOqOb6/fWHo fG9Pz76pVyTnO75Y0X7v8Z2zuxqjrTTvlZa7P/Wa9k7od9G1pRd9E359m7+5sazvj05SQwX/ x+euRs5/YvXFlr6VvlXLo6jEUpyRaKjFXFScCADRvHg25AMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrOIsWRmVeSWpSXmKPExsVy+t/xe7o7p51NMmjsV7WY0NHKZPHri4XF 5jnFFp2zN7Bb7H29ld1i0+NrrBaXd81hs5hxfh+Txb/eg4wWBz88YbV43gfknrr7md3i+PvH jBYtd0wd+DyeHJzH5LFm3hpGj52z7rJ7LNhU6rFpVSebx51re9g8Ni+p93ixeSajR9+WVYwe nzfJBXBF6dkU5ZeWpCpk5BeX2CpFG1oY6RlaWugZmVjqGRqbx1oZmSrp29mkpOZklqUW6dsl 6GU86ZzCXDA1qmLNjIcsDYyt7l2MnBwSAiYSJ69uZeti5OIQEljKKPGtaRkzREJG4uS0BlYI W1jiz7UuNhBbSOA9o8T5swIgNq+AncTr9vdA9RwcLAKqEj9PuUGEBSVOznzCAmKLCiRLNG85 xARiCwtESjw+uQDMZhYQl7j1ZD6YLSKQJrFv0mtGkBuYBXYxS/S0vWKBOOgko8T7tRvAqtgE DCW63kIcwSngIHFz1hpWiElmEl1buxghbHmJ7W/nME9gFJqF5JBZSBbOQtIyC0nLAkaWVYwi qaXFuem5xYZ6xYm5xaV56XrJ+bmbGIExvu3Yz807GOe9+qh3iJGJg/EQowQHs5II75+zp5KE eFMSK6tSi/Lji0pzUosPMZoCA2Mis5Rocj4wyeSVxBuaGZgamphZGphamhkrifN6FnQkCgmk J5akZqemFqQWwfQxcXBKNTAl3nBM5ruUYallUyHDk8y/q58jITnBL5n13tZNRXezMg07Zf+1 b06zXme/J+F0wY1Obr4tZ2b7fpY6wC35vq5yop1qftrhez2Gu9P6PucwtS3nv/t3gq5kWVGv 66SgxBWiM1IfZFVYyssbTzG/a3npRvAVm7hOG9ZTW66seVnw3CCRofWglKtwsjHPjqV/u1eH bJ3hJufy4v/ypXeS958M7hBnusrtx7cqaUJue/XDRXcPh+Yc5JbNX8vtqqwu2nhevFFG8fys xW9mbDihnJgQuidBW6KGc8/2KHEzV4Xd1w/NzKw4GNNQcZd/YfqcmT8y7U/OnGl+eu15tZUP j5se32Kk1l0owPsvzYNxhRJLcUaioRZzUXEiAALLfS56AwAA X-CMS-MailID: 20220712154353eucas1p29b1f000b81193fd4e8db445745787c18 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20220710230616eucas1p2f8b4f6ed183b44076e849c016bf226eb X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20220710230616eucas1p2f8b4f6ed183b44076e849c016bf226eb References: <20220710230603.13526-1-semen.protsenko@linaro.org> <20220710230603.13526-5-semen.protsenko@linaro.org> X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_HI,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 11.07.2022 01:06, Sam Protsenko wrote: > At the moment the driver supports SysMMU v1..v5 versions. SysMMU v5 has > different register layout than SysMMU v1..v3. Instead of checking the > version each time before reading/writing the registers, let's create > corresponding register table for each SysMMU version and set the needed > table on init, checking the SysMMU version one single time. This way is > faster and more elegant. > > No functional change here, just a refactoring patch. > > Signed-off-by: Sam Protsenko Acked-by: Marek Szyprowski > --- > Changes in v2: > - Reworked existing code (SysMMU v1..v5) to use this approach > - Extracted v7 registers to the separate patches > - Replaced MMU_REG() with corresponding SysMMU read/write functions > - Improved the comment for 0x1 offsets triggering an unaligned access > exception > - Removed support for VMID number, as only VMID=0 (default) is used > for now > - Renamed register index names to reflect the old SysMMU version > register names > > drivers/iommu/exynos-iommu.c | 141 ++++++++++++++++++++++------------- > 1 file changed, 90 insertions(+), 51 deletions(-) > > diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c > index 494f7d7aa9c5..0cb1ce10db51 100644 > --- a/drivers/iommu/exynos-iommu.c > +++ b/drivers/iommu/exynos-iommu.c > @@ -136,9 +136,6 @@ static u32 lv2ent_offset(sysmmu_iova_t iova) > #define CFG_FLPDCACHE (1 << 20) /* System MMU 3.2+ only */ > > /* common registers */ > -#define REG_MMU_CTRL 0x000 > -#define REG_MMU_CFG 0x004 > -#define REG_MMU_STATUS 0x008 > #define REG_MMU_VERSION 0x034 > > #define MMU_MAJ_VER(val) ((val) >> 7) > @@ -148,31 +145,57 @@ static u32 lv2ent_offset(sysmmu_iova_t iova) > #define MAKE_MMU_VER(maj, min) ((((maj) & 0xF) << 7) | ((min) & 0x7F)) > > /* v1.x - v3.x registers */ > -#define REG_MMU_FLUSH 0x00C > -#define REG_MMU_FLUSH_ENTRY 0x010 > -#define REG_PT_BASE_ADDR 0x014 > -#define REG_INT_STATUS 0x018 > -#define REG_INT_CLEAR 0x01C > - > #define REG_PAGE_FAULT_ADDR 0x024 > #define REG_AW_FAULT_ADDR 0x028 > #define REG_AR_FAULT_ADDR 0x02C > #define REG_DEFAULT_SLAVE_ADDR 0x030 > > /* v5.x registers */ > -#define REG_V5_PT_BASE_PFN 0x00C > -#define REG_V5_MMU_FLUSH_ALL 0x010 > -#define REG_V5_MMU_FLUSH_ENTRY 0x014 > -#define REG_V5_MMU_FLUSH_RANGE 0x018 > -#define REG_V5_MMU_FLUSH_START 0x020 > -#define REG_V5_MMU_FLUSH_END 0x024 > -#define REG_V5_INT_STATUS 0x060 > -#define REG_V5_INT_CLEAR 0x064 > #define REG_V5_FAULT_AR_VA 0x070 > #define REG_V5_FAULT_AW_VA 0x080 > > #define has_sysmmu(dev) (dev_iommu_priv_get(dev) != NULL) > > +enum { > + REG_SET_V1, > + REG_SET_V5, > + MAX_REG_SET > +}; > + > +enum { > + IDX_CTRL, > + IDX_CFG, > + IDX_STATUS, > + IDX_PT_BASE, > + IDX_FLUSH_ALL, > + IDX_FLUSH_ENTRY, > + IDX_FLUSH_RANGE, > + IDX_FLUSH_START, > + IDX_FLUSH_END, > + IDX_INT_STATUS, > + IDX_INT_CLEAR, > + MAX_REG_IDX > +}; > + > +/* > + * Some SysMMU versions might not implement some registers from this set, thus > + * those registers shouldn't be accessed. Set the offsets for those registers to > + * 0x1 to trigger an unaligned access exception, which can help one to debug > + * related issues. > + */ > +static const unsigned int sysmmu_regs[MAX_REG_SET][MAX_REG_IDX] = { > + /* SysMMU v1..v3 */ > + { > + 0x00, 0x04, 0x08, 0x14, 0x0c, 0x10, 0x1, 0x1, 0x1, > + 0x18, 0x1c, > + }, > + /* SysMMU v5 */ > + { > + 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, 0x18, 0x20, 0x24, > + 0x60, 0x64, > + }, > +}; > + > static struct device *dma_dev; > static struct kmem_cache *lv2table_kmem_cache; > static sysmmu_pte_t *zero_lv2_table; > @@ -274,6 +297,7 @@ struct sysmmu_drvdata { > unsigned int version; /* our version */ > > struct iommu_device iommu; /* IOMMU core handle */ > + const unsigned int *regs; /* register set */ > }; > > static struct exynos_iommu_domain *to_exynos_domain(struct iommu_domain *dom) > @@ -281,20 +305,30 @@ static struct exynos_iommu_domain *to_exynos_domain(struct iommu_domain *dom) > return container_of(dom, struct exynos_iommu_domain, domain); > } > > +static void sysmmu_write(struct sysmmu_drvdata *data, size_t idx, u32 val) > +{ > + writel(val, data->sfrbase + data->regs[idx]); > +} > + > +static u32 sysmmu_read(struct sysmmu_drvdata *data, size_t idx) > +{ > + return readl(data->sfrbase + data->regs[idx]); > +} > + > static void sysmmu_unblock(struct sysmmu_drvdata *data) > { > - writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL); > + sysmmu_write(data, IDX_CTRL, CTRL_ENABLE); > } > > static bool sysmmu_block(struct sysmmu_drvdata *data) > { > int i = 120; > > - writel(CTRL_BLOCK, data->sfrbase + REG_MMU_CTRL); > - while ((i > 0) && !(readl(data->sfrbase + REG_MMU_STATUS) & 1)) > + sysmmu_write(data, IDX_CTRL, CTRL_BLOCK); > + while (i > 0 && !(sysmmu_read(data, IDX_STATUS) & 0x1)) > --i; > > - if (!(readl(data->sfrbase + REG_MMU_STATUS) & 1)) { > + if (!(sysmmu_read(data, IDX_STATUS) & 0x1)) { > sysmmu_unblock(data); > return false; > } > @@ -304,10 +338,7 @@ static bool sysmmu_block(struct sysmmu_drvdata *data) > > static void __sysmmu_tlb_invalidate(struct sysmmu_drvdata *data) > { > - if (MMU_MAJ_VER(data->version) < 5) > - writel(0x1, data->sfrbase + REG_MMU_FLUSH); > - else > - writel(0x1, data->sfrbase + REG_V5_MMU_FLUSH_ALL); > + sysmmu_write(data, IDX_FLUSH_ALL, 0x1); > } > > static void __sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data, > @@ -317,31 +348,33 @@ static void __sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data, > > if (MMU_MAJ_VER(data->version) < 5) { > for (i = 0; i < num_inv; i++) { > - writel((iova & SPAGE_MASK) | 1, > - data->sfrbase + REG_MMU_FLUSH_ENTRY); > + sysmmu_write(data, IDX_FLUSH_ENTRY, > + (iova & SPAGE_MASK) | 0x1); > iova += SPAGE_SIZE; > } > } else { > if (num_inv == 1) { > - writel((iova & SPAGE_MASK) | 1, > - data->sfrbase + REG_V5_MMU_FLUSH_ENTRY); > + sysmmu_write(data, IDX_FLUSH_ENTRY, > + (iova & SPAGE_MASK) | 0x1); > } else { > - writel((iova & SPAGE_MASK), > - data->sfrbase + REG_V5_MMU_FLUSH_START); > - writel((iova & SPAGE_MASK) + (num_inv - 1) * SPAGE_SIZE, > - data->sfrbase + REG_V5_MMU_FLUSH_END); > - writel(1, data->sfrbase + REG_V5_MMU_FLUSH_RANGE); > + sysmmu_write(data, IDX_FLUSH_START, iova & SPAGE_MASK); > + sysmmu_write(data, IDX_FLUSH_END, (iova & SPAGE_MASK) + > + (num_inv - 1) * SPAGE_SIZE); > + sysmmu_write(data, IDX_FLUSH_RANGE, 0x1); > } > } > } > > static void __sysmmu_set_ptbase(struct sysmmu_drvdata *data, phys_addr_t pgd) > { > + u32 pt_base; > + > if (MMU_MAJ_VER(data->version) < 5) > - writel(pgd, data->sfrbase + REG_PT_BASE_ADDR); > + pt_base = pgd; > else > - writel(pgd >> SPAGE_ORDER, data->sfrbase + REG_V5_PT_BASE_PFN); > + pt_base = pgd >> SPAGE_ORDER; > > + sysmmu_write(data, IDX_PT_BASE, pt_base); > __sysmmu_tlb_invalidate(data); > } > > @@ -365,8 +398,7 @@ static void __sysmmu_get_version(struct sysmmu_drvdata *data) > { > u32 ver; > > - __sysmmu_enable_clocks(data); > - > + /* Don't use sysmmu_read() here, as data->regs is not set yet */ > ver = readl(data->sfrbase + REG_MMU_VERSION); > > /* controllers on some SoCs don't report proper version */ > @@ -377,6 +409,17 @@ static void __sysmmu_get_version(struct sysmmu_drvdata *data) > > dev_dbg(data->sysmmu, "hardware version: %d.%d\n", > MMU_MAJ_VER(data->version), MMU_MIN_VER(data->version)); > +} > + > +static void sysmmu_get_hw_info(struct sysmmu_drvdata *data) > +{ > + __sysmmu_enable_clocks(data); > + > + __sysmmu_get_version(data); > + if (MMU_MAJ_VER(data->version) < 5) > + data->regs = sysmmu_regs[REG_SET_V1]; > + else > + data->regs = sysmmu_regs[REG_SET_V5]; > > __sysmmu_disable_clocks(data); > } > @@ -405,19 +448,14 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id) > const struct sysmmu_fault_info *finfo; > unsigned int i, n, itype; > sysmmu_iova_t fault_addr; > - unsigned short reg_status, reg_clear; > int ret = -ENOSYS; > > WARN_ON(!data->active); > > if (MMU_MAJ_VER(data->version) < 5) { > - reg_status = REG_INT_STATUS; > - reg_clear = REG_INT_CLEAR; > finfo = sysmmu_faults; > n = ARRAY_SIZE(sysmmu_faults); > } else { > - reg_status = REG_V5_INT_STATUS; > - reg_clear = REG_V5_INT_CLEAR; > finfo = sysmmu_v5_faults; > n = ARRAY_SIZE(sysmmu_v5_faults); > } > @@ -426,7 +464,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id) > > clk_enable(data->clk_master); > > - itype = __ffs(readl(data->sfrbase + reg_status)); > + itype = __ffs(sysmmu_read(data, IDX_INT_STATUS)); > for (i = 0; i < n; i++, finfo++) > if (finfo->bit == itype) > break; > @@ -443,7 +481,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id) > /* fault is not recovered by fault handler */ > BUG_ON(ret != 0); > > - writel(1 << itype, data->sfrbase + reg_clear); > + sysmmu_write(data, IDX_INT_CLEAR, 1 << itype); > > sysmmu_unblock(data); > > @@ -461,8 +499,8 @@ static void __sysmmu_disable(struct sysmmu_drvdata *data) > clk_enable(data->clk_master); > > spin_lock_irqsave(&data->lock, flags); > - writel(CTRL_DISABLE, data->sfrbase + REG_MMU_CTRL); > - writel(0, data->sfrbase + REG_MMU_CFG); > + sysmmu_write(data, IDX_CTRL, CTRL_DISABLE); > + sysmmu_write(data, IDX_CFG, 0x0); > data->active = false; > spin_unlock_irqrestore(&data->lock, flags); > > @@ -482,7 +520,7 @@ static void __sysmmu_init_config(struct sysmmu_drvdata *data) > > cfg |= CFG_EAP; /* enable access protection bits check */ > > - writel(cfg, data->sfrbase + REG_MMU_CFG); > + sysmmu_write(data, IDX_CFG, cfg); > } > > static void __sysmmu_enable(struct sysmmu_drvdata *data) > @@ -492,10 +530,10 @@ static void __sysmmu_enable(struct sysmmu_drvdata *data) > __sysmmu_enable_clocks(data); > > spin_lock_irqsave(&data->lock, flags); > - writel(CTRL_BLOCK, data->sfrbase + REG_MMU_CTRL); > + sysmmu_write(data, IDX_CTRL, CTRL_BLOCK); > __sysmmu_init_config(data); > __sysmmu_set_ptbase(data, data->pgtable); > - writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL); > + sysmmu_write(data, IDX_CTRL, CTRL_ENABLE); > data->active = true; > spin_unlock_irqrestore(&data->lock, flags); > > @@ -622,6 +660,8 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) > data->sysmmu = dev; > spin_lock_init(&data->lock); > > + sysmmu_get_hw_info(data); > + > ret = iommu_device_sysfs_add(&data->iommu, &pdev->dev, NULL, > dev_name(data->sysmmu)); > if (ret) > @@ -633,7 +673,6 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, data); > > - __sysmmu_get_version(data); > if (PG_ENT_SHIFT < 0) { > if (MMU_MAJ_VER(data->version) < 5) { > PG_ENT_SHIFT = SYSMMU_PG_ENT_SHIFT; Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland