Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp3573157iog; Tue, 21 Jun 2022 01:17:02 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vmIy1W7n3St6it8zhHzHPhULJsATKjc9X/FZO/onv41IfYAwP1+hijKDOy4RIzKwCQPO8F X-Received: by 2002:a17:902:a704:b0:168:e48d:b9a9 with SMTP id w4-20020a170902a70400b00168e48db9a9mr27434281plq.49.1655799422667; Tue, 21 Jun 2022 01:17:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655799422; cv=none; d=google.com; s=arc-20160816; b=H/USKLefB9juSas0Uh5CM+7z42h+XZJriKUDd8OckgvM151D8hugKWeMNK7cjEdYGU kCcAXaBpDSNgH1F1Jcb2xqEbdyb5XhwRDblprU7h1D/qMItm9GGaozEf9RimXtIyMFTm EcYTtHdCDBbe8mUL14d9jT9XIqmmOVoXcCcLv0j7YWFJfjTfyuFoSZejEdojHrINjU/+ OlSIMOIs00oeDbjzdXufEcpX7MimDQVMS60r88SvfkeUNN4jD0JzPKUG2UA1vdmGJXi2 xlh3b/AGg8lb0pmIwTHcBzGElGoiUTfKvYjaFC7UbXajNk7N2gvVOCt2xuG7nnvwaSQO 6ChA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=wT6wVqH4VlO2ExanIdGZnPz52zNjJUieOCV4idkpyj8=; b=n4XyF0gqk4WBBoKYZkrx4nVc/87koiEEzVbN2mgDe66qQMtkM04tS8LNERNyRhzg9b quhBhcsSZMWAnH7TiXUllXjsvTSIIXoMT5fbB7fr582gZlW0a0ymIfcr2B3I3vP/2jeO +/lC9nTEb+bPXZF6rEhSzy6AR5Hor8ch8976rqYJqRmqAGnHSguX3UgBjiCpP7M9n6eE 5dM/5DLH9MZ996IQb1XNMiuAjkvN4ypBnX77mNT+i5nYx5iLEx+ruhGvG+80D9C9E8so 9ENFei2Gv3OOgYrpJVWE3U+tGRfRN11hQu9Y0kWgploFKmJpJBMQqIoV6hlJwajzkCRZ bndg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p16-20020aa79e90000000b005253459815csi2109368pfq.324.2022.06.21.01.16.48; Tue, 21 Jun 2022 01:17:02 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346840AbiFUHZl (ORCPT + 99 others); Tue, 21 Jun 2022 03:25:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55538 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345320AbiFUHZa (ORCPT ); Tue, 21 Jun 2022 03:25:30 -0400 X-Greylist: delayed 399 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Tue, 21 Jun 2022 00:25:29 PDT Received: from soltyk.jannau.net (soltyk.jannau.net [144.76.91.90]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88A1C1A04B for ; Tue, 21 Jun 2022 00:25:29 -0700 (PDT) Received: from coburn.home.jannau.net (p579ad988.dip0.t-ipconnect.de [87.154.217.136]) by soltyk.jannau.net (Postfix) with ESMTPSA id 1E53426ED1B; Tue, 21 Jun 2022 09:18:51 +0200 (CEST) From: Janne Grunau To: iommu@lists.linux-foundation.org Cc: Konrad Dybcio , asahi@lists.linux.dev, Sven Peter , Alyssa Rosenzweig , Georgi Djakov , Hector Martin , "Isaac J. Manjarres" , Joerg Roedel , Robin Murphy , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 4/5] iommu/io-pgtable-dart: Add DART PTE support for t6000 Date: Tue, 21 Jun 2022 09:18:47 +0200 Message-Id: <20220621071848.14834-5-j@jannau.net> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220621071848.14834-1-j@jannau.net> References: <20220621071848.14834-1-j@jannau.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_NONE,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 From: Sven Peter The DARTs present in the M1 Pro/Max/Ultra SoC use a diffent PTE format. They support a 42bit physical address space by shifting the paddr and extending its mask inside the PTE. They also come with mandatory sub-page protection now which we just configure to always allow access to the entire page. This feature is already present but optional on the previous DARTs which allows to unconditionally configure it. Signed-off-by: Sven Peter Co-developed-by: Janne Grunau Signed-off-by: Janne Grunau --- Changes in v3: - apply change to io-pgtable-dart.c - handle pte <> paddr conversion based on the pte format instead of the output address size Changes in v2: - add APPLE_DART2 PTE format drivers/iommu/io-pgtable-dart.c | 51 +++++++++++++++++++++++++++------ drivers/iommu/io-pgtable.c | 1 + include/linux/io-pgtable.h | 1 + 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c index fa8025c03bb5..9c3c2505f3dc 100644 --- a/drivers/iommu/io-pgtable-dart.c +++ b/drivers/iommu/io-pgtable-dart.c @@ -68,12 +68,19 @@ #define APPLE_DART_PTE_SUBPAGE_END GENMASK_ULL(51, 40) #define APPLE_DART1_PADDR_MASK GENMASK_ULL(35, 12) +#define APPLE_DART2_PADDR_MASK GENMASK_ULL(37, 10) +#define APPLE_DART2_PADDR_SHIFT (4) /* Apple DART1 protection bits */ #define APPLE_DART1_PTE_PROT_NO_READ BIT(8) #define APPLE_DART1_PTE_PROT_NO_WRITE BIT(7) #define APPLE_DART1_PTE_PROT_SP_DIS BIT(1) +/* Apple DART2 protection bits */ +#define APPLE_DART2_PTE_PROT_NO_READ BIT(3) +#define APPLE_DART2_PTE_PROT_NO_WRITE BIT(2) +#define APPLE_DART2_PTE_PROT_NO_CACHE BIT(1) + /* marks PTE as valid */ #define APPLE_DART_PTE_VALID BIT(0) @@ -101,13 +108,31 @@ static inline bool iopte_leaf(dart_iopte pte, int lvl, static dart_iopte paddr_to_iopte(phys_addr_t paddr, struct dart_io_pgtable *data) { - return paddr & APPLE_DART1_PADDR_MASK; + dart_iopte pte; + + if (data->iop.fmt == APPLE_DART) + return paddr & APPLE_DART1_PADDR_MASK; + + /* format is APPLE_DART2 */ + pte = paddr >> APPLE_DART2_PADDR_SHIFT; + pte &= APPLE_DART2_PADDR_MASK; + + return pte; } static phys_addr_t iopte_to_paddr(dart_iopte pte, struct dart_io_pgtable *data) { - return pte & APPLE_DART1_PADDR_MASK; + u64 paddr; + + if (data->iop.fmt == APPLE_DART) + return pte & APPLE_DART1_PADDR_MASK; + + /* format is APPLE_DART2 */ + paddr = pte & APPLE_DART2_PADDR_MASK; + paddr <<= APPLE_DART2_PADDR_SHIFT; + + return paddr; } static void *__dart_alloc_pages(size_t size, gfp_t gfp, @@ -139,7 +164,7 @@ static void __dart_init_pte(struct dart_io_pgtable *data, size_t sz = DART_BLOCK_SIZE(lvl, data); int i; - if (lvl == DART_MAX_LEVELS - 1) + if (lvl == DART_MAX_LEVELS - 1 && data->iop.fmt == APPLE_DART) pte |= APPLE_DART1_PTE_PROT_SP_DIS; pte |= APPLE_DART_PTE_VALID; @@ -251,10 +276,20 @@ static dart_iopte dart_prot_to_pte(struct dart_io_pgtable *data, { dart_iopte pte = 0; - if (!(prot & IOMMU_WRITE)) - pte |= APPLE_DART1_PTE_PROT_NO_WRITE; - if (!(prot & IOMMU_READ)) - pte |= APPLE_DART1_PTE_PROT_NO_READ; + if (data->iop.fmt == APPLE_DART) { + if (!(prot & IOMMU_WRITE)) + pte |= APPLE_DART1_PTE_PROT_NO_WRITE; + if (!(prot & IOMMU_READ)) + pte |= APPLE_DART1_PTE_PROT_NO_READ; + } + if (data->iop.fmt == APPLE_DART2) { + if (!(prot & IOMMU_WRITE)) + pte |= APPLE_DART2_PTE_PROT_NO_WRITE; + if (!(prot & IOMMU_READ)) + pte |= APPLE_DART2_PTE_PROT_NO_READ; + if (!(prot & IOMMU_CACHE)) + pte |= APPLE_DART2_PTE_PROT_NO_CACHE; + } return pte; } @@ -536,7 +571,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) if (!cfg->coherent_walk) return NULL; - if (cfg->oas > 36) + if (cfg->oas != 36 && cfg->oas != 42) return NULL; data = dart_alloc_pgtable(cfg); diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c index e6edc6686859..a5d0f01afa7b 100644 --- a/drivers/iommu/io-pgtable.c +++ b/drivers/iommu/io-pgtable.c @@ -23,6 +23,7 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = { #endif #ifdef CONFIG_APPLE_DART [APPLE_DART] = &io_pgtable_apple_dart_init_fns, + [APPLE_DART2] = &io_pgtable_apple_dart_init_fns, #endif #ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S [ARM_V7S] = &io_pgtable_arm_v7s_init_fns, diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index 86af6f0a00a2..76b98511cbc8 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -17,6 +17,7 @@ enum io_pgtable_fmt { ARM_MALI_LPAE, AMD_IOMMU_V1, APPLE_DART, + APPLE_DART2, IO_PGTABLE_NUM_FMTS, }; -- 2.35.1