All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
To: Marc Zyngier <marc.zyngier@arm.com>,
	Hanjun Guo <hanjun.guo@linaro.org>,
	Jason Cooper <jason@lakedaemon.net>,
	Will Deacon <Will.Deacon@arm.com>,
	Catalin Marinas <Catalin.Marinas@arm.com>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Jiang Liu <jiang.liu@linux.intel.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>,
	Timur Tabi <timur@codeaurora.org>,
	Tomasz Nowicki <tomasz.nowicki@linaro.org>,
	"grant.likely@linaro.org" <grant.likely@linaro.org>,
	Mark Brown <broonie@kernel.org>, Wei Huang <wei@redhat.com>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linaro-acpi@lists.linaro.org" <linaro-acpi@lists.linaro.org>
Subject: Re: [PATCH v4 10/10] irqchip / gicv2m: Introducing gicv2m_acpi_init()
Date: Sun, 9 Aug 2015 15:04:31 +0700	[thread overview]
Message-ID: <55C7098F.5010303@amd.com> (raw)
In-Reply-To: <55C0CAC4.3010202@arm.com>

Hi Marc,

On 8/4/15 21:23, Marc Zyngier wrote:
> On 29/07/15 11:08, Hanjun Guo wrote:
>> From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>>
>> This patch introduces gicv2m_acpi_init(), which uses information
>> in MADT GIC MSI frames structure to initialize GICv2m driver.
>> It also refactors gicv2m_init_one() to handle both DT and ACPI
>> initialization path.
>>
>> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
>> ---
>>   drivers/irqchip/irq-gic-v2m.c   | 111 +++++++++++++++++++++++++++++++---------
>>   drivers/irqchip/irq-gic.c       |   3 ++
>>   include/linux/irqchip/arm-gic.h |   7 +++
>>   3 files changed, 98 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c
>> index d0fcbf8..c491a08 100644
>> --- a/drivers/irqchip/irq-gic-v2m.c
>> +++ b/drivers/irqchip/irq-gic-v2m.c
>> @@ -15,6 +15,7 @@
>>
>>   #define pr_fmt(fmt) "GICv2m: " fmt
>>
>> +#include <linux/acpi.h>
>>   #include <linux/irq.h>
>>   #include <linux/irqdomain.h>
>>   #include <linux/kernel.h>
>> @@ -211,6 +212,10 @@ static bool is_msi_spi_valid(u32 base, u32 num)
>>   	return true;
>>   }
>>
>> +char gicv2m_domain_name[] = "GICV2M";
>> +char gicv2m_pci_msi_domain_name[] = "GICV2M-PCI-MSI";
>> +char gicv2m_plat_msi_domain_name[] = "GICV2M-PLAT-MSI";
>> +
>
> Can't these be static? Why do we need them?

Of course, this is not needed. I figured it was useful when I was 
debugging the irq domain hierarchy stuff. I'll remove it then.

