From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755703AbbJUSsI (ORCPT ); Wed, 21 Oct 2015 14:48:08 -0400 Received: from mail-by2on0075.outbound.protection.outlook.com ([207.46.100.75]:39520 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755600AbbJUSr6 (ORCPT ); Wed, 21 Oct 2015 14:47:58 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; apm.com; dkim=none (message not signed) header.d=none;apm.com; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0NWL2VQ-08-3S0-02 X-M-MSG: From: Suravee Suthikulpanit To: , , , CC: Lorenzo Pieralisi , Will Deacon , Catalin Marinas , , , , , , , , Suravee Suthikulpanit Subject: [PATCH V3 6/6] gicv2m: acpi: Introducing GICv2m ACPI support Date: Wed, 21 Oct 2015 11:47:29 -0700 Message-ID: <1445453249-32557-7-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1445453249-32557-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1445453249-32557-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(189002)(199003)(5001770100001)(5003940100001)(64706001)(47776003)(48376002)(19580405001)(19580395003)(5003600100002)(229853001)(101416001)(189998001)(87936001)(5007970100001)(11100500001)(97736004)(106466001)(50466002)(92566002)(5008740100001)(77096005)(53416004)(86362001)(76176999)(2950100001)(50986999)(2201001)(46102003)(105586002)(50226001)(36756003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0716;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0716;2:W0CummaRkjJnqdacpc5PANYNIQThiTDQ2DjqsxFtSp/eNy8t1rqfPYd3HP+Qv4FqlaS0E34S54yvAUZJEwfXlztm8GjpmiHGjR5pr7kXI5Vo0sSR64RRuLoYqPSIvH+UEbVfY8MGTkIzWn8RgUR7zQ9Qw/AbS2eO6J2nEkJZiVs=;3:GqGFSq0jEL+tRxugiAM9W1MNL0i30Top3a28yE+kMPA59OvqfMc7HyuWuK86Bh6AqbwtJ8/5HAhDiOpricdoL3lnqwuJbVDpHnIoQpIIIrroDpE0EursLvZS7BKHGiVNuwQEQlItvQoGNQ1vAvSua6GeTq4H9hvUaWkFYmGaLmlUTgoF6L/+0rlptkKNCsogWt+L9E7BTOjpYK2VBqzPZIx/Ar3JALkWTa7FOxA5tY80qv3RX+u0jXoGlosEAbkc;25:Toy8amdY7qsC5Bj+MhZtmVYUsM+NOeZ7ZEIP/JqJpisq7I3OPyVETaEQIF9hLcn08DIVbRvqIoXSmn6Wn30cs1pP537WzY79qUi2D5a22TtgW9eczLGhL0YfWzn7bEEaIKihQH8bfNmPHZdem86FhPgKEFpFV+zltlvbjtKNlZt++NLmGNbJhFrKMrlKrBB8tQkpFDI5IOUbVPChzqwLRt5CYwtqV3DBmd+5N79OegwdolAPxwH9l9yR+eahIL1QHXHZGv3ALvUpm20g8fYb4g== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0716; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0716;20:WkI5kYUyAvBb98CMzwd0N2kekKBXy5ryAYvA8ZJKeV9fAU/gdH3Vz4hRga0Zbgteq3CGa/4GWbnKUE5O3TfGKJR2dKzBimGC/zduA6AGXYsLm6RPaxvZi4BE/CeuFpjXT0tF5RQOaOEMXF54dLLUOyNNmRpBLp2TPSDOSbF3XhfmxPB7/GDCpM/9iuMfnluhGyOt38n4Ng15DJXY7ybfD1o/o+5uKQm5csAlz4kM9c709IvIOZfgvykI2Qq11/0id98smrHLQg0cg595kDJH9TAQXm9BwFb0Z3rxrmI9IpBQT82k1ZAKL8uDGgLFvysl2HkdQPhjt1HHYLGQDwAB9FHGWjsxkbKQIKW8Z2dU2lqC91m6+8Y6+HF18dFFp1svABJpoDU8llela3CNQokvAjUiQg+ajRKB3MpmP+ceI/UO37v7UU9wkjy2Mem7LvtyYlo1Ib+uMyTCd7CjNpjAgFe47g4cyv/yvzlUXP1iD/uIVTTedQK98pxWjk2o0izM;4:zqxfgm9U0X29/t6xneK3JZLBbAkWadldwLcwAgDDcO2X361MYzAmbRQk76aNJI1ZVBj26yolctz1nThlSzIzq+haP+UfVqhucit2Jaedr5ELDmR3bTceLJk2bE4L/ksQUP5L1jNMTseXFPamVDxIpAlTZzCIIrIj5HboWFWKHqNG+XoxQ+Z/6soRHwEr2ZhjGbBZrn+dw+JPqMILR+/1VE+f48kTcJlGAxF7x8XIOAQLZ8FK8TOTG/LKOs0Chow1G5qUvoTlB7dRJ1yOlCdjW9lWd0ak06WMQDEYCN9Vva6GbU49bCD0WjmCoRBlyi+su0TzgwEtF73UCce5Q1x+AirojF/XoofAixFhINUloptZhrKa41/3mHpcT78wjatN X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(102115026);SRVR:CY1PR12MB0716;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0716; X-Forefront-PRVS: 073631BD3D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0716;23:iKM++y4rQhY+dz1meiRkl3pHxupq5qqEcWh3NFT1s?= =?us-ascii?Q?JAATjbErc69DribHJNw0h6yucLEuFkgbkPHyODYZGt6shzmDSb0NyHxulN95?= =?us-ascii?Q?JARGiOqzLczvPV8LrEn0nruL0VAGB4NKNqfVs82Vz6/NBIUPVB/KK5IUZctF?= =?us-ascii?Q?+ut7wy4mhdu/UV2gChzlcYN7uXIYsFx9zr6sEXsIJp1G0IrliTl2BnhQPAk8?= =?us-ascii?Q?mRY/X0kssO9Kn2JhBlVt2jwoSAo5LGHh6xKeQm7ma3Tt+KJRwUHXSqC+Y1SH?= =?us-ascii?Q?n+WcJ2BUFr3IlovwqKHpZWwL5GxufXm/atzLrPRlHteiK+HE0ad/djsvjaU8?= =?us-ascii?Q?lr1AUAuHXw3JGOiKl/Q0wmq89g+J0kBtVXKowWfZPwKKlcUMicBSq9OjpaOF?= =?us-ascii?Q?VsbHnBGPh+nf/UA4h7VObXUFEZZYkiZ+vqjaDEdGg316pk/TvAxPb3reYZWQ?= =?us-ascii?Q?FGF1pKkdC8S2Znpt7A3i5nCjqvNgy42uak2uOoEilmx1amnr8X5Uf2LpRt4V?= =?us-ascii?Q?XmoYwPYRiERt0OebsAI4fQS3VnxOiwQC7DI47k3B3eT9ldefxq0nBxgIR0rs?= =?us-ascii?Q?x3s5UdokMJGPkg5lpTFW/xCEtGvB9VoJuGA/tibaWw2u/F/Sdp+GneRGr594?= =?us-ascii?Q?qUHfN/Yt0upN7a/7cihNJ6+m7Mwcn7dhYkA824kOeWuEoliXZvMpO8sKvq3m?= =?us-ascii?Q?3XoSYz7bN3HGn7kYG563cn4plXMHLsaSb53wPjBMDbCg7LKjCHkMBM3wkp7X?= =?us-ascii?Q?LY+JweCVAp4ESnRDmdaq5VP43Crsbi2Dik/Q1rGI3U+jHE7UqKDWYZSBoibr?= =?us-ascii?Q?jT7f8tIY7fgUCnciJqf1bEAUUHoP5FxOnssS8fny/LGg+I3vwO8d9jChWOHX?= =?us-ascii?Q?GE28a6K9oBjgkhH7jLyCuP/10Myr8GYDm0I36cgWHLg0VfI8HjfXW/6BBu+h?= =?us-ascii?Q?380eAFthq/zLDLZz70kcD+8xnY838OTIQkSgYT3kkf95etuy1RLyI1xvyCTY?= =?us-ascii?Q?04=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0716;5:Z0lHlK2cBPqOqxjORx2AYzjdE3sfTE/jfoEUzSrKcPOFgbEhA4Wn0kHcjWbrlPegOluiYQfth4KzYEWUy0XSZHYTyvMojArR9BKXG8sOAvuEj0tHS66qIlW1fPmns5C9/8saBSTE+etZomHy0qMcvg==;24:duL+02E9pVG7+ET1lhmWgM4UbUAl7kYmbK15Z4osXqT9aV5qoSWz78SPrYBP7/ROnxEZQ4ux0H01QgJKuWOdhAbQifcDC34xal6q5O3H8Xo=;20:UV96Zrg5M5D08Y+2BDKB+Ow0M+x6R6jv8oTfIqTgCkpjtZOazOM94FGjEfN95PEsz8LXbxIx1cSmBdJRPAJd0/cjpj7oCfmOVId8/hGXlOQFxrJVzwBZXNDkb+BT4QlVU2pkrXgnZV6hs/kJnVpzfuWvd7mqALb+wyxOsohC5f12ifVLqtk52fc74oPVukzPnOHbyqgIYymrD3M7AuLavtaMkZMHKnjfV3xhqMQJ74MNK39z2ApSFETNSzNdNg2Y SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2015 18:47:54.9371 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0716 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch introduces gicv2m_acpi_init(), which uses information in MADT GIC MSI frames structure to initialize GICv2m driver. Signed-off-by: Suravee Suthikulpanit Signed-off-by: Hanjun Guo --- drivers/irqchip/irq-gic-v2m.c | 95 +++++++++++++++++++++++++++++++++++++++++ drivers/irqchip/irq-gic.c | 3 ++ include/linux/irqchip/arm-gic.h | 4 ++ 3 files changed, 102 insertions(+) diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c index 7e60f7e..4f52e9a 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 #include #include #include +#include #include #include #include @@ -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); } } @@ -359,6 +368,8 @@ static int __init gicv2m_init_one(struct fwnode_handle *fwnode, if (to_of_node(fwnode)) name = to_of_node(fwnode)->name; + else + name = irq_domain_get_irqchip_fwnode_name(fwnode); pr_info("Frame %s: range[%#lx:%#lx], SPI[%d:%d]\n", name, (unsigned long)res->start, (unsigned long)res->end, @@ -415,3 +426,87 @@ 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 = NULL; + + 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 + 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); + } + + 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; +} + +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; +} + +#endif /* CONFIG_ACPI */ diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 6685b33..bb3e1f2 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -1329,6 +1329,9 @@ gic_v2_acpi_init(struct acpi_table_header *table) __gic_init_bases(0, -1, dist_base, cpu_base, 0, domain_handle); + if (IS_ENABLED(CONFIG_ARM_GIC_V2M)) + gicv2m_acpi_init(gic_data[0].domain); + acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, domain_handle); return 0; } diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h index bae69e5..30b2ccb 100644 --- a/include/linux/irqchip/arm-gic.h +++ b/include/linux/irqchip/arm-gic.h @@ -108,6 +108,10 @@ void gic_init(unsigned int nr, int start, int gicv2m_of_init(struct device_node *node, struct irq_domain *parent); +#ifdef CONFIG_ACPI +int gicv2m_acpi_init(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); -- 2.1.0