From nobody Mon Apr 29 15:24:49 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=1626997020; cv=none; d=zohomail.com; s=zohoarc; b=fIdJewlhEBI5FsP+zDK7POr0Y/RdaNhleQp+9X8B357ol5GNox2ztFhgS3r+iTsgmVWkUtgTIbucolxB8fdtEDCstCRtyrcwO28P2xVT/0TRhEuRvA1I8AzIkzkGh3/6O/I1JXsa5I7rSeuVj4yYsFSG3CdSYhfiCyuZddJXobk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1626997020; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=/FmUIrPE00nX8DnmdVs884V/lclxD8sCEx+5MSh4azo=; b=TgZDfTKLovX2U8h8ol5Lo5a/c5f+45iA+QcKG0EOcjqFLTAm3FZPTgKl66p8Xs3i34gvUcnkBc7NuCF5IPhqAWNOqnWeyYex4goa7vCb/2Cry+zRkidh+2S26iTUdF4wCrmgp2ImP7mmDceI9JZ56idb1khDPwiCuebpOJ9ZRu0= 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 1626997020902318.8440658281876; Thu, 22 Jul 2021 16:37:00 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.159900.294056 (Exim 4.92) (envelope-from ) id 1m6iFD-0001G5-Ik; Thu, 22 Jul 2021 23:36:47 +0000 Received: by outflank-mailman (output) from mailman id 159900.294056; Thu, 22 Jul 2021 23:36:47 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFD-0001Fv-EP; Thu, 22 Jul 2021 23:36:47 +0000 Received: by outflank-mailman (input) for mailman id 159900; Thu, 22 Jul 2021 23:36:46 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFC-0001Fh-0X for xen-devel@lists.xenproject.org; Thu, 22 Jul 2021 23:36:46 +0000 Received: from mail.kernel.org (unknown [198.145.29.99]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 192036cd-fad2-4aaa-be31-14f1077d63c2; Thu, 22 Jul 2021 23:36:44 +0000 (UTC) Received: by mail.kernel.org (Postfix) with ESMTPSA id 126EE60EB2; Thu, 22 Jul 2021 23:36:44 +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: 192036cd-fad2-4aaa-be31-14f1077d63c2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1626997004; bh=Nq3WENT04Jv2WVQpnaz0jZGl+pYE7uv2I5GgVFteS7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=A3CuBlXsOn5mkFfOKnRVSzr9Qo8oPddtNybZPb/1TA9LIPpZlhupvJBtQZuOhlqeQ mJxu/pyeizSVnYIVRHS9ChLdPr0TF+Jrfto6WiL/L1V9hr6k6558GT1rdOEkxEyN8i mp4l9d9vDjnwp5wvyXu1m3OOZwsT4J02RL8r6kfJoEoyJgOv2cb35jieUzlpKLZ2Df 7msYsBgtWQnGnEOIbnNNUPyPYg44bB9RL2wigAGQKfErkCRrxZK8PaGLYdLNmZYgEP mAegT9vCdN+BBq0nuku/DhGovxZeQbEFMD2iqY+Vrooy5nJXmbA9x34vU7WeDSJCyB UztlmbgNnOvfw== 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 v5 1/4] arm,smmu: switch to using iommu_fwspec functions Date: Thu, 22 Jul 2021 16:36:39 -0700 Message-Id: <20210722233642.22515-1-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: 1626997022547100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Brian Woods Modify the smmu driver so that it uses the iommu_fwspec helper functions. This means both ARM IOMMU drivers will both use the iommu_fwspec helper functions, making enabling generic device tree bindings in the SMMU driver much cleaner. Signed-off-by: Brian Woods Signed-off-by: Stefano Stabellini Reviewed-by: Rahul Singh --- Changes in v5: - moved iommu_add_dt_device change to a separate patch --- xen/drivers/passthrough/arm/smmu.c | 75 ++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/a= rm/smmu.c index 658c40433c..09773702c3 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -32,6 +32,9 @@ * - 4k and 64k pages, with contiguous pte hints. * - Up to 48-bit addressing (dependent on VA_BITS) * - Context fault reporting + * + * Changes compared to Linux driver: + * - support for fwspec */ =20 =20 @@ -49,6 +52,7 @@ #include #include #include +#include #include =20 /* Xen: The below defines are redefined within the file. Undef it */ @@ -617,13 +621,11 @@ struct arm_smmu_smr { =20 struct arm_smmu_master_cfg { struct arm_smmu_device *smmu; - int num_streamids; - u16 streamids[MAX_MASTER_STREAMIDS]; s16 smendx[MAX_MASTER_STREAMIDS]; }; #define INVALID_SMENDX -1 -#define for_each_cfg_sme(cfg, i, idx) \ - for (i =3D 0; idx =3D cfg->smendx[i], i < cfg->num_streamids; ++i) +#define for_each_cfg_sme(cfg, i, idx, num) \ + for (i =3D 0; idx =3D cfg->smendx[i], i < num; ++i) =20 struct arm_smmu_master { struct device_node *of_node; @@ -713,6 +715,14 @@ static struct arm_smmu_option_prop arm_smmu_options[] = =3D { { 0, NULL}, }; =20 +static inline struct iommu_fwspec * +arm_smmu_get_fwspec(struct arm_smmu_master_cfg *cfg) +{ + struct arm_smmu_master *master =3D container_of(cfg, + struct arm_smmu_master, cfg); + return dev_iommu_fwspec_get(&master->of_node->dev); +} + static void parse_driver_options(struct arm_smmu_device *smmu) { int i =3D 0; @@ -806,8 +816,9 @@ static int register_smmu_master(struct arm_smmu_device = *smmu, struct device *dev, struct of_phandle_args *masterspec) { - int i; + int i, ret =3D 0; struct arm_smmu_master *master; + struct iommu_fwspec *fwspec; =20 master =3D find_smmu_master(smmu, masterspec->np); if (master) { @@ -817,24 +828,30 @@ static int register_smmu_master(struct arm_smmu_devic= e *smmu, return -EBUSY; } =20 - if (masterspec->args_count > MAX_MASTER_STREAMIDS) { - dev_err(dev, - "reached maximum number (%d) of stream IDs for master device %s\n", - MAX_MASTER_STREAMIDS, masterspec->np->name); - return -ENOSPC; - } - master =3D devm_kzalloc(dev, sizeof(*master), GFP_KERNEL); if (!master) return -ENOMEM; + master->of_node =3D masterspec->np; =20 - master->of_node =3D masterspec->np; - master->cfg.num_streamids =3D masterspec->args_count; + ret =3D iommu_fwspec_init(&master->of_node->dev, smmu->dev); + if (ret) { + kfree(master); + return ret; + } + + /* adding the ids here */ + ret =3D iommu_fwspec_add_ids(&masterspec->np->dev, + masterspec->args, + masterspec->args_count); + if (ret) + return ret; + + fwspec =3D dev_iommu_fwspec_get(dev); =20 /* Xen: Let Xen know that the device is protected by an SMMU */ dt_device_set_protected(masterspec->np); =20 - for (i =3D 0; i < master->cfg.num_streamids; ++i) { + for (i =3D 0; i < fwspec->num_ids; ++i) { u16 streamid =3D masterspec->args[i]; =20 if (!(smmu->features & ARM_SMMU_FEAT_STREAM_MATCH) && @@ -844,7 +861,6 @@ static int register_smmu_master(struct arm_smmu_device = *smmu, masterspec->np->name, smmu->num_mapping_groups); return -ERANGE; } - master->cfg.streamids[i] =3D streamid; master->cfg.smendx[i] =3D INVALID_SMENDX; } return insert_smmu_master(smmu, master); @@ -1500,22 +1516,23 @@ static int arm_smmu_master_alloc_smes(struct device= *dev) struct arm_smmu_device *smmu =3D cfg->smmu; struct arm_smmu_smr *smrs =3D smmu->smrs; int i, idx, ret; + struct iommu_fwspec *fwspec =3D arm_smmu_get_fwspec(cfg); =20 spin_lock(&smmu->stream_map_lock); /* Figure out a viable stream map entry allocation */ - for_each_cfg_sme(cfg, i, idx) { + for_each_cfg_sme(cfg, i, idx, fwspec->num_ids) { if (idx !=3D INVALID_SMENDX) { ret =3D -EEXIST; goto out_err; } =20 - ret =3D arm_smmu_find_sme(smmu, cfg->streamids[i], 0); + ret =3D arm_smmu_find_sme(smmu, fwspec->ids[i], 0); if (ret < 0) goto out_err; =20 idx =3D ret; if (smrs && smmu->s2crs[idx].count =3D=3D 0) { - smrs[idx].id =3D cfg->streamids[i]; + smrs[idx].id =3D fwspec->ids[i]; smrs[idx].mask =3D 0; /* We don't currently share SMRs */ smrs[idx].valid =3D true; } @@ -1524,7 +1541,7 @@ static int arm_smmu_master_alloc_smes(struct device *= dev) } =20 /* It worked! Now, poke the actual hardware */ - for_each_cfg_sme(cfg, i, idx) { + for_each_cfg_sme(cfg, i, idx, fwspec->num_ids) { arm_smmu_write_sme(smmu, idx); } =20 @@ -1544,9 +1561,10 @@ static void arm_smmu_master_free_smes(struct arm_smm= u_master_cfg *cfg) { struct arm_smmu_device *smmu =3D cfg->smmu; int i, idx; + struct iommu_fwspec *fwspec =3D arm_smmu_get_fwspec(cfg); =20 spin_lock(&smmu->stream_map_lock); - for_each_cfg_sme(cfg, i, idx) { + for_each_cfg_sme(cfg, i, idx, fwspec->num_ids) { if (arm_smmu_free_sme(smmu, idx)) arm_smmu_write_sme(smmu, idx); cfg->smendx[i] =3D INVALID_SMENDX; @@ -1562,8 +1580,9 @@ static int arm_smmu_domain_add_master(struct arm_smmu= _domain *smmu_domain, enum arm_smmu_s2cr_type type =3D S2CR_TYPE_TRANS; u8 cbndx =3D smmu_domain->cfg.cbndx; int i, idx; + struct iommu_fwspec *fwspec =3D arm_smmu_get_fwspec(cfg); =20 - for_each_cfg_sme(cfg, i, idx) { + for_each_cfg_sme(cfg, i, idx, fwspec->num_ids) { if (type =3D=3D s2cr[idx].type && cbndx =3D=3D s2cr[idx].cbndx) continue; =20 @@ -1962,6 +1981,7 @@ static int arm_smmu_add_device(struct device *dev) struct arm_smmu_master_cfg *cfg; struct iommu_group *group; void (*releasefn)(void *) =3D NULL; + int ret; =20 smmu =3D find_smmu_for_device(dev); if (!smmu) @@ -1969,19 +1989,26 @@ static int arm_smmu_add_device(struct device *dev) =20 if (dev_is_pci(dev)) { struct pci_dev *pdev =3D to_pci_dev(dev); + struct iommu_fwspec *fwspec; =20 cfg =3D kzalloc(sizeof(*cfg), GFP_KERNEL); if (!cfg) { return -ENOMEM; } =20 - cfg->num_streamids =3D 1; + ret =3D iommu_fwspec_init(dev, smmu->dev); + if (ret) { + kfree(cfg); + return ret; + } + fwspec =3D dev_iommu_fwspec_get(dev); + /* * Assume Stream ID =3D=3D Requester ID for now. * We need a way to describe the ID mappings in FDT. */ pci_for_each_dma_alias(pdev, __arm_smmu_get_pci_sid, - &cfg->streamids[0]); + &fwspec->ids[0]); releasefn =3D __arm_smmu_release_pci_iommudata; cfg->smmu =3D smmu; } else { --=20 2.17.1 From nobody Mon Apr 29 15:24:49 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=1626997024; cv=none; d=zohomail.com; s=zohoarc; b=k0bY7h65JslTLYaLbkeb5lNMqpwFWdzW/xOLVly/nWxvTGPXQZN6NYymcHDUsUnBzcFzXBr+di2BhWIClszVn6/sc0UEpSQ5P9i5jeK7TTEZ98SAEfZ/BIWjSmMO6HIHmBYOJH2vhJLp1oEmSNgvkjFJOTQEB26N/2HVS8HwXXI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1626997024; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=TqRbf6ahLjoLSXoZy3kBu4Dkj+rk7e/dm86wKvMakbk=; b=Ool30pPnXaioNSdATqaHxDBcUc1ZZCmiUerQUDYmrsxUDlbVCu9NF5JEHQgI0wxzZlucPXJwFBtIdgHjyFb3GKQeSCV9ESECl4AJaPPUoRgY35tuDvUg5Z50oYJltOZTmXabNOS9Np3vdRy2bKRsnI5tPAxa2GPBO1JuDKY9LnA= 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 1626997024113998.8412023619687; Thu, 22 Jul 2021 16:37:04 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.159901.294061 (Exim 4.92) (envelope-from ) id 1m6iFD-0001He-SV; Thu, 22 Jul 2021 23:36:47 +0000 Received: by outflank-mailman (output) from mailman id 159901.294061; Thu, 22 Jul 2021 23:36:47 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFD-0001H5-Lu; Thu, 22 Jul 2021 23:36:47 +0000 Received: by outflank-mailman (input) for mailman id 159901; Thu, 22 Jul 2021 23:36:46 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFC-0001Fn-E2 for xen-devel@lists.xenproject.org; Thu, 22 Jul 2021 23:36:46 +0000 Received: from mail.kernel.org (unknown [198.145.29.99]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id aca6a57b-eb45-11eb-915d-12813bfff9fa; Thu, 22 Jul 2021 23:36:45 +0000 (UTC) Received: by mail.kernel.org (Postfix) with ESMTPSA id 84BE860EB6; Thu, 22 Jul 2021 23:36:44 +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: aca6a57b-eb45-11eb-915d-12813bfff9fa DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1626997004; bh=ZwhD+RQJEWZ4Vg/B7gh7aqOpMG1wvIPubUsh0/bpBug=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aA6eG87iyF3vJlkrAzMd+S+3lAzUzLFxW4AAU8u37PKD9jd9k1SAJ7RYFi/zhhoIG rvlTAADZoczTuoS6quoB6Kz6gWJdBEX5+lZAigvbdE7UGptHe3xst2NC3hkZBchLjO P5jo9dE+sxQKqpZiMVHwA8UC/nrYdyVqMZ1UbKP0zLa5BQ/cFzfMBkPl/Bltxzoacf FHMan59kkNfEYrg2GMkp7qfaTJh2dZh/vYgcPq095TnT44GkPmS4tz7LgEr8mLEH5R nVIpldqAL4VgKzC7QfBs+Dj7y7foQ9h6uSDwxOAY6wyYGOLiu2mBi5NVc6IpPlA+Hu /cyFEA6Bq+1RQ== 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 v5 2/4] xen: do not return -EEXIST if iommu_add_dt_device is called twice Date: Thu, 22 Jul 2021 16:36:40 -0700 Message-Id: <20210722233642.22515-2-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: 1626997024924100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If both legacy IOMMU bindings and generic bindings are present, iommu_add_dt_device can be called twice. Do not return error in that case, that way there is no need to check for -EEXIST at the call sites. Remove the one existing -EEXIT check, now unneeded. Signed-off-by: Stefano Stabellini --- Changes in v5: - new patch --- xen/drivers/passthrough/device_tree.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/xen/drivers/passthrough/device_tree.c b/xen/drivers/passthroug= h/device_tree.c index 999b831d90..32526ecabb 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -140,8 +140,13 @@ int iommu_add_dt_device(struct dt_device_node *np) if ( !ops ) return -EINVAL; =20 + /* + * Some Device Trees may expose both legacy SMMU and generic + * IOMMU bindings together. If both are present, the device + * can be already added. + */ if ( dev_iommu_fwspec_get(dev) ) - return -EEXIST; + return 0; =20 /* * According to the Documentation/devicetree/bindings/iommu/iommu.txt @@ -254,7 +259,7 @@ int iommu_do_dt_domctl(struct xen_domctl *domctl, struc= t domain *d, * already added to the IOMMU (positive result). Such happens after * re-creating guest domain. */ - if ( ret < 0 && ret !=3D -EEXIST ) + if ( ret < 0 ) { printk(XENLOG_G_ERR "Failed to add %s to the IOMMU\n", dt_node_full_name(dev)); --=20 2.17.1 From nobody Mon Apr 29 15:24:49 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=1626997027; cv=none; d=zohomail.com; s=zohoarc; b=MLM6dKBItcVlmPGrf8nISKgLNRZ/eUfQOK7nN6PW3Eqz5nvw8IJNbQdRIMf4ivsRCAFli+/Cl64QzDXQCBgNbV72LZ01sQh4H77AE3+1pVqwu3iluO71N7nyDuRQ3sHwm952Sk4v96XmI41YyIE4d8no25RwoJ74CgC+VPcDgNQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1626997027; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=E7MaqfElVxr31TuPt12UpYFhxweyJuek32ryUq16V6Y=; b=Zha9CCXB0lunWyNIbmR8TYDMHjD2GB+RPrJIdHjkfUDj+okkgaEFiAyqhZxQnkvHFrx6L1L9tcmILMEyoIAaEmm/l+djp3l0Pb0n3NL4le+t0QielX3yBHw/7di00lUgPlY9dv/o/0KUfzgaNYaJOv+w2N/6fRl1HcBPnCNxr0o= 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 1626997027869187.90754904061248; Thu, 22 Jul 2021 16:37:07 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.159904.294092 (Exim 4.92) (envelope-from ) id 1m6iFJ-00029R-C5; Thu, 22 Jul 2021 23:36:53 +0000 Received: by outflank-mailman (output) from mailman id 159904.294092; Thu, 22 Jul 2021 23:36:53 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFJ-00029I-8S; Thu, 22 Jul 2021 23:36:53 +0000 Received: by outflank-mailman (input) for mailman id 159904; Thu, 22 Jul 2021 23:36:51 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFH-0001Fn-Cg for xen-devel@lists.xenproject.org; Thu, 22 Jul 2021 23:36:51 +0000 Received: from mail.kernel.org (unknown [198.145.29.99]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id ad21ea5a-eb45-11eb-915d-12813bfff9fa; Thu, 22 Jul 2021 23:36:45 +0000 (UTC) Received: by mail.kernel.org (Postfix) with ESMTPSA id E7F2960EB9; Thu, 22 Jul 2021 23:36:44 +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: ad21ea5a-eb45-11eb-915d-12813bfff9fa DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1626997005; bh=6TReV4Pdjfx3WD5lh4CLVkGlPCvVlrwBPMhSYNdvOVM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lYd1xnzV0XCaves7HoNXnS/51OFkEUGhQNQpW03IZ1wp4dWpCpTvl4zRdCH2Fb3V7 0jt4o/EI0KhbBIFX7YYfX6xqF5bknn60kmzBTduspXEGonyUXr94Jrf+YbU+yqADOM ZsMY/JaseJrRHDGMQkeTKjzi5D5bb4RuiZvBwnYUkYNTIanEfttj1dSuU9ZKyi3hAQ oJ4OJJWcKBXarAMawwoKUcquuBXb3D95gYeksrP4NS+O4DCLmf6nbkZ0Vr0kQeubcn gP+1qxnXoToT621XZbVzdQ4VOl9aHXlwu+kUU5oOctTXJk2sMXlC9nALkOFLE8VwiD l5R/NsAHX1ozA== 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 v5 3/4] arm,smmu: restructure code in preparation to new bindings support Date: Thu, 22 Jul 2021 16:36:41 -0700 Message-Id: <20210722233642.22515-3-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: 1626997028799100005 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Brian Woods Restructure some of the code and add supporting functions for adding generic device tree (DT) binding support. This will allow for using current Linux device trees with just modifying the chosen field to enable Xen. Signed-off-by: Brian Woods Signed-off-by: Stefano Stabellini Reviewed-by: Rahul Singh Acked-by: Julien Grall --- xen/drivers/passthrough/arm/smmu.c | 62 ++++++++++++++++-------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/a= rm/smmu.c index 09773702c3..4aa3ecec57 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -812,53 +812,36 @@ static int insert_smmu_master(struct arm_smmu_device = *smmu, return 0; } =20 -static int register_smmu_master(struct arm_smmu_device *smmu, - struct device *dev, - struct of_phandle_args *masterspec) +static int arm_smmu_dt_add_device_legacy(struct arm_smmu_device *smmu, + struct device *dev, + struct iommu_fwspec *fwspec) { - int i, ret =3D 0; + int i; struct arm_smmu_master *master; - struct iommu_fwspec *fwspec; + struct device_node *dev_node =3D dev_get_dev_node(dev); =20 - master =3D find_smmu_master(smmu, masterspec->np); + master =3D find_smmu_master(smmu, dev_node); if (master) { dev_err(dev, "rejecting multiple registrations for master device %s\n", - masterspec->np->name); + dev_node->name); return -EBUSY; } =20 master =3D devm_kzalloc(dev, sizeof(*master), GFP_KERNEL); if (!master) return -ENOMEM; - master->of_node =3D masterspec->np; - - ret =3D iommu_fwspec_init(&master->of_node->dev, smmu->dev); - if (ret) { - kfree(master); - return ret; - } - - /* adding the ids here */ - ret =3D iommu_fwspec_add_ids(&masterspec->np->dev, - masterspec->args, - masterspec->args_count); - if (ret) - return ret; - - fwspec =3D dev_iommu_fwspec_get(dev); + master->of_node =3D dev_node; =20 /* Xen: Let Xen know that the device is protected by an SMMU */ - dt_device_set_protected(masterspec->np); + dt_device_set_protected(dev_node); =20 for (i =3D 0; i < fwspec->num_ids; ++i) { - u16 streamid =3D masterspec->args[i]; - if (!(smmu->features & ARM_SMMU_FEAT_STREAM_MATCH) && - (streamid >=3D smmu->num_mapping_groups)) { + (fwspec->ids[i] >=3D smmu->num_mapping_groups)) { dev_err(dev, "stream ID for master device %s greater than maximum allowed (%d)\n", - masterspec->np->name, smmu->num_mapping_groups); + dev_node->name, smmu->num_mapping_groups); return -ERANGE; } master->cfg.smendx[i] =3D INVALID_SMENDX; @@ -866,6 +849,29 @@ static int register_smmu_master(struct arm_smmu_device= *smmu, return insert_smmu_master(smmu, master); } =20 +static int register_smmu_master(struct arm_smmu_device *smmu, + struct device *dev, + struct of_phandle_args *masterspec) +{ + int ret =3D 0; + struct iommu_fwspec *fwspec; + + ret =3D iommu_fwspec_init(&masterspec->np->dev, smmu->dev); + if (ret) + return ret; + + ret =3D iommu_fwspec_add_ids(&masterspec->np->dev, + masterspec->args, + masterspec->args_count); + if (ret) + return ret; + + fwspec =3D dev_iommu_fwspec_get(&masterspec->np->dev); + return arm_smmu_dt_add_device_legacy(smmu, + &masterspec->np->dev, + fwspec); +} + static struct arm_smmu_device *find_smmu_for_device(struct device *dev) { struct arm_smmu_device *smmu; --=20 2.17.1 From nobody Mon Apr 29 15:24:49 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=1626997024; cv=none; d=zohomail.com; s=zohoarc; b=Oo6YAmr+kE9XFGqlMhEjcTydI9VmkRcPqCF5GvNBDET3HAOAvSUW2i/g4qD/F3wGW0cRN8IStqdwdspww1rlchoAzE7iZGDg8Qf9sHVGJMhpWwkIcdT56p+SUzAQkkD2KtJi+pk+avqdq1cNpcXoDPbXbhSphDX1mc7PuQh2zN8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1626997024; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=EO/sf0zSE6WW504lI+Apfkdpo7LcVcHtvhI/BMkt5Sc=; b=La+uZU181LWtKBl4wmcx1wijfhEVpZSp+f5ddlAujuSU/vbZKUmdd+Zga41bvtly2+bgPgp50W/qpYSniMhCTDX/tJ8SoZuSB6YjTAYyVZZ9Ckr7eMcxznLFa7rZA0Lxdd0jy+11ICZ+kAqB1WlFN/4k/Qp2tdppClJ/CyTQfgs= 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 1626997024618732.8617638932972; Thu, 22 Jul 2021 16:37:04 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.159903.294080 (Exim 4.92) (envelope-from ) id 1m6iFI-0001rG-1T; Thu, 22 Jul 2021 23:36:52 +0000 Received: by outflank-mailman (output) from mailman id 159903.294080; Thu, 22 Jul 2021 23:36:52 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFH-0001r3-US; Thu, 22 Jul 2021 23:36:51 +0000 Received: by outflank-mailman (input) for mailman id 159903; Thu, 22 Jul 2021 23:36:51 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1m6iFG-0001Fh-Vh for xen-devel@lists.xenproject.org; Thu, 22 Jul 2021 23:36:51 +0000 Received: from mail.kernel.org (unknown [198.145.29.99]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 06c6b96e-1b8f-4cf9-9dd9-a7ae0394e6bd; Thu, 22 Jul 2021 23:36:46 +0000 (UTC) Received: by mail.kernel.org (Postfix) with ESMTPSA id 6961660EB3; Thu, 22 Jul 2021 23:36:45 +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: 06c6b96e-1b8f-4cf9-9dd9-a7ae0394e6bd DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1626997005; bh=QjllWcLvUx9mzoMKNB1Xu/UYm+2+6PHACe7S/EWzwgI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fYZljsNLjOauZxrDLmQYvWLyur51QAqM8oYNdlTO73wlExLH0Vp9+qb/VQHOkaBkl wUo/8lwK+CLmc4P8RX97YLSArBn1jNt8oXZEaIq1PXG79LWUoSYKk7kr6yq3XFoBV+ fvvbIxmv/8OO9mN8oLUwPA92f7uTXCf9+OF759OMlYJIHqS2pVHfSMWwOb17Al6q0Y gjPm1kjF4qFS3IytbA3KMewJmPBq5daXWXPfzM0cUd4Yg2xA62OhWWNVqRkm9V6gKV nVDLi1uFvVzFAnbq5m/DOWsGhHWP8sJQ/yIJyroboPtDsf5IXM+nHpmthMgBkr9sHh VCU6kG6xrUi2Q== 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 v5 4/4] arm,smmu: add support for generic DT bindings. Implement add_device and dt_xlate. Date: Thu, 22 Jul 2021 16:36:42 -0700 Message-Id: <20210722233642.22515-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: 1626997026715100003 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 32526ecabb..46ce726521 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -160,22 +160,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