[...]
>> @@ -329,15 +330,79 @@ int __init gicv2m_of_init(struct device_node *node, struct irq_domain *parent)
>>
>>   	for (child = of_find_matching_node(node, gicv2m_device_id); child;
>>   	     child = of_find_matching_node(child, gicv2m_device_id)) {
>> +		u32 spi_start = 0, nr_spis = 0;
>> +		struct resource res;
>> +
>>   		if (!of_find_property(child, "msi-controller", NULL))
>>   			continue;
>>
>> -		ret = gicv2m_init_one(child, parent);
>> +		ret = of_address_to_resource(child, 0, &res);
>> +		if (ret) {
>> +			pr_err("Failed to allocate v2m resource.\n");
>> +			break;
>> +		}
>> +
>> +		if (!of_property_read_u32(child, "arm,msi-base-spi", &spi_start) &&
>> +		    !of_property_read_u32(child, "arm,msi-num-spis", &nr_spis))
>> +			pr_info("Overriding V2M MSI_TYPER (base:%u, num:%u)\n",
>> +				spi_start, nr_spis);
>> +
>> +		ret = gicv2m_init_one(parent, &spi_start, &nr_spis, &res,
>
> If these spi_start and nr_spis pointers passed to gicv2m_init_one are
> only for the benefit of printing the message below, just move the
> message inside the function...
>

Ok.

>> +				      child);
>>   		if (ret) {
>>   			of_node_put(node);
>>   			break;
>>   		}
>> +
>> +		pr_info("Node %s: range[%#lx:%#lx], SPI[%d:%d]\n", child->name,
>> +			(unsigned long)res.start, (unsigned long)res.end,
>> +			spi_start, (spi_start + nr_spis));
>>   	}
>>
>>   	return ret;
>>   }
>> +
>> +#ifdef CONFIG_ACPI
>> +int __init gicv2m_acpi_init(struct acpi_table_header *table,
>> +			    struct irq_domain *parent)
>> +{
>> +	int i, ret;
>> +
>> +	ret = acpi_gic_msi_init(table);
>> +	if (ret)
>> +		return ret;
>> +
>> +	for (i = 0; i < acpi_gic_get_num_msi_frame(); i++) {
>> +		struct resource res;
>> +		u32 spi_start = 0, nr_spis = 0;
>> +		struct acpi_madt_generic_msi_frame *m;
>> +
>> +		ret = acpi_gic_get_msi_frame(i, &m);
>> +		if (ret)
>> +			return ret;
>> +
>
> All of that should be moved here. And we don't need to build an
> intermediate representation. Just build the v2m_data structures as you go.

I'll rework the ACPI MADT parsing, and move it into this file, and get 
rid of the structure.

>> +		res.start = m->base_address;
>> +		res.end = m->base_address + 0x1000;
>> +
>> +		if (m->flags & ACPI_MADT_OVERRIDE_SPI_VALUES) {
>> +			spi_start = m->spi_base;
>> +			nr_spis = m->spi_count;
>> +
>> +			pr_info("ACPI overriding V2M MSI_TYPER (base:%u, num:%u)\n",
>> +				spi_start, nr_spis);
>> +		}
>> +
>> +		ret = gicv2m_init_one(parent, &spi_start, &nr_spis, &res,
>> +				      (void *)(m->base_address));
>> +		if (ret)
>> +			break;
>> +
>> +		pr_info("MSI frame ID %u: range[%#lx:%#lx], SPI[%d:%d]\n",
>> +			m->msi_frame_id,
>> +			(unsigned long)res.start, (unsigned long)res.end,
>> +			spi_start, (spi_start + nr_spis));
>> +	}
>> +	return ret;
>> +}
>> +
>> +#endif /* CONFIG_ACPI */
>> diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
>> index bec6b00..531ebbc 100644
>> --- a/drivers/irqchip/irq-gic.c
>> +++ b/drivers/irqchip/irq-gic.c
>> @@ -1159,6 +1159,9 @@ gic_v2_acpi_init(struct acpi_table_header *table)
>>   	 */
>>   	gic_init_bases(0, -1, dist_base, cpu_base, 0, (void *)ACPI_IRQ_MODEL_GIC);
>>
>> +	if (IS_ENABLED(CONFIG_ARM_GIC_V2M))
>> +		gicv2m_acpi_init(table, gic_data[0].domain);
>> +
>>   	acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, ACPI_IRQ_MODEL_GIC,
>>   			   gic_acpi_gsi_desc_populate);
>>   	return 0;
>> diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
>> index 97799b7..27d8196 100644
>> --- a/include/linux/irqchip/arm-gic.h
>> +++ b/include/linux/irqchip/arm-gic.h
>> @@ -109,6 +109,13 @@ static inline void gic_init(unsigned int nr, int start,
>>
>>   int gicv2m_of_init(struct device_node *node, struct irq_domain *parent);
>>
>> +#ifdef CONFIG_ACPI
>> +struct acpi_table_header;
>> +
>> +int gicv2m_acpi_init(struct acpi_table_header *table,
>> +		     struct irq_domain *parent);
>> +#endif
>> +
>>   void gic_send_sgi(unsigned int cpu_id, unsigned int irq);
>>   int gic_get_cpu_id(unsigned int cpu);
>>   void gic_migrate_target(unsigned int new_cpu_id);
>>
>
> This needs rework to do the parsing of the tables in this driver. Just
> expose the domain_token through a function that you register with the
> ACPI layer.

Ok. I'll investigate and rework this to only expose the domain_token.

Basically, I would need a way to pass down a device from ACPI layer into 
irqchips (e.g. GICv2m and GICv3-ITS), so that it can verify the device 
with the MSI domains and return the appropriate domain token (or some 
sort of domain reference).

Thanks,
Suravee

WARNING: multiple messages have this Message-ID (diff)
From: Suravee.Suthikulpanit@amd.com (Suravee Suthikulpanit)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 10/10] irqchip / gicv2m: Introducing gicv2m_acpi_init()
Date: Sun, 9 Aug 2015 15:04:31 +0700	[thread overview]
Message-ID: <55C7098F.5010303@amd.com> (raw)
In-Reply-To: <55C0CAC4.3010202@arm.com>

