From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751626AbdE3MXv (ORCPT ); Tue, 30 May 2017 08:23:51 -0400 Received: from mail-co1nam03on0062.outbound.protection.outlook.com ([104.47.40.62]:37512 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751589AbdE3MXp (ORCPT ); Tue, 30 May 2017 08:23:45 -0400 Authentication-Results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=caviumnetworks.com; From: Geetha sowjanya To: will.deacon@arm.com, robin.murphy@arm.com, lorenzo.pieralisi@arm.com, hanjun.guo@linaro.org, sudeep.holla@arm.com, iommu@lists.linux-foundation.org Cc: robert.moore@intel.com, lv.zheng@intel.com, rjw@rjwysocki.net, jcm@redhat.com, linux-kernel@vger.kernel.org, robert.richter@cavium.com, catalin.marinas@arm.com, sgoutham@cavium.com, linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org, geethasowjanya.akula@gmail.com, devel@acpica.org, linu.cherian@cavium.com, Charles.Garcia-Tobin@arm.com, robh@kernel.org, Geetha Sowjanya Subject: [PATCH v7 2/3] iommu/arm-smmu-v3: Add workaround for Cavium ThunderX2 erratum #74 Date: Tue, 30 May 2017 17:33:40 +0530 Message-Id: <1496145821-3411-3-git-send-email-gakula@caviumnetworks.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1496145821-3411-1-git-send-email-gakula@caviumnetworks.com> References: <1496145821-3411-1-git-send-email-gakula@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: BM1PR01CA0081.INDPRD01.PROD.OUTLOOK.COM (10.174.208.149) To BY2PR0701MB2024.namprd07.prod.outlook.com (10.163.156.139) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BY2PR0701MB2024: X-MS-Office365-Filtering-Correlation-Id: 79540a2f-aa9e-4d39-eb19-08d4a756b69a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075)(201703031133081);SRVR:BY2PR0701MB2024; X-Microsoft-Exchange-Diagnostics: 1;BY2PR0701MB2024;3:6r5pmxB1VKdCHKcWFQr7rXZrHG26dj6FmpUXKBksBc7vrZyRYiXh8SC8lpupqpT69YyPSCBxiBe8TT86DGaN1R232MF2z7qV1rimVGRF/VfQ4SIF8q9BpTYwXzHLp36HpYQ/MpUmyy95PrOSV8xxcR30s1qf92qO6eHZJ4AYXTpLJeEKxAlORd9I1LJSvSHQ5wZ3UmALn3DkGVeFoP+e0P70r00sIBeomYmp5TOpnImlirnty5ANxeMyWd+5UQYpSx1ndEM1I1UQo/1uCCdFNnN8/THkQVDIqRRYOwyltQ3EXIRhjgIwPiI/Hl+wgBWlI9I3MYjIL4ZoU2l80wqtUg==;25:rJfy4VK6pATGVuoxDnA31Qb7Lc8sN5RI4eTMPY/UW8FIHEsj2nERmeVpNiNb1tKx/bMV2aHtAs3A4xIXMIMmKliqWLJOa7ooCCk0TafwLeRH3TiEyhPa0LFAegFj65Ld7JdPxhkoujDJQzh4UxYAbyi6ZlLB98V+zFLjzXc1h8a8CxcJrDRESnZ1eOao7owr4n8w59QdxzqWlGaTCrKHEqyXqGHiuXghe+rGvyep3i+DRlOi8YYkObXdb+V4Ww89ciPNOtJZptm6RCykb8hvJ/vXDyHcHEml4ZPCeeBGnwPAVEBEdx4oVHFwnJAcP1/1G67yX8jDqePacJ+6rdsA/hp+SxKg+GdLg0+ZYkyWCjJtUIaNBH3B0CDUN0CAsu5LOEVKyJnQ80jZlf6feRe1uffFnxLcqQrMIrKgYGoZQVPLDy4yg9gft8xxDZIXOGEWHBE58jlyx27a/AO2jiR5OV3taGO/lFHOB72LdgAYF9Q= X-Microsoft-Exchange-Diagnostics: 1;BY2PR0701MB2024;31:YEMHLk2OGZlrs7fYAsLJAbRRp7ACdcNeEgoxhIlLXaf+1MZkqVpQSE+I39AhrkTLihca/tdxkwaNZVcQtrSxDKCNIgbsGaDYfuh/2kJkR/6i5G7+YoREe93qGuJRT6Dy4TJSg2kmCfmW5jRhTowpl0OzKMTQO8mFHjWcyNS21A4B40HMXtxg1ED90Eb1KZ7SZmkqwTa+Wva9zmYYRbsVFqnCAwZOhKNGgIzaBnaczog=;20:v/MIHlyo/k14HXDbDY6+gwyPjTR9gKHdZKUo51I3zTdp77ofpAETEZ9cGUXoRMkCVTK3uFQx2kPtUr+XlP9tq/IAnN8VfAwtqmG/VodpOmkgLkGJZBzUi+cMW0hgZDxSV/j2NdVJkP/cyOF6Fk5jQ3DBr8CvgPSSWVcur6BvE1B0vyixuDYl/guO8b5GSkwF2klDBvr9Rm8EGhB3QIiaTKDq4pFHw+mF4lKHUzEIu9JTpGTzyac+xkJFrjDs9F5ZL8fz3HN60ElIy7JfpNIw4kH+Esem6y15Wr2Iu5FY12ZIzKVbrcn8EnYe2ZBl9zS/DPQHBKep7TCrpxgCovKRfu7/E2YrjQPdVgRxzNFs81ZI+6Jt9VaRj5pJCHwfAwAUVB/DeWlnumdVTkKOZqyrD2hWgQPoYDNTX5S8IZK0LtrlkPpv7YGOOVm61pWE2dVwGwgTziqgavmnyhsO3s2U5Q80oOyOKkN8ZfL43pNtxLY50PTsZw/BusAPat+pXQUF2B0LG0YitulMVjYe9yxh2zGiO8vaS5vHtL3ZPXc5NzWT+lLwwdAlJnjPb0i5J/yXjTcSGpo686PzRXrKFHhWzKm4iv7N800tBGJEuD+V1sQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700073)(100105000095)(100000701073)(100105300095)(100000702073)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(100000703073)(100105400095)(10201501046)(93006095)(3002001)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123564025)(20161123562025)(20161123555025)(6072148)(100000704073)(100105200095)(100000705073)(100105500095);SRVR:BY2PR0701MB2024;BCL:0;PCL:0;RULEID:(100000800073)(100110000095)(100000801073)(100110300095)(100000802073)(100110100095)(100000803073)(100110400095)(100000804073)(100110200095)(100000805073)(100110500095);SRVR:BY2PR0701MB2024; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR0701MB2024;4:+Ncsy9pKqAZvL4zQmVTeYt5LaQO5l4aGB4h4bZB1?= =?us-ascii?Q?pALSpDrhn4w75+xlAN/1gyw6yB9jVSDx9AkOku8TNGuH6vmaO6UD5tSWLKyH?= =?us-ascii?Q?k7kNVyt/QARWhfGxm4Rw5COWYQANPdH/MPE2Q1PBZe/zL34HVgGoVbUsYkjh?= =?us-ascii?Q?7bCn15jZtr61uEacwlsxSbpB8Y1YaNyGDN3ty6UGmodO2FxQofTvYSZLvxAr?= =?us-ascii?Q?S45mUYkU2w54wQ6ZMv4RfCbMsM+Nzv4d1sC5A6Jc41lQ3IjOz3cWrjK8LSKc?= =?us-ascii?Q?dSJJQeRi/4cD58rihbhHrnYmvW+IcecEAP2/hOX2OEkORnH+9SXSzm0U9RFI?= =?us-ascii?Q?RAYojiq3P78qK4N8OeOuYZRgC/jXFs8zw7UUmCttx7QDjyMqKAtPK1+5Y4BZ?= =?us-ascii?Q?FhBh/PH+kSQa8RoHR1XWS9fc7XsmGQG4yzSrpoAaZs+MmKibFLQLZVWYi1N8?= =?us-ascii?Q?wIEi9yNYwg+FnL66X2CqlKyXLvPjgJ2Tz3a5DRgRiYiUbGQAxlPfajDp2KpI?= =?us-ascii?Q?rzqDjvEDIIF0nJFGaZ0IoCC/M8sGWFfhws66ygIRjscd1B+aMx+ldRXBqFTb?= =?us-ascii?Q?VjXfARdd+NZjwBhhPBLD0LXgE+ysqyuPD5nGtcANDJEVVYY/duKxoaczMdMC?= =?us-ascii?Q?BY37lwvujy2swIyaMSok2ycEvB+HORXVA6VupdQqbOY8d4hCOsd/CymZ9xUT?= =?us-ascii?Q?O0M9v4Bbx2L2tAQUmDsdoVsX5oWLeYKPM1NbLx7Qx9Gecnb4NfuBYLDHRNKz?= =?us-ascii?Q?v40YdAVnh8hGZ+i1GCKc3I7Muo+iBnE7SUhD6xhGf2yUtRNiMGQuQDH7fxFM?= =?us-ascii?Q?hen/4bR+Vkeb7X2oVnJTSH1QyYPslhVj539wywbppmpk90vCBxCTbFyDawuu?= =?us-ascii?Q?kvvmbLSfxZkD24nmcQs12eVHsxWHbx4aRHArCvzK1hwLUkwp8JJP3uscLfy+?= =?us-ascii?Q?h/gjhfd4b//1G/H3k+BIII5P1nu9nlWUAfnLwc36tIxBuNnZ6gCCF1a/CepP?= =?us-ascii?Q?lyicsE2zgfUuVGS6ozhn6YZmKCX5SiuFqMHB64bUpAfjFj7LKRcRyXCm1+3s?= =?us-ascii?Q?nlP0AAFd2gvv0wQweF4MTPsg11VawMAGZxNqj7xOWgqFeQJ+jeut/z3gNEkr?= =?us-ascii?Q?ncKx9OGBURU=3D?= X-Forefront-PRVS: 032334F434 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(39840400002)(39410400002)(39850400002)(39450400003)(39400400002)(3846002)(6116002)(8676002)(5009440100003)(5660300001)(81166006)(36756003)(478600001)(38730400002)(6486002)(6506006)(6512007)(50986999)(76176999)(6666003)(2950100002)(7416002)(42882006)(7736002)(50226002)(305945005)(4326008)(25786009)(47776003)(42186005)(33646002)(230783001)(110136004)(189998001)(107886003)(72206003)(53936002)(66066001)(48376002)(50466002)(5003940100001)(2906002)(110426004)(42262002);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR0701MB2024;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR0701MB2024;23:1/0ch18TZrJ/GMOdJscnvD1lPodxRMD1hTED5IZ?= =?us-ascii?Q?1g2zl209AMKcmD075pFQfvo7UdLTXUYJSshc/Sms8NMSy4dphMPG32Ewi90C?= =?us-ascii?Q?z1wLWTWe8d4cYDKozoBRyoijwJyzH4JLJGIW5bxylZYU90y858vRhd8klcIw?= =?us-ascii?Q?/j3Cyy+/e4jcSxL1+HNl0ADIui+Wt6s8xRu4wBx0qKjp8YbHQEwAg0bUzuWM?= =?us-ascii?Q?AZEH5FTxGKpjNET4HJWEkvQaGi++sISNilFG3hm+7+qoGcxMwb3rDqWQyHpO?= =?us-ascii?Q?NRM8uH8g7fkEXd2REexzs0mMAY9NIvHlOQGMENtq1pW2ISCc1sLTUEQJcmll?= =?us-ascii?Q?00Q+v1ko7ZtFBWIj0PLM7mAdQXzDp6CJubdVM1qFUfJELLNN7FUBm9IVgAY8?= =?us-ascii?Q?4Jh5nCqhTelO2kSw5u+GCw8agFofIJv1WLtNr0RvDKhFkOPRNVBHm3mNIkYW?= =?us-ascii?Q?WIjieVI2tsS8BLm6SbSI8TURg07Pow6lYUgKoWEYv+BOpeLYyR/+ay8doHxT?= =?us-ascii?Q?PVNu2gWrG3RbcgH2iqbKE08Uw+7Da9K/9Iqfdb8aW5YyVDHSDVVyhRzjcnaa?= =?us-ascii?Q?yNkXKJU6tzFs5ardRL21IwSe8GWVq1TrLYijl7BCCX8ZRhoaSZhD0aZ+7d7S?= =?us-ascii?Q?/VIk1Q9LTG2zTML3Q2H2q+RE3/dp2kgVmAl7NYnwVRD1N63G0WqrRiM2RHZw?= =?us-ascii?Q?sm30AbxPDoLbpikk0wUprRbyQutPrK8u47TyU+F5sQfPdlhs25KyDdgk+7YR?= =?us-ascii?Q?MFzuAHCpKDVfhtBv2k0v6IhQVvalunXjJJLnZ2y2WdGMaIhjSo20RUDO0THO?= =?us-ascii?Q?w+vMwETnCoe0P2yWUAgYXSo46bzFvhnR3ljngH40GGgkCi69gGFxK45E4Kk3?= =?us-ascii?Q?kFZja+kxopgA8tN4xWNI2ulOCtTf9ag+g2m+fx6ME93/ZxJ7B6bjaBngRwSj?= =?us-ascii?Q?suJYEE+1rGw62c4hIymEnLr7fddTLtpuFB3fSxQLYRZU9m4J752trRaYDPPG?= =?us-ascii?Q?VGGXMIsRMipUl595JT1pWa/l1EN4NRigol+WHksWXkGdqlTKBMpPobWUAbd7?= =?us-ascii?Q?AM4+zUBolMEmhnBN67ak0MlrkOjEwRCNj4x2+ms+eBSKYk91QVEujcVEg5Gd?= =?us-ascii?Q?Azb+5YMukMKnXT/PW8s2n+VwlR0z4ipY1DbduXolZQbJko/ieX8tezADPtOC?= =?us-ascii?Q?Z7Va7PbO+FoG6mBs=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR0701MB2024;6:8W8qaq9RTs2EHZDG3V5+hiR/788Gq71+e0By5M0alWE755Ciwl+xH6JYnXs1j4FY3tLd89TfIz1OLq3KDca3Kq4MSysHBnT7jCYjJlhwERCsbvlWicU1KlwNQwpl+SA9QselAuadfmk11ZEoerBkgnXdJcP62m9bGvAVYnnSUj1Q9Ky+D2MWWHRGS/8x6EosE+1mmCpaYVRTp8QvO/nisG0UvXO2VMSrisYgN1yqG/8i49W/IyrZAfCpNWnNOykDHhjN+/Pk03/pxcH8butJYgJUwzeJAkGVhmGaYungREwDipuCt+Uk53RJ6J/x8fqvnkNmHOAvTXeuYXB9hW5QCZBXp7c5KN0a+fpYoajuq88Nms44SgWJ3Lq/DUt8YREhldCbQXnQJkiK8XOTeTu6J4/bQWUmYOELAVptBHo/iuNxi9Cjd1uHOMxPsESewLoLKjiNGR73AoOrfch346naQx/Lit095qSA7FD9IgTa4rh1O/sAFhdk9EQlkoAF4Wtyoy9GQcanHvYb37f7YRSNYA== X-Microsoft-Exchange-Diagnostics: 1;BY2PR0701MB2024;5:Nw6B6E+zJv22FjjSqSkNyHRN7GFlDIOkgL1GNlTyHfYua7p8gMfML+Rx+osffykD4uvXCv1UZFjVZwfKdsDf7J5XogxaJ1xtjHbyUPuIRtPy6vTGAdKs8A3AGT2E4Q6IKBaHaL1XvzfBV5a3aLN/mUfAk7wrKAMjONSzWhtJZ1gcqO7zXOhLLkqeqlJP9X4dyRioZfg9EF/V5sxlEECxFxI3cp8qqH5nHETCWYjvUsCAizhB+Xdh8G2z9yh7qsZq1NhGuY6fxhy+t/AeTACzhHDqCPJMyEXGQt5BW9TQVk9HbGmeDwv8MV4Czhip1p4h8tRDHBspbzepUJEamvF31ecvtCKVRsGrFLCwzRIf14Kzow4pvDimq9tbyNNCf90E+QT9VenYgLwbwKpwoaBYB8Yshs9nOVQRnIUeb8uDVXFeTq/waV6/SkZBiO1C/rKOABSVF3dI890e1HyAmH2j1zwAnRMfP6Q6UBhm7TlOv6XmprzBXO+AYarij1UHG/iw;24:OBBNtTYt1xcDlEdny9QIvkN9kaFtjOLwMh+Mlqh/xgY4gy389Ns0fGXH8ghJ3fCmLniQRKhw1B9jZXHpxebbCkCDJj5z98MdJcrDeFlVteQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BY2PR0701MB2024;7:SSjRsKs6XTcqa72xmWdWDRxfspUAiAPwOpCCZkjYSCH6BAmquMoA1soNW27F/UYuvP2JlyKd4HpLriVYS1eMBOm6FDJW9dgr4Z4uSpqgXqkU+637mAWkggNaIJE4xrKfy39h1Qu6axSkUzyxor6Ml0WGcHBcwV7sHxmTjtGfwSY7ED190X7EuS26BmnH/AoR7K8xkxNEO04AvPl1WejGlhwIFOuEnZ2Qp0KAu3MGMWyFzcB+g1l5LGJO7tkFSBtj776WVZc95/z+N4ICk4sLDxut9qM+oPKVefH8qJ/YC6nPxeQJf/10mXze0bDMjINzdZyZFXmmuKlgMCEC58aFfw== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2017 12:23:37.8868 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0701MB2024 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Linu Cherian Cavium ThunderX2 SMMU implementation doesn't support page 1 register space and PAGE0_REGS_ONLY option is enabled as an errata workaround. This option when turned on, replaces all page 1 offsets used for EVTQ_PROD/CONS, PRIQ_PROD/CONS register access with page 0 offsets. SMMU resource size checks are now based on SMMU option PAGE0_REGS_ONLY, since resource size can be either 64k/128k. For this, arm_smmu_device_dt_probe/acpi_probe has been moved before platform_get_resource call, so that SMMU options are set beforehand. Signed-off-by: Linu Cherian Signed-off-by: Geetha Sowjanya --- Documentation/arm64/silicon-errata.txt | 1 + .../devicetree/bindings/iommu/arm,smmu-v3.txt | 6 ++ drivers/iommu/arm-smmu-v3.c | 64 +++++++++++++++----- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/Documentation/arm64/silicon-errata.txt b/Documentation/arm64/silicon-errata.txt index 10f2ddd..4693a32 100644 --- a/Documentation/arm64/silicon-errata.txt +++ b/Documentation/arm64/silicon-errata.txt @@ -62,6 +62,7 @@ stable kernels. | Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 | | Cavium | ThunderX Core | #27456 | CAVIUM_ERRATUM_27456 | | Cavium | ThunderX SMMUv2 | #27704 | N/A | +| Cavium | ThunderX2 SMMUv3| #74 | N/A | | | | | | | Freescale/NXP | LS2080A/LS1043A | A-008585 | FSL_ERRATUM_A008585 | | | | | | diff --git a/Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt b/Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt index be57550..607e270 100644 --- a/Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt +++ b/Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt @@ -49,6 +49,12 @@ the PCIe specification. - hisilicon,broken-prefetch-cmd : Avoid sending CMD_PREFETCH_* commands to the SMMU. +- cavium,cn9900-broken-page1-regspace + : Replaces all page 1 offsets used for EVTQ_PROD/CONS, + PRIQ_PROD/CONS register access with page 0 offsets. + Set for Caviun ThunderX2 silicon that doesn't support + SMMU page1 register space. + ** Example smmu@2b400000 { diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 380969a..4e80205 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -412,6 +412,9 @@ #define MSI_IOVA_BASE 0x8000000 #define MSI_IOVA_LENGTH 0x100000 +#define ARM_SMMU_PAGE0_REGS_ONLY(smmu) \ + ((smmu)->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY) + static bool disable_bypass; module_param_named(disable_bypass, disable_bypass, bool, S_IRUGO); MODULE_PARM_DESC(disable_bypass, @@ -597,6 +600,7 @@ struct arm_smmu_device { u32 features; #define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0) +#define ARM_SMMU_OPT_PAGE0_REGS_ONLY (1 << 1) u32 options; struct arm_smmu_cmdq cmdq; @@ -663,9 +667,19 @@ struct arm_smmu_option_prop { static struct arm_smmu_option_prop arm_smmu_options[] = { { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" }, + { ARM_SMMU_OPT_PAGE0_REGS_ONLY, "cavium,cn9900-broken-page1-regspace"}, { 0, NULL}, }; +static inline void __iomem *arm_smmu_page1_fixup(unsigned long offset, + struct arm_smmu_device *smmu) +{ + if (offset > SZ_64K && ARM_SMMU_PAGE0_REGS_ONLY(smmu)) + offset -= SZ_64K; + + return smmu->base + offset; +} + static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom) { return container_of(dom, struct arm_smmu_domain, domain); @@ -1961,8 +1975,8 @@ static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu, return -ENOMEM; } - q->prod_reg = smmu->base + prod_off; - q->cons_reg = smmu->base + cons_off; + q->prod_reg = arm_smmu_page1_fixup(prod_off, smmu); + q->cons_reg = arm_smmu_page1_fixup(cons_off, smmu); q->ent_dwords = dwords; q->q_base = Q_BASE_RWA; @@ -2363,8 +2377,10 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass) /* Event queue */ writeq_relaxed(smmu->evtq.q.q_base, smmu->base + ARM_SMMU_EVTQ_BASE); - writel_relaxed(smmu->evtq.q.prod, smmu->base + ARM_SMMU_EVTQ_PROD); - writel_relaxed(smmu->evtq.q.cons, smmu->base + ARM_SMMU_EVTQ_CONS); + writel_relaxed(smmu->evtq.q.prod, + arm_smmu_page1_fixup(ARM_SMMU_EVTQ_PROD, smmu)); + writel_relaxed(smmu->evtq.q.cons, + arm_smmu_page1_fixup(ARM_SMMU_EVTQ_CONS, smmu)); enables |= CR0_EVTQEN; ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0, @@ -2379,9 +2395,9 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass) writeq_relaxed(smmu->priq.q.q_base, smmu->base + ARM_SMMU_PRIQ_BASE); writel_relaxed(smmu->priq.q.prod, - smmu->base + ARM_SMMU_PRIQ_PROD); + arm_smmu_page1_fixup(ARM_SMMU_PRIQ_PROD, smmu)); writel_relaxed(smmu->priq.q.cons, - smmu->base + ARM_SMMU_PRIQ_CONS); + arm_smmu_page1_fixup(ARM_SMMU_PRIQ_CONS, smmu)); enables |= CR0_PRIQEN; ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0, @@ -2605,6 +2621,14 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu) } #ifdef CONFIG_ACPI +static void acpi_smmu_get_options(u32 model, struct arm_smmu_device *smmu) +{ + if (model == ACPI_IORT_SMMU_CAVIUM_CN99XX) + smmu->options |= ARM_SMMU_OPT_PAGE0_REGS_ONLY; + + dev_notice(smmu->dev, "option mask 0x%x\n", smmu->options); +} + static int arm_smmu_device_acpi_probe(struct platform_device *pdev, struct arm_smmu_device *smmu) { @@ -2617,6 +2641,8 @@ static int arm_smmu_device_acpi_probe(struct platform_device *pdev, /* Retrieve SMMUv3 specific data */ iort_smmu = (struct acpi_iort_smmu_v3 *)node->node_data; + acpi_smmu_get_options(iort_smmu->model, smmu); + if (iort_smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE) smmu->features |= ARM_SMMU_FEAT_COHERENCY; @@ -2652,6 +2678,14 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev, return ret; } +static unsigned long arm_smmu_resource_size(struct arm_smmu_device *smmu) +{ + if (ARM_SMMU_PAGE0_REGS_ONLY(smmu)) + return SZ_64K; + else + return SZ_128K; +} + static int arm_smmu_device_probe(struct platform_device *pdev) { int irq, ret; @@ -2668,9 +2702,17 @@ static int arm_smmu_device_probe(struct platform_device *pdev) } smmu->dev = dev; + if (dev->of_node) { + ret = arm_smmu_device_dt_probe(pdev, smmu); + } else { + ret = arm_smmu_device_acpi_probe(pdev, smmu); + if (ret == -ENODEV) + return ret; + } + /* Base address */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (resource_size(res) + 1 < SZ_128K) { + if (resource_size(res) + 1 < arm_smmu_resource_size(smmu)) { dev_err(dev, "MMIO region too small (%pr)\n", res); return -EINVAL; } @@ -2697,14 +2739,6 @@ static int arm_smmu_device_probe(struct platform_device *pdev) if (irq > 0) smmu->gerr_irq = irq; - if (dev->of_node) { - ret = arm_smmu_device_dt_probe(pdev, smmu); - } else { - ret = arm_smmu_device_acpi_probe(pdev, smmu); - if (ret == -ENODEV) - return ret; - } - /* Set bypass mode according to firmware probing result */ bypass = !!ret; -- 1.7.1