Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp1001802rdg; Wed, 11 Oct 2023 11:15:56 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGVMpJRpFiGXMPw+iy1BppfrGE44eOAqrNSQ1EfXuHFyaqI5Pjz64Vf3PrFeNJJ/3mOl+iq X-Received: by 2002:a05:6a20:3d1d:b0:166:654e:549d with SMTP id y29-20020a056a203d1d00b00166654e549dmr23738898pzi.37.1697048156092; Wed, 11 Oct 2023 11:15:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697048156; cv=none; d=google.com; s=arc-20160816; b=IYKYadzquFPr9CUGSaUAlVZ0MaSM7RrKM2SuavDgBa7Qu18rYLO1KSN3CQrLkD312C gYXvvSupS7k+2rp8EHqkmrO1x/nWO5GRSOLieETRSh8X/UgfVrIVAOub8CL3Riik3V5L 0T6aJkw6dWPYG1owk+I1vWGT/CzpGhGGZNdhoKUvxDYvabszfGT+13AiqZpxorksXou2 7ijC6M9GxjRGRWhHiPZi3lvcXZUgGRtyS7V46DTYXf554antmTDuhwFgRgqLmNL5k27V Dh3WqvpzHY4wesnnDPxWPWugtxf1+riIxEbANopjST23mZWLtr2Fk+DeezWPi5Jn4NDN 8tSQ== 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=Tx44bFL5ciOCcadBLeZ2ny8kVoEI2YT4lsJXRu0R/PY=; fh=3nQM0QufZPSZ94JO+WDmHkrFziuG1/NJr0OD1jy0Wvc=; b=OEGM//lPGJsfqFH5vi36moYYPildmVRM+Z4BO14zele75g9Mo6MFqAU9H3JoxcVVDc 5U7Y7Ft5YYIrMlB1P3/d3XAABXr8hnc2jj0mt6VALwyLb+aM8qFj1x5LTMEhHd2mUnUC iAaeW04kihRly/9hUHmrvC4wyh6IV4ekyqYJ7WFpuFYpX1B50zqeFY9Y77+L8wivPAH6 eA5q+v5+tXij6EeGCoctlMkbwLQpHr7dXlrPTuGG4LX1kuzH8N0XfUhTxvBFn1Gd53m/ yxCb1pNoMHkCsfm7OPEKYf8bHOVc/L7vXUeEa114crt1zl0yEhmA79S/q6u2dyKHg+QS fu7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id k189-20020a6384c6000000b00584e52f3ee9si320827pgd.61.2023.10.11.11.15.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Oct 2023 11:15:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id CF6F68068A41; Wed, 11 Oct 2023 11:15:26 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234931AbjJKSPQ (ORCPT + 99 others); Wed, 11 Oct 2023 14:15:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233342AbjJKSPI (ORCPT ); Wed, 11 Oct 2023 14:15:08 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C69BC9E for ; Wed, 11 Oct 2023 11:15:06 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 545E8150C; Wed, 11 Oct 2023 11:15:47 -0700 (PDT) Received: from e121345-lin.cambridge.arm.com (e121345-lin.cambridge.arm.com [10.1.196.40]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B5E143F5A1; Wed, 11 Oct 2023 11:15:05 -0700 (PDT) From: Robin Murphy To: joro@8bytes.org, will@kernel.org Cc: iommu@lists.linux.dev, jgg@nvidia.com, baolu.lu@linux.intel.com, linux-kernel@vger.kernel.org Subject: [PATCH v5 4/7] iommu: Decouple iommu_domain_alloc() from bus ops Date: Wed, 11 Oct 2023 19:14:51 +0100 Message-Id: <81a0a66d76b3826f1a0b55d7fbaf0986034c7abc.1697047261.git.robin.murphy@arm.com> X-Mailer: git-send-email 2.39.2.101.g768bb238c484.dirty In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=2.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Wed, 11 Oct 2023 11:15:27 -0700 (PDT) X-Spam-Level: ** As the final remaining piece of bus-dependent API, iommu_domain_alloc() can now take responsibility for the "one iommu_ops per bus" rule for itself. It turns out we can't safely make the internal allocation call any more group-based or device-based yet - that will have to wait until the external callers can pass the right thing - but we can at least get as far as deriving "bus ops" based on which driver is actually managing devices on the given bus, rather than whichever driver won the race to register first. This will then leave us able to convert the last of the core internals over to the IOMMU-instance model, allow multiple drivers to register and actually coexist (modulo the above limitation for unmanaged domain users in the short term), and start trying to solve the long-standing iommu_probe_device() mess. Signed-off-by: Robin Murphy --- v5: Rewrite, de-scoping to just retrieve ops under the same assumptions as the existing code. --- drivers/iommu/iommu.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 578292d3b152..18667dc2ff86 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2140,12 +2140,31 @@ __iommu_group_domain_alloc(struct iommu_group *group, unsigned int type) return __iommu_domain_alloc(dev_iommu_ops(dev), dev, type); } +static int __iommu_domain_alloc_dev(struct device *dev, void *data) +{ + const struct iommu_ops **ops = data; + + if (!dev_has_iommu(dev)) + return 0; + + if (WARN_ONCE(*ops && *ops != dev_iommu_ops(dev), + "Multiple IOMMU drivers present for bus %s, which the public IOMMU API can't fully support yet. You will still need to disable one or more for this to work, sorry!\n", + dev_bus_name(dev))) + return -EBUSY; + + *ops = dev_iommu_ops(dev); + return 0; +} + struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) { - if (bus == NULL || bus->iommu_ops == NULL) + const struct iommu_ops *ops = NULL; + int err = bus_for_each_dev(bus, NULL, &ops, __iommu_domain_alloc_dev); + + if (err || !ops) return NULL; - return __iommu_domain_alloc(bus->iommu_ops, NULL, - IOMMU_DOMAIN_UNMANAGED); + + return __iommu_domain_alloc(ops, NULL, IOMMU_DOMAIN_UNMANAGED); } EXPORT_SYMBOL_GPL(iommu_domain_alloc); -- 2.39.2.101.g768bb238c484.dirty