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

Linux/Unix编程

开发平台:

Unix_Linux

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