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

TOMOYO Linux Cross Reference
Linux/arch/alpha/kernel/irq.c

Version: ~ [ linux-5.8-rc4 ] ~ [ linux-5.7.7 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.50 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.131 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.187 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.229 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.229 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ 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.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *      linux/arch/alpha/kernel/irq.c
  3  *
  4  *      Copyright (C) 1995 Linus Torvalds
  5  *
  6  * This file contains the code used by various IRQ handling routines:
  7  * asking for different IRQ's should be done through these routines
  8  * instead of just grabbing them. Thus setups with different IRQ numbers
  9  * shouldn't result in any weird surprises, and installing new handlers
 10  * should be easier.
 11  */
 12 
 13 #include <linux/kernel.h>
 14 #include <linux/module.h>
 15 #include <linux/errno.h>
 16 #include <linux/kernel_stat.h>
 17 #include <linux/signal.h>
 18 #include <linux/sched.h>
 19 #include <linux/ptrace.h>
 20 #include <linux/interrupt.h>
 21 #include <linux/random.h>
 22 #include <linux/init.h>
 23 #include <linux/irq.h>
 24 #include <linux/proc_fs.h>
 25 #include <linux/seq_file.h>
 26 #include <linux/profile.h>
 27 #include <linux/bitops.h>
 28 
 29 #include <asm/io.h>
 30 #include <asm/uaccess.h>
 31 
 32 volatile unsigned long irq_err_count;
 33 DEFINE_PER_CPU(unsigned long, irq_pmi_count);
 34 
 35 void ack_bad_irq(unsigned int irq)
 36 {
 37         irq_err_count++;
 38         printk(KERN_CRIT "Unexpected IRQ trap at vector %u\n", irq);
 39 }
 40 
 41 #ifdef CONFIG_SMP 
 42 static char irq_user_affinity[NR_IRQS];
 43 
 44 int irq_select_affinity(unsigned int irq)
 45 {
 46         struct irq_data *data = irq_get_irq_data(irq);
 47         struct irq_chip *chip;
 48         static int last_cpu;
 49         int cpu = last_cpu + 1;
 50 
 51         if (!data)
 52                 return 1;
 53         chip = irq_data_get_irq_chip(data);
 54 
 55         if (!chip->irq_set_affinity || irq_user_affinity[irq])
 56                 return 1;
 57 
 58         while (!cpu_possible(cpu) ||
 59                !cpumask_test_cpu(cpu, irq_default_affinity))
 60                 cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
 61         last_cpu = cpu;
 62 
 63         cpumask_copy(data->affinity, cpumask_of(cpu));
 64         chip->irq_set_affinity(data, cpumask_of(cpu), false);
 65         return 0;
 66 }
 67 #endif /* CONFIG_SMP */
 68 
 69 int arch_show_interrupts(struct seq_file *p, int prec)
 70 {
 71         int j;
 72 
 73 #ifdef CONFIG_SMP
 74         seq_puts(p, "IPI: ");
 75         for_each_online_cpu(j)
 76                 seq_printf(p, "%10lu ", cpu_data[j].ipi_count);
 77         seq_putc(p, '\n');
 78 #endif
 79         seq_puts(p, "PMI: ");
 80         for_each_online_cpu(j)
 81                 seq_printf(p, "%10lu ", per_cpu(irq_pmi_count, j));
 82         seq_puts(p, "          Performance Monitoring\n");
 83         seq_printf(p, "ERR: %10lu\n", irq_err_count);
 84         return 0;
 85 }
 86 
 87 /*
 88  * handle_irq handles all normal device IRQ's (the special
 89  * SMP cross-CPU interrupts have their own specific
 90  * handlers).
 91  */
 92 
 93 #define MAX_ILLEGAL_IRQS 16
 94 
 95 void
 96 handle_irq(int irq)
 97 {       
 98         /* 
 99          * We ack quickly, we don't want the irq controller
100          * thinking we're snobs just because some other CPU has
101          * disabled global interrupts (we have already done the
102          * INT_ACK cycles, it's too late to try to pretend to the
103          * controller that we aren't taking the interrupt).
104          *
105          * 0 return value means that this irq is already being
106          * handled by some other CPU. (or is disabled)
107          */
108         static unsigned int illegal_count=0;
109         struct irq_desc *desc = irq_to_desc(irq);
110         
111         if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS &&
112             illegal_count < MAX_ILLEGAL_IRQS)) {
113                 irq_err_count++;
114                 illegal_count++;
115                 printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
116                        irq);
117                 return;
118         }
119 
120         irq_enter();
121         generic_handle_irq_desc(irq, desc);
122         irq_exit();
123 }
124 

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

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | 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.

osdn.jp