irq.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/ppc/kernel/irq.c
  3.  *
  4.  *  Derived from arch/i386/kernel/irq.c
  5.  *    Copyright (C) 1992 Linus Torvalds
  6.  *  Adapted from arch/i386 by Gary Thomas
  7.  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
  8.  *  Updated and modified by Cort Dougan (cort@cs.nmt.edu)
  9.  *    Copyright (C) 1996 Cort Dougan
  10.  *  Adapted for Power Macintosh by Paul Mackerras
  11.  *    Copyright (C) 1996 Paul Mackerras (paulus@cs.anu.edu.au)
  12.  *  Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk).
  13.  * 
  14.  * This program is free software; you can redistribute it and/or
  15.  * modify it under the terms of the GNU General Public License
  16.  * as published by the Free Software Foundation; either version
  17.  * 2 of the License, or (at your option) any later version.
  18.  *
  19.  * This file contains the code used by various IRQ handling routines:
  20.  * asking for different IRQ's should be done through these routines
  21.  * instead of just grabbing them. Thus setups with different IRQ numbers
  22.  * shouldn't result in any weird surprises, and installing new handlers
  23.  * should be easier.
  24.  */
  25. #include <linux/ptrace.h>
  26. #include <linux/errno.h>
  27. #include <linux/threads.h>
  28. #include <linux/kernel_stat.h>
  29. #include <linux/signal.h>
  30. #include <linux/sched.h>
  31. #include <linux/ioport.h>
  32. #include <linux/interrupt.h>
  33. #include <linux/timex.h>
  34. #include <linux/config.h>
  35. #include <linux/init.h>
  36. #include <linux/slab.h>
  37. #include <linux/pci.h>
  38. #include <linux/delay.h>
  39. #include <linux/irq.h>
  40. #include <linux/proc_fs.h>
  41. #include <linux/seq_file.h>
  42. #include <linux/random.h>
  43. #include <asm/uaccess.h>
  44. #include <asm/bitops.h>
  45. #include <asm/system.h>
  46. #include <asm/io.h>
  47. #include <asm/pgtable.h>
  48. #include <asm/irq.h>
  49. #include <asm/cache.h>
  50. #include <asm/prom.h>
  51. #include <asm/ptrace.h>
  52. #include <asm/iSeries/LparData.h>
  53. #include <asm/machdep.h>
  54. #include <asm/paca.h>
  55. #include <asm/perfmon.h>
  56. #include "local_irq.h"
  57. atomic_t ipi_recv;
  58. atomic_t ipi_sent;
  59. void enable_irq(unsigned int irq_nr);
  60. void disable_irq(unsigned int irq_nr);
  61. #ifdef CONFIG_SMP
  62. extern void iSeries_smp_message_recv( struct pt_regs * );
  63. #endif
  64. volatile unsigned char *chrp_int_ack_special;
  65. static void register_irq_proc (unsigned int irq);
  66. irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned =
  67. { [0 ... NR_IRQS-1] = { 0, NULL, NULL, 0, SPIN_LOCK_UNLOCKED}};
  68. int ppc_spurious_interrupts = 0;
  69. struct irqaction *ppc_irq_action[NR_IRQS];
  70. unsigned long lpEvent_count = 0;
  71. #ifdef CONFIG_XMON
  72. extern void xmon(struct pt_regs *regs);
  73. extern int xmon_bpt(struct pt_regs *regs);
  74. extern int xmon_sstep(struct pt_regs *regs);
  75. extern int xmon_iabr_match(struct pt_regs *regs);
  76. extern int xmon_dabr_match(struct pt_regs *regs);
  77. extern void (*xmon_fault_handler)(struct pt_regs *regs);
  78. #endif
  79. #ifdef CONFIG_XMON
  80. extern void (*debugger)(struct pt_regs *regs);
  81. extern int (*debugger_bpt)(struct pt_regs *regs);
  82. extern int (*debugger_sstep)(struct pt_regs *regs);
  83. extern int (*debugger_iabr_match)(struct pt_regs *regs);
  84. extern int (*debugger_dabr_match)(struct pt_regs *regs);
  85. extern void (*debugger_fault_handler)(struct pt_regs *regs);
  86. #endif
  87. /* nasty hack for shared irq's since we need to do kmalloc calls but
  88.  * can't very early in the boot when we need to do a request irq.
  89.  * this needs to be removed.
  90.  * -- Cort
  91.  */
  92. #define IRQ_KMALLOC_ENTRIES 16
  93. static int cache_bitmask = 0;
  94. static struct irqaction malloc_cache[IRQ_KMALLOC_ENTRIES];
  95. extern int mem_init_done;
  96. void *irq_kmalloc(size_t size, int pri)
  97. {
  98. unsigned int i;
  99. if ( mem_init_done )
  100. return kmalloc(size,pri);
  101. for ( i = 0; i < IRQ_KMALLOC_ENTRIES ; i++ )
  102. if ( ! ( cache_bitmask & (1<<i) ) ) {
  103. cache_bitmask |= (1<<i);
  104. return (void *)(&malloc_cache[i]);
  105. }
  106. return 0;
  107. }
  108. void irq_kfree(void *ptr)
  109. {
  110. unsigned int i;
  111. for ( i = 0 ; i < IRQ_KMALLOC_ENTRIES ; i++ )
  112. if ( ptr == &malloc_cache[i] ) {
  113. cache_bitmask &= ~(1<<i);
  114. return;
  115. }
  116. kfree(ptr);
  117. }
  118. int
  119. setup_irq(unsigned int irq, struct irqaction * new)
  120. {
  121. int shared = 0;
  122. unsigned long flags;
  123. struct irqaction *old, **p;
  124. irq_desc_t *desc = irq_desc + irq;
  125. /*
  126.  * Some drivers like serial.c use request_irq() heavily,
  127.  * so we have to be careful not to interfere with a
  128.  * running system.
  129.  */
  130. if (new->flags & SA_SAMPLE_RANDOM) {
  131. /*
  132.  * This function might sleep, we want to call it first,
  133.  * outside of the atomic block.
  134.  * Yes, this might clear the entropy pool if the wrong
  135.  * driver is attempted to be loaded, without actually
  136.  * installing a new handler, but is this really a problem,
  137.  * only the sysadmin is able to do this.
  138.  */
  139. rand_initialize_irq(irq);
  140. }
  141. /*
  142.  * The following block of code has to be executed atomically
  143.  */
  144. spin_lock_irqsave(&desc->lock,flags);
  145. p = &desc->action;
  146. if ((old = *p) != NULL) {
  147. /* Can't share interrupts unless both agree to */
  148. if (!(old->flags & new->flags & SA_SHIRQ)) {
  149. spin_unlock_irqrestore(&desc->lock,flags);
  150. return -EBUSY;
  151. }
  152. /* add new interrupt at end of irq queue */
  153. do {
  154. p = &old->next;
  155. old = *p;
  156. } while (old);
  157. shared = 1;
  158. }
  159. *p = new;
  160. if (!shared) {
  161. desc->depth = 0;
  162. desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
  163. unmask_irq(irq);
  164. }
  165. spin_unlock_irqrestore(&desc->lock,flags);
  166. register_irq_proc(irq);
  167. return 0;
  168. }
  169. /* This could be promoted to a real free_irq() ... */
  170. static int
  171. do_free_irq(int irq, void* dev_id)
  172. {
  173. irq_desc_t *desc;
  174. struct irqaction **p;
  175. unsigned long flags;
  176. desc = irq_desc + irq;
  177. spin_lock_irqsave(&desc->lock,flags);
  178. p = &desc->action;
  179. for (;;) {
  180. struct irqaction * action = *p;
  181. if (action) {
  182. struct irqaction **pp = p;
  183. p = &action->next;
  184. if (action->dev_id != dev_id)
  185. continue;
  186. /* Found it - now remove it from the list of entries */
  187. *pp = action->next;
  188. if (!desc->action) {
  189. desc->status |= IRQ_DISABLED;
  190. mask_irq(irq);
  191. }
  192. spin_unlock_irqrestore(&desc->lock,flags);
  193. #ifdef CONFIG_SMP
  194. /* Wait to make sure it's not being used on another CPU */
  195. while (desc->status & IRQ_INPROGRESS)
  196. barrier();
  197. #endif
  198. irq_kfree(action);
  199. return 0;
  200. }
  201. printk("Trying to free free IRQ%dn",irq);
  202. spin_unlock_irqrestore(&desc->lock,flags);
  203. break;
  204. }
  205. return -ENOENT;
  206. }
  207. int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
  208. unsigned long irqflags, const char * devname, void *dev_id)
  209. {
  210. struct irqaction *action;
  211. int retval;
  212. if (irq >= NR_IRQS)
  213. return -EINVAL;
  214. if (!handler)
  215. /* We could implement really free_irq() instead of that... */
  216. return do_free_irq(irq, dev_id);
  217. action = (struct irqaction *)
  218. irq_kmalloc(sizeof(struct irqaction), GFP_KERNEL);
  219. if (!action) {
  220. printk(KERN_ERR "irq_kmalloc() failed for irq %d !n", irq);
  221. return -ENOMEM;
  222. }
  223. action->handler = handler;
  224. action->flags = irqflags;
  225. action->mask = 0;
  226. action->name = devname;
  227. action->dev_id = dev_id;
  228. action->next = NULL;
  229. retval = setup_irq(irq, action);
  230. if (retval)
  231. kfree(action);
  232. return 0;
  233. }
  234. void free_irq(unsigned int irq, void *dev_id)
  235. {
  236. request_irq(irq, NULL, 0, NULL, dev_id);
  237. }
  238. /*
  239.  * Generic enable/disable code: this just calls
  240.  * down into the PIC-specific version for the actual
  241.  * hardware disable after having gotten the irq
  242.  * controller lock. 
  243.  */
  244.  
  245. /**
  246.  * disable_irq_nosync - disable an irq without waiting
  247.  * @irq: Interrupt to disable
  248.  *
  249.  * Disable the selected interrupt line. Disables of an interrupt
  250.  * stack. Unlike disable_irq(), this function does not ensure existing
  251.  * instances of the IRQ handler have completed before returning.
  252.  *
  253.  * This function may be called from IRQ context.
  254.  */
  255.  
  256.  void disable_irq_nosync(unsigned int irq)
  257. {
  258. irq_desc_t *desc = irq_desc + irq;
  259. unsigned long flags;
  260. spin_lock_irqsave(&desc->lock, flags);
  261. if (!desc->depth++) {
  262. if (!(desc->status & IRQ_PER_CPU))
  263. desc->status |= IRQ_DISABLED;
  264. mask_irq(irq);
  265. }
  266. spin_unlock_irqrestore(&desc->lock, flags);
  267. }
  268. /**
  269.  * disable_irq - disable an irq and wait for completion
  270.  * @irq: Interrupt to disable
  271.  *
  272.  * Disable the selected interrupt line. Disables of an interrupt
  273.  * stack. That is for two disables you need two enables. This
  274.  * function waits for any pending IRQ handlers for this interrupt
  275.  * to complete before returning. If you use this function while
  276.  * holding a resource the IRQ handler may need you will deadlock.
  277.  *
  278.  * This function may be called - with care - from IRQ context.
  279.  */
  280.  
  281. void disable_irq(unsigned int irq)
  282. {
  283. disable_irq_nosync(irq);
  284. if (!local_irq_count(smp_processor_id())) {
  285. do {
  286. barrier();
  287. } while (irq_desc[irq].status & IRQ_INPROGRESS);
  288. }
  289. }
  290. /**
  291.  * enable_irq - enable interrupt handling on an irq
  292.  * @irq: Interrupt to enable
  293.  *
  294.  * Re-enables the processing of interrupts on this IRQ line
  295.  * providing no disable_irq calls are now in effect.
  296.  *
  297.  * This function may be called from IRQ context.
  298.  */
  299.  
  300. void enable_irq(unsigned int irq)
  301. {
  302. irq_desc_t *desc = irq_desc + irq;
  303. unsigned long flags;
  304. spin_lock_irqsave(&desc->lock, flags);
  305. switch (desc->depth) {
  306. case 1: {
  307. unsigned int status = desc->status & ~IRQ_DISABLED;
  308. desc->status = status;
  309. if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
  310. desc->status = status | IRQ_REPLAY;
  311. hw_resend_irq(desc->handler,irq);
  312. }
  313. unmask_irq(irq);
  314. /* fall-through */
  315. }
  316. default:
  317. desc->depth--;
  318. break;
  319. case 0:
  320. printk("enable_irq(%u) unbalancedn", irq);
  321. }
  322. spin_unlock_irqrestore(&desc->lock, flags);
  323. }
  324. /* one would think this function has one foot in the grave */
  325. int get_irq_list(char *buf)
  326. {
  327.    int i, len = 0, j;
  328.    struct irqaction * action;
  329.    len += sprintf(buf+len, "           ");
  330.    for (j=0; j<smp_num_cpus; j++)
  331.        len += sprintf(buf+len, "CPU%d       ",j);
  332.    *(char *)(buf+len++) = 'n';
  333.    for (i = 0 ; i < NR_IRQS ; i++) {
  334.        action = irq_desc[i].action;
  335.        if ( !action || !action->handler )
  336.            continue;
  337.        len += sprintf(buf+len, "%3d: ", i);
  338. #ifdef CONFIG_SMP
  339.        for (j = 0; j < smp_num_cpus; j++)
  340.            len += sprintf(buf+len, "%10u ",
  341.                kstat.irqs[cpu_logical_map(j)][i]);
  342. #else
  343.        len += sprintf(buf+len, "%10u ", kstat_irqs(i));
  344. #endif /* CONFIG_SMP */
  345. if ( irq_desc[i].handler )
  346. len += sprintf(buf+len, " %s ", irq_desc[i].handler->typename );
  347. else
  348. len += sprintf(buf+len, "  None      ");
  349. len += sprintf(buf+len, "%s", (irq_desc[i].status & IRQ_LEVEL) ? "Level " : "Edge  ");
  350. len += sprintf(buf+len, "    %s",action->name);
  351. for (action=action->next; action; action = action->next) {
  352. len += sprintf(buf+len, ", %s", action->name);
  353. }
  354. len += sprintf(buf+len, "n");
  355. }
  356. #ifdef CONFIG_SMP
  357. /* should this be per processor send/receive? */
  358. len += sprintf(buf+len, "IPI (recv/sent): %10u/%un",
  359. atomic_read(&ipi_recv), atomic_read(&ipi_sent));
  360. #endif
  361. len += sprintf(buf+len, "BAD: %10un", ppc_spurious_interrupts);
  362. return len;
  363. }
  364. int show_interrupts(struct seq_file *p, void *v)
  365. {
  366. int i, j;
  367. struct irqaction * action;
  368. seq_printf(p, "           ");
  369. for (j=0; j<smp_num_cpus; j++)
  370. seq_printf(p, "CPU%d       ",j);
  371. seq_putc(p, 'n');
  372. for (i = 0 ; i < NR_IRQS ; i++) {
  373. action = irq_desc[i].action;
  374. if (!action || !action->handler)
  375. continue;
  376. seq_printf(p, "%3d: ", i);
  377. #ifdef CONFIG_SMP
  378. for (j = 0; j < smp_num_cpus; j++)
  379. seq_printf(p, "%10u ",
  380. kstat.irqs[cpu_logical_map(j)][i]);
  381. #else
  382. seq_printf(p, "%10u ", kstat_irqs(i));
  383. #endif /* CONFIG_SMP */
  384. if (irq_desc[i].handler)
  385. seq_printf(p, " %s ", irq_desc[i].handler->typename );
  386. else
  387. seq_printf(p, "  None      ");
  388. seq_printf(p, "%s", (irq_desc[i].status & IRQ_LEVEL) ? "Level " : "Edge  ");
  389. seq_printf(p, "    %s",action->name);
  390. for (action=action->next; action; action = action->next)
  391. seq_printf(p, ", %s", action->name);
  392. seq_putc(p, 'n');
  393. }
  394. #ifdef CONFIG_SMP
  395. /* should this be per processor send/receive? */
  396. seq_printf(p, "IPI (recv/sent): %10u/%un",
  397.        atomic_read(&ipi_recv), atomic_read(&ipi_sent));
  398. #endif
  399. seq_printf(p, "BAD: %10un", ppc_spurious_interrupts);
  400. return 0;
  401. }
  402. static inline void
  403. handle_irq_event(int irq, struct pt_regs *regs, struct irqaction *action)
  404. {
  405. int status = 0;
  406. if (!(action->flags & SA_INTERRUPT))
  407. __sti();
  408. do {
  409. status |= action->flags;
  410. action->handler(irq, action->dev_id, regs);
  411. action = action->next;
  412. } while (action);
  413. if (status & SA_SAMPLE_RANDOM)
  414. add_interrupt_randomness(irq);
  415. __cli();
  416. }
  417. /*
  418.  * Eventually, this should take an array of interrupts and an array size
  419.  * so it can dispatch multiple interrupts.
  420.  */
  421. void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq)
  422. {
  423. int status;
  424. struct irqaction *action;
  425. int cpu = smp_processor_id();
  426. irq_desc_t *desc = irq_desc + irq;
  427. kstat.irqs[cpu][irq]++;
  428. spin_lock(&desc->lock);
  429. ack_irq(irq);
  430. /*
  431.    REPLAY is when Linux resends an IRQ that was dropped earlier
  432.    WAITING is used by probe to mark irqs that are being tested
  433.    */
  434. status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);
  435. if (!(status & IRQ_PER_CPU))
  436. status |= IRQ_PENDING; /* we _want_ to handle it */
  437. /*
  438.  * If the IRQ is disabled for whatever reason, we cannot
  439.  * use the action we have.
  440.  */
  441. action = NULL;
  442. if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
  443. action = desc->action;
  444. if (!action || !action->handler) {
  445. ppc_spurious_interrupts++;
  446. printk(KERN_DEBUG "Unhandled interrupt %x, disabledn", irq);
  447. /* We can't call disable_irq here, it would deadlock */
  448. if (!desc->depth)
  449. desc->depth = 1;
  450. desc->status |= IRQ_DISABLED;
  451. /* This is not a real spurrious interrupt, we
  452.  * have to eoi it, so we jump to out
  453.  */
  454. mask_irq(irq);
  455. goto out;
  456. }
  457. status &= ~IRQ_PENDING; /* we commit to handling */
  458. if (!(status & IRQ_PER_CPU))
  459. status |= IRQ_INPROGRESS; /* we are handling it */
  460. }
  461. desc->status = status;
  462. /*
  463.  * If there is no IRQ handler or it was disabled, exit early.
  464.    Since we set PENDING, if another processor is handling
  465.    a different instance of this same irq, the other processor
  466.    will take care of it.
  467.  */
  468. if (!action)
  469. goto out;
  470. /*
  471.  * Edge triggered interrupts need to remember
  472.  * pending events.
  473.  * This applies to any hw interrupts that allow a second
  474.  * instance of the same irq to arrive while we are in do_IRQ
  475.  * or in the handler. But the code here only handles the _second_
  476.  * instance of the irq, not the third or fourth. So it is mostly
  477.  * useful for irq hardware that does not mask cleanly in an
  478.  * SMP environment.
  479.  */
  480. for (;;) {
  481. spin_unlock(&desc->lock);
  482. handle_irq_event(irq, regs, action);
  483. spin_lock(&desc->lock);
  484. if (!(desc->status & IRQ_PENDING))
  485. break;
  486. desc->status &= ~IRQ_PENDING;
  487. }
  488. desc->status &= ~IRQ_INPROGRESS;
  489. out:
  490. /*
  491.  * The ->end() handler has to deal with interrupts which got
  492.  * disabled while the handler was running.
  493.  */
  494. if (irq_desc[irq].handler) {
  495. if (irq_desc[irq].handler->end)
  496. irq_desc[irq].handler->end(irq);
  497. else if (irq_desc[irq].handler->enable)
  498. irq_desc[irq].handler->enable(irq);
  499. }
  500. spin_unlock(&desc->lock);
  501. }
  502. int do_IRQ(struct pt_regs *regs)
  503. {
  504. int cpu = smp_processor_id();
  505. int irq, first = 1;
  506. #ifdef CONFIG_PPC_ISERIES
  507. struct paca_struct *lpaca;
  508. struct ItLpQueue *lpq;
  509. #endif
  510. irq_enter(cpu);
  511. #ifdef CONFIG_PPC_ISERIES
  512. lpaca = get_paca();
  513. #ifdef CONFIG_SMP
  514. if (lpaca->xLpPaca.xIntDword.xFields.xIpiCnt) {
  515. lpaca->xLpPaca.xIntDword.xFields.xIpiCnt = 0;
  516. iSeries_smp_message_recv(regs);
  517. }
  518. #endif /* CONFIG_SMP */
  519. lpq = lpaca->lpQueuePtr;
  520. if (lpq && ItLpQueue_isLpIntPending(lpq))
  521. lpEvent_count += ItLpQueue_process(lpq, regs);
  522. #else
  523. /*
  524.  * Every arch is required to implement ppc_md.get_irq.
  525.  * This function will either return an irq number or -1 to
  526.  * indicate there are no more pending.  But the first time
  527.  * through the loop this means there wasn't an IRQ pending.
  528.  * The value -2 is for buggy hardware and means that this IRQ
  529.  * has already been handled. -- Tom
  530.  */
  531. while ((irq = ppc_md.get_irq(regs)) >= 0) {
  532. ppc_irq_dispatch_handler(regs, irq);
  533. first = 0;
  534. }
  535. if (irq != -2 && first)
  536. /* That's not SMP safe ... but who cares ? */
  537. ppc_spurious_interrupts++;
  538. #endif
  539.         irq_exit(cpu);
  540. #ifdef CONFIG_PPC_ISERIES
  541. if (lpaca->xLpPaca.xIntDword.xFields.xDecrInt) {
  542. lpaca->xLpPaca.xIntDword.xFields.xDecrInt = 0;
  543. /* Signal a fake decrementer interrupt */
  544. timer_interrupt(regs);
  545. }
  546. if (lpaca->xLpPaca.xIntDword.xFields.xPdcInt) {
  547. lpaca->xLpPaca.xIntDword.xFields.xPdcInt = 0;
  548. /* Signal a fake PMC interrupt */
  549. PerformanceMonitorException();
  550. }
  551. #endif
  552. if (softirq_pending(cpu))
  553. do_softirq();
  554. return 1; /* lets ret_from_int know we can do checks */
  555. }
  556. unsigned long probe_irq_on (void)
  557. {
  558. return 0;
  559. }
  560. int probe_irq_off (unsigned long irqs)
  561. {
  562. return 0;
  563. }
  564. unsigned int probe_irq_mask(unsigned long irqs)
  565. {
  566. return 0;
  567. }
  568. void __init init_IRQ(void)
  569. {
  570. static int once = 0;
  571. if ( once )
  572. return;
  573. else
  574. once++;
  575. ppc_md.init_IRQ();
  576. if(ppc_md.init_ras_IRQ) ppc_md.init_ras_IRQ(); 
  577. }
  578. #ifdef CONFIG_SMP
  579. unsigned char global_irq_holder = NO_PROC_ID;
  580. static void show(char * str)
  581. {
  582. int cpu = smp_processor_id();
  583. int i;
  584. printk("n%s, CPU %d:n", str, cpu);
  585. printk("irq:  %d [ ", irqs_running());
  586. for (i = 0; i < smp_num_cpus; i++)
  587. printk("%u ", __brlock_array[i][BR_GLOBALIRQ_LOCK]);
  588. printk("]nbh:   %d [ ",
  589. (spin_is_locked(&global_bh_lock) ? 1 : 0));
  590. for (i = 0; i < smp_num_cpus; i++)
  591. printk("%u ", local_bh_count(i));
  592. printk("]n");
  593. }
  594. #define MAXCOUNT 10000000
  595. void synchronize_irq(void)
  596. {
  597. if (irqs_running()) {
  598. cli();
  599. sti();
  600. }
  601. }
  602. static inline void get_irqlock(int cpu)
  603. {
  604.         int count;
  605.         if ((unsigned char)cpu == global_irq_holder)
  606.                 return;
  607.         count = MAXCOUNT;
  608. again:
  609.         br_write_lock(BR_GLOBALIRQ_LOCK);
  610.         for (;;) {
  611.                 spinlock_t *lock;
  612.                 if (!irqs_running() &&
  613.                     (local_bh_count(smp_processor_id()) || !spin_is_locked(&global_bh_lock)))
  614.                         break;
  615.                 br_write_unlock(BR_GLOBALIRQ_LOCK);
  616.                 lock = &__br_write_locks[BR_GLOBALIRQ_LOCK].lock;
  617.                 while (irqs_running() ||
  618.                        spin_is_locked(lock) ||
  619.                        (!local_bh_count(smp_processor_id()) && spin_is_locked(&global_bh_lock))) {
  620.                         if (!--count) {
  621.                                 show("get_irqlock");
  622.                                 count = (~0 >> 1);
  623.                         }
  624.                         __sti();
  625.                         barrier();
  626.                         __cli();
  627.                 }
  628.                 goto again;
  629.         }
  630.         global_irq_holder = cpu;
  631. }
  632. /*
  633.  * A global "cli()" while in an interrupt context
  634.  * turns into just a local cli(). Interrupts
  635.  * should use spinlocks for the (very unlikely)
  636.  * case that they ever want to protect against
  637.  * each other.
  638.  *
  639.  * If we already have local interrupts disabled,
  640.  * this will not turn a local disable into a
  641.  * global one (problems with spinlocks: this makes
  642.  * save_flags+cli+sti usable inside a spinlock).
  643.  */
  644. void __global_cli(void)
  645. {
  646. unsigned long flags;
  647. __save_flags(flags);
  648. if (flags & (1UL << 15)) {
  649. int cpu = smp_processor_id();
  650. __cli();
  651. if (!local_irq_count(cpu))
  652. get_irqlock(cpu);
  653. }
  654. }
  655. void __global_sti(void)
  656. {
  657. int cpu = smp_processor_id();
  658. if (!local_irq_count(cpu))
  659. release_irqlock(cpu);
  660. __sti();
  661. }
  662. /*
  663.  * SMP flags value to restore to:
  664.  * 0 - global cli
  665.  * 1 - global sti
  666.  * 2 - local cli
  667.  * 3 - local sti
  668.  */
  669. unsigned long __global_save_flags(void)
  670. {
  671. int retval;
  672. int local_enabled;
  673. unsigned long flags;
  674. __save_flags(flags);
  675. local_enabled = (flags >> 15) & 1;
  676. /* default to local */
  677. retval = 2 + local_enabled;
  678. /* check for global flags if we're not in an interrupt */
  679. if (!local_irq_count(smp_processor_id())) {
  680. if (local_enabled)
  681. retval = 1;
  682. if (global_irq_holder == (unsigned char) smp_processor_id())
  683. retval = 0;
  684. }
  685. return retval;
  686. }
  687. void __global_restore_flags(unsigned long flags)
  688. {
  689. switch (flags) {
  690. case 0:
  691. __global_cli();
  692. break;
  693. case 1:
  694. __global_sti();
  695. break;
  696. case 2:
  697. __cli();
  698. break;
  699. case 3:
  700. __sti();
  701. break;
  702. default:
  703. printk("global_restore_flags: %016lx caller %pn",
  704. flags, __builtin_return_address(0));
  705. }
  706. }
  707. #endif /* CONFIG_SMP */
  708. static struct proc_dir_entry * root_irq_dir;
  709. static struct proc_dir_entry * irq_dir [NR_IRQS];
  710. static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
  711. #ifdef CONFIG_IRQ_ALL_CPUS
  712. unsigned int irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0xffffffff};
  713. #else  /* CONFIG_IRQ_ALL_CPUS */
  714. unsigned int irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0x00000000};
  715. #endif /* CONFIG_IRQ_ALL_CPUS */
  716. #define HEX_DIGITS 8
  717. static int irq_affinity_read_proc (char *page, char **start, off_t off,
  718. int count, int *eof, void *data)
  719. {
  720. if (count < HEX_DIGITS+1)
  721. return -EINVAL;
  722. return sprintf (page, "%08xn", irq_affinity[(int)(long)data]);
  723. }
  724. static unsigned int parse_hex_value (const char *buffer,
  725. unsigned long count, unsigned long *ret)
  726. {
  727. unsigned char hexnum [HEX_DIGITS];
  728. unsigned long value;
  729. int i;
  730. if (!count)
  731. return -EINVAL;
  732. if (count > HEX_DIGITS)
  733. count = HEX_DIGITS;
  734. if (copy_from_user(hexnum, buffer, count))
  735. return -EFAULT;
  736. /*
  737.  * Parse the first 8 characters as a hex string, any non-hex char
  738.  * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
  739.  */
  740. value = 0;
  741. for (i = 0; i < count; i++) {
  742. unsigned int c = hexnum[i];
  743. switch (c) {
  744. case '0' ... '9': c -= '0'; break;
  745. case 'a' ... 'f': c -= 'a'-10; break;
  746. case 'A' ... 'F': c -= 'A'-10; break;
  747. default:
  748. goto out;
  749. }
  750. value = (value << 4) | c;
  751. }
  752. out:
  753. *ret = value;
  754. return 0;
  755. }
  756. static int irq_affinity_write_proc (struct file *file, const char *buffer,
  757. unsigned long count, void *data)
  758. {
  759. int irq = (int)(long) data, full_count = count, err;
  760. unsigned long new_value;
  761. if (!irq_desc[irq].handler->set_affinity)
  762. return -EIO;
  763. err = parse_hex_value(buffer, count, &new_value);
  764. /* Why is this disabled ? --BenH */
  765. #if 0/*CONFIG_SMP*/
  766. /*
  767.  * Do not allow disabling IRQs completely - it's a too easy
  768.  * way to make the system unusable accidentally :-) At least
  769.  * one online CPU still has to be targeted.
  770.  */
  771. if (!(new_value & cpu_online_map))
  772. return -EINVAL;
  773. #endif
  774. irq_affinity[irq] = new_value;
  775. irq_desc[irq].handler->set_affinity(irq, new_value);
  776. return full_count;
  777. }
  778. static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
  779. int count, int *eof, void *data)
  780. {
  781. unsigned long *mask = (unsigned long *) data;
  782. if (count < HEX_DIGITS+1)
  783. return -EINVAL;
  784. return sprintf (page, "%08lxn", *mask);
  785. }
  786. static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
  787. unsigned long count, void *data)
  788. {
  789. unsigned long *mask = (unsigned long *) data, full_count = count, err;
  790. unsigned long new_value;
  791. err = parse_hex_value(buffer, count, &new_value);
  792. if (err)
  793. return err;
  794. *mask = new_value;
  795. #ifdef CONFIG_PPC_ISERIES
  796. {
  797. unsigned i;
  798. for (i=0; i<MAX_PACAS; ++i) {
  799. if ( paca[i].prof_buffer && (new_value & 1) )
  800. paca[i].prof_mode = PMC_STATE_DECR_PROFILE;
  801. else {
  802. if(paca[i].prof_mode != PMC_STATE_INITIAL) 
  803. paca[i].prof_mode = PMC_STATE_READY;
  804. }
  805. new_value >>= 1;
  806. }
  807. }
  808. #endif
  809. return full_count;
  810. }
  811. #define MAX_NAMELEN 10
  812. static void register_irq_proc (unsigned int irq)
  813. {
  814. struct proc_dir_entry *entry;
  815. char name [MAX_NAMELEN];
  816. if (!root_irq_dir || (irq_desc[irq].handler == NULL))
  817. return;
  818. memset(name, 0, MAX_NAMELEN);
  819. sprintf(name, "%d", irq);
  820. /* create /proc/irq/1234 */
  821. irq_dir[irq] = proc_mkdir(name, root_irq_dir);
  822. /* create /proc/irq/1234/smp_affinity */
  823. entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
  824. entry->nlink = 1;
  825. entry->data = (void *)(long)irq;
  826. entry->read_proc = irq_affinity_read_proc;
  827. entry->write_proc = irq_affinity_write_proc;
  828. smp_affinity_entry[irq] = entry;
  829. }
  830. unsigned long prof_cpu_mask = -1;
  831. void init_irq_proc (void)
  832. {
  833. struct proc_dir_entry *entry;
  834. int i;
  835. /* create /proc/irq */
  836. root_irq_dir = proc_mkdir("irq", 0);
  837. /* create /proc/irq/prof_cpu_mask */
  838. entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir);
  839. entry->nlink = 1;
  840. entry->data = (void *)&prof_cpu_mask;
  841. entry->read_proc = prof_cpu_mask_read_proc;
  842. entry->write_proc = prof_cpu_mask_write_proc;
  843. /*
  844.  * Create entries for all existing IRQs.
  845.  */
  846. for (i = 0; i < NR_IRQS; i++) {
  847. if (irq_desc[i].handler == NULL)
  848. continue;
  849. register_irq_proc(i);
  850. }
  851. }
  852. void no_action(int irq, void *dev, struct pt_regs *regs)
  853. {
  854. }