irq.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:24k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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