From patchwork Fri Nov 23 00:50:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Vorontsov X-Patchwork-Id: 13097 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 9E57323E13 for ; Fri, 23 Nov 2012 00:53:55 +0000 (UTC) Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by fiordland.canonical.com (Postfix) with ESMTP id 43E7BA18BD0 for ; Fri, 23 Nov 2012 00:53:55 +0000 (UTC) Received: by mail-ie0-f180.google.com with SMTP id c10so1226114ieb.11 for ; Thu, 22 Nov 2012 16:53:55 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=ymJQ+qzWwcb79RZ+xSeYZjF2C9gAV1drZnapVSPxX3U=; b=UuuvR5dkLknqNEeXANrfgjXZjTmrXREbPDwmqR9+F5m4tz7AxslI66dq3cSWkuEElQ Ckr1Up2y7W0LI6FeR72pYrn/cktIs+QNQMN0ukNfwhjpx4vwIA9XeERwCdat+rD+pH+y tODzqiAJqCbn2SCbo5B47150WvL2geE6AKELXgReoGsfChNeGfaVHhIdNv1hGzziBmyJ Qp5Kf3ckMp99xjPcu4TiyAqpYQTdNZxUkS2mi0VafO7UlBQ9bc1ZI/q/bJlKwd1UVdK7 8aohzPD2PjBfaOurzgnO2zWrj072hoUl4Z51Eb2l1ySBhGfG7MewLvv5ODBDYa6FRPVy o74A== Received: by 10.43.7.132 with SMTP id oo4mr1904354icb.6.1353632035026; Thu, 22 Nov 2012 16:53:55 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.50.67.148 with SMTP id n20csp282419igt; Thu, 22 Nov 2012 16:53:54 -0800 (PST) Received: by 10.60.8.131 with SMTP id r3mr1663312oea.14.1353632034092; Thu, 22 Nov 2012 16:53:54 -0800 (PST) Received: from mail-oa0-f51.google.com (mail-oa0-f51.google.com [209.85.219.51]) by mx.google.com with ESMTPS id df4si4243974obc.194.2012.11.22.16.53.53 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 22 Nov 2012 16:53:54 -0800 (PST) Received-SPF: neutral (google.com: 209.85.219.51 is neither permitted nor denied by best guess record for domain of anton.vorontsov@linaro.org) client-ip=209.85.219.51; Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.219.51 is neither permitted nor denied by best guess record for domain of anton.vorontsov@linaro.org) smtp.mail=anton.vorontsov@linaro.org Received: by mail-oa0-f51.google.com with SMTP id n12so8036182oag.24 for ; Thu, 22 Nov 2012 16:53:53 -0800 (PST) Received: by 10.60.11.197 with SMTP id s5mr1679344oeb.29.1353632033866; Thu, 22 Nov 2012 16:53:53 -0800 (PST) Received: from localhost (ip-64-134-239-153.public.wayport.net. [64.134.239.153]) by mx.google.com with ESMTPS id b5sm4462891obd.18.2012.11.22.16.53.52 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 22 Nov 2012 16:53:53 -0800 (PST) From: Anton Vorontsov To: Andrew Morton Cc: Russell King , Jason Wessel , John Stultz , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linaro-kernel@lists.linaro.org, patches@linaro.org, kernel-team@android.com Subject: [PATCH 10/10] ARM: FIQ: Get rid of init_FIQ() Date: Thu, 22 Nov 2012 16:50:03 -0800 Message-Id: <1353631803-4853-10-git-send-email-anton.vorontsov@linaro.org> X-Mailer: git-send-email 1.8.0 In-Reply-To: <20121123003849.GA973@lizard.mcd25758.sjc.wayport.net> References: <20121123003849.GA973@lizard.mcd25758.sjc.wayport.net> X-Gm-Message-State: ALoCoQni8P0ZGFAiZrKnBBq5f4XyibAFaYs1mbCBRbfIcBi5STFtTMgwFazj5a4HmQg61FY6F0oj The function only saves initial arch-specific "no FIQ" instruction, by placing the code into set_fiq_handler() we can: - Have less code and logic in the platform-specific files; - Have the code that manages FIQ vector overwriting in one place, i.e. don't spread the logic around. p.s. Also, I noticed that we saved no_fiq_insn w/o bothering about !CONFIG_CPU_USE_DOMAINS case, but set_fiq_handler() handles this case specifically. I wonder, was that on purpose, e.g. it does not matter for init_FIQ(), or it was just overlooked? In the latter case, the patch fixes the issue. Signed-off-by: Anton Vorontsov --- arch/arm/include/asm/mach/irq.h | 2 -- arch/arm/kernel/fiq.c | 17 ++++++++--------- arch/arm/mach-rpc/irq.c | 2 -- arch/arm/plat-mxc/avic.c | 3 --- arch/arm/plat-mxc/tzic.c | 3 --- arch/arm/plat-s3c24xx/irq.c | 2 -- 6 files changed, 8 insertions(+), 21 deletions(-) diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index 8be5ba9..6e70ae3 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h @@ -18,10 +18,8 @@ struct seq_file; * This is internal. Do not use it. */ #ifdef CONFIG_FIQ -extern void init_FIQ(void); extern void show_fiq_list(struct seq_file *, int); #else -static inline void init_FIQ(void) {} static inline void show_fiq_list(struct seq_file *p, int prec) {} #endif diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index 9bf3a60..3602df6 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -49,6 +49,7 @@ #include static unsigned long no_fiq_insn; +static int got_no_fiq_insn; /* Default reacquire function * - we always relinquish FIQ control @@ -78,11 +79,14 @@ void show_fiq_list(struct seq_file *p, int prec) void set_fiq_handler(void *start, unsigned int length) { -#if defined(CONFIG_CPU_USE_DOMAINS) - memcpy((void *)0xffff001c, start, length); -#else - memcpy(vectors_page + 0x1c, start, length); + unsigned long *addr = (void *)0xffff001c; + +#ifndef CONFIG_CPU_USE_DOMAINS + addr = vectors_page + 0x1c; #endif + if (!cmpxchg(&got_no_fiq_insn, 0, 1)) + no_fiq_insn = *addr; + memcpy(addr, start, length); flush_icache_range(0xffff001c, 0xffff001c + length); if (!vectors_high()) flush_icache_range(0x1c, 0x1c + length); @@ -126,8 +130,3 @@ EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */ EXPORT_SYMBOL(__get_fiq_regs); /* defined in fiqasm.S */ EXPORT_SYMBOL(claim_fiq); EXPORT_SYMBOL(release_fiq); - -void __init init_FIQ(void) -{ - no_fiq_insn = *(unsigned long *)0xffff001c; -} diff --git a/arch/arm/mach-rpc/irq.c b/arch/arm/mach-rpc/irq.c index 07770c8..2d915ba 100644 --- a/arch/arm/mach-rpc/irq.c +++ b/arch/arm/mach-rpc/irq.c @@ -151,7 +151,5 @@ void __init rpc_init_irq(void) break; } } - - init_FIQ(); } diff --git a/arch/arm/plat-mxc/avic.c b/arch/arm/plat-mxc/avic.c index 426980c..b173dc6 100644 --- a/arch/arm/plat-mxc/avic.c +++ b/arch/arm/plat-mxc/avic.c @@ -216,8 +216,5 @@ void __init mxc_init_irq(void __iomem *irqbase) for (i = 0; i < 8; i++) __raw_writel(0, avic_base + AVIC_NIPRIORITY(i)); - /* Initialize FIQ */ - init_FIQ(); - printk(KERN_INFO "MXC IRQ initialized\n"); } diff --git a/arch/arm/plat-mxc/tzic.c b/arch/arm/plat-mxc/tzic.c index 8a5a633..889267c 100644 --- a/arch/arm/plat-mxc/tzic.c +++ b/arch/arm/plat-mxc/tzic.c @@ -191,9 +191,6 @@ void __init tzic_init_irq(void __iomem *irqbase) for (i = 0; i < 4; i++, irq_base += 32) tzic_init_gc(i, irq_base); - /* Initialize FIQ */ - init_FIQ(); - pr_info("TrustZone Interrupt Controller (TZIC) initialized\n"); } diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index 531d6a4..66b8856 100644 --- a/arch/arm/plat-s3c24xx/irq.c +++ b/arch/arm/plat-s3c24xx/irq.c @@ -532,8 +532,6 @@ void __init s3c24xx_init_irq(void) int irqno; int i; - init_FIQ(); - irqdbf("s3c2410_init_irq: clearing interrupt status flags\n"); /* first, clear all interrupts pending... */