xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Oleksandr <olekstysh@gmail.com>
To: Julien Grall <julien.grall@arm.com>, xen-devel@lists.xenproject.org
Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>,
	sstabellini@kernel.org, Volodymyr_Babchuk@epam.com
Subject: Re: [Xen-devel] [PATCH V3 7/8] iommu/arm: Introduce iommu_add_dt_device API
Date: Mon, 9 Sep 2019 18:48:43 +0300	[thread overview]
Message-ID: <e2e67d7a-788d-9ae7-3f5f-274ce7bb2ab1@gmail.com> (raw)
In-Reply-To: <17ed5e35-94e5-69a7-67f1-6978c50fea09@arm.com>


On 09.09.19 18:04, Julien Grall wrote:
> Hi Oleksandr,

Hi Julien


>
>
> On 8/20/19 7:09 PM, Oleksandr Tyshchenko wrote:
>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>>
>> This patch adds new iommu_add_dt_device API for adding DT device
>> to the IOMMU using generic IOMMU DT bindings [1] and previously
>> added "iommu_fwspec" support and "add_device/of_xlate" callbacks.
>>
>> New function does the following:
>> - Parse the DT bindings according to the specification
>> - Provide DT IOMMU specifier which describes the IOMMU master
>>    interfaces of that device (device IDs, etc) to the driver
>> - Add master device to the IOMMU if latter is present and available
>>
>> The additional benefit here is to avoid to go through the whole DT
>> multiple times in IOMMU driver trying to locate master devices which
>> belong to each IOMMU device being probed.
>
> So the commit title/message describes the new function 
> iommu_add_dt_device, but not the main important thing i.e. "Why is it 
> called when building dom0".
>
> While I agree the new function is the big part of the function what 
> matter is we need to register device using the generic IOMMU bindings 
> before assigning the device to a domain. The split is to keep separate 
> "add" and "assign". The later can be called from dom0.

Good point. I will update description.


