home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / Include / asm / io_apic.h < prev    next >
C/C++ Source or Header  |  2002-04-26  |  3KB  |  150 lines

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