Hi Marc,

On 8/4/15 21:23, Marc Zyngier wrote:
> On 29/07/15 11:08, Hanjun Guo wrote:
>> From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>>
>> This patch introduces gicv2m_acpi_init(), which uses information
>> in MADT GIC MSI frames structure to initialize GICv2m driver.
>> It also refactors gicv2m_init_one() to handle both DT and ACPI
>> initialization path.
>>
>> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
>> ---
>>   drivers/irqchip/irq-gic-v2m.c   | 111 +++++++++++++++++++++++++++++++---------
>>   drivers/irqchip/irq-gic.c       |   3 ++
>>   include/linux/irqchip/arm-gic.h |   7 +++
>>   3 files changed, 98 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c
>> index d0fcbf8..c491a08 100644
>> --- a/drivers/irqchip/irq-gic-v2m.c
>> +++ b/drivers/irqchip/irq-gic-v2m.c
>> @@ -15,6 +15,7 @@
>>
>>   #define pr_fmt(fmt) "GICv2m: " fmt
>>
>> +#include <linux/acpi.h>
>>   #include <linux/irq.h>
>>   #include <linux/irqdomain.h>
>>   #include <linux/kernel.h>
>> @@ -211,6 +212,10 @@ static bool is_msi_spi_valid(u32 base, u32 num)
>>   	return true;
>>   }
>>
>> +char gicv2m_domain_name[] = "GICV2M";
>> +char gicv2m_pci_msi_domain_name[] = "GICV2M-PCI-MSI";
>> +char gicv2m_plat_msi_domain_name[] = "GICV2M-PLAT-MSI";
>> +
>
> Can't these be static? Why do we need them?

Of course, this is not needed. I figured it was useful when I was 
debugging the irq domain hierarchy stuff. I'll remove it then.

