Changeset 41591


Ignore:
Timestamp:
2014-07-12T14:31:47+02:00 (4 years ago)
Author:
jogo
Message:

brcm63xx: update irq affinity code to latest version

Reduces code size a bit and sets affinity to boot cpu by default.

Signed-off-by: Jonas Gorski <jogo@…>

Location:
trunk/target/linux/brcm63xx
Files:
14 edited
6 moved

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm63xx/patches-3.10/318-MIPS-BCM63XX-add-width-to-__dispatch_internal.patch

    r41590 r41591  
    1 From 653dcc09407a695efb203337c6f72515d4c4ee43 Mon Sep 17 00:00:00 2001 
     1From a2015bfad293a7eb79519beb60381cb996c6e298 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 21 Mar 2013 17:05:15 +0100 
    4 Subject: [PATCH 29/53] MIPS: BCM63XX: rename __dispatch_internal to 
    5  __dispatch_internal_32 
     4Subject: [PATCH 01/10] MIPS: BCM63XX: add width to __dispatch_internal 
    65 
    76Make it follow the same naming convention as the other functions. 
  • trunk/target/linux/brcm63xx/patches-3.10/319-MIPS-BCM63XX-move-bcm63xx_init_irq-down.patch

    r39268 r41591  
    1 From c28c639b031385ecf965eecf3bfb532e88044c89 Mon Sep 17 00:00:00 2001 
     1From 6e79c6dd02aa56e37eb071797f0eb5e3fb588cba Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Sun, 15 Dec 2013 20:52:53 +0100 
    4 Subject: [PATCH 30/53] MIPS: BCM63XX: move bcm63xx_init_irq down 
     4Subject: [PATCH 02/10] MIPS: BCM63XX: move bcm63xx_init_irq down 
    55 
    66Allows up to drop the prototypes from the top. 
     7 
     8Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    79--- 
    810 arch/mips/bcm63xx/irq.c | 190 +++++++++++++++++++++++------------------------- 
  • trunk/target/linux/brcm63xx/patches-3.10/320-MIPS-BCM63XX-replace-irq-dispatch-code-with-a-generi.patch

    r39268 r41591  
    1 From 01bf26c51b427e24ac69f604d33f7d9360a9e470 Mon Sep 17 00:00:00 2001 
     1From 39b46ed1c9fe71890566e129d9ac5feb8421b3b4 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 18 Apr 2013 21:14:49 +0200 
    4 Subject: [PATCH 31/53] MIPS: BCM63XX: replace irq dispatch code with a generic 
     4Subject: [PATCH 03/10] MIPS: BCM63XX: replace irq dispatch code with a generic 
    55 version 
    66 
    7 The generic version uses a variable length of u32 registers of u32/u64. 
    8 This allows easier support for longer registers without having to rewrite 
    9 verything. 
     7The generic version uses a variable length of u32 registers instead of u32/u64. 
     8This allows easier support for "wider" registers without having to rewrite 
     9everything. 
    1010 
    11 This "generic" version is not slower than the old version in the best case 
    12 (= i == next set bit), and twice as fast in the worst case in 64 bits. 
     11This "generic" version is as fast as the old version in the best case 
     12(i == next set bit), and twice as fast in the worst case in 64 bits. 
     13 
     14Using a macro was chosen over a (forced) inline version because gcc generated 
     15more compact code with the macro. 
     16 
     17The change from (signed) int to unsigned int for i and to_call was intentional 
     18as the value can be only between 0 and (width - 1) anyway, and allowed gcc to 
     19optimise the code a bit further. 
    1320 
    1421Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
     
    4855+       unsigned int src, tgt;                                          \ 
    4956+       bool irqs_pending = false;                                      \ 
    50 +       static int i;                                                   \ 
     57+       static unsigned int i;                                          \ 
    5158+                                                                       \ 
    5259+       /* read registers in reverse order */                           \ 
     
    6673+                                                                       \ 
    6774+       while (1) {                                                     \ 
    68 +               int to_call = i;                                        \ 
     75+               unsigned int to_call = i;                               \ 
    6976+                                                                       \ 
    7077+               i = (i + 1) & (width - 1);                              \ 
     
    8895+                                                                       \ 
    8996+static void __internal_irq_unmask_##width(unsigned int irq)            \ 
    90 +{                                                                      \ 
     97+{                                                                      \ 
    9198+       u32 val;                                                        \ 
    9299+       unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    93 +       unsigned bit = irq & 0x1f;                                      \ 
     100+       unsigned bit = irq & 0x1f;                                      \ 
    94101+                                                                       \ 
    95102+       val = bcm_readl(irq_mask_addr + reg * sizeof(u32));             \ 
    96 +       val |= (1 << bit);                                              \ 
     103+       val |= (1 << bit);                                              \ 
    97104+       bcm_writel(val, irq_mask_addr + reg * sizeof(u32));             \ 
    98105 } 
  • trunk/target/linux/brcm63xx/patches-3.10/321-MIPS-BCM63XX-append-irq-line-to-irq_-stat-mask.patch

    r41590 r41591  
    1 From 1003fb4a5ee9fcff518f20eefdee1a9bf500af7e Mon Sep 17 00:00:00 2001 
     1From 96ce0a9d195b2781d6f8d919dea8056b1c409703 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 25 Apr 2013 00:24:06 +0200 
    4 Subject: [PATCH 32/53] MIPS: BCM63XX: append irq line number to 
    5  irq_{stat,mask}* 
     4Subject: [PATCH 04/10] MIPS: BCM63XX: append irq line to irq_{stat,mask}* 
    65 
    7 The SMP capable irq controllers have two interupt output pins which are 
     6The SMP capable irq controllers have two interrupt output pins which are 
    87controlled through separate registers, so make the variables arrays. 
    98 
     
    5150@@ -103,9 +104,9 @@ static void __internal_irq_unmask_##widt 
    5251        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    53         unsigned bit = irq & 0x1f;                                      \ 
     52        unsigned bit = irq & 0x1f;                                      \ 
    5453                                                                        \ 
    5554-       val = bcm_readl(irq_mask_addr + reg * sizeof(u32));             \ 
    5655+       val = bcm_readl(irq_mask_addr[0] + reg * sizeof(u32));          \ 
    57         val |= (1 << bit);                                              \ 
     56        val |= (1 << bit);                                              \ 
    5857-       bcm_writel(val, irq_mask_addr + reg * sizeof(u32));             \ 
    5958+       bcm_writel(val, irq_mask_addr[0] + reg * sizeof(u32));          \ 
  • trunk/target/linux/brcm63xx/patches-3.10/322-MIPS-BCM63XX-populate-irq_-stat-mask-_addr-for-secon.patch

    r39268 r41591  
    1 From 842f213228e6fc9fd6cca01ab5128623112aa7a9 Mon Sep 17 00:00:00 2001 
     1From ff61c72a7a260ab4c4abbddb72c3cd2aea5e0687 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 25 Apr 2013 00:31:29 +0200 
    4 Subject: [PATCH 33/53] MIPS: BCM63XX: populate irq_{stat,mask}_addr for second 
    5  pin 
     4Subject: [PATCH 05/10] MIPS: BCM63XX: populate irq_{stat,mask}_addr for second 
     5 cpu 
     6 
     7Set it to zero if there is no second set. 
    68 
    79Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
  • trunk/target/linux/brcm63xx/patches-3.10/323-MIPS-BCM63XX-add-cpu-argument-to-dispatch-internal.patch

    r41590 r41591  
    1 From a33bb660c712447ba8b561109cda6734954a6efa Mon Sep 17 00:00:00 2001 
     1From 43ebef8162adfa7789cb915e60e46103965d7efd Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Fri, 26 Apr 2013 11:21:16 +0200 
    4 Subject: [PATCH 34/53] MIPS: BCM63XX: add pin argument to dispatch internal 
     4Subject: [PATCH 06/10] MIPS: BCM63XX: add cpu argument to dispatch internal 
    55 
    66Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
     
    1919 static u32 irq_mask_addr[2]; 
    2020-static void (*dispatch_internal)(void); 
    21 +static void (*dispatch_internal)(int pin); 
     21+static void (*dispatch_internal)(int cpu); 
    2222 static int is_ext_irq_cascaded; 
    2323 static unsigned int ext_irq_count; 
     
    2828 #define BUILD_IPIC_INTERNAL(width)                                     \ 
    2929-void __dispatch_internal_##width(void)                                 \ 
    30 +void __dispatch_internal_##width(int pin)                              \ 
     30+void __dispatch_internal_##width(int cpu)                              \ 
    3131 {                                                                      \ 
    3232        u32 pending[width / 32];                                        \ 
    3333        unsigned int src, tgt;                                          \ 
    3434        bool irqs_pending = false;                                      \ 
    35 -       static int i;                                                   \ 
    36 +       static int i[2];                                                \ 
    37 +       int *next = &i[pin];                                            \ 
     35-       static unsigned int i;                                          \ 
     36+       static unsigned int i[2];                                       \ 
     37+       unsigned int *next = &i[cpu];                                   \ 
    3838                                                                        \ 
    3939        /* read registers in reverse order */                           \ 
     
    4343-               val = bcm_readl(irq_stat_addr[0] + src * sizeof(u32));  \ 
    4444-               val &= bcm_readl(irq_mask_addr[0] + src * sizeof(u32)); \ 
    45 +               val = bcm_readl(irq_stat_addr[pin] + src * sizeof(u32)); \ 
    46 +               val &= bcm_readl(irq_mask_addr[pin] + src * sizeof(u32)); \ 
     45+               val = bcm_readl(irq_stat_addr[cpu] + src * sizeof(u32)); \ 
     46+               val &= bcm_readl(irq_mask_addr[cpu] + src * sizeof(u32)); \ 
    4747                pending[--tgt] = val;                                   \ 
    4848                                                                        \ 
     
    5252                                                                        \ 
    5353        while (1) {                                                     \ 
    54 -               int to_call = i;                                        \ 
    55 +               int to_call = *next;                                    \ 
     54-               unsigned int to_call = i;                               \ 
     55+               unsigned int to_call = *next;                           \ 
    5656                                                                        \ 
    5757-               i = (i + 1) & (width - 1);                              \ 
  • trunk/target/linux/brcm63xx/patches-3.10/324-MIPS-BCM63XX-protect-irq-register-accesses.patch

    r39268 r41591  
    1 From 85257b702e1d4c6dcc839c737833c42ca53bae93 Mon Sep 17 00:00:00 2001 
     1From 5e86f3988854c62c0788e4820caf722fec7c791b Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Sun, 21 Apr 2013 15:38:56 +0200 
    4 Subject: [PATCH 35/53] MIPS: BCM63XX: protect irq register accesses 
     4Subject: [PATCH 07/10] MIPS: BCM63XX: protect irq register accesses 
    55 
     6Since we will have the chance of accessing the registers concurrently, 
     7protect any accesses through a spinlock. 
     8 
     9Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    610--- 
    711 arch/mips/bcm63xx/irq.c | 26 ++++++++++++++++++++++++++ 
     
    2731 static u32 irq_stat_addr[2]; 
    2832 static u32 irq_mask_addr[2]; 
    29  static void (*dispatch_internal)(int pin); 
    30 @@ -62,8 +66,10 @@ void __dispatch_internal_##width(int pin 
     33 static void (*dispatch_internal)(int cpu); 
     34@@ -62,8 +66,10 @@ void __dispatch_internal_##width(int cpu 
    3135        bool irqs_pending = false;                                      \ 
    32         static int i[2];                                                \ 
    33         int *next = &i[pin];                                            \ 
     36        static unsigned int i[2];                                       \ 
     37        unsigned int *next = &i[cpu];                                   \ 
    3438+       unsigned long flags;                                            \ 
    3539                                                                        \ 
     
    3943                u32 val;                                                \ 
    4044                                                                        \ 
    41 @@ -74,6 +80,7 @@ void __dispatch_internal_##width(int pin 
     45@@ -74,6 +80,7 @@ void __dispatch_internal_##width(int cpu 
    4246                if (val)                                                \ 
    4347                        irqs_pending = true;                            \ 
     
    6468        u32 val;                                                        \ 
    6569        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    66         unsigned bit = irq & 0x1f;                                      \ 
     70        unsigned bit = irq & 0x1f;                                      \ 
    6771+       unsigned long flags;                                            \ 
    6872                                                                        \ 
    6973+       spin_lock_irqsave(&ipic_lock, flags);                           \ 
    7074        val = bcm_readl(irq_mask_addr[0] + reg * sizeof(u32));          \ 
    71         val |= (1 << bit);                                              \ 
     75        val |= (1 << bit);                                              \ 
    7276        bcm_writel(val, irq_mask_addr[0] + reg * sizeof(u32));          \ 
    7377+       spin_unlock_irqrestore(&ipic_lock, flags);                      \ 
  • trunk/target/linux/brcm63xx/patches-3.10/325-MIPS-BCM63XX-wire-up-the-second-cpu-s-irq-line.patch

    r39268 r41591  
    1 From df6661d1b5c001eb91ce07f364fd5b6468fd6f99 Mon Sep 17 00:00:00 2001 
     1From 6e74b82aca08a5ecc4d2f0780254468659427e82 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Fri, 26 Apr 2013 12:03:15 +0200 
    4 Subject: [PATCH 36/53] MIPS: BCM63XX: wire up the second cpu's irq line 
     4Subject: [PATCH 08/10] MIPS: BCM63XX: wire up the second cpu's irq line 
    55 
     6Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    67--- 
    78 arch/mips/bcm63xx/irq.c | 44 +++++++++++++++++++++++++++++++++++++------- 
     
    3334@@ -116,11 +122,20 @@ static void __internal_irq_unmask_##widt 
    3435        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    35         unsigned bit = irq & 0x1f;                                      \ 
     36        unsigned bit = irq & 0x1f;                                      \ 
    3637        unsigned long flags;                                            \ 
    3738+       int cpu;                                                        \ 
     
    3940        spin_lock_irqsave(&ipic_lock, flags);                           \ 
    4041-       val = bcm_readl(irq_mask_addr[0] + reg * sizeof(u32));          \ 
    41 -       val |= (1 << bit);                                              \ 
     42-       val |= (1 << bit);                                              \ 
    4243-       bcm_writel(val, irq_mask_addr[0] + reg * sizeof(u32));          \ 
    4344+       for_each_present_cpu(cpu) {                                     \ 
     
    4748+               val = bcm_readl(irq_mask_addr[cpu] + reg * sizeof(u32));\ 
    4849+               if (cpu_online(cpu))                                    \ 
    49 +                       val |= (1 << bit);                              \ 
     50+                       val |= (1 << bit);                              \ 
    5051+               else                                                    \ 
    5152+                       val &= ~(1 << bit);                             \ 
  • trunk/target/linux/brcm63xx/patches-3.10/326-MIPS-BCM63XX-use-irq_desc-as-argument-for-un-mask.patch

    r39268 r41591  
    1 From b665117faa0dfde70689502fc420d72bbf8e6bd4 Mon Sep 17 00:00:00 2001 
     1From e23dc903cd69d32d407ea1b7310bc9a71e00d359 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Tue, 30 Apr 2013 11:26:53 +0200 
    4 Subject: [PATCH 37/53] MIPS: BCM63XX: use irq_desc as argument for (un)mask 
     4Subject: [PATCH 09/10] MIPS: BCM63XX: use irq_desc as argument for (un)mask 
    55 
    66In preparation for applying affinity, use the irq descriptor as the 
     
    2525  
    2626 static inline u32 get_ext_irq_perf_reg(int irq) 
    27 @@ -96,9 +96,10 @@ void __dispatch_internal_##width(int pin 
     27@@ -96,9 +96,10 @@ void __dispatch_internal_##width(int cpu 
    2828        }                                                               \ 
    2929 }                                                                      \ 
     
    4343-static void __internal_irq_unmask_##width(unsigned int irq)            \ 
    4444+static void __internal_irq_unmask_##width(struct irq_data *d)          \ 
    45  {                                                                      \ 
     45 {                                                                      \ 
    4646        u32 val;                                                        \ 
    4747+       unsigned irq = d->irq - IRQ_INTERNAL_BASE;                      \ 
    4848        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    49         unsigned bit = irq & 0x1f;                                      \ 
     49        unsigned bit = irq & 0x1f;                                      \ 
    5050        unsigned long flags;                                            \ 
    5151@@ -182,12 +184,12 @@ asmlinkage void plat_irq_dispatch(void) 
  • trunk/target/linux/brcm63xx/patches-3.10/327-MIPS-BCM63XX-allow-setting-affinity-for-IPIC.patch

    r39268 r41591  
    1 From 9249f2f6a309e3f45c35d16decdcc5b2cadcadb8 Mon Sep 17 00:00:00 2001 
     1From 23493b47d8caaa59b18627a01bf443c3b50bb530 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Fri, 26 Apr 2013 12:06:03 +0200 
    4 Subject: [PATCH 38/53] MIPS: BCM63XX: allow setting affinity for IPIC 
     4Subject: [PATCH 10/10] MIPS: BCM63XX: allow setting affinity for IPIC 
     5 
     6Wire up the set_affinity call for the internal PIC if booting on 
     7a cpu supporting it. 
     8Affinity is kept to boot cpu as default. 
    59 
    610Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    711--- 
    8  arch/mips/bcm63xx/irq.c | 43 +++++++++++++++++++++++++++++++++++++------ 
    9  1 file changed, 37 insertions(+), 6 deletions(-) 
     12 arch/mips/bcm63xx/irq.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 
     13 1 file changed, 40 insertions(+), 6 deletions(-) 
    1014 
    1115--- a/arch/mips/bcm63xx/irq.c 
     
    2832+{ 
    2933+       bool enable = cpu_online(cpu); 
     34+ 
    3035+#ifdef CONFIG_SMP 
    31 + 
    3236+       if (m) 
    3337+               enable &= cpu_isset(cpu, *m); 
     
    4852+static void __internal_irq_unmask_##width(struct irq_data *d,          \ 
    4953+                                         const struct cpumask *m)      \ 
    50  {                                                                      \ 
     54 {                                                                      \ 
    5155        u32 val;                                                        \ 
    5256        unsigned irq = d->irq - IRQ_INTERNAL_BASE;                      \ 
     
    5761-               if (cpu_online(cpu))                                    \ 
    5862+               if (enable_irq_for_cpu(cpu, d, m))                      \ 
    59                         val |= (1 << bit);                              \ 
     63                        val |= (1 << bit);                              \ 
    6064                else                                                    \ 
    6165                        val &= ~(1 << bit);                             \ 
     
    98102        .name           = "bcm63xx_ipic", 
    99103        .irq_mask       = bcm63xx_internal_irq_mask, 
    100 @@ -523,7 +551,10 @@ void __init arch_init_irq(void) 
     104@@ -523,7 +551,13 @@ void __init arch_init_irq(void) 
    101105  
    102106        setup_irq(MIPS_CPU_IRQ_BASE + 2, &cpu_ip2_cascade_action); 
     
    107111+               bcm63xx_internal_irq_chip.irq_set_affinity = 
    108112+                       bcm63xx_internal_set_affinity; 
     113+ 
     114+               cpumask_clear(irq_default_affinity); 
     115+               cpumask_set_cpu(smp_processor_id(), irq_default_affinity); 
    109116+       } 
    110117 #endif 
  • trunk/target/linux/brcm63xx/patches-3.14/318-MIPS-BCM63XX-add-width-to-__dispatch_internal.patch

    r41590 r41591  
    1 From 653dcc09407a695efb203337c6f72515d4c4ee43 Mon Sep 17 00:00:00 2001 
     1From a2015bfad293a7eb79519beb60381cb996c6e298 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 21 Mar 2013 17:05:15 +0100 
    4 Subject: [PATCH 29/53] MIPS: BCM63XX: rename __dispatch_internal to 
    5  __dispatch_internal_32 
     4Subject: [PATCH 01/10] MIPS: BCM63XX: add width to __dispatch_internal 
    65 
    76Make it follow the same naming convention as the other functions. 
  • trunk/target/linux/brcm63xx/patches-3.14/319-MIPS-BCM63XX-move-bcm63xx_init_irq-down.patch

    r40380 r41591  
    1 From c28c639b031385ecf965eecf3bfb532e88044c89 Mon Sep 17 00:00:00 2001 
     1From 6e79c6dd02aa56e37eb071797f0eb5e3fb588cba Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Sun, 15 Dec 2013 20:52:53 +0100 
    4 Subject: [PATCH 30/53] MIPS: BCM63XX: move bcm63xx_init_irq down 
     4Subject: [PATCH 02/10] MIPS: BCM63XX: move bcm63xx_init_irq down 
    55 
    66Allows up to drop the prototypes from the top. 
     7 
     8Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    79--- 
    810 arch/mips/bcm63xx/irq.c | 190 +++++++++++++++++++++++------------------------- 
  • trunk/target/linux/brcm63xx/patches-3.14/320-MIPS-BCM63XX-replace-irq-dispatch-code-with-a-generi.patch

    r40380 r41591  
    1 From 01bf26c51b427e24ac69f604d33f7d9360a9e470 Mon Sep 17 00:00:00 2001 
     1From 39b46ed1c9fe71890566e129d9ac5feb8421b3b4 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 18 Apr 2013 21:14:49 +0200 
    4 Subject: [PATCH 31/53] MIPS: BCM63XX: replace irq dispatch code with a generic 
     4Subject: [PATCH 03/10] MIPS: BCM63XX: replace irq dispatch code with a generic 
    55 version 
    66 
    7 The generic version uses a variable length of u32 registers of u32/u64. 
    8 This allows easier support for longer registers without having to rewrite 
    9 verything. 
     7The generic version uses a variable length of u32 registers instead of u32/u64. 
     8This allows easier support for "wider" registers without having to rewrite 
     9everything. 
    1010 
    11 This "generic" version is not slower than the old version in the best case 
    12 (= i == next set bit), and twice as fast in the worst case in 64 bits. 
     11This "generic" version is as fast as the old version in the best case 
     12(i == next set bit), and twice as fast in the worst case in 64 bits. 
     13 
     14Using a macro was chosen over a (forced) inline version because gcc generated 
     15more compact code with the macro. 
     16 
     17The change from (signed) int to unsigned int for i and to_call was intentional 
     18as the value can be only between 0 and (width - 1) anyway, and allowed gcc to 
     19optimise the code a bit further. 
    1320 
    1421Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
     
    4855+       unsigned int src, tgt;                                          \ 
    4956+       bool irqs_pending = false;                                      \ 
    50 +       static int i;                                                   \ 
     57+       static unsigned int i;                                          \ 
    5158+                                                                       \ 
    5259+       /* read registers in reverse order */                           \ 
     
    6673+                                                                       \ 
    6774+       while (1) {                                                     \ 
    68 +               int to_call = i;                                        \ 
     75+               unsigned int to_call = i;                               \ 
    6976+                                                                       \ 
    7077+               i = (i + 1) & (width - 1);                              \ 
     
    8895+                                                                       \ 
    8996+static void __internal_irq_unmask_##width(unsigned int irq)            \ 
    90 +{                                                                      \ 
     97+{                                                                      \ 
    9198+       u32 val;                                                        \ 
    9299+       unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    93 +       unsigned bit = irq & 0x1f;                                      \ 
     100+       unsigned bit = irq & 0x1f;                                      \ 
    94101+                                                                       \ 
    95102+       val = bcm_readl(irq_mask_addr + reg * sizeof(u32));             \ 
    96 +       val |= (1 << bit);                                              \ 
     103+       val |= (1 << bit);                                              \ 
    97104+       bcm_writel(val, irq_mask_addr + reg * sizeof(u32));             \ 
    98105 } 
  • trunk/target/linux/brcm63xx/patches-3.14/321-MIPS-BCM63XX-append-irq-line-to-irq_-stat-mask.patch

    r41590 r41591  
    1 From 1003fb4a5ee9fcff518f20eefdee1a9bf500af7e Mon Sep 17 00:00:00 2001 
     1From 96ce0a9d195b2781d6f8d919dea8056b1c409703 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 25 Apr 2013 00:24:06 +0200 
    4 Subject: [PATCH 32/53] MIPS: BCM63XX: append irq line number to 
    5  irq_{stat,mask}* 
     4Subject: [PATCH 04/10] MIPS: BCM63XX: append irq line to irq_{stat,mask}* 
    65 
    7 The SMP capable irq controllers have two interupt output pins which are 
     6The SMP capable irq controllers have two interrupt output pins which are 
    87controlled through separate registers, so make the variables arrays. 
    98 
     
    5150@@ -103,9 +104,9 @@ static void __internal_irq_unmask_##widt 
    5251        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    53         unsigned bit = irq & 0x1f;                                      \ 
     52        unsigned bit = irq & 0x1f;                                      \ 
    5453                                                                        \ 
    5554-       val = bcm_readl(irq_mask_addr + reg * sizeof(u32));             \ 
    5655+       val = bcm_readl(irq_mask_addr[0] + reg * sizeof(u32));          \ 
    57         val |= (1 << bit);                                              \ 
     56        val |= (1 << bit);                                              \ 
    5857-       bcm_writel(val, irq_mask_addr + reg * sizeof(u32));             \ 
    5958+       bcm_writel(val, irq_mask_addr[0] + reg * sizeof(u32));          \ 
  • trunk/target/linux/brcm63xx/patches-3.14/322-MIPS-BCM63XX-populate-irq_-stat-mask-_addr-for-secon.patch

    r40380 r41591  
    1 From 842f213228e6fc9fd6cca01ab5128623112aa7a9 Mon Sep 17 00:00:00 2001 
     1From ff61c72a7a260ab4c4abbddb72c3cd2aea5e0687 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Thu, 25 Apr 2013 00:31:29 +0200 
    4 Subject: [PATCH 33/53] MIPS: BCM63XX: populate irq_{stat,mask}_addr for second 
    5  pin 
     4Subject: [PATCH 05/10] MIPS: BCM63XX: populate irq_{stat,mask}_addr for second 
     5 cpu 
     6 
     7Set it to zero if there is no second set. 
    68 
    79Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
  • trunk/target/linux/brcm63xx/patches-3.14/323-MIPS-BCM63XX-add-cpu-argument-to-dispatch-internal.patch

    r41590 r41591  
    1 From a33bb660c712447ba8b561109cda6734954a6efa Mon Sep 17 00:00:00 2001 
     1From 43ebef8162adfa7789cb915e60e46103965d7efd Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Fri, 26 Apr 2013 11:21:16 +0200 
    4 Subject: [PATCH 34/53] MIPS: BCM63XX: add pin argument to dispatch internal 
     4Subject: [PATCH 06/10] MIPS: BCM63XX: add cpu argument to dispatch internal 
    55 
    66Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
     
    1919 static u32 irq_mask_addr[2]; 
    2020-static void (*dispatch_internal)(void); 
    21 +static void (*dispatch_internal)(int pin); 
     21+static void (*dispatch_internal)(int cpu); 
    2222 static int is_ext_irq_cascaded; 
    2323 static unsigned int ext_irq_count; 
     
    2828 #define BUILD_IPIC_INTERNAL(width)                                     \ 
    2929-void __dispatch_internal_##width(void)                                 \ 
    30 +void __dispatch_internal_##width(int pin)                              \ 
     30+void __dispatch_internal_##width(int cpu)                              \ 
    3131 {                                                                      \ 
    3232        u32 pending[width / 32];                                        \ 
    3333        unsigned int src, tgt;                                          \ 
    3434        bool irqs_pending = false;                                      \ 
    35 -       static int i;                                                   \ 
    36 +       static int i[2];                                                \ 
    37 +       int *next = &i[pin];                                            \ 
     35-       static unsigned int i;                                          \ 
     36+       static unsigned int i[2];                                       \ 
     37+       unsigned int *next = &i[cpu];                                   \ 
    3838                                                                        \ 
    3939        /* read registers in reverse order */                           \ 
     
    4343-               val = bcm_readl(irq_stat_addr[0] + src * sizeof(u32));  \ 
    4444-               val &= bcm_readl(irq_mask_addr[0] + src * sizeof(u32)); \ 
    45 +               val = bcm_readl(irq_stat_addr[pin] + src * sizeof(u32)); \ 
    46 +               val &= bcm_readl(irq_mask_addr[pin] + src * sizeof(u32)); \ 
     45+               val = bcm_readl(irq_stat_addr[cpu] + src * sizeof(u32)); \ 
     46+               val &= bcm_readl(irq_mask_addr[cpu] + src * sizeof(u32)); \ 
    4747                pending[--tgt] = val;                                   \ 
    4848                                                                        \ 
     
    5252                                                                        \ 
    5353        while (1) {                                                     \ 
    54 -               int to_call = i;                                        \ 
    55 +               int to_call = *next;                                    \ 
     54-               unsigned int to_call = i;                               \ 
     55+               unsigned int to_call = *next;                           \ 
    5656                                                                        \ 
    5757-               i = (i + 1) & (width - 1);                              \ 
  • trunk/target/linux/brcm63xx/patches-3.14/324-MIPS-BCM63XX-protect-irq-register-accesses.patch

    r40380 r41591  
    1 From 85257b702e1d4c6dcc839c737833c42ca53bae93 Mon Sep 17 00:00:00 2001 
     1From 5e86f3988854c62c0788e4820caf722fec7c791b Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Sun, 21 Apr 2013 15:38:56 +0200 
    4 Subject: [PATCH 35/53] MIPS: BCM63XX: protect irq register accesses 
     4Subject: [PATCH 07/10] MIPS: BCM63XX: protect irq register accesses 
    55 
     6Since we will have the chance of accessing the registers concurrently, 
     7protect any accesses through a spinlock. 
     8 
     9Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    610--- 
    711 arch/mips/bcm63xx/irq.c | 26 ++++++++++++++++++++++++++ 
     
    2731 static u32 irq_stat_addr[2]; 
    2832 static u32 irq_mask_addr[2]; 
    29  static void (*dispatch_internal)(int pin); 
    30 @@ -62,8 +66,10 @@ void __dispatch_internal_##width(int pin 
     33 static void (*dispatch_internal)(int cpu); 
     34@@ -62,8 +66,10 @@ void __dispatch_internal_##width(int cpu 
    3135        bool irqs_pending = false;                                      \ 
    32         static int i[2];                                                \ 
    33         int *next = &i[pin];                                            \ 
     36        static unsigned int i[2];                                       \ 
     37        unsigned int *next = &i[cpu];                                   \ 
    3438+       unsigned long flags;                                            \ 
    3539                                                                        \ 
     
    3943                u32 val;                                                \ 
    4044                                                                        \ 
    41 @@ -74,6 +80,7 @@ void __dispatch_internal_##width(int pin 
     45@@ -74,6 +80,7 @@ void __dispatch_internal_##width(int cpu 
    4246                if (val)                                                \ 
    4347                        irqs_pending = true;                            \ 
     
    6468        u32 val;                                                        \ 
    6569        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    66         unsigned bit = irq & 0x1f;                                      \ 
     70        unsigned bit = irq & 0x1f;                                      \ 
    6771+       unsigned long flags;                                            \ 
    6872                                                                        \ 
    6973+       spin_lock_irqsave(&ipic_lock, flags);                           \ 
    7074        val = bcm_readl(irq_mask_addr[0] + reg * sizeof(u32));          \ 
    71         val |= (1 << bit);                                              \ 
     75        val |= (1 << bit);                                              \ 
    7276        bcm_writel(val, irq_mask_addr[0] + reg * sizeof(u32));          \ 
    7377+       spin_unlock_irqrestore(&ipic_lock, flags);                      \ 
  • trunk/target/linux/brcm63xx/patches-3.14/325-MIPS-BCM63XX-wire-up-the-second-cpu-s-irq-line.patch

    r40380 r41591  
    1 From df6661d1b5c001eb91ce07f364fd5b6468fd6f99 Mon Sep 17 00:00:00 2001 
     1From 6e74b82aca08a5ecc4d2f0780254468659427e82 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Fri, 26 Apr 2013 12:03:15 +0200 
    4 Subject: [PATCH 36/53] MIPS: BCM63XX: wire up the second cpu's irq line 
     4Subject: [PATCH 08/10] MIPS: BCM63XX: wire up the second cpu's irq line 
    55 
     6Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    67--- 
    78 arch/mips/bcm63xx/irq.c | 44 +++++++++++++++++++++++++++++++++++++------- 
     
    3334@@ -116,11 +122,20 @@ static void __internal_irq_unmask_##widt 
    3435        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    35         unsigned bit = irq & 0x1f;                                      \ 
     36        unsigned bit = irq & 0x1f;                                      \ 
    3637        unsigned long flags;                                            \ 
    3738+       int cpu;                                                        \ 
     
    3940        spin_lock_irqsave(&ipic_lock, flags);                           \ 
    4041-       val = bcm_readl(irq_mask_addr[0] + reg * sizeof(u32));          \ 
    41 -       val |= (1 << bit);                                              \ 
     42-       val |= (1 << bit);                                              \ 
    4243-       bcm_writel(val, irq_mask_addr[0] + reg * sizeof(u32));          \ 
    4344+       for_each_present_cpu(cpu) {                                     \ 
     
    4748+               val = bcm_readl(irq_mask_addr[cpu] + reg * sizeof(u32));\ 
    4849+               if (cpu_online(cpu))                                    \ 
    49 +                       val |= (1 << bit);                              \ 
     50+                       val |= (1 << bit);                              \ 
    5051+               else                                                    \ 
    5152+                       val &= ~(1 << bit);                             \ 
  • trunk/target/linux/brcm63xx/patches-3.14/326-MIPS-BCM63XX-use-irq_desc-as-argument-for-un-mask.patch

    r40380 r41591  
    1 From b665117faa0dfde70689502fc420d72bbf8e6bd4 Mon Sep 17 00:00:00 2001 
     1From e23dc903cd69d32d407ea1b7310bc9a71e00d359 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Tue, 30 Apr 2013 11:26:53 +0200 
    4 Subject: [PATCH 37/53] MIPS: BCM63XX: use irq_desc as argument for (un)mask 
     4Subject: [PATCH 09/10] MIPS: BCM63XX: use irq_desc as argument for (un)mask 
    55 
    66In preparation for applying affinity, use the irq descriptor as the 
     
    2525  
    2626 static inline u32 get_ext_irq_perf_reg(int irq) 
    27 @@ -96,9 +96,10 @@ void __dispatch_internal_##width(int pin 
     27@@ -96,9 +96,10 @@ void __dispatch_internal_##width(int cpu 
    2828        }                                                               \ 
    2929 }                                                                      \ 
     
    4343-static void __internal_irq_unmask_##width(unsigned int irq)            \ 
    4444+static void __internal_irq_unmask_##width(struct irq_data *d)          \ 
    45  {                                                                      \ 
     45 {                                                                      \ 
    4646        u32 val;                                                        \ 
    4747+       unsigned irq = d->irq - IRQ_INTERNAL_BASE;                      \ 
    4848        unsigned reg = (irq / 32) ^ (width/32 - 1);                     \ 
    49         unsigned bit = irq & 0x1f;                                      \ 
     49        unsigned bit = irq & 0x1f;                                      \ 
    5050        unsigned long flags;                                            \ 
    5151@@ -182,12 +184,12 @@ asmlinkage void plat_irq_dispatch(void) 
  • trunk/target/linux/brcm63xx/patches-3.14/327-MIPS-BCM63XX-allow-setting-affinity-for-IPIC.patch

    r40380 r41591  
    1 From 9249f2f6a309e3f45c35d16decdcc5b2cadcadb8 Mon Sep 17 00:00:00 2001 
     1From 23493b47d8caaa59b18627a01bf443c3b50bb530 Mon Sep 17 00:00:00 2001 
    22From: Jonas Gorski <jogo@openwrt.org> 
    33Date: Fri, 26 Apr 2013 12:06:03 +0200 
    4 Subject: [PATCH 38/53] MIPS: BCM63XX: allow setting affinity for IPIC 
     4Subject: [PATCH 10/10] MIPS: BCM63XX: allow setting affinity for IPIC 
     5 
     6Wire up the set_affinity call for the internal PIC if booting on 
     7a cpu supporting it. 
     8Affinity is kept to boot cpu as default. 
    59 
    610Signed-off-by: Jonas Gorski <jogo@openwrt.org> 
    711--- 
    8  arch/mips/bcm63xx/irq.c | 43 +++++++++++++++++++++++++++++++++++++------ 
    9  1 file changed, 37 insertions(+), 6 deletions(-) 
     12 arch/mips/bcm63xx/irq.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 
     13 1 file changed, 40 insertions(+), 6 deletions(-) 
    1014 
    1115--- a/arch/mips/bcm63xx/irq.c 
     
    2832+{ 
    2933+       bool enable = cpu_online(cpu); 
     34+ 
    3035+#ifdef CONFIG_SMP 
    31 + 
    3236+       if (m) 
    3337+               enable &= cpu_isset(cpu, *m); 
     
    4852+static void __internal_irq_unmask_##width(struct irq_data *d,          \ 
    4953+                                         const struct cpumask *m)      \ 
    50  {                                                                      \ 
     54 {                                                                      \ 
    5155        u32 val;                                                        \ 
    5256        unsigned irq = d->irq - IRQ_INTERNAL_BASE;                      \ 
     
    5761-               if (cpu_online(cpu))                                    \ 
    5862+               if (enable_irq_for_cpu(cpu, d, m))                      \ 
    59                         val |= (1 << bit);                              \ 
     63                        val |= (1 << bit);                              \ 
    6064                else                                                    \ 
    6165                        val &= ~(1 << bit);                             \ 
     
    98102        .name           = "bcm63xx_ipic", 
    99103        .irq_mask       = bcm63xx_internal_irq_mask, 
    100 @@ -523,7 +551,10 @@ void __init arch_init_irq(void) 
     104@@ -523,7 +551,13 @@ void __init arch_init_irq(void) 
    101105  
    102106        setup_irq(MIPS_CPU_IRQ_BASE + 2, &cpu_ip2_cascade_action); 
     
    107111+               bcm63xx_internal_irq_chip.irq_set_affinity = 
    108112+                       bcm63xx_internal_set_affinity; 
     113+ 
     114+               cpumask_clear(irq_default_affinity); 
     115+               cpumask_set_cpu(smp_processor_id(), irq_default_affinity); 
    109116+       } 
    110117 #endif 
Note: See TracChangeset for help on using the changeset viewer.