>
>
>>
>> [1] 
>> https://www.kernel.org/doc/Documentation/devicetree/bindings/iommu/iommu.txt
>>
>> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>> CC: Julien Grall <julien.grall@arm.com>
>>
>> ---
>> Changes V2 -> V3:
>>      - clarified patch description
>>      - clarified comments in code
>>      - modified to provide DT IOMMU specifier to the driver
>>        using "of_xlate" callback
>>      - documented function usage
>>      - modified to return an error if ops is not present/implemented,
>>      - added ability to return a possitive value to indicate
>>        that device doesn't need to be protected
>>      - removed check for the "iommu" property presence
>>        in the common code
>>      - included <asm/iommu_fwspec.h> directly
>> ---
>>   xen/arch/arm/domain_build.c         | 11 ++++++++
>>   xen/drivers/passthrough/arm/iommu.c | 55 
>> +++++++++++++++++++++++++++++++++++++
>>   xen/include/asm-arm/iommu.h         | 11 ++++++++
>>   3 files changed, 77 insertions(+)
>>
>> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
>> index e79d4e2..159ea6a 100644
>> --- a/xen/arch/arm/domain_build.c
>> +++ b/xen/arch/arm/domain_build.c
>> @@ -1240,6 +1240,7 @@ static int __init map_device_children(struct 
>> domain *d,
>>     /*
>>    * For a given device node:
>> + *  - Try to call iommu_add_dt_device to protect the device by an IOMMU
>>    *  - Give permission to the guest to manage IRQ and MMIO range
>>    *  - Retrieve the IRQ configuration (i.e edge/level) from device tree
>>    * When the device is not marked for guest passthrough:
>> @@ -1257,6 +1258,16 @@ static int __init handle_device(struct domain 
>> *d, struct dt_device_node *dev,
>>       u64 addr, size;
>>       bool need_mapping = !dt_device_for_passthrough(dev);
>>   +    dt_dprintk("%s add to iommu\n", dt_node_full_name(dev));
>
> This message is slightly confusing. You are not adding the device, you 
> are trying to. So how about "Check if %s is behind an IOMMU and add it".

Sounds reasonable.


>
>
>> +
>> +    res = iommu_add_dt_device(dev);
>> +    if ( res < 0 )
>> +    {
>> +        printk(XENLOG_ERR "Failed to add %s to the IOMMU\n",
>> +               dt_node_full_name(dev));
>> +        return res;
>> +    }
>> +
>>       nirq = dt_number_of_irq(dev);
>>       naddr = dt_number_of_address(dev);
>>   diff --git a/xen/drivers/passthrough/arm/iommu.c 
>> b/xen/drivers/passthrough/arm/iommu.c
>> index 72a30e0..47e4bc6 100644
>> --- a/xen/drivers/passthrough/arm/iommu.c
>> +++ b/xen/drivers/passthrough/arm/iommu.c
>> @@ -20,6 +20,7 @@
>>   #include <xen/lib.h>
>>     #include <asm/device.h>
>> +#include <asm/iommu_fwspec.h>
>>     /*
>>    * Deferred probe list is used to keep track of devices for which 
>> driver
>> @@ -139,3 +140,57 @@ int arch_iommu_populate_page_table(struct domain 
>> *d)
>>   void __hwdom_init arch_iommu_hwdom_init(struct domain *d)
>>   {
>>   }
>> +
>> +int __init iommu_add_dt_device(struct dt_device_node *np)
>> +{
>> +    const struct iommu_ops *ops = iommu_get_ops();
>> +    struct dt_phandle_args iommu_spec;
>> +    struct device *dev = dt_to_dev(np);
>> +    int rc = 1, index = 0;
>> +
>> +    if ( !iommu_enabled )
>> +        return 1;
>> +
>> +    if ( !ops || !ops->add_device || !ops->of_xlate )
>
> The SMMU does not implement of_xlate(). It is actually only mandatory 
> if you are using the generic bindings. So I would only check 
> ops->of_xlate if "iommus" exists.

Agree. Will do.


>
>
>> +        return -EINVAL;
>> +
>> +    if ( dev_iommu_fwspec_get(dev) )
>> +        return -EEXIST; > +
>> +    /* According Documentation/devicetree/bindings/iommu/iommu.txt 
>> from Linux */
>
> s/According/According to/

ok


>
>
>> +    while ( !dt_parse_phandle_with_args(np, "iommus", "#iommu-cells",
>> +                                        index, &iommu_spec) )
>> +    {
>> +        if ( !dt_device_is_available(iommu_spec.np) )
>> +            break;
>> +
>> +        rc = iommu_fwspec_init(dev, &iommu_spec.np->dev);
>> +        if ( rc )
>> +            break;
>> +
>> +        /*
>> +         * Provide DT IOMMU specifier which describes the IOMMU master
>> +         * interfaces of that device (device IDs, etc) to the driver.
>> +         * The driver's responsibility is to decide how to interpret 
>> them.
>
> NIT: "The driver is responsible to decide...".

ok


>
>> +         * It should also initialize/verify that device.
>
> What do you mean? of_xlate should mostly translate the specifier to 
> fwspec.

Yes. Saying "initialize/verify that device" I meant to verify passed DT 
IOMMU specifier and initialize driver's private data for this device 
(iommu_priv). But, this is obvious.

I will remove confusing word "initialize" or even the whole sentence.


>
>
>> +         */
>> +        rc = ops->of_xlate(dev, &iommu_spec);
>> +        if ( rc )
>> +            break;
>> +
>> +        index++;
>> +    }
>> +
>> +    /*
>> +     * Add master device to the IOMMU if latter is present and 
>> available.
>> +     * The driver's responsibility is to check whether that device
>> +     * was initialized/verified before and mark that device as 
>> protected.
>
> I don't understand the last sentence. For me, "device" refers to 
> what's pointed by "dev". But the IOMMU driver is not responsible for 
> initializing the device.

Yes. The same as for comment above. I will remove confusing word 
"initialize".


-- 
Regards,

Oleksandr Tyshchenko


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-09-09 15:49 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-20 18:09 [Xen-devel] [PATCH V3 0/8] iommu/arm: Add Renesas IPMMU-VMSA support + Linux's iommu_fwspec Oleksandr Tyshchenko
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 1/8] iommu/arm: Add iommu_helpers.c file to keep common for IOMMUs stuff Oleksandr Tyshchenko
2019-09-09 11:45   ` Julien Grall
2019-09-09 14:12     ` Oleksandr
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 2/8] iommu/arm: Add ability to handle deferred probing request Oleksandr Tyshchenko
2019-09-09 12:24   ` Julien Grall
2019-09-09 14:19     ` Oleksandr
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 3/8] xen/common: Introduce _xrealloc function Oleksandr Tyshchenko
2019-08-21  8:09   ` Paul Durrant
2019-08-21 14:36     ` Oleksandr
2019-08-21 15:47       ` Paul Durrant
2019-08-21 17:04         ` Oleksandr
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 4/8] xen/common: Introduce xrealloc_flex_struct() helper macros Oleksandr Tyshchenko
2019-08-27 13:28   ` Jan Beulich
2019-08-28 18:23     ` Oleksandr
2019-08-29  7:21       ` Jan Beulich
2019-08-29 19:04         ` Oleksandr
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 5/8] iommu/arm: Add lightweight iommu_fwspec support Oleksandr Tyshchenko
2019-09-09 14:36   ` Julien Grall
2019-09-09 14:41     ` Oleksandr
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 6/8] iommu: Add of_xlate callback Oleksandr Tyshchenko
2019-08-27 13:30   ` Jan Beulich
2019-08-27 14:59     ` Oleksandr
2019-08-27 15:11       ` Jan Beulich
2019-09-09 12:37         ` Julien Grall
2019-09-09 14:28           ` Oleksandr
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 7/8] iommu/arm: Introduce iommu_add_dt_device API Oleksandr Tyshchenko
2019-09-09 15:04   ` Julien Grall
2019-09-09 15:48     ` Oleksandr [this message]
2019-09-10 13:34       ` Oleksandr
2019-09-10 14:30         ` Julien Grall
2019-08-20 18:09 ` [Xen-devel] [PATCH V3 8/8] iommu/arm: Add Renesas IPMMU-VMSA support Oleksandr Tyshchenko
2019-08-29  8:37   ` Yoshihiro Shimoda
2019-08-29 10:56     ` Oleksandr
2019-09-02  7:04       ` Yoshihiro Shimoda
2019-09-09 14:33         ` Oleksandr
2019-08-29 11:19   ` Oleksandr
2019-09-09 21:24   ` Julien Grall
2019-09-10 11:04     ` Oleksandr
2019-09-10 14:31       ` Julien Grall
2019-09-11 15:29         ` Oleksandr

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e2e67d7a-788d-9ae7-3f5f-274ce7bb2ab1@gmail.com \
    --to=olekstysh@gmail.com \
    --cc=Volodymyr_Babchuk@epam.com \
    --cc=julien.grall@arm.com \
    --cc=oleksandr_tyshchenko@epam.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).