From patchwork Wed Aug 9 22:51:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Daney X-Patchwork-Id: 800020 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="Cxzq7MrX"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xSRP23sctz9t2M for ; Thu, 10 Aug 2017 08:52:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752181AbdHIWvw (ORCPT ); Wed, 9 Aug 2017 18:51:52 -0400 Received: from mail-sn1nam01on0060.outbound.protection.outlook.com ([104.47.32.60]:33216 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752524AbdHIWvu (ORCPT ); Wed, 9 Aug 2017 18:51:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=vBiIhdrsUwGf0aNuaShCD9Y9C1grJnLOKRDBDnmJCHY=; b=Cxzq7MrX+i+kaf0bsmDUWXGIzgAT7hbj8gMAkLZDOcqWIg4eiaOxOWlfvyrev3dyI52/pQMyLYaVXOIqrEE4nJK6zzGBF9+qghK7beSW5U423gkVTyh+DniBZhWMBKL+iyUGk+YtVasuORPhOkjdnZM+RKarFG4SqsACarxJvRk= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=David.Daney@cavium.com; Received: from ubuntu.caveonetworks.com (50.233.148.156) by MWHPR07MB3503.namprd07.prod.outlook.com (10.164.192.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1320.16; Wed, 9 Aug 2017 22:51:45 +0000 From: David Daney To: Linus Walleij , Alexandre Courbot , Mark Rutland , Marc Zyngier , Thomas Gleixner , linux-gpio@vger.kernel.org Cc: linux-kernel@vger.kernel.org, David Daney Subject: [PATCH v7 2/5] genirq: Add handle_fasteoi_{level, edge}_irq flow handlers. Date: Wed, 9 Aug 2017 15:51:36 -0700 Message-Id: <1502319099-2782-3-git-send-email-david.daney@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1502319099-2782-1-git-send-email-david.daney@cavium.com> References: <1502319099-2782-1-git-send-email-david.daney@cavium.com> MIME-Version: 1.0 X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: CO2PR07CA0057.namprd07.prod.outlook.com (10.174.192.25) To MWHPR07MB3503.namprd07.prod.outlook.com (10.164.192.30) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2e3d9cfd-62ae-4cd5-39bd-08d4df793672 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:MWHPR07MB3503; X-Microsoft-Exchange-Diagnostics: 1; MWHPR07MB3503; 3:gHpNcLHlKdthYMXykvdVnJOtASKAFWZwv0mCm08kHNrX9AO3S7kxVCh6N//4vFwqm1oZauzePT3Yhc/d1ppw+9orcdSN2yLEHVmWQe9G0PH8ar0K3Csx3wrNJUPfnH6gX0OVwYUrnrlXFC7TUYfDO6hq6wCnnw1Gi5MR1y2N08R5kmR8kCtt4GTJM9KUkB7TYOv2jlsO8PCpE9MU7PCbNSqNz/5L/mS6/i6NSgmvR/s219LIFIlUpgS61jozsoY+; 25:EIp+6xK9NQuChaLRzA2HT8OB2vZfKVnjCk1Wbc0xigUPyecTmKS7I2tDUS3kw9mLe4Uc8FUT8cDfb6CYSX7fPyxplbuonJORp43d/XC2JYQDm5wiQxL/AQvsKSkuQeLQOCAuBtjJ4gvuNYcmzA0Gyu0bKiAFp46FalXm0OECINyZPk4HJACKxgCxht3RZ/mXfrbkNPe3sYgcFvP9+Z8EGcFd1/7B9BcBALaYrz1SQUoyqwoMx+V9ZEYxT7RpNtzUovMGhugT53vC1aPG8I7IucbfwFoidttCWzpgWACpjVIr0/rCXyL6kXgGynBrFmAkJyNg+if17MOzad+OF4WW+Q==; 31:npeFS4Xwie6SjYl4TTmDi0OJMuINvn9VHNg5nkHTKB4kkimw+PvTe2a+MyWiG/eDBxK1U49nxaOCIKsOSzAUWtkcuTn/larei4BENuD+F1An/cQqfcLRUaEdRHI7WF01EPTXIC0pFecQo9+5TmM/InZM2N6NQL67nrbhFEARq1W+uI/HnMrXPh57AK4vKWvUeIQq0QR2SLTZDWFORO4JNF2hPcF/Nf3EAbRqndy3WWY= X-MS-TrafficTypeDiagnostic: MWHPR07MB3503: X-Microsoft-Exchange-Diagnostics: 1; MWHPR07MB3503; 20:1juFirGmJld2elk0MAaSpW86sYHD/MZhvNIh5+DBMFPCCZTeus/rXtvMeUcCsLryH+7fhXQbDw8uF6fkJJfkgLZJLKFbnZYD0wskWx6uDfT13XQMYWSVlSIzRynkKBpbKfDzzzExq2ph7gkxF5uaGDdt3XcRSKRdzmwCM9Ig8ESpAPwJY4ba2R2EmJcLdsMtT/UhxxD+q1wzL6Zd0sw+ylQkzTXve8zVyzTUACbxkg0Ta5KqUkbu+GI60OEdAFfcPzjgJFD9qDonlrN29cW4ub6oIklrv3KSPXK60BjMRR4VWtFTo8pWmWeuE9AVwKOMvO8IKq4a3PdckWx3jsvXO29qzp0xSFVkDgvw0qeBc2d+FHcsecdwdf4FzueQKMF06AGRzkdptzerdyLFcQl3adMeqYinmbpgtZu3zVoXNVXD+KUl9ZM5zHQPuGiOEtol9cvbG6FjrUQdS684ofgO2DEtwqtxx05dftFZJrz2yrCt/ems+YNldek4vrlgx1VO; 4:ClLjHcb8jTx9a5HYfyjB25zwx8Sy0+Al5Wp/U7eWWmY/jB8CaQQkNvkqzosHstvl8S4XYIdTWqW39TEhdC/oy4I7PgAkiprEiEqFLwIFrdQmxlEBDqM1pBbmxjza1FWmCaS29kpt/pdHmq82mxs7caCWmnJhXP0tf1wGfy7lXdhkKPl2YXl4bDa7icZtO9gL61bmIJXQUCNn3RucbJJX2XzYJT+PlI+MXAIyNTgUaHVRq0doH1VdpWNomgjte28/ X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3002001)(6041248)(20161123558100)(20161123555025)(20161123562025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:MWHPR07MB3503; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:MWHPR07MB3503; X-Forefront-PRVS: 0394259C80 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(7370300001)(6009001)(39400400002)(39410400002)(39850400002)(39840400002)(39450400003)(189002)(199003)(4720700003)(69596002)(4326008)(478600001)(6512007)(53936002)(107886003)(38730400002)(66066001)(72206003)(47776003)(81166006)(86362001)(5660300001)(2950100002)(105586002)(53416004)(33646002)(68736007)(50226002)(42186005)(25786009)(2906002)(81156014)(106356001)(50466002)(305945005)(189998001)(48376002)(5003940100001)(7736002)(97736004)(6116002)(36756003)(3846002)(50986999)(6666003)(101416001)(8676002)(7350300001)(76176999)(6486002)(6506006)(142933001); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR07MB3503; H:ubuntu.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR07MB3503; 23:M/Hii1kjoxpNhNeKEfYEfx60F2UO1HCec6kswj1Ok?= =?us-ascii?Q?LNtWhQS2PiIcBifXgCx5/fV3F+qXcSBQi2LjlaxH9+7QOz2SDRwWYfcudxCC?= =?us-ascii?Q?FnnGRyR5WUhlZ0JnmTydtwSRSmMah4EIgvtkddcPlJoYZ8VnFNld5yXPmzS+?= =?us-ascii?Q?XUTiij6Dp3oHhzZ33Ye81ssDk0ex7mA60zbUUctd4djjB1egrcZz6465Pbu3?= =?us-ascii?Q?XP2vZrRU/fIXteJdSmHlcQ0v5HX++T82IUreuDJ4YwNmbyonKvCH9msjX3Em?= =?us-ascii?Q?jQjZxvCI9yzd/6Y7HJvi4tmP01p1A0aDFBVznIAhGSdIZ2MshFjhrgbQvC3b?= =?us-ascii?Q?dV5qm79KUcisrqBuuRbO4j1gcS9+t9MnM+UTRCIUdbsyMTumvX47EaUZviKg?= =?us-ascii?Q?/fBuSe5otrGTD/vtSCa+LEXmp9bbMHeB1NGR5oauVhAmww0Tgw+SOFtO7ZUd?= =?us-ascii?Q?BVbMcV8JBlPzoZhZGndDq06HSQLonhMnYfURFQpsVzq8hQ4I1JE075WSAld0?= =?us-ascii?Q?yDBlSzFx7RUrNKqA5EEBcRktRAD/rT3G2th6RpTz3WZlrLZsHo8ss/QGCLxd?= =?us-ascii?Q?Jn/C3iC6fIkJ1VcUQVeqvZ1u12XUarDsnQMWJIPdpi8CquXpJTu221/itBUO?= =?us-ascii?Q?IioPqxukSBLto9qIui76XvIdmOsdhStmBZ2jyzkstnqTi4zA1zs26Y/C9jSd?= =?us-ascii?Q?rZGaAZI9sSMuVU0cm/9RT9GJfZ/+TetjV+zKcA6Vv5Y7jLyd53JiaAwlcGmq?= =?us-ascii?Q?uFuU7Dwar/si4BG7cqeGUIvByFe3DfzA3qNa7kTgmzkx5zfDaN9oo0ORXLBz?= =?us-ascii?Q?OYjJ6MgIBZ0mR52FlvgOoq8kCenhNUo3JkQJOOr+ZIwdAIPJi6nWC3bPp+9V?= =?us-ascii?Q?aVv1h/gLSU0c9C0yHjpEW8NIwyNGa2NiFAawsuYjVfzTD+I6MHtcLuRlypdH?= =?us-ascii?Q?MMuDq9N/l9owU0ySYcfJREim+lcEuWPzHBlJ+rZEgrjo72egmAKhzgRe65vH?= =?us-ascii?Q?H2KZT0mFEcoBAhfrtNNHFGR/3LdpNGpMqPXU/SbRo3NXLJUsyfknFbHnx2EX?= =?us-ascii?Q?2SKxt6XUOvaWHvAeaReioj53WtIAls/qRBRSCYrwBAnXLCy8FcgXJ4H6VVkK?= =?us-ascii?Q?miKiZ1Qe5jwFvTNzsgfGCp4gFn8FoKAd2UkHiJ8CZtDvFlAXE3fHrutOUmv9?= =?us-ascii?Q?gRGl1z7IAdkWGNeVs+ty2kVSY4E5YZ5DIPx0BKiVqNRWcL7ovVya379x1xDg?= =?us-ascii?Q?fXmGOwitWu5cC3Bk28Z2igSGtZzlvMSIqvwo/zC10Hpf6ydK+WyXgy/6Uctw?= =?us-ascii?Q?UYHEwaA6VCiD7ci75Nvrctpmb/KqmBqc68aHmcRsaAP?= X-Microsoft-Exchange-Diagnostics: 1; MWHPR07MB3503; 6:3DNXd52GzxyxiKfUQ+014rwbK9fX/olo72Z+oJnt4QbSCUS9ZOgrPuThw1ihOWFAOcZwPaGsmMv/Bt59qoLldy1aXdzb603Sbp+eGMSk9nu1x2ut4YMr9ljKNklvMykuSDyqOycAjETuBS8MPSyzqVSkBO0eHG6uTndDO/rO6ijC/cVFao85fC61RY1hDI0kmhOgkwq0zBlpC+jc9Xz6x8Hn2klFwslpBSomaNOTiv8sz8yptpPedK6diD+vl6YxZystQlvPBHO1ovKLufGnJQqbam0xvaIQ+Di9W4L+84dGsHzxQb/f+Pg7VAyU38naVC2pvTyDRKn8QrsADhKRxg==; 5:HfGBPqDiNrkir6HNnpyhA0SCsE6/sb48MM9ZYB5DFo1DpH+YoE2tHL6iIzRJ01MuEwLTfuS/R7chmXeSaur/T1Q1R9hfXJsk5iNDP0DU4zGRGrFJKUEk/kui6WR3K8mMkl4BBakS0sM3LNiv/z2QKQ==; 24:UvV04SHQ3TE7VEkNaSpYDXTCa1B8xcCG1kCT2xJvQ1LUElaKuviUU37qsKY5ZAQ2AlPFgRS1ccP3A3+iKMEcLsIkBhrubwGS9R3CcmqmtwE=; 7:SuyoFYC+xKQSkdZlcP0oOAAi5uNACmDsFYIgzwWWtUSXUmNU7ox+cbFwpc8GToWBkI8VnNTZv2hIKZkATvBu1sF6z1U0+JCyhlLncZqyt44ICyHVfcf77PMgAYVnr0neG9e0esbWGGXoOKiyHTdAP9E9FeKBP3AhjItAHMmsDVkVayMiewvbuQkAFXJ88cwSCZG0zmd/2pzZg+yNUwHBnx8yY8NHg0wAOstZS7aCgQg= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2017 22:51:45.7949 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR07MB3503 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Follow-on patch for gpio-thunderx uses a irqdomain hierarchy which requires slightly different flow handlers, add them to chip.c which contains most of the other flow handlers. Signed-off-by: David Daney --- include/linux/irq.h | 2 ++ kernel/irq/chip.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/include/linux/irq.h b/include/linux/irq.h index d2d54379..86a2273 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -568,6 +568,8 @@ static inline int irq_set_parent(int irq, int parent_irq) extern int irq_chip_pm_get(struct irq_data *data); extern int irq_chip_pm_put(struct irq_data *data); #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY +extern void handle_fasteoi_edge_irq(struct irq_desc *desc); +extern void handle_fasteoi_level_irq(struct irq_desc *desc); extern void irq_chip_enable_parent(struct irq_data *data); extern void irq_chip_disable_parent(struct irq_data *data); extern void irq_chip_ack_parent(struct irq_data *data); diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 6514f07..7511591 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -1093,6 +1093,108 @@ void irq_cpu_offline(void) #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY /** + * handle_fasteoi_edge_irq - irq handler for edge hierarchy + * stacked on transparent controllers + * + * @desc: the interrupt description structure for this irq + * + * Like handle_fasteoi_irq(), but for use with hierarchy where + * the irq_chip also needs to have its ->irq_ack() function + * called. + */ +void handle_fasteoi_edge_irq(struct irq_desc *desc) +{ + struct irq_chip *chip = desc->irq_data.chip; + + raw_spin_lock(&desc->lock); + + if (!irq_may_run(desc)) + goto out; + + desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); + + /* + * If its disabled or no action available + * then mask it and get out of here: + */ + if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { + desc->istate |= IRQS_PENDING; + mask_irq(desc); + goto out; + } + + kstat_incr_irqs_this_cpu(desc); + if (desc->istate & IRQS_ONESHOT) + mask_irq(desc); + + /* Start handling the irq */ + desc->irq_data.chip->irq_ack(&desc->irq_data); + + preflow_handler(desc); + handle_irq_event(desc); + + cond_unmask_eoi_irq(desc, chip); + + raw_spin_unlock(&desc->lock); + return; +out: + if (!(chip->flags & IRQCHIP_EOI_IF_HANDLED)) + chip->irq_eoi(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} +EXPORT_SYMBOL_GPL(handle_fasteoi_edge_irq); + +/** + * handle_fasteoi_level_irq - irq handler for level hierarchy + * stacked on transparent controllers + * + * @desc: the interrupt description structure for this irq + * + * Like handle_fasteoi_irq(), but for use with hierarchy where + * the irq_chip also needs to have its ->irq_mask_ack() function + * called. + */ +void handle_fasteoi_level_irq(struct irq_desc *desc) +{ + struct irq_chip *chip = desc->irq_data.chip; + + raw_spin_lock(&desc->lock); + mask_ack_irq(desc); + + if (!irq_may_run(desc)) + goto out; + + desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); + + /* + * If its disabled or no action available + * then mask it and get out of here: + */ + if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { + desc->istate |= IRQS_PENDING; + mask_irq(desc); + goto out; + } + + kstat_incr_irqs_this_cpu(desc); + if (desc->istate & IRQS_ONESHOT) + mask_irq(desc); + + preflow_handler(desc); + handle_irq_event(desc); + + cond_unmask_eoi_irq(desc, chip); + + raw_spin_unlock(&desc->lock); + return; +out: + if (!(chip->flags & IRQCHIP_EOI_IF_HANDLED)) + chip->irq_eoi(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} +EXPORT_SYMBOL_GPL(handle_fasteoi_level_irq); + +/** * irq_chip_enable_parent - Enable the parent interrupt (defaults to unmask if * NULL) * @data: Pointer to interrupt specific data