[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 3/3] arm,smmu: add support for generic DT bindings. Implement add_device and dt_xlate.


  • To: Stefano Stabellini <sstabellini@xxxxxxxxxx>
  • From: Rahul Singh <Rahul.Singh@xxxxxxx>
  • Date: Tue, 2 Feb 2021 16:09:31 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nlbsKsoq5v7rwOLmf68xBCBs+buI++72lSKrZwzCYWE=; b=LFNZSXfNrOGjC+oq50n689/93QEPZlCyP359UIvrHXm8DrWqMn4A/GDZKi6KGuX9e5rEOISeLxs+m5/a9WXCSqLy4wPanf2XKqQAz835eEtBVJokjUbONaxuHwcMPJAigNgi28Rc3tQ7WVTDz/MmBlq5HsorFKJWgPbciRMWYzC6rCqC4yjRih2SmGvItoxCmrbDo0Ws5wNAC+SHGhlldjj2jlr1JtdKtvQu0NhZSpyENgqwWxQAOvpLpbR7hvcikuQyVCvIMiPHDBHejOXg/HqVK6/mWK56kuftetmHokGniu9v5tL24qZt0OQX5PySC9RAm4p97ntVoWAiDh/Esg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KTz/Ff+w+rnsyEFUfpU6Zk55tC/ma718YTlrm5aRNxVVVju23DBxhHdIdP7X5vU/z61kWXNPY4rXgUuCY8njQkSECIBRhbXYikv95fh0xkrEa8QiqXazH5VvvXVs822fNPgJ84sq1gm83bbWoI2A8Fh95i0ESEdXL8QfrEUPjDsJ9M5Z95sTf9CnbiZNrtrxGa2V5dVuXkA7OEXd0E/RIGL0aQZiP0O++qL+0D+x6wqsKW8lFdq3C/GEeTkf41H2MAPdc4+dwzPZwSdydKCgo4Mh38v/OVsZSZvWnvyUd5vHIrp4McQz5OkwjE+8PHP3DK+d+BKEc/117PFD2B+A6A==
  • Authentication-results-original: kernel.org; dkim=none (message not signed) header.d=none;kernel.org; dmarc=none action=none header.from=arm.com;
  • Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, "Volodymyr_Babchuk@xxxxxxxx" <Volodymyr_Babchuk@xxxxxxxx>, "brian.woods@xxxxxxxxxx" <brian.woods@xxxxxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
  • Delivery-date: Tue, 02 Feb 2021 16:09:49 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: kernel.org; dkim=none (message not signed) header.d=none;kernel.org; dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHW9DbZcc+nHEHmhUCG1Y8eIX96RapFEyUA
  • Thread-topic: [PATCH v3 3/3] arm,smmu: add support for generic DT bindings. Implement add_device and dt_xlate.

Hello Stefano,

> On 26 Jan 2021, at 10:58 pm, Stefano Stabellini <sstabellini@xxxxxxxxxx> 
> wrote:
> 
> From: Brian Woods <brian.woods@xxxxxxxxxx>
> 
> Now that all arm iommu drivers support generic bindings we can remove
> the workaround from iommu_add_dt_device().
> 
> Note that if both legacy bindings and generic bindings are present in
> device tree, the legacy bindings are the ones that are used.
> 
> Signed-off-by: Brian Woods <brian.woods@xxxxxxxxxx>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>

Reviewed-by: Rahul Singh <rahul.singh@xxxxxxx>
Tested-by: Rahul Singh <rahul.singh@xxxxxxx>

Regards,
Rahul
> ---
> Changes in v3:
> - split patch
> - make find_smmu return non-const so that we can use it in 
> arm_smmu_dt_add_device_generic
> - use dt_phandle_args
> - update commit message
> ---
> 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/arm/smmu.c
> index 9687762283..620ba5a4b5 100644
> --- a/xen/drivers/passthrough/arm/smmu.c
> +++ b/xen/drivers/passthrough/arm/smmu.c
> @@ -254,6 +254,8 @@ struct iommu_group
>       atomic_t ref;
> };
> 
> +static struct arm_smmu_device *find_smmu(const struct device *dev);
> +
> static struct iommu_group *iommu_group_alloc(void)
> {
>       struct iommu_group *group = xzalloc(struct iommu_group);
> @@ -843,6 +845,40 @@ static int register_smmu_master(struct arm_smmu_device 
> *smmu,
>                                            fwspec);
> }
> 
> +static int arm_smmu_dt_add_device_generic(u8 devfn, struct device *dev)
> +{
> +     struct arm_smmu_device *smmu;
> +     struct iommu_fwspec *fwspec;
> +
> +     fwspec = dev_iommu_fwspec_get(dev);
> +     if (fwspec == NULL)
> +             return -ENXIO;
> +
> +     smmu = find_smmu(fwspec->iommu_dev);
> +     if (smmu == 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 = 0;
> +
> +     if (spec->args_count > 0)
> +             fwid |= (SMR_ID_MASK & spec->args[0]) << SMR_ID_SHIFT;
> +
> +     if (spec->args_count > 1)
> +             fwid |= (SMR_MASK_MASK & spec->args[1]) << SMR_MASK_SHIFT;
> +     else if (!of_property_read_u32(spec->np, "stream-match-mask", &mask))
> +             fwid |= (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;
> @@ -2766,6 +2802,7 @@ static void arm_smmu_iommu_domain_teardown(struct 
> domain *d)
> static const struct iommu_ops arm_smmu_iommu_ops = {
>     .init = arm_smmu_iommu_domain_init,
>     .hwdom_init = arm_smmu_iommu_hwdom_init,
> +    .add_device = arm_smmu_dt_add_device_generic,
>     .teardown = arm_smmu_iommu_domain_teardown,
>     .iotlb_flush = arm_smmu_iotlb_flush,
>     .iotlb_flush_all = arm_smmu_iotlb_flush_all,
> @@ -2773,9 +2810,10 @@ static const struct iommu_ops arm_smmu_iommu_ops = {
>     .reassign_device = arm_smmu_reassign_dev,
>     .map_page = arm_iommu_map_page,
>     .unmap_page = arm_iommu_unmap_page,
> +    .dt_xlate = arm_smmu_dt_xlate_generic,
> };
> 
> -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 = false;
> diff --git a/xen/drivers/passthrough/device_tree.c 
> b/xen/drivers/passthrough/device_tree.c
> index a51ae3c9c3..ae07f272e1 100644
> --- a/xen/drivers/passthrough/device_tree.c
> +++ b/xen/drivers/passthrough/device_tree.c
> @@ -162,22 +162,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;
> 
>         if ( !dt_device_is_available(iommu_spec.np) )
>             break;
> -- 
> 2.17.1
> 




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.