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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __ASM_IO_APIC_H
  2. #define __ASM_IO_APIC_H
  3. #include <linux/config.h>
  4. #include <asm/types.h>
  5. /*
  6.  * Intel IO-APIC support for SMP and UP systems.
  7.  *
  8.  * Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar
  9.  */
  10. #ifdef CONFIG_X86_IO_APIC
  11. #define APIC_MISMATCH_DEBUG
  12. #define IO_APIC_BASE(idx) 
  13. ((volatile int *)(__fix_to_virt(FIX_IO_APIC_BASE_0 + idx) 
  14. + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK)))
  15. /*
  16.  * The structure of the IO-APIC:
  17.  */
  18. struct IO_APIC_reg_00 {
  19. __u32 __reserved_2 : 24,
  20. ID :  4,
  21. __reserved_1 :  4;
  22. } __attribute__ ((packed));
  23. struct IO_APIC_reg_01 {
  24. __u32 version :  8,
  25. __reserved_2 :  7,
  26. PRQ :  1,
  27. entries :  8,
  28. __reserved_1 :  8;
  29. } __attribute__ ((packed));
  30. struct IO_APIC_reg_02 {
  31. __u32 __reserved_2 : 24,
  32. arbitration :  4,
  33. __reserved_1 :  4;
  34. } __attribute__ ((packed));
  35. /*
  36.  * # of IO-APICs and # of IRQ routing registers
  37.  */
  38. extern int nr_ioapics;
  39. extern int nr_ioapic_registers[MAX_IO_APICS];
  40. enum ioapic_irq_destination_types {
  41. dest_Fixed = 0,
  42. dest_LowestPrio = 1,
  43. dest_SMI = 2,
  44. dest__reserved_1 = 3,
  45. dest_NMI = 4,
  46. dest_INIT = 5,
  47. dest__reserved_2 = 6,
  48. dest_ExtINT = 7
  49. };
  50. struct IO_APIC_route_entry {
  51. __u32 vector :  8,
  52. delivery_mode :  3, /* 000: FIXED
  53.  * 001: lowest prio
  54.  * 111: ExtINT
  55.  */
  56. dest_mode :  1, /* 0: physical, 1: logical */
  57. delivery_status :  1,
  58. polarity :  1,
  59. irr :  1,
  60. trigger :  1, /* 0: edge, 1: level */
  61. mask :  1, /* 0: enabled, 1: disabled */
  62. __reserved_2 : 15;
  63. union { struct { __u32
  64. __reserved_1 : 24,
  65. physical_dest :  4,
  66. __reserved_2 :  4;
  67. } physical;
  68. struct { __u32
  69. __reserved_1 : 24,
  70. logical_dest :  8;
  71. } logical;
  72. } dest;
  73. } __attribute__ ((packed));
  74. /*
  75.  * MP-BIOS irq configuration table structures:
  76.  */
  77. /* I/O APIC entries */
  78. extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
  79. /* # of MP IRQ source entries */
  80. extern int mp_irq_entries;
  81. /* MP IRQ source entries */
  82. extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
  83. /* non-0 if default (table-less) MP configuration */
  84. extern int mpc_default_type;
  85. static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
  86. {
  87. *IO_APIC_BASE(apic) = reg;
  88. return *(IO_APIC_BASE(apic)+4);
  89. }
  90. static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
  91. {
  92. *IO_APIC_BASE(apic) = reg;
  93. *(IO_APIC_BASE(apic)+4) = value;
  94. }
  95. /*
  96.  * Re-write a value: to be used for read-modify-write
  97.  * cycles where the read already set up the index register.
  98.  */
  99. static inline void io_apic_modify(unsigned int apic, unsigned int value)
  100. {
  101. *(IO_APIC_BASE(apic)+4) = value;
  102. }
  103. /*
  104.  * Synchronize the IO-APIC and the CPU by doing
  105.  * a dummy read from the IO-APIC
  106.  */
  107. static inline void io_apic_sync(unsigned int apic)
  108. {
  109. (void) *(IO_APIC_BASE(apic)+4);
  110. }
  111. /* 1 if "noapic" boot option passed */
  112. extern int skip_ioapic_setup;
  113. /*
  114.  * If we use the IO-APIC for IRQ routing, disable automatic
  115.  * assignment of PCI IRQ's.
  116.  */
  117. #define io_apic_assign_pci_irqs (mp_irq_entries && !skip_ioapic_setup)
  118. #else  /* !CONFIG_X86_IO_APIC */
  119. #define io_apic_assign_pci_irqs 0
  120. #endif
  121. #endif