From patchwork Sun Oct 3 18:30:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Kettenis X-Patchwork-Id: 1535860 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HMsx30JXjz9sX3 for ; Mon, 4 Oct 2021 05:35:50 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id DDD218349C; Sun, 3 Oct 2021 20:35:18 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=openbsd.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by phobos.denx.de (Postfix, from userid 109) id 9C57C80303; Sun, 3 Oct 2021 20:34:15 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_SOFTFAIL autolearn=no autolearn_force=no version=3.4.2 Received: from lb2-smtp-cloud7.xs4all.net (lb2-smtp-cloud7.xs4all.net [194.109.24.28]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 179CA83124 for ; Sun, 3 Oct 2021 20:34:12 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=openbsd.org Authentication-Results: phobos.denx.de; spf=fail smtp.mailfrom=kettenis@openbsd.org Received: from cust-df1d398c ([IPv6:fc0c:c1f5:9ac0:c45f:1583:5c5b:91fa:2436]) by smtp-cloud7.xs4all.net with ESMTPA id X6GJmiwcM3tiGX6JOmem0X; Sun, 03 Oct 2021 20:34:11 +0200 From: Mark Kettenis To: u-boot@lists.denx.de Cc: Mark Kettenis , Bharat Gooty , Rayagonda Kokatanur , Simon Glass , Andre Przywara , Fabio Estevam , Jagan Teki , Kever Yang , Priyanka Jain , Peter Robinson , Tim Harvey , Konstantin Porotchkin , Heiko Schocher , Lokesh Vutla , Dario Binacchi , Bin Meng , Nandor Han , Sean Anderson , Nicolas Saenz Julienne , Claudiu Manoil , Jean-Jacques Hiblot , Michael Walle , Patrick Delaunay , AKASHI Takahiro , Joe Hershberger , Rasmus Villemoes , =?utf-8?q?Fr=C3=A9d=C3=A9ric?= =?utf-8?q?_Danis?= , Wasim Khan , Alexandru Gagniuc , Pratyush Yadav , Steffen Jaeckel , Stefan Roese , Matthias Brugger , Alper Nebi Yasak , Heinrich Schuchardt , Asherah Connor , Oliver Graute , Stephan Gerhold , Leo Yu-Chi Liang , Jonathan Balkind , Kishon Vijay Abraham I , Masami Hiramatsu , Padmarao Begari , Kunihiko Hayashi , Ye Li , Philippe Reynes , Michal Simek , =?utf-8?q?Pali_Roh=C3=A1r?= , =?utf-8?q?Marek_Beh=C3=BAn?= , Weijie Gao , Vabhav Sharma , Andy Shevchenko Subject: [PATCH v2 5/7] iommu: Add Apple DART driver Date: Sun, 3 Oct 2021 20:30:31 +0200 Message-Id: <20211003183050.67925-6-kettenis@openbsd.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211003183050.67925-1-kettenis@openbsd.org> References: <20211003183050.67925-1-kettenis@openbsd.org> MIME-Version: 1.0 X-CMAE-Envelope: MS4xfKZxxecf9qumDJ8CTN+++aUGNEXpZTp8rmFaa6gqYqtPKAI4xGWA9YFds/pbQ14PuYgoNDYzCxsDrmyxLwL4YVsueVzExdWXV6KaUK9FISSl9DWjZCQv t4HDmLVMyQJQcmydeBJJvRwmTZTGsJtgDzXwoGfGPqrkowrIM4wl6CoP6IoWEsRU37ANfrWrO352zTvo5jN9ueyknJAyte5fmGMLf25lkAVeFP0dAWkXp9SG G5mAJ9/c/+z6E7T7hDFeNTm1UlQEkImamPIgd4K7xlFVycSkHlKYe53CKZPyE+E8L0B5zN1Lp+q61vj51ZRoRdvRagtKbBnyH9VHJF0JVWcr5K35+ugCy1he K4hGiEv5G6PUEM8X4rEDCYWZfN3GX8j0/WUCHQYpAYAVXq+Txa+A3QHE6ADzohVF/bDS1GY3OsrvJ8W1FHwgdq/WyVnJ7jyXXLtBA05mumti95eMfDlF0pxt R8IB5EMdFg+NCHsjeJjWwX39ufELLAAUezoeiyPC1B4cm+DeINr/KJhNITjhIv3VKXMNhDnFtSgB0WcvkDGQbOdC+nmOWrGO1KK01//gx8URI+JhYmwPirzg 5A6Smh2lHHbnRQJz5idN4u6kazxkiQsDPe9mSA87Mbs285eVGIHVqGqLpG1vlLeqdIAr4Y6Tr5R4WNX5/wwvgGXSlVLc3FyFdQLucontZbu1rg+vuwBR3yQb ptvRay0wDm+5YpjSkgXfdH+jT7oM7EhifaYoITvFClZJIGptJ1hN/caAsLEA4QNpK3VhBp7k7753yiHPA/l+LQ5QJ8kuetdGkK8bBuCEpIkO29p9fmcBjcP9 PsreNgzouAcAS+wIPA6Qm3I4bChZP9oj8mBkEDD0tkuTQt6KLvHhTVOiQCukkJEC08SzcH0tr6PasIYhGTWxUku7k9fcID0e6ka298oNC9fOgYfvRPSpjroi Vq4i3VJ0EIKXcZgYFAU2iGErm04P48yVkV7JYpRC/VZt/u3VHB9ZVIMcp89ZzpLEV29Wymd4HgKRJ9Kr/UT1DtrcF9oJaGlCatcWZtI6pVHkWfYSbbROraJm judiFuAsgq6Re6bJQBMRGerqKkbmgMW3f5c1PEq+ixu3s6HxgL+ADmFNVo2luM+FYblW+cRFDXgo+q/zqQhKUtxiprVCB0Bw2aLi6pEFsIN0yKYPFYHTTmrz aend4jAdghJ+X0NIfksvyAKrhpE0ZYRwBX6DKGvgZSHyqW/SjJfxavGqk24U+is6z2QdXesU8r8AN01B47ZdkPN3immykrHHw5Vt0hCfr5wHQ4oEl46YoQVs MYMBLttlfZcxB8KuYDeay+NWDJzfTrVthtDeFOwrcXjOHpAJTyH1S+K8vQOlWuoi8DzoQjExpqlBt/fiVq/brcuaRNhq46XCYruwM8RcGveT5yb26xNMqsc7 4Dc68/GHWYxQhWJMYJEiPgodsAp6EDBahwKhmFweabNuzHlBkXanaEJQ8Bwf09pyF+PJ2qBGJdnUYuB7FJ5c5ADsJ/FUv+r0rOt3LY+/XC8gI5AQttoiyTpl wZ8nxUVP4OENLBgwmEq06MWndQAgpL8uH4E0lSB/ZAN7H+ssvNzhayif9TAf4kz7OyAKgxacRLDnCTfHIS/lGJwfU+K5qqr+G+XCsXPWj9mbNFDzKsO6uk3D qj8YasYeHJ9SgM8UeVNqaHEq+h3WBrccxPV7KOuDOD0YBGU5LTYFbkNGoej01pkt5gyAjbwsreyPyj1zLPr+Ffg0mSWu5/bIWhT8O/sIdbjEIAk2qHR0ddvt 0y8Dpam24NrVWcfxotdQOI9BST41t5IL4F6rvFma5EdPB86/mSbC9QMdz2S0RN0V/N5ncnzudr9ad6Mx/A4yXC6yhQK5LLunrOUbzohDSl2zB23QkwWjl5B+ sMSMFYzkwlnbI7wIdBdT+M5pqPgAAjC+uhXsq9R659BAwm6a X-Mailman-Approved-At: Sun, 03 Oct 2021 20:34:39 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean The DART is an IOMMU that is used on Apple's M1 SoC. This driver configures the DART such that it operates in bypass mode which is enough to support DMA for the USB3 ports integrated on the SoC. Signed-off-by: Mark Kettenis Reviewed-by: Simon Glass --- arch/arm/Kconfig | 1 + drivers/iommu/Kconfig | 10 +++++++ drivers/iommu/Makefile | 1 + drivers/iommu/apple_dart.c | 59 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 drivers/iommu/apple_dart.c diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 876d9c4044..91bf6a122a 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -906,6 +906,7 @@ config ARCH_APPLE select DM_SERIAL select DM_USB select DM_VIDEO + select IOMMU select LINUX_KERNEL_IMAGE_HEADER select OF_CONTROL select OF_BOARD diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index 8cb377560e..51694c168c 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -10,4 +10,14 @@ config IOMMU help Enable driver model for IOMMU devices. +config APPLE_DART + bool "Apple DART support" + depends on IOMMU && ARCH_APPLE + default y + help + Enable support for the DART on Apple SoCs. The DART is Apple's + IOMMU implementation. The driver performs the necessary + configuration to put the DART into bypass mode such that it can + be used transparently by U-Boot. + endmenu diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index af1c6bbb7a..e3e0900e17 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile @@ -2,4 +2,5 @@ obj-$(CONFIG_IOMMU) += iommu-uclass.o +obj-$(CONFIG_APPLE_DART) += apple_dart.o obj-$(CONFIG_SANDBOX) += sandbox_iommu.o diff --git a/drivers/iommu/apple_dart.c b/drivers/iommu/apple_dart.c new file mode 100644 index 0000000000..ff8c5fa62c --- /dev/null +++ b/drivers/iommu/apple_dart.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2021 Mark Kettenis + */ + +#include +#include +#include +#include + +#define DART_PARAMS2 0x0004 +#define DART_PARAMS2_BYPASS_SUPPORT BIT(0) +#define DART_TLB_OP 0x0020 +#define DART_TLB_OP_OPMASK (0xfff << 20) +#define DART_TLB_OP_FLUSH (0x001 << 20) +#define DART_TLB_OP_BUSY BIT(2) +#define DART_TLB_OP_SIDMASK 0x0034 +#define DART_ERROR_STATUS 0x0040 +#define DART_TCR(sid) (0x0100 + 4 * (sid)) +#define DART_TCR_TRANSLATE_ENABLE BIT(7) +#define DART_TCR_BYPASS_DART BIT(8) +#define DART_TCR_BYPASS_DAPF BIT(12) +#define DART_TTBR(sid, idx) (0x0200 + 16 * (sid) + 4 * (idx)) +#define DART_TTBR_VALID BIT(31) +#define DART_TTBR_SHIFT 12 + +static int apple_dart_probe(struct udevice *dev) +{ + void *base; + int sid, i; + + base = dev_read_addr_ptr(dev); + if (!base) + return -EINVAL; + + u32 params2 = readl(base + DART_PARAMS2); + if (params2 & DART_PARAMS2_BYPASS_SUPPORT) { + for (sid = 0; sid < 16; sid++) { + writel(DART_TCR_BYPASS_DART | DART_TCR_BYPASS_DAPF, + base + DART_TCR(sid)); + for (i = 0; i < 4; i++) + writel(0, base + DART_TTBR(sid, i)); + } + } + + return 0; +} + +static const struct udevice_id apple_dart_ids[] = { + { .compatible = "apple,t8103-dart" }, + { /* sentinel */ } +}; + +U_BOOT_DRIVER(apple_dart) = { + .name = "apple_dart", + .id = UCLASS_IOMMU, + .of_match = apple_dart_ids, + .probe = apple_dart_probe +};