~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arc/kernel/intc-compact.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/arc/kernel/intc-compact.c (Version linux-6.12-rc7) and /arch/sparc64/kernel/intc-compact.c (Version linux-4.20.17)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 
  2 /*                                                
  3  * Copyright (C) 2011-12 Synopsys, Inc. (www.s    
  4  */                                               
  5                                                   
  6 #include <linux/interrupt.h>                      
  7 #include <linux/module.h>                         
  8 #include <linux/of.h>                             
  9 #include <linux/irqdomain.h>                      
 10 #include <linux/irqchip.h>                        
 11 #include <asm/irq.h>                              
 12                                                   
 13 #define NR_CPU_IRQS     32      /* number of i    
 14 #define TIMER0_IRQ      3       /* Fixed by IS    
 15                                                   
 16 /*                                                
 17  * Early Hardware specific Interrupt setup        
 18  * -Platform independent, needed for each CPU     
 19  * -Called very early (start_kernel -> setup_a    
 20  *                                                
 21  * what it does ?                                 
 22  * -Optionally, setup the High priority Interr    
 23  */                                               
 24 void arc_init_IRQ(void)                           
 25 {                                                 
 26         unsigned int level_mask = 0, i;           
 27                                                   
 28        /* Is timer high priority Interrupt (Le    
 29         level_mask |= IS_ENABLED(CONFIG_ARC_CO    
 30                                                   
 31         /*                                        
 32          * Write to register, even if no LV2 I    
 33          * in case bootloader had mucked with     
 34          */                                       
 35         write_aux_reg(AUX_IRQ_LEV, level_mask)    
 36                                                   
 37         if (level_mask)                           
 38                 pr_info("Level-2 interrupts bi    
 39                                                   
 40         /*                                        
 41          * Disable all IRQ lines so faulty ext    
 42          * trigger interrupt that kernel is no    
 43          */                                       
 44         for (i = TIMER0_IRQ; i < NR_CPU_IRQS;     
 45                 unsigned int ienb;                
 46                                                   
 47                 ienb = read_aux_reg(AUX_IENABL    
 48                 ienb &= ~(1 << i);                
 49                 write_aux_reg(AUX_IENABLE, ien    
 50         }                                         
 51 }                                                 
 52                                                   
 53 /*                                                
 54  * ARC700 core includes a simple on-chip intc     
 55  * -per IRQ enable/disable                        
 56  * -2 levels of interrupts (high/low)             
 57  * -all interrupts being level triggered          
 58  *                                                
 59  * To reduce platform code, we assume all IRQs    
 60  * Platforms with external intc, hence cascade    
 61  * below, per IRQ.                                
 62  */                                               
 63                                                   
 64 static void arc_irq_mask(struct irq_data *data    
 65 {                                                 
 66         unsigned int ienb;                        
 67                                                   
 68         ienb = read_aux_reg(AUX_IENABLE);         
 69         ienb &= ~(1 << data->hwirq);              
 70         write_aux_reg(AUX_IENABLE, ienb);         
 71 }                                                 
 72                                                   
 73 static void arc_irq_unmask(struct irq_data *da    
 74 {                                                 
 75         unsigned int ienb;                        
 76                                                   
 77         ienb = read_aux_reg(AUX_IENABLE);         
 78         ienb |= (1 << data->hwirq);               
 79         write_aux_reg(AUX_IENABLE, ienb);         
 80 }                                                 
 81                                                   
 82 static struct irq_chip onchip_intc = {            
 83         .name           = "ARC In-core Intc",     
 84         .irq_mask       = arc_irq_mask,           
 85         .irq_unmask     = arc_irq_unmask,         
 86 };                                                
 87                                                   
 88 static int arc_intc_domain_map(struct irq_doma    
 89                                irq_hw_number_t    
 90 {                                                 
 91         switch (hw) {                             
 92         case TIMER0_IRQ:                          
 93                 irq_set_percpu_devid(irq);        
 94                 irq_set_chip_and_handler(irq,     
 95                 break;                            
 96         default:                                  
 97                 irq_set_chip_and_handler(irq,     
 98         }                                         
 99         return 0;                                 
100 }                                                 
101                                                   
102 static const struct irq_domain_ops arc_intc_do    
103         .xlate = irq_domain_xlate_onecell,        
104         .map = arc_intc_domain_map,               
105 };                                                
106                                                   
107 static int __init                                 
108 init_onchip_IRQ(struct device_node *intc, stru    
109 {                                                 
110         struct irq_domain *root_domain;           
111                                                   
112         if (parent)                               
113                 panic("DeviceTree incore intc     
114                                                   
115         root_domain = irq_domain_add_linear(in    
116                                             &a    
117         if (!root_domain)                         
118                 panic("root irq domain not ava    
119                                                   
120         /*                                        
121          * Needed for primary domain lookup to    
122          * This is a primary irqchip, and can     
123          */                                       
124         irq_set_default_host(root_domain);        
125                                                   
126         return 0;                                 
127 }                                                 
128                                                   
129 IRQCHIP_DECLARE(arc_intc, "snps,arc700-intc",     
130                                                   
131 /*                                                
132  * arch_local_irq_enable - Enable interrupts.     
133  *                                                
134  * 1. Explicitly called to re-enable interrupt    
135  * 2. Implicitly called from spin_unlock_irq,     
136  *    which maybe in hard ISR itself              
137  *                                                
138  * Semantics of this function change depending    
139  *                                                
140  * -If called from hard-ISR, it must not inver    
141  *  e.g. suppose TIMER is high priority (Level    
142  *    Time hard-ISR, timer_interrupt( ) calls     
143  *    Here local_irq_enable( ) shd not re-enab    
144  * -If called from soft-ISR, it must re-enable    
145  *    soft ISR are low priority jobs which can    
146  *    must be enabled while they run.             
147  *    Now hardware context wise we may still b    
148  *    still we must re-enable both L1 and L2 I    
149  *  Another twist is prev scenario with flow b    
150  *     L1 ISR ==> interrupted by L2 ISR  ==> L    
151  *     here we must not re-enable Ll as prev L    
152  *     over-written (this is deficiency in ARC    
153  */                                               
154                                                   
155 #ifdef CONFIG_ARC_COMPACT_IRQ_LEVELS    /* Com    
156                                                   
157 void arch_local_irq_enable(void)                  
158 {                                                 
159         unsigned long flags = arch_local_save_    
160                                                   
161         if (flags & STATUS_A2_MASK)               
162                 flags |= STATUS_E2_MASK;          
163         else if (flags & STATUS_A1_MASK)          
164                 flags |= STATUS_E1_MASK;          
165                                                   
166         arch_local_irq_restore(flags);            
167 }                                                 
168                                                   
169 EXPORT_SYMBOL(arch_local_irq_enable);             
170 #endif                                            
171                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php