Various APIC debugging and IOAPIC IRQ routing
[akaros.git] / kern / arch / x86 / io.h
index 4ec4cec..086d2fd 100644 (file)
  */
 
 enum {
-       VectorNMI       = 2,            /* non-maskable interrupt */
-       VectorBPT       = 3,            /* breakpoint */
-       VectorUD        = 6,            /* invalid opcode exception */
-       VectorCNA       = 7,            /* coprocessor not available */
-       Vector2F        = 8,            /* double fault */
-       VectorCSO       = 9,            /* coprocessor segment overrun */
-       VectorPF        = 14,           /* page fault */
-       Vector15        = 15,           /* reserved */
-       VectorCERR      = 16,           /* coprocessor error */
-
-       VectorPIC       = 32,           /* external i8259 interrupts */
-       IrqCLOCK        = 0,
-       IrqKBD          = 1,
-       IrqUART1        = 3,
-       IrqUART0        = 4,
-       IrqPCMCIA       = 5,
-       IrqFLOPPY       = 6,
-       IrqLPT          = 7,
-       IrqIRQ7         = 7,
-       IrqAUX          = 12,           /* PS/2 port */
-       IrqIRQ13        = 13,           /* coprocessor on 386 */
-       IrqATA0         = 14,
-       IrqATA1         = 15,
-       MaxIrqPIC       = 15,
-
-       VectorLAPIC     = VectorPIC+16, /* local APIC interrupts */
-       IrqLINT0        = VectorLAPIC+0,
-       IrqLINT1        = VectorLAPIC+1,
-       IrqTIMER        = VectorLAPIC+2,
-       IrqERROR        = VectorLAPIC+3,
-       IrqPCINT        = VectorLAPIC+4,
-       IrqSPURIOUS     = VectorLAPIC+15,
-       MaxIrqLAPIC     = VectorLAPIC+15,
-
-       VectorSYSCALL   = 64,
-
-       VectorAPIC      = 65,           /* external APIC interrupts */
-       MaxVectorAPIC   = 255,
+       VectorNMI = 2,                          /* non-maskable interrupt */
+       VectorBPT = 3,  /* breakpoint */
+       VectorUD = 6,   /* invalid opcode exception */
+       VectorCNA = 7,  /* coprocessor not available */
+       Vector2F = 8,   /* double fault */
+       VectorCSO = 9,  /* coprocessor segment overrun */
+       VectorPF = 14,  /* page fault */
+       Vector15 = 15,  /* reserved */
+       VectorCERR = 16,        /* coprocessor error */
+
+       VectorPIC = 32, /* external i8259 interrupts */
+       IrqCLOCK = 0,
+       IrqKBD = 1,
+       IrqUART1 = 3,
+       IrqUART0 = 4,
+       IrqPCMCIA = 5,
+       IrqFLOPPY = 6,
+       IrqLPT = 7,
+       IrqIRQ7 = 7,
+       IrqAUX = 12,    /* PS/2 port */
+       IrqIRQ13 = 13,  /* coprocessor on 386 */
+       IrqATA0 = 14,
+       IrqATA1 = 15,
+       MaxIrqPIC = 15,
+
+       VectorLAPIC = VectorPIC + 16,   /* local APIC interrupts */
+       IrqLINT0 = VectorLAPIC + 0,
+       IrqLINT1 = VectorLAPIC + 1,
+       IrqTIMER = VectorLAPIC + 2,
+       IrqERROR = VectorLAPIC + 3,
+       IrqPCINT = VectorLAPIC + 4,
+       IrqSPURIOUS = VectorLAPIC + 15,
+       MaxIrqLAPIC = VectorLAPIC + 15,
+
+       VectorSYSCALL = 64,
+
+       VectorAPIC = 65,        /* external APIC interrupts */
+       MaxVectorAPIC = 255,
 };
 
 enum {
-       IdtPIC          = 32,                   /* external i8259 interrupts */
+       IdtPIC = 32,                            /* external i8259 interrupts */
 
-       IdtLINT0        = 48,                   /* local APIC interrupts */
-       IdtLINT1        = 49,
-       IdtTIMER        = 50,
-       IdtERROR        = 51,
-       IdtPCINT        = 52,
+       IdtLINT0 = 48,  /* local APIC interrupts */
+       IdtLINT1 = 49,
+       IdtTIMER = 50,
+       IdtERROR = 51,
+       IdtPCINT = 52,
 
-       IdtIPI          = 62,
-       IdtSPURIOUS     = 63,
+       IdtIPI = 62,
+       IdtSPURIOUS = 63,
 
-       IdtSYSCALL      = 64,
+       IdtSYSCALL = 64,
 
-       IdtIOAPIC       = 65,                   /* external APIC interrupts */
+       IdtIOAPIC = 65, /* external APIC interrupts */
 
-       IdtMAX          = 255,
+       IdtMAX = 255,
 };
 
 struct Vkey {
-       int     tbdf;                   /* pci: ioapic or msi sources */
-       int     irq;                    /* 8259-emulating sources */
+       int tbdf;                                       /* pci: ioapic or msi sources */
+       int irq;                                        /* 8259-emulating sources */
 };
 
 typedef struct Vctl {
-       struct Vctl*    next;                   /* handlers on this vector */
+       struct Vctl *next;                      /* handlers on this vector */
 
-       int     isintr;                 /* interrupt or fault/trap */
+       int isintr;                                     /* interrupt or fault/trap */
 
        struct Vkey;                            /* source-specific key; tbdf for pci */
-       //void  (*f)(Ureg*, void*);     /* handler to call */
-       void*   a;                      /* argument to call it with */
-       char    name[KNAMELEN];         /* of driver */
-       char    *type;
-
-       int     (*isr)(int);            /* get isr bit for this irq */
-       int     (*eoi)(int);            /* eoi */
-       int     (*mask)(struct Vkey*, int);     /* interrupt enable returns masked vector */
-       int     vno;
+       void (*f) (void *, void *);     /* handler to call */
+       void *a;                                        /* argument to call it with */
+       char name[KNAMELEN];            /* of driver */
+       char *type;
+
+       int (*isr) (int);                       /* get isr bit for this irq */
+       int (*eoi) (int);                       /* eoi */
+       int (*mask) (struct Vkey *, int);       /* interrupt enable returns masked vector */
+       int vno;
 } Vctl;
 
 struct ACVctl {
-       //char* (*f)(Ureg*,void*);
-       void*   a;
-       int     vno;
-       char    name[KNAMELEN];         /* of driver */
+       //char* (*f)(Ureg*,void*);
+       void *a;
+       int vno;
+       char name[KNAMELEN];            /* of driver */
 };
 
 enum {
-       BusCBUS         = 0,            /* Corollary CBUS */
-       BusCBUSII,                      /* Corollary CBUS II */
-       BusEISA,                        /* Extended ISA */
-       BusFUTURE,                      /* IEEE Futurebus */
-       BusINTERN,                      /* Internal bus */
-       BusISA,                         /* Industry Standard Architecture */
-       BusMBI,                         /* Multibus I */
-       BusMBII,                        /* Multibus II */
-       BusMCA,                         /* Micro Channel Architecture */
-       BusMPI,                         /* MPI */
-       BusMPSA,                        /* MPSA */
-       BusNUBUS,                       /* Apple Macintosh NuBus */
-       BusPCI,                         /* Peripheral Component Interconnect */
-       BusPCMCIA,                      /* PC Memory Card International Association */
-       BusTC,                          /* DEC TurboChannel */
-       BusVL,                          /* VESA Local bus */
-       BusVME,                         /* VMEbus */
-       BusXPRESS,                      /* Express System Bus */
+       BusCBUS = 0,                            /* Corollary CBUS */
+       BusCBUSII,      /* Corollary CBUS II */
+       BusEISA,        /* Extended ISA */
+       BusFUTURE,      /* IEEE Futurebus */
+       BusINTERN,      /* Internal bus */
+       BusISA, /* Industry Standard Architecture */
+       BusMBI, /* Multibus I */
+       BusMBII,        /* Multibus II */
+       BusMCA, /* Micro Channel Architecture */
+       BusMPI, /* MPI */
+       BusMPSA,        /* MPSA */
+       BusNUBUS,       /* Apple Macintosh NuBus */
+       BusPCI, /* Peripheral Component Interconnect */
+       BusPCMCIA,      /* PC Memory Card International Association */
+       BusTC,  /* DEC TurboChannel */
+       BusVL,  /* VESA Local bus */
+       BusVME, /* VMEbus */
+       BusXPRESS,      /* Express System Bus */
 };
 
 #define MKBUS(t,b,d,f) (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
