Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1425314 > unrolled thread

Re: [PATCH v10 7/9] irqchip/gicv3-its: register the MSI global doorbell

Started byJean-Philippe Brucker <Jean-Philippe.Brucker@arm.com>
First post2016-06-17 18:40 +0200
Last post2016-06-19 18:20 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH v10 7/9] irqchip/gicv3-its: register the MSI global  doorbell Jean-Philippe Brucker <Jean-Philippe.Brucker@arm.com> - 2016-06-17 18:40 +0200
    Re: [PATCH v10 7/9] irqchip/gicv3-its: register the MSI global  doorbell Auger Eric <eric.auger@redhat.com> - 2016-06-19 18:20 +0200

#1425314 — Re: [PATCH v10 7/9] irqchip/gicv3-its: register the MSI global doorbell

FromJean-Philippe Brucker <Jean-Philippe.Brucker@arm.com>
Date2016-06-17 18:40 +0200
SubjectRe: [PATCH v10 7/9] irqchip/gicv3-its: register the MSI global doorbell
Message-ID<rL4Yh-tv-21@gated-at.bofh.it>
Hi Eric,

On Tue, Jun 07, 2016 at 04:01:26PM +0000, Eric Auger wrote:
> This patch adds the registration of the MSI global doorbell in
> gicv3-its driver.
> 
> This will allow the msi layer to iommu_map this doorbell when
> requested.
> 
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> ---
>  drivers/irqchip/irq-gic-v3-its.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 5eb1f9e..ed9dfce 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -29,6 +29,8 @@
>  #include <linux/of_platform.h>
>  #include <linux/percpu.h>
>  #include <linux/slab.h>
> +#include <linux/iommu.h>
> +#include <linux/msi-doorbell.h>
>  
>  #include <linux/irqchip.h>
>  #include <linux/irqchip/arm-gic-v3.h>
> @@ -1607,6 +1609,7 @@ static int __init its_probe(struct device_node *node,
>  
>  	if (of_property_read_bool(node, "msi-controller")) {
>  		struct msi_domain_info *info;
> +		phys_addr_t translater;
>  
>  		info = kzalloc(sizeof(*info), GFP_KERNEL);
>  		if (!info) {
> @@ -1614,10 +1617,21 @@ static int __init its_probe(struct device_node *node,
>  			goto out_free_tables;
>  		}
>  
> +		translater = its->phys_base + GITS_TRANSLATER;
> +		err = msi_doorbell_register_global(its, translater,
> +						sizeof(u32),
> +						IOMMU_WRITE | IOMMU_MMIO, true);

This doesn't work :(

First we have its_probe registering the global mapping with
doorbell->chip_data = its, which is a pointer to an its_node structure.

But when enabling MSIs for a device, its_irq_domain_alloc puts a pointer
to an *its_device* into irq_data->chip_data. This seems to be a
per-device structure, allocated by its_msi_prepare.

The following call to msi_doorbell_lookup won't ever succeed, because it
will compare its_node to its_device. I can't figure out how to fix it
cleanly at the moment.

Jean-Philippe

> +		if (err)  {
> +			kfree(info);
> +			goto out_free_tables;
> +		}
> +
> +
>  		inner_domain = irq_domain_add_tree(node, &its_domain_ops, its);
>  		if (!inner_domain) {
>  			err = -ENOMEM;
>  			kfree(info);
> +			msi_doorbell_unregister(its);
>  			goto out_free_tables;
>  		}
>  
> -- 
> 1.9.1
> 

[toc] | [next] | [standalone]


#1426000

FromAuger Eric <eric.auger@redhat.com>
Date2016-06-19 18:20 +0200
Message-ID<rLNC1-4DF-1@gated-at.bofh.it>
In reply to#1425314
Hi Jean-Philippe,

On 17/06/2016 18:33, Jean-Philippe Brucker wrote:
> Hi Eric,
> 
> On Tue, Jun 07, 2016 at 04:01:26PM +0000, Eric Auger wrote:
>> This patch adds the registration of the MSI global doorbell in
>> gicv3-its driver.
>>
>> This will allow the msi layer to iommu_map this doorbell when
>> requested.
>>
>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>> ---
>>  drivers/irqchip/irq-gic-v3-its.c | 14 ++++++++++++++
>>  1 file changed, 14 insertions(+)
>>
>> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
>> index 5eb1f9e..ed9dfce 100644
>> --- a/drivers/irqchip/irq-gic-v3-its.c
>> +++ b/drivers/irqchip/irq-gic-v3-its.c
>> @@ -29,6 +29,8 @@
>>  #include <linux/of_platform.h>
>>  #include <linux/percpu.h>
>>  #include <linux/slab.h>
>> +#include <linux/iommu.h>
>> +#include <linux/msi-doorbell.h>
>>  
>>  #include <linux/irqchip.h>
>>  #include <linux/irqchip/arm-gic-v3.h>
>> @@ -1607,6 +1609,7 @@ static int __init its_probe(struct device_node *node,
>>  
>>  	if (of_property_read_bool(node, "msi-controller")) {
>>  		struct msi_domain_info *info;
>> +		phys_addr_t translater;
>>  
>>  		info = kzalloc(sizeof(*info), GFP_KERNEL);
>>  		if (!info) {
>> @@ -1614,10 +1617,21 @@ static int __init its_probe(struct device_node *node,
>>  			goto out_free_tables;
>>  		}
>>  
>> +		translater = its->phys_base + GITS_TRANSLATER;
>> +		err = msi_doorbell_register_global(its, translater,
>> +						sizeof(u32),
>> +						IOMMU_WRITE | IOMMU_MMIO, true);
> 
> This doesn't work :(

Sorry to hear that.

Thank you for testing with ITS. As mentioned in the part 3 cover letter,
I could not test assignment with this MSI controller; I now have access
to it so I am going to test it from next release onwards.
> 
> First we have its_probe registering the global mapping with
> doorbell->chip_data = its, which is a pointer to an its_node structure.
> 
> But when enabling MSIs for a device, its_irq_domain_alloc puts a pointer
> to an *its_device* into irq_data->chip_data. This seems to be a
> per-device structure, allocated by its_msi_prepare.
Hum OK, I missed the fact the chip_data was overwritten on
its_irq_domain_alloc. I will investigate what we have as other alternatives.

Thank you for the time spent on debugging that ;-)

Best Regards

Eric


> 
> The following call to msi_doorbell_lookup won't ever succeed, because it
> will compare its_node to its_device. I can't figure out how to fix it
> cleanly at the moment.
> 
> Jean-Philippe
> 
>> +		if (err)  {
>> +			kfree(info);
>> +			goto out_free_tables;
>> +		}
>> +
>> +
>>  		inner_domain = irq_domain_add_tree(node, &its_domain_ops, its);
>>  		if (!inner_domain) {
>>  			err = -ENOMEM;
>>  			kfree(info);
>> +			msi_doorbell_unregister(its);
>>  			goto out_free_tables;
>>  		}
>>  
>> -- 
>> 1.9.1
>>

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web