[...]
>> @@ -329,15 +330,79 @@ int __init gicv2m_of_init(struct device_node *node, struct irq_domain *parent)
>>
>>   	for (child = of_find_matching_node(node, gicv2m_device_id); child;
>>   	     child = of_find_matching_node(child, gicv2m_device_id)) {
>> +		u32 spi_start = 0, nr_spis = 0;
>> +		struct resource res;
>> +
>>   		if (!of_find_property(child, "msi-controller", NULL))
>>   			continue;
>>
>> -		ret = gicv2m_init_one(child, parent);
>> +		ret = of_address_to_resource(child, 0, &res);
>> +		if (ret) {
>> +			pr_err("Failed to allocate v2m resource.\n");
>> +			break;
>> +		}
>> +
>> +		if (!of_property_read_u32(child, "arm,msi-base-spi", &spi_start) &&
>> +		    !of_property_read_u32(child, "arm,msi-num-spis", &nr_spis))
>> +			pr_info("Overriding V2M MSI_TYPER (base:%u, num:%u)\n",
>> +				spi_start, nr_spis);
>> +
>> +		ret = gicv2m_init_one(parent, &spi_start, &nr_spis, &res,
>
> If these spi_start and nr_spis pointers passed to gicv2m_init_one are
> only for the benefit of printing the message below, just move the
> message inside the function...
>

Ok.

>> +				      child);
>>   		if (ret) {
>>   			of_node_put(node);
>>   			break;
>>   		}
>> +
>> +		pr_info("Node %s: range[%#lx:%#lx], SPI[%d:%d]\n", child->name,
>> +			(unsigned long)res.start, (unsigned long)res.end,
>> +			spi_start, (spi_start + nr_spis));
>>   	}
>>
>>   	return ret;
>>   }
>> +
>> +#ifdef CONFIG_ACPI
>> +int __init gicv2m_acpi_init(struct acpi_table_header *table,
>> +			    struct irq_domain *parent)
>> +{
>> +	int i, ret;
>> +
>> +	ret = acpi_gic_msi_init(table);
>> +	if (ret)
>> +		return ret;
>> +
>> +	for (i = 0; i < acpi_gic_get_num_msi_frame(); i++) {
>> +		struct resource res;
>> +		u32 spi_start = 0, nr_spis = 0;
>> +		struct acpi_madt_generic_msi_frame *m;
>> +
>> +		ret = acpi_gic_get_msi_frame(i, &m);
>> +		if (ret)
>> +			return ret;
>> +
>
> All of that should be moved here. And we don't need to build an
> intermediate representation. Just build the v2m_data structures as you go.

I'll rework the ACPI MADT parsing, and move it into this file, and get 
rid of the structure.

>> +		res.start = m->base_address;
>> +		res.end = m->base_address + 0x1000;
>> +
>> +		if (m->flags & ACPI_MADT_OVERRIDE_SPI_VALUES) {
>> +			spi_start = m->spi_base;
>> +			nr_spis = m->spi_count;
>> +
>> +			pr_info("ACPI overriding V2M MSI_TYPER (base:%u, num:%u)\n",
>> +				spi_start, nr_spis);
>> +		}
>> +
>> +		ret = gicv2m_init_one(parent, &spi_start, &nr_spis, &res,
>> +				      (void *)(m->base_address));
>> +		if (ret)
>> +			break;
>> +
>> +		pr_info("MSI frame ID %u: range[%#lx:%#lx], SPI[%d:%d]\n",
>> +			m->msi_frame_id,
>> +			(unsigned long)res.start, (unsigned long)res.end,
>> +			spi_start, (spi_start + nr_spis));
>> +	}
>> +	return ret;
>> +}
>> +
>> +#endif /* CONFIG_ACPI */
>> diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
>> index bec6b00..531ebbc 100644
>> --- a/drivers/irqchip/irq-gic.c
>> +++ b/drivers/irqchip/irq-gic.c
>> @@ -1159,6 +1159,9 @@ gic_v2_acpi_init(struct acpi_table_header *table)
>>   	 */
>>   	gic_init_bases(0, -1, dist_base, cpu_base, 0, (void *)ACPI_IRQ_MODEL_GIC);
>>
>> +	if (IS_ENABLED(CONFIG_ARM_GIC_V2M))
>> +		gicv2m_acpi_init(table, gic_data[0].domain);
>> +
>>   	acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, ACPI_IRQ_MODEL_GIC,
>>   			   gic_acpi_gsi_desc_populate);
>>   	return 0;
>> diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
>> index 97799b7..27d8196 100644
>> --- a/include/linux/irqchip/arm-gic.h
>> +++ b/include/linux/irqchip/arm-gic.h
>> @@ -109,6 +109,13 @@ static inline void gic_init(unsigned int nr, int start,
>>
>>   int gicv2m_of_init(struct device_node *node, struct irq_domain *parent);
>>
>> +#ifdef CONFIG_ACPI
>> +struct acpi_table_header;
>> +
>> +int gicv2m_acpi_init(struct acpi_table_header *table,
>> +		     struct irq_domain *parent);
>> +#endif
>> +
>>   void gic_send_sgi(unsigned int cpu_id, unsigned int irq);
>>   int gic_get_cpu_id(unsigned int cpu);
>>   void gic_migrate_target(unsigned int new_cpu_id);
>>
>
> This needs rework to do the parsing of the tables in this driver. Just
> expose the domain_token through a function that you register with the
> ACPI layer.

Ok. I'll investigate and rework this to only expose the domain_token.

Basically, I would need a way to pass down a device from ACPI layer into 
irqchips (e.g. GICv2m and GICv3-ITS), so that it can verify the device 
with the MSI domains and return the appropriate domain token (or some 
sort of domain reference).

Thanks,
Suravee

  reply	other threads:[~2015-08-09  8:04 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-29 10:08 [PATCH v4 00/10] ACPI GIC Self-probing, GICv2m and GICv3 support Hanjun Guo
2015-07-29 10:08 ` Hanjun Guo
2015-07-29 10:08 ` [PATCH v4 01/10] irqchip / GIC: Add GIC version support in ACPI MADT Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 12:06   ` Marc Zyngier
2015-08-04 12:06     ` Marc Zyngier
2015-08-05 12:40     ` Hanjun Guo
2015-08-05 12:40       ` Hanjun Guo
2015-08-05 12:57       ` Marc Zyngier
2015-08-05 12:57         ` Marc Zyngier
2015-08-05 13:11         ` Hanjun Guo
2015-08-05 13:11           ` Hanjun Guo
2015-07-29 10:08 ` [PATCH v4 02/10] ACPI / irqchip: Add self-probe infrastructure to initialize IRQ controller Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 12:27   ` Marc Zyngier
2015-08-04 12:27     ` Marc Zyngier
2015-08-05 13:24     ` Hanjun Guo
2015-08-05 13:24       ` Hanjun Guo
2015-08-06 16:29       ` Marc Zyngier
2015-08-06 16:29         ` Marc Zyngier
2015-07-29 10:08 ` [PATCH v4 03/10] irqchip / GIC / ACPI: Use IRQCHIP_ACPI_DECLARE to simplify GICv2 init code Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-07-29 10:08 ` [PATCH v4 04/10] irqchip / GICv3: Refactor gic_of_init() for GICv3 driver Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-07-29 10:08 ` [PATCH v4 05/10] irqchip / GICv3: remove the useless comparision of device node in xlate Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-07-29 10:08 ` [PATCH v4 06/10] irqchip / GICv3: Add ACPI support for GICv3+ initialization Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 13:17   ` Marc Zyngier
2015-08-04 13:17     ` Marc Zyngier
2015-08-05 14:00     ` Hanjun Guo
2015-08-05 14:00       ` Hanjun Guo
2015-08-06 16:42       ` Marc Zyngier
2015-08-06 16:42         ` Marc Zyngier
2015-08-11  7:19         ` Hanjun Guo
2015-08-11  7:19           ` Hanjun Guo
2015-07-29 10:08 ` [PATCH v4 07/10] irqchip / GICv3 / ACPI: Add GICR support via GICC structures Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 13:37   ` Marc Zyngier
2015-08-04 13:37     ` Marc Zyngier
2015-08-05 14:11     ` Hanjun Guo
2015-08-05 14:11       ` Hanjun Guo
2015-08-06 16:42       ` Marc Zyngier
2015-08-06 16:42         ` Marc Zyngier
2015-07-29 10:08 ` [PATCH v4 08/10] ACPI: GIC: Add ACPI helper functions to query irq-domain tokens for for GIC MSI and ITS Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 14:02   ` Marc Zyngier
2015-08-04 14:02     ` Marc Zyngier
2015-08-09  8:02     ` Suravee Suthikulpanit
2015-08-09  8:02       ` Suravee Suthikulpanit
2015-07-29 10:08 ` [PATCH v4 09/10] PCI: ACPI: Bind GIC MSI frame to PCI host bridge Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 14:04   ` Marc Zyngier
2015-08-04 14:04     ` Marc Zyngier
2015-08-07  8:42     ` Hanjun Guo
2015-08-07  8:42       ` Hanjun Guo
2015-08-09  8:02     ` Suravee Suthikulpanit
2015-08-09  8:02       ` Suravee Suthikulpanit
2015-08-07 10:03   ` Tomasz Nowicki
2015-08-07 10:03     ` Tomasz Nowicki
2015-08-07 10:48     ` Mark Brown
2015-08-07 10:48       ` Mark Brown
2015-08-07 12:06     ` Marc Zyngier
2015-08-07 12:06       ` Marc Zyngier
2015-07-29 10:08 ` [PATCH v4 10/10] irqchip / gicv2m: Introducing gicv2m_acpi_init() Hanjun Guo
2015-07-29 10:08   ` Hanjun Guo
2015-08-04 14:23   ` Marc Zyngier
2015-08-04 14:23     ` Marc Zyngier
2015-08-09  8:04     ` Suravee Suthikulpanit [this message]
2015-08-09  8:04       ` Suravee Suthikulpanit
2015-08-11 22:01 ` [PATCH v4 00/10] ACPI GIC Self-probing, GICv2m and GICv3 support Timur Tabi
2015-08-11 22:01   ` Timur Tabi
2015-08-11 22:24   ` [Linaro-acpi] " G Gregory
2015-08-11 22:24     ` G Gregory
2015-08-11 22:25   ` Marc Zyngier
2015-08-11 22:25     ` Marc Zyngier
2015-08-11 22:36     ` Timur Tabi
2015-08-11 22:36       ` Timur Tabi
2015-08-11 22:48       ` Marc Zyngier
2015-08-11 22:48         ` Marc Zyngier
2015-08-11 23:33         ` Timur Tabi
2015-08-11 23:33           ` Timur Tabi
2015-08-12  7:21           ` Marc Zyngier
2015-08-12  7:21             ` Marc Zyngier
2015-08-12 19:20             ` Timur Tabi
2015-08-12 19:20               ` Timur Tabi

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=55C7098F.5010303@amd.com \
    --to=suravee.suthikulpanit@amd.com \
    --cc=Catalin.Marinas@arm.com \
    --cc=Lorenzo.Pieralisi@arm.com \
    --cc=Will.Deacon@arm.com \
    --cc=bhelgaas@google.com \
    --cc=broonie@kernel.org \
    --cc=grant.likely@linaro.org \
    --cc=hanjun.guo@linaro.org \
    --cc=jason@lakedaemon.net \
    --cc=jiang.liu@linux.intel.com \
    --cc=linaro-acpi@lists.linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=rjw@rjwysocki.net \
    --cc=tglx@linutronix.de \
    --cc=timur@codeaurora.org \
    --cc=tomasz.nowicki@linaro.org \
    --cc=wei@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.