Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1288697
| Path | csiph.com!eternal-september.org!feeder.eternal-september.org!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> |
| Newsgroups | linux.kernel |
| Subject | [PATCH v7 4/4] gicv2m: acpi: Introducing GICv2m ACPI support |
| Date | Thu, 10 Dec 2015 18:20:03 +0100 |
| Message-ID | <qEd2P-GC-17@gated-at.bofh.it> (permalink) |
| References | <qEcJr-k8-5@gated-at.bofh.it> |
| X-Original-To | <marc.zyngier@arm.com>, <tglx@linutronix.de>, <jason@lakedaemon.net>, <rjw@rjwysocki.net>, <bhelgaas@google.com> |
| Authentication-Results | spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; |
| X-Mailer | git-send-email 2.1.0 |
| MIME-Version | 1.0 |
| Content-Type | text/plain |
| X-Originating-IP | [165.204.77.1] |
| X-Clientproxiedby | CY1PR14CA0031.namprd14.prod.outlook.com (25.163.13.169) To BLUPR12MB0433.namprd12.prod.outlook.com (25.162.92.139) |
| X-Microsoft-Exchange-Diagnostics | 1;BLUPR12MB0433;2:0aRGxddvKGFtmYRoEgzVDj9EUbHPRLhwstsM9lGxDfalciGv9b50OLd5IErV5P2v9A49y39lS15clSMrhcB4J0n484L5ygywOajFBuMaSzfMRscnRUvEO5qw2IPU0cX/LrvWT8XonOPxxjVQntsUkA==;3:fNpnrORRZGB8mmQMpamytHj7uixb4t9lW3eLlyQ0p9odNP+6dxUgADhAe+btxb//CdBtM/M9ZdkgV+h9c41vpsejVqGTAjadm+ag4R7JSTfQNV3zanAuNGdxunghBMc2;25:LZNGvtqENR1SxJtVCcq7CLnkhksGcuYwNLyIHAYII+iJqr2nexpQzpKC3uM0hLWcO0h53csfwlP0nCazPEgH/6ZD3Md3GLo/iaoSMsFiGZRo4N6dhbBu0I73Yx07JCuFfCB6ng2aePQ/1rIlUNw44gBJWGYq+XdTNn8ObC36t6qQBbw5bIPaG5SuxN4cHpVneq/HfxSpKT4OaIsQxEf1+4lSQJ3PTUQ005+W2SrZGCZSASHbtFRJtq3TGDnHK33p9bfI3KXZyT6353SDPDcsUA== |
| X-Microsoft-Antispam | UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0433; |
| X-Microsoft-Exchange-Diagnostics | 1;BLUPR12MB0433;20:aSrhXpv/ru5ZXDPeNW/Mu0vKzFlBkLHYmXAcfg/MrHpjZaIc27W9KgFW7LQcttoHmgtvUjFeUiclKt+NH/G1Fu15Dcn8TY51U/sZFToY1Ryh2ALhfMCc2t6qbCHai4MTji6FK5T/Aru/sjswnZIF9O3o2HrHanInJ22fv15+Q5m9Cir/ZcQvWDzbwzU0CyUnljAJUXNG9prRIUc+fbU6dDm5LkK5lU143TvqzAMSGBu4AsPJsCfVCzheDA6kiANH82C1gK3fzMvY7B48B1p+It+11ABaOnZbs6PHQeSuogBqGWeCNOIHOAiIcpAmI5WB+lMpZ09XNwoeP0kmwI0LOwgPZ0nmA9rgQTc641aD0jxCzZ/YFL3sxT+MgSzEaeLJd5OEkQ3egbOfWRdx2v26i3zFVHJPsrHVvClz2Jzxfe8Hj2sIe8BSNT0DtFAfKYLVsgvZAB+7ktyBz76okJ3qKWuFfLo+NRJ4L1Dx7SCx3l3bonC1dfjQOyV/JXsdDzOj |
| X-Microsoft-Antispam-Prvs | <BLUPR12MB0433D047FD23EA8AFC478E2FF3E90@BLUPR12MB0433.namprd12.prod.outlook.com> |
| X-Exchange-Antispam-Report-Test | UriScan:(767451399110)(180628864354917); |
| X-Exchange-Antispam-Report-Cfa-Test | BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(8121501046)(5005006)(10201501046)(3002001);SRVR:BLUPR12MB0433;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0433; |
| X-Microsoft-Exchange-Diagnostics | 1;BLUPR12MB0433;4:/uQEo+rdPbjmH2p4uGv9g87aF+5Z6TuBb4Ni4dyUnrya8Paeyg6QnAw64R+nB+ASRVHMY1ao+NeBsg6qGo6NLQFQqFhTWYSGl89MpONPI9owS9A1ZJIs2nnLM3Zs9cLso/8XEYd6j5rVgh3DMYZMM+Q5l5IeDtmvPXk3paLzuD7Bn/sPUHws2Fdx0se3OzsDQ3okFpRaYhOQnWyp9R5Snatk4coOz9Gip2FcEOpShoe0gNiqywwy6KAGI9DppSA78j8+WJA4FVC54dF6bPLxAjyJahmiyPwjaFKyT5ce1uPMwGIFZ22s82fNDuJXQlpYC4U9Tw2EVVcx1llxkFEOvAiCUenkR0vZc3cEQDXJFbng1K0nnK55dp2l/u8niSHxafqdSHK75gonshbP7BROjfGqg5R7RensARgmmNegmqHFzsoMITo+qfjIi+JEZQevHVqCaURWH9lEMAcs7QuJCg== |
| X-Forefront-Prvs | 078693968A |
| X-Forefront-Antispam-Report | SFV:NSPM;SFS:(10009020)(6009001)(199003)(189002)(97736004)(50226001)(122386002)(5001770100001)(42186005)(229853001)(36756003)(106356001)(47776003)(2201001)(66066001)(5004730100002)(105586002)(53416004)(86362001)(5003940100001)(189998001)(5008740100001)(76176999)(586003)(101416001)(50986999)(50466002)(40100003)(3846002)(1096002)(2950100001)(77096005)(48376002)(6116002)(87976001)(19580395003)(19580405001)(92566002);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR12MB0433;H:ssuthiku-fedora-lt.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; |
| Received-Spf | None (protection.outlook.com: amd.com does not designate permitted sender hosts) |
| X-Microsoft-Exchange-Diagnostics | 1;BLUPR12MB0433;23:X4HB+ITrelMSuHppg1I/aWUNFJ28P7wjZKJaZ53mMwNmw+TUsKGVK+eVfDhBhvlnMYHZBR5zU9jgXnwhjhIrYDS8BJP62K2bUnoqgpEAlSjDAMBvkJjmzS68SrEeaobe1o1jzaQqdlJWsLrlfNn8oif1jehu4dqYfa+hIdxbO1JuVZ+HG0N7nRhAgYOVKNQg9vobAjYBVlqmmft6ZKvkOs0jxvusS/4Z13N9nXR4/Of/H30e8qNyOtwNVnskzEJdzZcAPsT3lismWO0F1czoAl3Qe4ilgFWb5aJTP9belfW6Nvm4xLMstvBeC7NDPMh76wmuT9jP+YuiCRn3uGKS/U//kyUHxo7zvOtvLoQAuQwY02IW4Vox9WqalmhMCr2p8enM9aXiiUfD3sK3RJ+m60Y4A5xwopVVc/5EFGX51p7VQ2EZfzpRFV8gWmskgO+wWHY53zdbzxz1oaFAVWOKPvQNpGyqZcI8pR2/SWUe7UAKPlV3nzZNOmUXwcHbvnoTjddXgg1PjF0N+dkZUak8YqrOYhCH0ieFSTPAqc2j5a6T484K6pgcj4pW+0p3nUT3aiePHSYyDthc2ZeesTEB0daZ0jW+9ukQ5YN6Tf/LMbVo+s1wGhvN4z5CkW7eIzaVVSDvcneOOANoycQ7xD+lznwnKHTDM5EwK6TsRYWF98EOOe39ab9Zx+Y+5+TbTPjI4D4YYYMGxoZy8UE3uJ78pi7d5FlCNOXqGSNmiySUY7Kz7cl2mFGXFa3jgflku3v7FlNG+hFOm8hCi7+7t/YGL2cvBVAEtMan2CcNLcTv82jerRDxc3Kvf7W3i3yu0McANmLenABzJ5wmKiyuxZmMZ60K5wbEIQcp/ULshslKj9pMrSiITAMxKJer7kUhmgB89kIXn1cs3gjHowIYERWTxp3pIWHSQ5rzF8rgzP/toBKM7mZgD0FJOnWemkTk7cQv7hWzI+hzrhsdvhSuoRDt/gjd9KiFvKj/rtCz9jhamIM= |
| X-Microsoft-Exchange-Diagnostics | 1;BLUPR12MB0433;5:0/BYwM24TWZQVAb78N8smLIJRvgnt02dbrM82p0zPGPVrWG1HDlTo6wcRxFwEtcYZ1qO7QFwvloXAFeX96RqlR/WHSNYN4Jsx/ppf67ozMRPwLT/qjRBnzPKdMBnD82hVOuaLB9SBKmSj2lfj2aN4w==;24:KJ+N/tNRnvi1eavZNeVVCTsyClH+EBoqr2lWlSGfn3lv6qU403RelB2VG1sDTMZvubWH+y+5SlzTVavh9QiVXLve0ngDIvkUu4u2lyikM9A=;20:rNjJ0mgjGfDa2mck0DuOemtISuf0jegC2LxPHNglaxG4CkwGYIUk9yb6DbUAq/UE18ex52RAfaHvKst3Cs7Rv+Pi4ojFLxr5yjbyiwz7cXktw/kCzU2y5zNOnmj5/HfeZgDaMpPNvLzeZtsws0a9WY/6a4SK+nV7ceKSko0XkTPFQFxLsmTUi5n0Qn1EK2sDWRQEqF6gnBS+DfMIwYBmzmDexLPoEoHs+so0gpeqWkr3aph4+A2PXTRPW6SzbBhy |
| X-Originatororg | amd.com |
| X-Ms-Exchange-Crosstenant-Originalarrivaltime | 10 Dec 2015 16:55:58.5627 (UTC) |
| X-Ms-Exchange-Crosstenant-Fromentityheader | Hosted |
| X-Ms-Exchange-Transport-Crosstenantheadersstamped | BLUPR12MB0433 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 212 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>, Will Deacon <will.deacon@arm.com>, Catalin Marinas <Catalin.Marinas@arm.com>, <hanjun.guo@linaro.org>, <tomasz.nowicki@linaro.org>, <graeme.gregory@linaro.org>, <dhdang@apm.com>, <linux-arm-kernel@lists.infradead.org>, <linux-kernel@vger.kernel.org>, <linux-acpi@vger.kernel.org>, <linux-pci@vger.kernel.org>, "Suravee Suthikulpanit" <Suravee.Suthikulpanit@amd.com> |
| X-Original-Date | Thu, 10 Dec 2015 08:55:30 -0800 |
| X-Original-Message-ID | <1449766530-16935-5-git-send-email-Suravee.Suthikulpanit@amd.com> |
| X-Original-References | <1449766530-16935-1-git-send-email-Suravee.Suthikulpanit@amd.com> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1288697 |
Show key headers only | View raw
This patch introduces gicv2m_acpi_init(), which uses information
in MADT GIC MSI frames structure to initialize GICv2m driver.
It also exposes gicv2m_init() function, which simplifies callers
to a single GICv2m init function.
Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Tested-by: Duc Dang <dhdang@apm.com>
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
---
drivers/irqchip/irq-gic-v2m.c | 110 +++++++++++++++++++++++++++++++++++++++-
drivers/irqchip/irq-gic.c | 6 ++-
include/linux/irqchip/arm-gic.h | 3 +-
3 files changed, 116 insertions(+), 3 deletions(-)
diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c
index 779c390..7e2975d 100644
--- a/drivers/irqchip/irq-gic-v2m.c
+++ b/drivers/irqchip/irq-gic-v2m.c
@@ -15,9 +15,11 @@
#define pr_fmt(fmt) "GICv2m: " fmt
+#include <linux/acpi.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/kernel.h>
+#include <linux/msi.h>
#include <linux/of_address.h>
#include <linux/of_pci.h>
#include <linux/slab.h>
@@ -138,6 +140,11 @@ static int gicv2m_irq_gic_domain_alloc(struct irq_domain *domain,
fwspec.param[0] = 0;
fwspec.param[1] = hwirq - 32;
fwspec.param[2] = IRQ_TYPE_EDGE_RISING;
+ } else if (is_fwnode_irqchip(domain->parent->fwnode)) {
+ fwspec.fwnode = domain->parent->fwnode;
+ fwspec.param_count = 2;
+ fwspec.param[0] = hwirq;
+ fwspec.param[1] = IRQ_TYPE_EDGE_RISING;
} else {
return -EINVAL;
}
@@ -255,6 +262,8 @@ static void gicv2m_teardown(void)
kfree(v2m->bm);
iounmap(v2m->base);
of_node_put(to_of_node(v2m->fwnode));
+ if (is_fwnode_irqchip(v2m->fwnode))
+ irq_domain_free_fwnode(v2m->fwnode);
kfree(v2m);
}
}
@@ -373,9 +382,11 @@ static struct of_device_id gicv2m_device_id[] = {
{},
};
-int __init gicv2m_of_init(struct device_node *node, struct irq_domain *parent)
+static int __init gicv2m_of_init(struct fwnode_handle *parent_handle,
+ struct irq_domain *parent)
{
int ret = 0;
+ struct device_node *node = to_of_node(parent_handle);
struct device_node *child;
for (child = of_find_matching_node(node, gicv2m_device_id); child;
@@ -411,3 +422,100 @@ int __init gicv2m_of_init(struct device_node *node, struct irq_domain *parent)
gicv2m_teardown();
return ret;
}
+
+#ifdef CONFIG_ACPI
+static int acpi_num_msi;
+
+static struct fwnode_handle *gicv2m_get_fwnode(struct device *dev)
+{
+ struct v2m_data *data;
+
+ if (WARN_ON(acpi_num_msi <= 0))
+ return NULL;
+
+ /* We only return the fwnode of the first MSI frame. */
+ data = list_first_entry_or_null(&v2m_nodes, struct v2m_data, entry);
+ if (!data)
+ return NULL;
+
+ return data->fwnode;
+}
+
+static int __init
+acpi_parse_madt_msi(struct acpi_subtable_header *header,
+ const unsigned long end)
+{
+ int ret;
+ struct resource res;
+ u32 spi_start = 0, nr_spis = 0;
+ struct acpi_madt_generic_msi_frame *m;
+ struct fwnode_handle *fwnode;
+
+ m = (struct acpi_madt_generic_msi_frame *)header;
+ if (BAD_MADT_ENTRY(m, end))
+ return -EINVAL;
+
+ res.start = m->base_address;
+ res.end = m->base_address + SZ_4K;
+
+ 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);
+ }
+
+ fwnode = irq_domain_alloc_fwnode((void *)m->base_address);
+ if (!fwnode) {
+ pr_err("Unable to allocate GICv2m domain token\n");
+ return -EINVAL;
+ }
+
+ ret = gicv2m_init_one(fwnode, spi_start, nr_spis, &res);
+ if (ret)
+ irq_domain_free_fwnode(fwnode);
+
+ return ret;
+}
+
+static int __init gicv2m_acpi_init(struct irq_domain *parent)
+{
+ int ret;
+
+ if (acpi_num_msi > 0)
+ return 0;
+
+ acpi_num_msi = acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_MSI_FRAME,
+ acpi_parse_madt_msi, 0);
+
+ if (acpi_num_msi <= 0)
+ goto err_out;
+
+ ret = gicv2m_allocate_domains(parent);
+ if (ret)
+ goto err_out;
+
+ pci_msi_register_fwnode_provider(&gicv2m_get_fwnode);
+
+ return 0;
+
+err_out:
+ gicv2m_teardown();
+ return -EINVAL;
+}
+#else /* CONFIG_ACPI */
+static int __init gicv2m_acpi_init(struct irq_domain *parent)
+{
+ return -EINVAL;
+}
+#endif /* CONFIG_ACPI */
+
+int __init gicv2m_init(struct fwnode_handle *parent_handle,
+ struct irq_domain *parent)
+{
+ if (is_of_node(parent_handle))
+ return gicv2m_of_init(parent_handle, parent);
+
+ return gicv2m_acpi_init(parent);
+}
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index fcd327f..644e8bb 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -1234,7 +1234,7 @@ gic_of_init(struct device_node *node, struct device_node *parent)
}
if (IS_ENABLED(CONFIG_ARM_GIC_V2M))
- gicv2m_of_init(node, gic_data[gic_cnt].domain);
+ gicv2m_init(&node->fwnode, gic_data[gic_cnt].domain);
gic_cnt++;
return 0;
@@ -1359,6 +1359,10 @@ static int __init gic_v2_acpi_init(struct acpi_subtable_header *header,
__gic_init_bases(0, -1, dist_base, cpu_base, 0, domain_handle);
acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, domain_handle);
+
+ if (IS_ENABLED(CONFIG_ARM_GIC_V2M))
+ gicv2m_init(NULL, gic_data[0].domain);
+
return 0;
}
IRQCHIP_ACPI_DECLARE(gic_v2, ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR,
diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
index bae69e5..febc6c3 100644
--- a/include/linux/irqchip/arm-gic.h
+++ b/include/linux/irqchip/arm-gic.h
@@ -106,7 +106,8 @@ int gic_cpu_if_down(unsigned int gic_nr);
void gic_init(unsigned int nr, int start,
void __iomem *dist , void __iomem *cpu);
-int gicv2m_of_init(struct device_node *node, struct irq_domain *parent);
+int gicv2m_init(struct fwnode_handle *parent_handle,
+ struct irq_domain *parent);
void gic_send_sgi(unsigned int cpu_id, unsigned int irq);
int gic_get_cpu_id(unsigned int cpu);
--
2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v7 0/4] gicv2m: acpi: Add ACPI support for GICv2m MSI Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> - 2015-12-10 18:00 +0100 [PATCH v7 1/4] acpi: pci: Setup MSI domain for ACPI based pci devices Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> - 2015-12-10 18:00 +0100 [PATCH v7 3/4] gicv2m: Refactor to prepare for ACPI support Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> - 2015-12-10 18:20 +0100 [PATCH v7 4/4] gicv2m: acpi: Introducing GICv2m ACPI support Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> - 2015-12-10 18:20 +0100 Re: [PATCH v7 0/4] gicv2m: acpi: Add ACPI support for GICv2m MSI Hanjun Guo <hanjun.guo@linaro.org> - 2015-12-10 18:30 +0100
csiph-web