Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751748AbbGMJPL (ORCPT ); Mon, 13 Jul 2015 05:15:11 -0400 Received: from mail-bn1on0117.outbound.protection.outlook.com ([157.56.110.117]:50809 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751578AbbGMJPE (ORCPT ); Mon, 13 Jul 2015 05:15:04 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; arm.com; dkim=none (message not signed) header.d=none; X-WSS-ID: 0NRF5OT-07-AAN-02 X-M-MSG: From: Suravee Suthikulpanit To: , , , , CC: , , , , , , , , , , , Suravee Suthikulpanit Subject: [RFCv2 PATCH 2/8] gic: Introduce gic_init_irq_alloc_info() Date: Mon, 13 Jul 2015 16:14:18 +0700 Message-ID: <1436778864-17645-3-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1436778864-17645-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1436778864-17645-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11OLC005;1:wXFJmsLH9ABVBNqUEfC6Xvm/aEaFJKRXd0IuKHrWcxZsKJaNq6h/9O52Gsn6RXH+oEEYlR5dEw07H1uehfXrNsgpLmp8ZQ/NnU617KTDtOJDvmQ4TEtauNN7GYQvQ6pa4r7eguVEpp4MlqgFbXOEWsvsHwHHMu1xNGlAmq69uc/OsSUaaMxmNjKNy5TEkQZW2mDiGJs0QKU4RL1NWNQBjbhbtd/WibQZsbWQMdgTpcPhG3a7CApWJDIeUmIgYlt9q6K/ceq+YzuehCF/WwofJZRZ0W+unlv7ZV8eaWmsu6Gdr7MWnFcADK4d750QyOG83BjfREfMAcYsbN5ubZJQqZZGlwcVKZTOuyB8BUE6Qw7SEGiLGARd2A/PXcSIpFYMwy+1og2CvuU+XBqqrYan3NJjYOx1S3xcns6ACO2MInk= X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(428002)(189002)(199003)(77096005)(5001770100001)(62966003)(77156002)(5003940100001)(5003600100002)(2950100001)(87936001)(50986999)(2201001)(86362001)(19580405001)(229853001)(19580395003)(76176999)(48376002)(50226001)(53416004)(50466002)(189998001)(101416001)(92566002)(36756003)(46102003)(47776003)(105586002);DIR:OUT;SFP:1102;SCL:1;SRVR:BY1PR02MB1148;H:atltwp01.amd.com;FPR:;SPF:None;MLV:sfv;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY1PR02MB1148;2:Y+9tdVa13ZN4lNvhM84zcz+qfJsNcHmvuj8ivTgyDwd5iLo5OdWutQKf55R7FNLf;3:geAD6+QiR9ASeopB8ksOty7rwuUualweTaTOkbeQwTgF5j1SkqtqBjgU4rNs2hNaQoKErpIL5ieua+nWoouJMaEzq98eb6z2xLP3pZ7pXFEitp14OvWIVBD26SVqWPwed3wEKliwjLy6mxKL1I696UGmYbOw63BL9XVmpZ2MkLJMcWXRgTG2Yt5MNMtJosZtZ04k8WstRf24maTrwXbbFLykZeRhlo2hWego9GDwFshfy7WomajYMPffDZ/DOOIG;25:kSZsEgcD5669Zh7uypbfVYXp3/uHs9hs72gydzEnjcpmRFTCUngid0aHN0n+ePkOey7rrrsKMpeIo+m4Vjz5H2u8+3vZ0qEfigHXapvUAb47ientTWHXJGJAaLO0BhvIqbVLJX8B0K/zbag1m35lk9wPf7KAhVsnRerUHbuNl9sMBNpmnvfW86hWbmnRSlHM+3keiNSFlA3/xxXkEREixlWWTQEV0cb4+vw3iNavVZnk4yyl43h567C1yxs4lLt+9uv6TvCjr15MmiaUNP5Hzw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR02MB1148; X-Microsoft-Exchange-Diagnostics: 1;BY1PR02MB1148;20:2vld2b7K4ExFYW2zGPcNooZqpyeGHHTytPROO7ZwebOlhOY8UItnmYVOx6H6NZ+fggVsD4diq3Vbm18KxTiHQRPZ19i+Lsc12lnT6vwSXxmkeqsRq8nYXAUn+x9vyPeDIkNQHulRb/96DMzSgke60BOATeee0SGtkIejaGmpCAlCRrZDmOY93qIp7sGvDJ0qTeTrkhSDi2Pal2S2Dc5uvpNYvTwRdcuuvUnk2Bwk5dkUYaKYvkYY6q2G6qJFg8jVomoVPivZS+qlthuronl/GIzDf2+nZSvPmaHQZTSa3ixo/vUmPIxCC9zt4gq5tQDKHrt2x9xRk+lbIZQ5y7/8u99Cdtfm0GG+xUh3afgzc0W/4rHXsYJq2v3c/k9aN0zVEAzVPwk1cNuQrdmHk0ZlujMfo0pWQvD8lRW88dmLYbSqToute9FBemu71Vu+XyuuwkIcYnB7faxwmWJvxNVQMbXtw9P8RYyN/MKUeTehnMXpc/J0Ylvd+BPiFtITiznK;4:7Sg6lZ55B7AsAhKH2HLqL4i32IWkQFx1lrwrZcSmYq2nfOj1Jt7IMHlYrEIvkRjVOB9cnVqutpE2VDG5P0mU92fuHyOH9I3PbRzZ3v6T8OdBIJYKHj5jwEgK3ArtpPL2Hq/L45w7Paod+89E6PET7A8Tut0qQW2Z7lp9gjv+EVSF5QhimSc/faYIZiPmB2h4Sdl3WCOwob0fmwKmM286srdvhUjaJKfUnj3Ho241lkz6oZm1fPoNSS1cXCIRx1008GZtfaFlUrAm957ia5x3684D1mn8s3xeLgfsXjENHDs= BY1PR02MB1148: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BY1PR02MB1148;BCL:0;PCL:0;RULEID:;SRVR:BY1PR02MB1148; X-Forefront-PRVS: 0636271852 X-Microsoft-Exchange-Diagnostics: 1;BY1PR02MB1148;23:7g2PGsiWAcE8moL+N6SkHkhc+kMUR7bCAA6qSg3lGq/AioGL7OVJf2Wh7h3aNaWlbMRR1zHFsiDMxK2+2AV9JI2FvgkMhmBfQ9uiJi/MGbTAfpd7T+62u5gOazyHU89jWvVEOh1as/wRcTq2sUNiRW3ULSm5QClnltPk7ugI0PenCHaA+6ZVn8uYBSbQO0YlOUQ4hn6yKntEWLsk/00ycmwlvIhZk99c3wR+aBLBm5A6DwwDaoBGZzwU6Q6uR24aHFx71APVNTmEs5Mpe2DgyIBy+PgSDciN2Euymqj+rBtrM8H4FpRo+td2/HbXDs7+OT/7+CmOwaKffilmNJobAniSd0gU4zIUR7fdhexn25B3OSPnBsSnF/mwAFddGuNz1a3JrLHlJZGZjKzbMRjZrOB2bBzCmvAe7LjLWoefHtCKGT9ZGGjHUlbQhjlxXSxmHrZl9EQCYqx9g741AacoeNNA0Q0nKbgegS6B/YUu+PHNiJm6q+nCSh5FipkoptraDT45oJGeeXSIDErxG6RosUUoMw3z5j5mMbNcDn0B9ENp7uj5KDstmth/8Hx+N8eEwgXE6xLNRGFFbzr7eOwysWSsyzvNzQnw+3UWJBWG8eOD4+w0FPW72O2deIMNeB9ZUduQ7U4fnirugD4X8x1sPphMGyJMx+wutMdVGi8pl3BT3/wTql9S7DfFD/zelUGCgPm+SIMcrH80BChETE6HgG0Z4DRRp9EfSEHwWo10kBNxKnCeOK3hp+P6dq8E0qbkmFhF94VU4GUH0tzXsQzbvKmyO1o+ETDWgnClmhSC8QIezj5wfxxUzoAEHeFJ2a3098tR2VYNZcq7/renWu7BeZSb7LaAL9a7z1Nt0xQ9qIw= X-Microsoft-Exchange-Diagnostics: 1;BY1PR02MB1148;5:Nk8wG9IqxH1nC1vS7CASeyiE8HIaVFKHW0xk3yF91q6PzC0FzaYmkD9n6OhIVU2FfxK4qvdQVT2bsWZHwxPmlSDYY3Ye/zsadovajO+w6u6VKMXHP39YvdB2OIK3rc5S2hhYJ09BFnuiLi5jm5My7Q==;24:WvTwRBEcpduAH1BjtBW/dd0JksaQ23m7StkugX1ERog0yl0kEVnr3+WBzwzt5FKHVP8xUpL/ZQJOrkd3v/Tc49BuZAP3u9pyN2Zp4JCaEWU=;20:oLhHAwOKWST5qfGctFlMzxAZlQjY3IQQsyO3ERaC/Cildpnxjl3sRDOmJP/+nRxYM81EVpkQHCdnxjhyrksgeA== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2015 09:14:54.3483 (UTC) X-MS-Exchange-CrossTenant-Id: fde4dada-be84-483f-92cc-e026cbee8e96 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fde4dada-be84-483f-92cc-e026cbee8e96;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR02MB1148 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4829 Lines: 161 Currently, gic_irq_domain_alloc assumes that the arg parameter must be a pointer to of_phandle_args. This is not appropriate for using with ACPI. Furthermore, there are several irq mappings (i.e. SPI, PPI, and GSI), which can be used when allocating GIC irqs. This can be confusing when used in multiple initialization path (i.e. DT, ACPI, MSI, etc.). This patch introduces struct gic_irq_alloc_info, which replaces the of_phandle_args when calling gic_irq_domain_alloc(). Also, it introduces gic_init_irq_alloc_info(), a new helper function to help simplifying GIC irq allocation, which hooks into the new irq_domain_ops.init_alloc_info. Signed-off-by: Suravee Suthikulpanit --- drivers/irqchip/irq-gic.c | 82 ++++++++++++++++++++++++++++++++++------- include/linux/irqchip/arm-gic.h | 11 ++++++ 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 7f943ef..8ac8ec4 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -852,22 +852,18 @@ static struct notifier_block gic_cpu_notifier = { static int gic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { - int i; + int i, ret; irq_hw_number_t hwirq; + unsigned int type = IRQ_TYPE_NONE; + struct gic_irq_alloc_info *info = arg; + u32 intspec[3]; - if (acpi_disabled) { /* DT case */ - int ret; - unsigned int type = IRQ_TYPE_NONE; - struct of_phandle_args *irq_data = arg; - - ret = gic_irq_domain_xlate(domain, irq_data->np, - irq_data->args, - irq_data->args_count, &hwirq, &type); - if (ret) - return ret; - } else { /* ACPI case */ - hwirq = (irq_hw_number_t)*(u32 *)arg; - } + intspec[0] = info->gic_int_type; + intspec[1] = info->hwirq; + intspec[2] = info->irq_type; + ret = gic_irq_domain_xlate(domain, info->ref, intspec, 3, &hwirq, &type); + if (ret) + return ret; for (i = 0; i < nr_irqs; i++) gic_irq_domain_map(domain, virq + i, hwirq + i); @@ -875,10 +871,68 @@ static int gic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, return 0; } +static int gic_init_irq_alloc_info(uint32_t *data, int nr, void *ref, + void **info) +{ + struct gic_irq_alloc_info *alloc_info; + unsigned int gic_int_type; + unsigned int hwirq; + unsigned int irq_type; + + if (nr != 3) + return -EINVAL; + + gic_int_type = data[0]; + hwirq = data[1]; + irq_type = data[2]; + + alloc_info = kzalloc(sizeof(struct gic_irq_alloc_info), GFP_KERNEL); + if (!alloc_info) + return -ENOMEM; + + if ((irq_type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_HIGH && + (irq_type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_EDGE_RISING) + return -EINVAL; + + alloc_info->irq_type = irq_type; + alloc_info->ref = ref; + + /* + * ACPI have no bindings to indicate SPI or PPI, so we + * use different mappings from DT in ACPI. + * + * For FDT + * PPI interrupt: in the range [0, 15]; + * SPI interrupt: in the range [0, 987]; + * + * For ACPI, GSI should be unique so using + * the hwirq directly for the mapping: + * PPI interrupt: in the range [16, 31]; + * SPI interrupt: in the range [32, 1019]; + */ + + if (gic_int_type != GIC_INT_TYPE_GSI) { + alloc_info->gic_int_type = gic_int_type; + alloc_info->hwirq = hwirq; + } else { + if (hwirq < 32) { + alloc_info->gic_int_type = GIC_INT_TYPE_PPI; + alloc_info->hwirq = hwirq - 16; + } else { + alloc_info->gic_int_type = GIC_INT_TYPE_SPI; + alloc_info->hwirq = hwirq - 32; + } + } + + *info = alloc_info; + return 0; +} + static const struct irq_domain_ops gic_irq_domain_hierarchy_ops = { .xlate = gic_irq_domain_xlate, .alloc = gic_irq_domain_alloc, .free = irq_domain_free_irqs_top, + .init_alloc_info = gic_init_irq_alloc_info, }; static const struct irq_domain_ops gic_irq_domain_ops = { diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h index 9de976b..4808514 100644 --- a/include/linux/irqchip/arm-gic.h +++ b/include/linux/irqchip/arm-gic.h @@ -89,12 +89,23 @@ #define GICH_MISR_EOI (1 << 0) #define GICH_MISR_U (1 << 1) +#define GIC_INT_TYPE_SPI 0 +#define GIC_INT_TYPE_PPI 1 +#define GIC_INT_TYPE_GSI ~0U + #ifndef __ASSEMBLY__ #include struct device_node; +struct gic_irq_alloc_info { + void *ref; + unsigned int irq_type; + unsigned int gic_int_type; + unsigned int hwirq; +}; + void gic_set_irqchip_flags(unsigned long flags); void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, u32 offset, struct device_node *); -- 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/