@@ -126,191 +126,189 @@ enum {
 #define BUSUNKNOWN     (-1)
 
 enum {
-       MaxEISA         = 16,
-       CfgEISA         = 0xC80,
+       MaxEISA = 16,
+       CfgEISA = 0xC80,
 };
 
 /*
  * PCI support code.
  */
-enum {                                 /* type 0 and type 1 pre-defined header */
-       PciVID          = 0x00,         /* vendor ID */
-       PciDID          = 0x02,         /* device ID */
-       PciPCR          = 0x04,         /* command */
-       PciPSR          = 0x06,         /* status */
-       PciRID          = 0x08,         /* revision ID */
-       PciCCRp         = 0x09,         /* programming interface class code */
-       PciCCRu         = 0x0A,         /* sub-class code */
-       PciCCRb         = 0x0B,         /* base class code */
-       PciCLS          = 0x0C,         /* cache line size */
-       PciLTR          = 0x0D,         /* latency timer */
-       PciHDT          = 0x0E,         /* header type */
-       PciBST          = 0x0F,         /* BIST */
-
-       PciBAR0         = 0x10,         /* base address */
-       PciBAR1         = 0x14,
-
-       PciCP           = 0x34,         /* capabilities pointer */
-
-       PciINTL         = 0x3C,         /* interrupt line */
-       PciINTP         = 0x3D,         /* interrupt pin */
+enum {                                                 /* type 0 and type 1 pre-defined header */
+       PciVID = 0x00,                          /* vendor ID */
+       PciDID = 0x02,  /* device ID */
+       PciPCR = 0x04,  /* command */
+       PciPSR = 0x06,  /* status */
+       PciRID = 0x08,  /* revision ID */
+       PciCCRp = 0x09, /* programming interface class code */
+       PciCCRu = 0x0A, /* sub-class code */
+       PciCCRb = 0x0B, /* base class code */
+       PciCLS = 0x0C,  /* cache line size */
+       PciLTR = 0x0D,  /* latency timer */
+       PciHDT = 0x0E,  /* header type */
+       PciBST = 0x0F,  /* BIST */
+
+       PciBAR0 = 0x10, /* base address */
+       PciBAR1 = 0x14,
+
+       PciCP = 0x34,   /* capabilities pointer */
+
+       PciINTL = 0x3C, /* interrupt line */
+       PciINTP = 0x3D, /* interrupt pin */
 };
 
 /* ccrb (base class code) values; controller types */
 enum {
-       Pcibcpci1       = 0,            /* pci 1.0; no class codes defined */
-       Pcibcstore      = 1,            /* mass storage */
-       Pcibcnet        = 2,            /* network */
-       Pcibcdisp       = 3,            /* display */
-       Pcibcmmedia     = 4,            /* multimedia */
-       Pcibcmem        = 5,            /* memory */
-       Pcibcbridge     = 6,            /* bridge */
-       Pcibccomm       = 7,            /* simple comms (e.g., serial) */
-       Pcibcbasesys    = 8,            /* base system */
-       Pcibcinput      = 9,            /* input */
-       Pcibcdock       = 0xa,          /* docking stations */
-       Pcibcproc       = 0xb,          /* processors */
-       Pcibcserial     = 0xc,          /* serial bus (e.g., USB) */
-       Pcibcwireless   = 0xd,          /* wireless */
-       Pcibcintell     = 0xe,          /* intelligent i/o */
-       Pcibcsatcom     = 0xf,          /* satellite comms */
-       Pcibccrypto     = 0x10,         /* encryption/decryption */
-       Pcibcdacq       = 0x11,         /* data acquisition & signal proc. */
+       Pcibcpci1 = 0,                          /* pci 1.0; no class codes defined */
+       Pcibcstore = 1, /* mass storage */
+       Pcibcnet = 2,   /* network */
+       Pcibcdisp = 3,  /* display */
+       Pcibcmmedia = 4,        /* multimedia */
+       Pcibcmem = 5,   /* memory */
+       Pcibcbridge = 6,        /* bridge */
+       Pcibccomm = 7,  /* simple comms (e.g., serial) */
+       Pcibcbasesys = 8,       /* base system */
+       Pcibcinput = 9, /* input */
+       Pcibcdock = 0xa,        /* docking stations */
+       Pcibcproc = 0xb,        /* processors */
+       Pcibcserial = 0xc,      /* serial bus (e.g., USB) */
+       Pcibcwireless = 0xd,    /* wireless */
+       Pcibcintell = 0xe,      /* intelligent i/o */
+       Pcibcsatcom = 0xf,      /* satellite comms */
+       Pcibccrypto = 0x10,     /* encryption/decryption */
+       Pcibcdacq = 0x11,       /* data acquisition & signal proc. */
 };
 
 /* ccru (sub-class code) values; common cases only */
 enum {
        /* mass storage */
-       Pciscscsi       = 0,            /* SCSI */
-       Pciscide        = 1,            /* IDE (ATA) */
-       Pciscsata       = 6,            /* SATA */
+       Pciscscsi = 0,                          /* SCSI */
+       Pciscide = 1,   /* IDE (ATA) */
+       Pciscsata = 6,  /* SATA */
 
        /* network */
-       Pciscether      = 0,            /* Ethernet */
+       Pciscether = 0, /* Ethernet */
 
        /* display */
-       Pciscvga        = 0,            /* VGA */
-       Pciscxga        = 1,            /* XGA */
-       Pcisc3d         = 2,            /* 3D */
+       Pciscvga = 0,   /* VGA */
+       Pciscxga = 1,   /* XGA */
+       Pcisc3d = 2,    /* 3D */
 
        /* bridges */
-       Pcischostpci    = 0,            /* host/pci */
-       Pciscpcicpci    = 1,            /* pci/pci */
+       Pcischostpci = 0,       /* host/pci */
+       Pciscpcicpci = 1,       /* pci/pci */
 
        /* simple comms */
-       Pciscserial     = 0,            /* 16450, etc. */
-       Pciscmultiser   = 1,            /* multiport serial */
+       Pciscserial = 0,        /* 16450, etc. */
+       Pciscmultiser = 1,      /* multiport serial */
 
        /* serial bus */
-       Pciscusb        = 3,            /* USB */
+       Pciscusb = 3,   /* USB */
 };
 
-enum {                                 /* type 0 pre-defined header */
-       PciCIS          = 0x28,         /* cardbus CIS pointer */
-       PciSVID         = 0x2C,         /* subsystem vendor ID */
-       PciSID          = 0x2E,         /* cardbus CIS pointer */
-       PciEBAR0        = 0x30,         /* expansion ROM base address */
-       PciMGNT         = 0x3E,         /* burst period length */
-       PciMLT          = 0x3F,         /* maximum latency between bursts */
+enum {                                                 /* type 0 pre-defined header */
+       PciCIS = 0x28,                          /* cardbus CIS pointer */
+       PciSVID = 0x2C, /* subsystem vendor ID */
+       PciSID = 0x2E,  /* cardbus CIS pointer */
+       PciEBAR0 = 0x30,        /* expansion ROM base address */
+       PciMGNT = 0x3E, /* burst period length */
+       PciMLT = 0x3F,  /* maximum latency between bursts */
 };
 
-enum {                                 /* type 1 pre-defined header */
-       PciPBN          = 0x18,         /* primary bus number */
-       PciSBN          = 0x19,         /* secondary bus number */
-       PciUBN          = 0x1A,         /* subordinate bus number */
-       PciSLTR         = 0x1B,         /* secondary latency timer */
-       PciIBR          = 0x1C,         /* I/O base */
-       PciILR          = 0x1D,         /* I/O limit */
-       PciSPSR         = 0x1E,         /* secondary status */
-       PciMBR          = 0x20,         /* memory base */
-       PciMLR          = 0x22,         /* memory limit */
-       PciPMBR         = 0x24,         /* prefetchable memory base */
-       PciPMLR         = 0x26,         /* prefetchable memory limit */
-       PciPUBR         = 0x28,         /* prefetchable base upper 32 bits */
-       PciPULR         = 0x2C,         /* prefetchable limit upper 32 bits */
-       PciIUBR         = 0x30,         /* I/O base upper 16 bits */
-       PciIULR         = 0x32,         /* I/O limit upper 16 bits */
-       PciEBAR1        = 0x28,         /* expansion ROM base address */
-       PciBCR          = 0x3E,         /* bridge control register */
+enum {                                                 /* type 1 pre-defined header */
+       PciPBN = 0x18,                          /* primary bus number */
+       PciSBN = 0x19,  /* secondary bus number */
+       PciUBN = 0x1A,  /* subordinate bus number */
+       PciSLTR = 0x1B, /* secondary latency timer */
+       PciIBR = 0x1C,  /* I/O base */
+       PciILR = 0x1D,  /* I/O limit */
+       PciSPSR = 0x1E, /* secondary status */
+       PciMBR = 0x20,  /* memory base */
+       PciMLR = 0x22,  /* memory limit */
+       PciPMBR = 0x24, /* prefetchable memory base */
+       PciPMLR = 0x26, /* prefetchable memory limit */
+       PciPUBR = 0x28, /* prefetchable base upper 32 bits */
+       PciPULR = 0x2C, /* prefetchable limit upper 32 bits */
+       PciIUBR = 0x30, /* I/O base upper 16 bits */
+       PciIULR = 0x32, /* I/O limit upper 16 bits */
+       PciEBAR1 = 0x28,        /* expansion ROM base address */
+       PciBCR = 0x3E,  /* bridge control register */
 };
 
-enum {                                 /* type 2 pre-defined header */
-       PciCBExCA       = 0x10,
-       PciCBSPSR       = 0x16,
-       PciCBPBN        = 0x18,         /* primary bus number */
-       PciCBSBN        = 0x19,         /* secondary bus number */
-       PciCBUBN        = 0x1A,         /* subordinate bus number */
-       PciCBSLTR       = 0x1B,         /* secondary latency timer */
-       PciCBMBR0       = 0x1C,
-       PciCBMLR0       = 0x20,
-       PciCBMBR1       = 0x24,
-       PciCBMLR1       = 0x28,
-       PciCBIBR0       = 0x2C,         /* I/O base */
-       PciCBILR0       = 0x30,         /* I/O limit */
-       PciCBIBR1       = 0x34,         /* I/O base */
-       PciCBILR1       = 0x38,         /* I/O limit */
-       PciCBSVID       = 0x40,         /* subsystem vendor ID */
-       PciCBSID        = 0x42,         /* subsystem ID */
-       PciCBLMBAR      = 0x44,         /* legacy mode base address */
+enum {                                                 /* type 2 pre-defined header */
+       PciCBExCA = 0x10,
+       PciCBSPSR = 0x16,
+       PciCBPBN = 0x18,        /* primary bus number */
+       PciCBSBN = 0x19,        /* secondary bus number */
+       PciCBUBN = 0x1A,        /* subordinate bus number */
+       PciCBSLTR = 0x1B,       /* secondary latency timer */
+       PciCBMBR0 = 0x1C,
+       PciCBMLR0 = 0x20,
+       PciCBMBR1 = 0x24,
+       PciCBMLR1 = 0x28,
+       PciCBIBR0 = 0x2C,       /* I/O base */
+       PciCBILR0 = 0x30,       /* I/O limit */
+       PciCBIBR1 = 0x34,       /* I/O base */
+       PciCBILR1 = 0x38,       /* I/O limit */
+       PciCBSVID = 0x40,       /* subsystem vendor ID */
+       PciCBSID = 0x42,        /* subsystem ID */
+       PciCBLMBAR = 0x44,      /* legacy mode base address */
 };
 
 /* capabilities */
 enum {
-       PciCapPMG       = 0x01,         /* power management */
-       PciCapAGP       = 0x02,
-       PciCapVPD       = 0x03,         /* vital product data */
-       PciCapSID       = 0x04,         /* slot id */
-       PciCapMSI       = 0x05,
-       PciCapCHS       = 0x06,         /* compact pci hot swap */
-       PciCapPCIX      = 0x07,
-       PciCapHTC       = 0x08,         /* hypertransport irq conf */
-       PciCapVND       = 0x09,         /* vendor specific information */
-       PciCapPCIe      = 0x10,
-       PciCapMSIX      = 0x11,
-       PciCapSATA      = 0x12,
-       PciCapHSW       = 0x0c,         /* hot swap */
+       PciCapPMG = 0x01,                       /* power management */
+       PciCapAGP = 0x02,
+       PciCapVPD = 0x03,       /* vital product data */
+       PciCapSID = 0x04,       /* slot id */
+       PciCapMSI = 0x05,
+       PciCapCHS = 0x06,       /* compact pci hot swap */
+       PciCapPCIX = 0x07,
+       PciCapHTC = 0x08,       /* hypertransport irq conf */
+       PciCapVND = 0x09,       /* vendor specific information */
+       PciCapPCIe = 0x10,
+       PciCapMSIX = 0x11,
+       PciCapSATA = 0x12,
+       PciCapHSW = 0x0c,       /* hot swap */
 };
 #if 0
-struct Pcisiz
-{
-//     Pcidev* dev;
-       int     siz;
-       int     bar;
+struct Pcisiz {
+//  Pcidev* dev;
+       int siz;
+       int bar;
 };
 
-struct Pcidev
-{
-       int     tbdf;                   /* type+bus+device+function */
-       ushort  vid;                    /* vendor ID */
-       ushort  did;                    /* device ID */
+struct Pcidev {
+       int tbdf;                                       /* type+bus+device+function */
+       ushort vid;                                     /* vendor ID */
+       ushort did;                                     /* device ID */
 
-       ushort  pcr;
+       ushort pcr;
 
-       uchar   rid;
-       uchar   ccrp;
-       uchar   ccru;
-       uchar   ccrb;
-       uchar   cls;
-       uchar   ltr;
+       uchar rid;
+       uchar ccrp;
+       uchar ccru;
+       uchar ccrb;
+       uchar cls;
+       uchar ltr;
 
        struct {
-               ulong   bar;            /* base address */
-               int     size;
+               ulong bar;                              /* base address */
+               int size;
        } mem[6];
 
        struct {
-               ulong   bar;
-               int     size;
+               ulong bar;
+               int size;
        } rom;
-       uchar   intl;                   /* interrupt line */
+       uchar intl;                                     /* interrupt line */
 
-       Pcidevlist;
-       Pcidev* link;                   /* next device on this bno */
+       Pcidev *list;
+       Pcidev *link;                           /* next device on this bno */
 
-       Pcidev* bridge;                 /* down a bus */
+       Pcidev *bridge;                         /* down a bus */
        struct {
-               ulong   bar;
-               int     size;
+               ulong bar;
+               int size;
        } ioa, mema;
 };
 #endif
@@ -318,4 +316,3 @@ struct Pcidev
 #define PCIWADDR(va)   (PADDR(va)+PCIWINDOW)
 #define ISAWINDOW      0
 #define ISAWADDR(va)   (PADDR(va)+ISAWINDOW)
-