From patchwork Wed May 10 11:31:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geetha sowjanya X-Patchwork-Id: 9719747 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E546E601E7 for ; Wed, 10 May 2017 11:52:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D085128498 for ; Wed, 10 May 2017 11:52:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C4819284E3; Wed, 10 May 2017 11:52:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED,DKIM_VALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1AC2A28498 for ; Wed, 10 May 2017 11:51:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Ta3rfre0skUJLZdDlPgn7grPsrOV3uKrzmjh9cbVhqI=; b=u2RLJ63vojEo5z EReLpP3lpKwgRwUEcMwWeIfr4x2tk5DFbXw3pVxfwmMobGe1a4CDAxNGhZtmCbuy46EylizmbP6Xq /S2t9qjiEoLDIlI6O7XtoSD4H+/6p8sBl40sggIX00j4bxF0sIbrJOP0z2j1wpqdQQ7airTu3XWfq 8bp4nrRlzfpVATSSYjhtYjnInp6piLEuyYtNPEIuI7BbY81/XupV+7nvAIR9Q1XVqHUTlGhvw/xyv epgDNRZY7EQcRdPkuPbtv/2oJKy6zZ/ZZYiEowJ60HGN95pi/in+Z50O8BzydCg+nlPoELEeBJyTN Up0Jy6JIub/9pclMY8/Q==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1d8Q9v-0005Ut-2P; Wed, 10 May 2017 11:51:59 +0000 Received: from mail-by2nam01on0074.outbound.protection.outlook.com ([104.47.34.74] helo=NAM01-BY2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1d8Q9f-0004iG-Am for linux-arm-kernel@lists.infradead.org; Wed, 10 May 2017 11:51:47 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=9wz/aruL+u2lTFsYOOTs2QbTLar2deSaGB8lELxley4=; b=Q0AGwGEB8tzB6CMwpc3xP9+FrPPY/SvDtiKknA2VRHKQaL+zjlAas78Cw6dfI1RrZvXEkbJe+0htpGtiuwQYvY3DqQrd/vDfDwEeUZmOYbuc4hJBlbSApZRsspWRcLTPbEYyZyfOb96LXbOBS20rZeSNGWGUZvqaaq+BCQNr18Y= Authentication-Results: arm.com; dkim=none (message not signed) header.d=none; arm.com; dmarc=none action=none header.from=caviumnetworks.com; Received: from localhost.localdomain (14.140.2.178) by CY1PR0701MB2025.namprd07.prod.outlook.com (10.163.142.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1075.11; Wed, 10 May 2017 11:51:15 +0000 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 Subject: [v5 3/4] iommu/arm-smmu-v3: Add workaround for Cavium ThunderX2 erratum #74 Date: Wed, 10 May 2017 17:01:57 +0530 Message-Id: <1494415918-13770-4-git-send-email-gakula@caviumnetworks.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1494415918-13770-1-git-send-email-gakula@caviumnetworks.com> References: <1494415918-13770-1-git-send-email-gakula@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: BMXPR01CA0046.INDPRD01.PROD.OUTLOOK.COM (10.174.214.32) To CY1PR0701MB2025.namprd07.prod.outlook.com (10.163.142.12) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f567f502-35f8-423e-078c-08d4979ae02f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075)(201703031133081); SRVR:CY1PR0701MB2025; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2025; 3:EowBSZi6S5RXj4ZzE+cOaI72n9THLbyxVpk1x70v5pi+sxZ4xR9/dBH3AA2QP8Vp/ii/g1aNtsIbHB/WYVKw6ZK8Yko7CK7C66L5fo/PmpVGNQ4k36PqDmeEDa3c6ZCHZlocHozQftsf7MZM1JCqR5FqkPxwIqdKl/v8K0wS5RTHUYIrhcCPBJZJgVC0TH9wz6BsUZCoXhLKlSCPTSQqGDhZOtiMHFXbtFSfaL+2Ca7R5og97Uoj0nH+lTmRjDy8mumgdUlZwQrbTtEnRhFSfAuIzhSr09mAurBveamK32lMrhR5GDnCqKl5XTuhIk0bPwNG4PTcIfrlDFkvEceelQ==; 25:LnWfkBUu3A3G2bx4K4VoWn3chFQgBp9lirghtFNrwlZWv7aWpswBOcQzEyPVs4dbGItZle3McJonTU6/qgfUEKxLd2zC7HM8REK+7ULYG8LYPZvFymD/Kwb5XToi2y9eqkPCtBj9sry3iF+G+uJfDKyKfPbSZvgupGNOaC0OuDL2gbCjPOIb9GvpgsRqAij/oAIimBt2vpBYPOqHuxqEfM/zCXCBvDby827hTIYR9q4Lxthxikv6ZvzWPV3FVEr202Z+9R+4aY1PMLbOwzuHGTJPpnAvipCbNMpHPIXz8FLihDh0hqxFvRWZ73odi9Af3Mk670HP0a6+g6QcIvhtd5M4sZPhdq8M4IgRm0bXZ8onIDtbwLaBRM27zReLm1XhcKB5ENtsDF9C6PwvYdTvhPKC7mhjF6cWwTKPMHHU9dDatd/0LgbHXpkrRp27lLWMhwZ9iGkROssk4snCyE7/iOa7KSM9OU5TmgubuLrKA0E= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2025; 31:awm2DOJaqtgqyKBPwllOLVAMmISLO9R6HBllk/9DonrkkFp4Eza4Z8ueol8AKkyRYHEYpd5Pk7n+kEB/pWqCXQ2WEePHz1pXalallTtcSGVSHtRs9EqNW5WJWwMzCbzN+k9Wiwiee/ugGA8/bCoI8CRYLBMAoWknoEr7GQLXRsu3h8FE+px6t+2FH9MZ4GVBN+/c10t6whFz1mkrwLQfbqLNwCNOdqWJCXJibmq+r1fXsShF7X+MNtupeIPZQbzv; 20:cQKjLfT88srFJuZcQ81N+J0vOinxKYcgpUN61dM/Y18+nSa9wwwVE9ZMZAiCX0hwbliMkRqUZ57qUwoS05dXzrva5TYtcxsXdsSOA4RS5UCUfvj4GI3HuimeoIQv0CwPnA7+2vKbtJ7gvhQFEIERt6DBJAHW5GqSQRWcXSRy5GeAIuE3g+QMt2e59COKGuD8ATydaqK6fAhIUrr/zVy6KL5XX72eq1LnRFkMlAsAdhBU/Icq7WdthJ9t5HA8UHYbKvE9f1VetMts1onru9woHfBzwJBD6qTunZ5Ai0Sbzy4lXARFTGtmA6rtdhvUwsP5N+FyBVeCvosILQW7smkbeQcJN1E7Ldnko22LGX1jkIOt9wfamRe+ZN7BVF7WGrqu0xbiej07h3XxNGS9Q4pCyGnkj7P8CC1Wzw4j011JlCj59036LTdurhFHWERxdFEjdDU431F38BtyIBPYhjnbKoz3jbQeyix3Tnapn5K1p0ho2vioRleqO9S/f+bUwkSi8Af9rzupHrT2gjUiOtNUpQYxztEB0n0uCM4+j0qdDy90txl4j+9o8wM+v3cZhvjHYiDoHt1xKTo9QJ5TJNspWo5WaaQyxmjXFL6CVxgz8y4= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(6041248)(20161123560025)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(6072148); SRVR:CY1PR0701MB2025; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0701MB2025; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2025; 4:RRLZceI6es2F1VWa3cbvHLpblsZG8MoCLawUvU3Vlq+ok5vLpmcs9FypgP539/8TNzR94ljHYo9FzEhyJ4R6yQB8hjTRMgqjh2ffrUqYYJLA1TWILluKhE0oXuu1y2iIuAUP5S35NHbIsqr3dVmaMj9oUlTYkSCcMXL7f8vm5WpC5DxfuoMT+rAARazicfdMVXlmPCquPbU8TSBAZQ0IvkJaFWrY8XMS7lRE6R3ujWVChXcE60a2Bbz/25ZiOQx6RWMTsDbWhPcZAXuZFFbXUFM/Hb0FQqq0a+z3Xa0VsyJxb03fJ0GfpJkCjAhW8LznYtVdMNXXmNgQReUcheXJz/pdtF6QoUuTzywzaCbteW1K6q3acenkJ7QgVsnIsmrInT7szWsyPbNfDv2pycwfCQW6Ok3v9RsZ6CjrS9yAJDT68YBrHtlbl1KyFFT2GEzf9enCeTnSvg8zvBfQsJX+ZpZJiTVyrW12QME60Bw6JGiZHMM1ZSqqIpW8a/S6PkyiwA5JP2v/9DbK3UlZSuxrCVVhB238zd3oOFn5lbeb70oQHlZjj57QSYMqHSAs/xSnEzobZeFuaGq3B38xnv8V6yjFZGLNFrFfrtalfSRJ3U7PTa+YPL8BdaD8pnuTewpB8ORyQkjrWXOZTrQOKKYejALFfOX45yXWFnPdzDnbKo489GLudKTGuw94dysBJrPFS/XJsDv2qLsHCke4RJ5EnoK/JtlCStVgp+XGVLhBP6X9SP7DZgoZU4m5YwMLYo9h8B0a0sAGxjDAORqcCJ0erw== X-Forefront-PRVS: 03030B9493 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(6069001)(39850400002)(39400400002)(39840400002)(39410400002)(39450400003)(478600001)(33646002)(42186005)(107886003)(5009440100003)(110136004)(48376002)(6116002)(2906002)(38730400002)(3846002)(50466002)(97736004)(7736002)(305945005)(25786009)(50986999)(76176999)(4326008)(42882006)(2950100002)(6486002)(6666003)(36756003)(189998001)(230783001)(5003940100001)(6506006)(5660300001)(66066001)(72206003)(53936002)(81166006)(6512007)(47776003)(7416002)(8676002)(50226002)(110426004)(42262002)(309714004); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB2025; H:localhost.localdomain; FPR:; SPF:None; MLV:nov; PTR:InfoNoRecords; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0701MB2025; 23:lECxC5GzHz6+I69em0944QrfOKpKpUixPK48pKw?= =?us-ascii?Q?wutrcECZ4NujxDB+xVYOIaz8u9r3s183SSr0oWfaYjobPK2srXwPOlPhgbn1?= =?us-ascii?Q?EHiz+sw5O2gvWzlCnM1kKKhQOs26YQfEnLYjTvxcfzwuA8DA2rmil8tWFc4i?= =?us-ascii?Q?DENDn2Gj4jEhWIIAGTtTzxGWjjtaibymbrZRHaas9ZPrcRbmmSBh/kPYtr1i?= =?us-ascii?Q?enkYix+1q451AJ+ItZpBjiJnk8jzUqmmwcA1JRB8Z+ULbrkkva0XmvqmoxK4?= =?us-ascii?Q?f/RAn6Dv8kqqso+3u9J2OWS0zHUd/C8FMAURso6tYaFKDtkBedFuSZnUlqj+?= =?us-ascii?Q?qNl5tP5c+n97Y1zGsOxIWKRXRP9G7Ar3efTcCFHGskwTHN6H1//y8jkiN1qv?= =?us-ascii?Q?vmfO1Drf/Hbpi/d11hveVX/4lfZj8Yd2JGvO1XdwB/Lls0tE7eHPodPenbcj?= =?us-ascii?Q?fJ/YWu0IBQTp/6qi7rMoN6Kcxc/ibRCWL+j064l8bW2CL3AuOmCiWMeVkynt?= =?us-ascii?Q?B9xA31hRyXWmjQWKIN1kn7AHsdoVUEQZzGZ7uihbvUUQ59gq+2gB67euVNSL?= =?us-ascii?Q?v/MJFQF016T0+/7mSYiPuM1Jkuc2FZ8QnWGnNWUpSJMTu+7bzc67r7M6dxrE?= =?us-ascii?Q?QPHHeYZ0rCZlxqCP2IQhuu/OhFqcNkPEoDQLTwjoYjYXnVEik65eUce5DUro?= =?us-ascii?Q?xrPlhu7m9hidC8+x3ya7kRrp4mb/8zjPQjB3j7kNIqr4KQE4D5USd7JHnzfY?= =?us-ascii?Q?nC5RvIUR64LYkxBKwkz1TMwh4rLNAOv/6Vq8LORi/OwJ48fRtNJmMUly+rNe?= =?us-ascii?Q?V3mm2y4DCzwDr8t/2JxZJgyaEbGiQ5oJlXTKRZJp+ykz5QoAzt4tWaqk+f3y?= =?us-ascii?Q?Mzrhdzfwow3pmhGaYcihQxlEuWISvh7ZUpLy6oPftuPG8WGpvEKRGlFoFMj5?= =?us-ascii?Q?Vpy73T2XYosHIU2jhH1AqF5okmVdYCYDFO3XTG4rMmPms9A+gQ3zhXVwmclW?= =?us-ascii?Q?6OrsBb8dvLR0dxKm+gm0EQirL0e0mjoYV+AYHAAGSCHl8wHv7ssPsCaBU6n5?= =?us-ascii?Q?3+NLLhFfUkhZa1iTFu1t3qMsdgqhn/tMJTJT44EFglj5rTQpWqKYWMaBpPts?= =?us-ascii?Q?6UxTC8zvyOZP+W2CNxWbpSW2pen36eG4tJ+joxYSfgLa0TdHPUpns1Ye/EID?= =?us-ascii?Q?0+G5XJOwAKbKLvcaxyUTmFlP6AsdJ4+GucEA9npy/9yBLXPCoNSLhQBUT1Q?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2025; 6:gNO2TbaExgnNICpCQEpuzIL0OVVIumBBuEt3mK3CtWAHUotJpF7I3up7qwnEy202RQmp/ITrHUaJK2ZUtycFQWRmRsf9N11bri+eJtDx6l8AVNkmLn+WPJBwrlINloFT4mLJ3loDXvuu4lJG+TCfd+7Z0xtJi5dK1GUEaXMncyHkTptvTLrGGLaw65tFe3COK7FzPRQ85bvjJ51PgyHOCxSCrbNLp5YWd0wQiyV6RCR5ZT+jFGkFte4RvZpuhJx6uGIDi5Py86cXMR9XV0JMcFcztXL78j0oYtJTV/1coAThdmKwVlWHVy+FNuefUD256uA9rORtB+hVE1yG0SP6QZNKKKdO6WWoNMPdn5QEouMGGnlFFDpuUMH41BYJljJDxiOBYm2/OWlYA1/MsXX67pW4mIgBwZml2MI1TV4aTGipl387x9sLh1jnhy2wEIcIVhvjRL8yx49BYg4eVKZbWy5vdPpbLSZRGZalL2TLJtvtumRLxdDJ+ORucnsdPtSRl1BCtdyIVWVuFX+Mt9Dz/Q==; 5:Wi2b7e59RzvVqoc9DHRF7E2Oh2xKJ67nqvq0qlbe2pVvHeeOA8MgfdcCpUxCIBoc/jtC1ix/56UgNUbOirevtyxNZSNnw6c9e5JsrgqO+bBoBFyYEaMCcsQpeSStjcjiOuh+ihx3xIEW7lr8tfFLEw==; 24:/eyndHrFbQ/SM1giyKgwPVMCdyJuraF9tO2jbNxvtaAnWfSz6R24D4PAoPbQSaPgslddzVJjAiL6k5k8wfNk2w62OXeO/ldVTFSRf3hpEPY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2025; 7:49Bu/8vYjb/tGujdMiwao6vC8kcozLziEI4yA97T+yOvK44a4I579vNn9B+pwxDac+mFtSil4LqcbFWUxdKBc7R/FBQ3sNYbc5k6yYKOA4qfzuTaFTPewho1HyGUSg0Yl4aZVVw5lVC08+0cGWDBWKgrrnaCzTxUKymSLdNDQOxtdM46if+j/bGByxpociybsMQh0xfn8bL/k7rU7Adv3OYgHYRwuwQGKmKGRS/TzccLGZl7qNhx1RuUJmRaX6vwxjgiTjPzcD2Tbh3U5ERvfDKIYuUQeDGSI0Zeu56SgHNUcDcOxHKe9J9dIB1SQGQMByk9wrzO0oKP4yM+ktIwsw== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 May 2017 11:51:15.2658 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0701MB2025 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170510_045144_047693_5A8069F1 X-CRM114-Status: GOOD ( 11.53 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Geetha Sowjanya , jcm@redhat.com, linu.cherian@cavium.com, linux-kernel@vger.kernel.org, geethasowjanya.akula@gmail.com, linux-acpi@vger.kernel.org, robert.richter@cavium.com, catalin.marinas@arm.com, sgoutham@cavium.com, linux-arm-kernel@lists.infradead.org, Charles.Garcia-Tobin@arm.com Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP 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..e6da62b 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-cn99xx,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..5836b72 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-cn99xx,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_V3_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;