From nobody Fri Nov 29 23:45:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1627950276; cv=none; d=zohomail.com; s=zohoarc; b=QzlTbPbIx8CXdN7780mam6t1qiZze9bwe9q84NZt7TIhpeyAPlfMUKuUMT6Je+mEPNZ94xaS31zTk8LJgp57r9MaFI0vvBLEgBi7C/G4I8V3sQjH+VgbjksLyguxtSvq1dZDB4ntiwlKLbqMfLYLswQ64guY+2H2QPVu066vFLY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1627950276; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=0y0t5XKLLwL9zvBJg+hYhWXQo3Tw4yd6XOMImXLIA1g=; b=lKp3GgimymkD1qVvIVvA+M/B3AZIFR5kiThWqHLiAPRsU1Nnqx+vuAXp3+XRRzXK8LgRvA2YL5d1vNuQpySZYTzXz+/eqL3dPpxMjX4lbyJ7yKN2Uz9jOagU5pazZKcAaHiK5xS9AhZqJHGXfD0enTXORSR8+OFgAnRJrY0QSek= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1627950276313495.18022566712034; Mon, 2 Aug 2021 17:24:36 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.163212.299058 (Exim 4.92) (envelope-from ) id 1mAiEJ-0002Lk-GM; Tue, 03 Aug 2021 00:24:23 +0000 Received: by outflank-mailman (output) from mailman id 163212.299058; Tue, 03 Aug 2021 00:24:23 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mAiEJ-0002LZ-Cp; Tue, 03 Aug 2021 00:24:23 +0000 Received: by outflank-mailman (input) for mailman id 163212; Tue, 03 Aug 2021 00:24:22 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mAiEI-0001EV-EX for xen-devel@lists.xenproject.org; Tue, 03 Aug 2021 00:24:22 +0000 Received: from mail.kernel.org (unknown [198.145.29.99]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 8821dc9d-bb27-477e-9c4f-5fe612abc26d; Tue, 03 Aug 2021 00:24:13 +0000 (UTC) Received: by mail.kernel.org (Postfix) with ESMTPSA id 4B14A60F11; Tue, 3 Aug 2021 00:24:12 +0000 (UTC) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 8821dc9d-bb27-477e-9c4f-5fe612abc26d DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1627950252; bh=Fhw/OAINyMd6WdnbOn4NtALR4OovCkQXG7dyHkj549U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VtLeXDlUfQUJEvy6/uPiVfdDNL8nQLK46o6juyovE15m9052qQIHeaWgQNBASxm9y u6bdufv1LXTr2W7Djf5MpygylzJjlvbW2594PJEYBxmUS7aDginuVarzZWZ1xfiA/R 0TZ+pUKJUDO2vLQr1ALzRoy6NUeLR7TF2PbZDud6RjpSMRou1SOfiBREf/jdIxJzdH aJYRVxEfH7QM5OEOpN8iWmOXWzVFFBVS/Nzd4/0HgTNEPnvaNXMoZqcoeevHh2W2oR yJ4WPc847VBTf+L2mjIVQITlpczJNcRDmTdbTZsJH3ghL9iUcxuLed4T/F70FkZxoj CcGGUKheI1n1w== From: Stefano Stabellini To: xen-devel@lists.xenproject.org Cc: sstabellini@kernel.org, julien@xen.org, Bertrand.Marquis@arm.com, Volodymyr_Babchuk@epam.com, rahul.singh@arm.com, brian.woods@xilinx.com, Stefano Stabellini Subject: [PATCH v6 4/4] arm,smmu: add support for generic DT bindings. Implement add_device and dt_xlate. Date: Mon, 2 Aug 2021 17:24:09 -0700 Message-Id: <20210803002409.19406-4-sstabellini@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: X-ZohoMail-DKIM: pass (identity @kernel.org) X-ZM-MESSAGEID: 1627950276942100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Brian Woods For the legacy path, arm_smmu_dt_add_device_legacy is called by register_smmu_master scanning mmu-masters (a fwspec entry is also created.) For the generic path, arm_smmu_dt_add_device_generic gets called instead. Then, arm_smmu_dt_add_device_generic calls arm_smmu_dt_add_device_legacy afterwards, shared with the legacy path. This way most of the low level implementation is shared between the two paths. If both legacy bindings and generic bindings are present in device tree, the legacy bindings are the ones that are used. That's because mmu-masters is parsed by xen/drivers/passthrough/arm/smmu.c:arm_smmu_device_dt_probe which is called by arm_smmu_dt_init. It happens very early. iommus is parsed by xen/drivers/passthrough/device_tree.c:iommu_add_dt_device which is called by xen/arch/arm/domain_build.c:handle_device and happens afterwards. arm_smmu_dt_xlate_generic is a verbatim copy from Linux (drivers/iommu/arm/arm-smmu/arm-smmu.c:arm_smmu_of_xlate, version v5.10). A workaround was introduced by cf4af9d6d6c (xen/arm: boot with device trees with "mmu-masters" and "iommus") because the SMMU driver only supported the legacy bindings. Remove it now. Signed-off-by: Brian Woods Signed-off-by: Stefano Stabellini Reviewed-by: Rahul Singh Acked-by: Julien Grall --- Changes in v5: - add Acked-by --- xen/drivers/passthrough/arm/smmu.c | 40 ++++++++++++++++++++++++++- xen/drivers/passthrough/device_tree.c | 17 +----------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/a= rm/smmu.c index 4aa3ecec57..c234ad9c7f 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -256,6 +256,8 @@ struct iommu_group atomic_t ref; }; =20 +static struct arm_smmu_device *find_smmu(const struct device *dev); + static struct iommu_group *iommu_group_alloc(void) { struct iommu_group *group =3D xzalloc(struct iommu_group); @@ -444,6 +446,8 @@ static struct iommu_group *iommu_group_get(struct devic= e *dev) #define SMR_VALID (1U << 31) #define SMR_MASK_SHIFT 16 #define SMR_ID_SHIFT 0 +#define SMR_ID_MASK 0x7fff +#define SMR_MASK_MASK 0x7fff =20 #define ARM_SMMU_GR0_S2CR(n) (0xc00 + ((n) << 2)) #define S2CR_CBNDX_SHIFT 0 @@ -872,6 +876,38 @@ static int register_smmu_master(struct arm_smmu_device= *smmu, fwspec); } =20 +static int arm_smmu_dt_add_device_generic(u8 devfn, struct device *dev) +{ + struct arm_smmu_device *smmu; + struct iommu_fwspec *fwspec; + + fwspec =3D dev_iommu_fwspec_get(dev); + if (fwspec =3D=3D NULL) + return -ENXIO; + + smmu =3D find_smmu(fwspec->iommu_dev); + if (smmu =3D=3D NULL) + return -ENXIO; + + return arm_smmu_dt_add_device_legacy(smmu, dev, fwspec); +} + +static int arm_smmu_dt_xlate_generic(struct device *dev, + const struct dt_phandle_args *spec) +{ + uint32_t mask, fwid =3D 0; + + if (spec->args_count > 0) + fwid |=3D (SMR_ID_MASK & spec->args[0]) << SMR_ID_SHIFT; + + if (spec->args_count > 1) + fwid |=3D (SMR_MASK_MASK & spec->args[1]) << SMR_MASK_SHIFT; + else if (!of_property_read_u32(spec->np, "stream-match-mask", &mask)) + fwid |=3D (SMR_MASK_MASK & mask) << SMR_MASK_SHIFT; + + return iommu_fwspec_add_ids(dev, &fwid, 1); +} + static struct arm_smmu_device *find_smmu_for_device(struct device *dev) { struct arm_smmu_device *smmu; @@ -2837,6 +2873,7 @@ static void arm_smmu_iommu_domain_teardown(struct dom= ain *d) static const struct iommu_ops arm_smmu_iommu_ops =3D { .init =3D arm_smmu_iommu_domain_init, .hwdom_init =3D arm_smmu_iommu_hwdom_init, + .add_device =3D arm_smmu_dt_add_device_generic, .teardown =3D arm_smmu_iommu_domain_teardown, .iotlb_flush =3D arm_smmu_iotlb_flush, .iotlb_flush_all =3D arm_smmu_iotlb_flush_all, @@ -2844,9 +2881,10 @@ static const struct iommu_ops arm_smmu_iommu_ops =3D= { .reassign_device =3D arm_smmu_reassign_dev, .map_page =3D arm_iommu_map_page, .unmap_page =3D arm_iommu_unmap_page, + .dt_xlate =3D arm_smmu_dt_xlate_generic, }; =20 -static __init const struct arm_smmu_device *find_smmu(const struct device = *dev) +static struct arm_smmu_device *find_smmu(const struct device *dev) { struct arm_smmu_device *smmu; bool found =3D false; diff --git a/xen/drivers/passthrough/device_tree.c b/xen/drivers/passthroug= h/device_tree.c index 9249f21c01..98f2aa0dad 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -159,22 +159,7 @@ int iommu_add_dt_device(struct dt_device_node *np) * these callback implemented. */ if ( !ops->add_device || !ops->dt_xlate ) - { - /* - * Some Device Trees may expose both legacy SMMU and generic - * IOMMU bindings together. However, the SMMU driver is only - * supporting the former and will protect them during the - * initialization. So we need to skip them and not return - * error here. - * - * XXX: This can be dropped when the SMMU is able to deal - * with generic bindings. - */ - if ( dt_device_is_protected(np) ) - return 0; - else - return -EINVAL; - } + return -EINVAL; =20 if ( !dt_device_is_available(iommu_spec.np) ) break; --=20 2.17.1