252 lines
9.5 KiB
C
252 lines
9.5 KiB
C
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
Copyright (c) 1994 Digital Equipment Corporation
|
|
|
|
Module Name:
|
|
|
|
pintolin.h
|
|
|
|
Abstract:
|
|
|
|
This file includes the platform-dependent Pin To Line Table
|
|
for Mikasa.
|
|
|
|
Author:
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
James Livingston (Digital) 10-May-1994
|
|
Extracted Mikasa-specific table from the combined table
|
|
of pin-to-line assignments.
|
|
|
|
Janet Schneider (Digital) 27-July-1995
|
|
Added support for the Noritake.
|
|
|
|
Scott Lee (Digital) 15-July-1996
|
|
Added support for Corelle.
|
|
|
|
--*/
|
|
|
|
//
|
|
// This table represents the mapping from slot number and interrupt pin
|
|
// into a PCI Interrupt Vector.
|
|
//
|
|
// On platforms that use an interrupt register or registers instead of,
|
|
// or in addition to cascaded 85c59s, the Interrupt Vector is one greater
|
|
// than the Interrupt Request Register bit, because interrupt vectors
|
|
// can't be zero, and bits in a register are numbered from zero. On
|
|
// Mikasa, the Interrupt Vector also represents the Interrupt Mask
|
|
// Register bit, since the arrangement of its bits is identical to
|
|
// that of the Interrupt Read Register.
|
|
//
|
|
// Formally, these mappings can be expressed as:
|
|
//
|
|
// PCIPinToLine:
|
|
// (SlotNumber.DeviceNumber, InterruptPin) -> InterruptLine
|
|
//
|
|
// LineToVector:
|
|
// InterruptLine -> InterruptVector
|
|
//
|
|
// VectorToIRRBit:
|
|
// InterruptVector -> InterruptRequestRegisterBit + 1
|
|
//
|
|
// VectorToIMRBit:
|
|
// InterruptVector -> InterruptMaskRegisterBit + 1
|
|
//
|
|
// SlotNumberToIDSEL:
|
|
// SlotNumber.DeviceNumber -> IDSEL
|
|
//
|
|
// subject to:
|
|
//
|
|
// Slot.DeviceNumber in {0,...,15}
|
|
//
|
|
// InterruptPin in {1, 2, 3, 4}
|
|
//
|
|
// InterruptRequestRegisterBit in {0,...,15}
|
|
//
|
|
// InterruptMaskRegisterBit in {0,...,15}
|
|
//
|
|
// PCIPinToLine(SlotNumber.DeviceNumber, InterruptPin) =
|
|
// PCIPinToLineTable[SlotNumber.DeviceNumber, InterruptPin]
|
|
// (Table for lookup function is initialized below)
|
|
//
|
|
// LineToVector(InterruptLine) = PCI_VECTORS + InterruptLine
|
|
//
|
|
// VectorToIRRBit(InterruptVector) = InterruptVector - 1
|
|
//
|
|
// VectorToIMRBit(InterruptVector) [see below]
|
|
//
|
|
// SlotNumberToIDSEL(SlotNumber.DeviceNumber) = (Slot.DeviceNumber + 11)
|
|
//
|
|
// where:
|
|
//
|
|
// SlotNumber.DeviceNumber:
|
|
// Alpha AXP Platforms receive interrupts on local PCI buses only, which
|
|
// are limited to 16 devices (PCI AD[11]-AD[26]).
|
|
//
|
|
// InterruptPin:
|
|
// Each virtual slot has up to four interrupt pins INTA#, INTB#, INTC#,
|
|
// INTD#, per the PCI Spec. V2.0, Section 2.2.6. Devices having one
|
|
// interrupt use INTA#; only multifunction devices use INTB#, INTC#,
|
|
// INTD#.)
|
|
//
|
|
// PCI configuration space indicates which interrupt pin a device will use
|
|
// in the InterruptPin register, which can have the values:
|
|
//
|
|
// INTA# = 1, INTB# = 2, INTC# = 3, INTD# = 4
|
|
//
|
|
// Note that there may be up to 8 functions/device on a PCI multifunction
|
|
// device plugged into the option slots. Each function has its own PCI
|
|
// configuration space, addressed by the SlotNumber.FunctionNumber field,
|
|
// and will identify which interrput pin of the four it will use in its
|
|
// own InterruptPin register.
|
|
//
|
|
// If the option is a PCI-PCI bridge, interrupts from "downstream" PCI
|
|
// slots must somehow be combined to appear on some combination of the
|
|
// four interrupt pins belonging to the bridge's slot.
|
|
//
|
|
// InterruptLine:
|
|
// This PCI Configuration register is maintained by software, and holds
|
|
// an offset into PCI interrupt vectors. Whenever HalGetBusData or
|
|
// HalGetBusDataByOffset is called, HalpPCIPinToLine() computes the
|
|
// correct InterruptLine register value by using the mapping in
|
|
// HalpPCIPinToLineTable.
|
|
//
|
|
// InterruptRequestRegisterBit:
|
|
// In the table, 0xff is used to mark an invalid cell; this cell cannot
|
|
// be used to produce an interrupt request register bit.
|
|
//
|
|
// InterruptMaskRegisterBit:
|
|
// On Mikasa, the pin-to-line table may also be used to write the
|
|
// InterruptMaskRegister, via
|
|
//
|
|
// VectorToIMRBit(InterrruptVector) = InterruptVector - 1
|
|
//
|
|
// IDSEL:
|
|
// For accessing PCI configuration space on a local PCI bus (as opposed
|
|
// to over a PCI-PCI bridge), type 0 configuration cycles must be generated.
|
|
// In this case, the IDSEL pin of the device to be accessed is tied to one
|
|
// of the PCI Address lines AD[11] - AD[26]. (The function field in the
|
|
// PCI address is used, should we be accessing a multifunction device.)
|
|
// Virtual slot 0 represents the device with IDSEL = AD[11], and so on.
|
|
//
|
|
//
|
|
// Interrupt Vector Table Mapping for Mikasa.
|
|
//
|
|
// Mikasa PCI interrupts are mapped to interrupt vectors in the table
|
|
// below. The values are a 1-1 map of the bit numbers in the Mikasa
|
|
// PCI interrupt register that are connected to PCI devices.
|
|
//
|
|
// N.B.: there are two other interrupts in the Mikasa IRR/IMR, but they
|
|
// are not connected to I/O devices, and have no associated PCI virtual
|
|
// slot, so they're not represented in the table. Entries in the table
|
|
// are interrupt vector values for the device having the given virtual
|
|
// slot and pin number.
|
|
//
|
|
// Limit init table to 15 entries, which is the
|
|
// MAX_PCI_LOCAL_DEVICES_MIKASA.
|
|
//
|
|
// We won't ever try to set an InterruptLine register of a slot
|
|
// greater than Virtual slot 15 = PCI_AD[25].
|
|
//
|
|
|
|
PULONG HalpPCIPinToLineTable;
|
|
|
|
ULONG MikasaPCIPinToLineTable[][4]=
|
|
{
|
|
// Pin 1 Pin 2 Pin 3 Pin 4
|
|
// ----- ----- ----- -----
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 0 = PCI_AD[11]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 1 = PCI_AD[12]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 2 = PCI_AD[13]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 3 = PCI_AD[14]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 4 = PCI_AD[15]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 5 = PCI_AD[16]
|
|
{ 0xd, 0xff, 0xff, 0xff }, // Virtual Slot 6 = PCI_AD[17] SCSI
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 7 = PCI_AD[18] ESC
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 8 = PCI_AD[19]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 9 = PCI_AD[20]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 10 = PCI_AD[21]
|
|
{ 0x1, 0x2, 0x3, 0x4 }, // Virtual Slot 11 = PCI_AD[22] Slot #0
|
|
{ 0x5, 0x6, 0x7, 0x8 }, // Virtual Slot 12 = PCI_AD[23] Slot #1
|
|
{ 0x9, 0xa, 0xb, 0xc }, // Virtual Slot 13 = PCI_AD[24] Slot #2
|
|
{ 0xff, 0xff, 0xff, 0xff } // Virtual Slot 14 = PCI_AD[25]
|
|
};
|
|
|
|
|
|
//
|
|
// Limit init table to 15 entries, which is the MAX_PCI_LOCAL_DEVICES_MIKASA.
|
|
// (It is same for Noritake.)
|
|
//
|
|
// We won't ever try to set an InterruptLine register of a slot
|
|
// greater than Virtual slot 14 = PCI_AD[25] on bus 0.
|
|
//
|
|
// Noritake PCI interrupts will be no lower than 0x11 so that they are disjoint
|
|
// from EISA levels.
|
|
//
|
|
|
|
ULONG NoritakePCIPinToLineTable0[][4]=
|
|
{
|
|
// Pin 1 Pin 2 Pin 3 Pin 4
|
|
// ----- ----- ----- -----
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 0 = PCI_AD[11]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 1 = PCI_AD[12]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 2 = PCI_AD[13]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 3 = PCI_AD[14]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 4 = PCI_AD[15]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 5 = PCI_AD[16]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 6 = PCI_AD[17]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 7 = PCI_AD[18] PCEB
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 8 = PCI_AD[19] PCI-PCI Bridge
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 9 = PCI_AD[20]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 10 = PCI_AD[21]
|
|
{ 0x13, 0x14, 0x23, 0x24 }, // Virtual Slot 11 = PCI_AD[22] Slot 0
|
|
{ 0x15, 0x16, 0x25, 0x26 }, // Virtual Slot 12 = PCI_AD[23] Slot 1
|
|
{ 0x17, 0x18, 0x27, 0x28 }, // Virtual Slot 13 = PCI_AD[24] Slot 2
|
|
{ 0xff, 0xff, 0xff, 0xff } // Virtual Slot 14 = PCI_AD[25]
|
|
};
|
|
|
|
|
|
ULONG NoritakePCIPinToLineTable1[][4]=
|
|
{
|
|
// Pin 1 Pin 2 Pin 3 Pin 4
|
|
// ----- ----- ----- -----
|
|
{ 0x12, 0xff, 0xff, 0xff }, // Virtual Slot 0 = PCI_AD[16] QLogic
|
|
{ 0x19, 0x1a, 0x29, 0x2a }, // Virtual Slot 1 = PCI_AD[17] Slot 3
|
|
{ 0x1b, 0x1c, 0x2b, 0x2c }, // Virtual Slot 2 = PCI_AD[18] Slot 4
|
|
{ 0x1d, 0x1e, 0x2d, 0x2e }, // Virtual Slot 3 = PCI_AD[19] Slot 5
|
|
{ 0x1f, 0x20, 0x2f, 0x30 } // Virtual Slot 4 = PCI_AD[20] Slot 6
|
|
};
|
|
|
|
//
|
|
// Define the pintolin table for Corelle.
|
|
//
|
|
|
|
ULONG CorellePCIPinToLineTable[][4]=
|
|
{
|
|
// Pin 1 Pin 2 Pin 3 Pin 4
|
|
// ----- ----- ----- -----
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 0 = PCI_AD[11]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 1 = PCI_AD[12]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 2 = PCI_AD[13]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 3 = PCI_AD[14]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 4 = PCI_AD[15]
|
|
{ 0x11, 0xff, 0xff, 0xff }, // Virtual Slot 5 = PCI_AD[16] QLogic
|
|
{ 0x1a, 0xff, 0xff, 0xff }, // Virtual Slot 6 = PCI_AD[17] S3 Trio 64
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 7 = PCI_AD[18] PCEB
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 8 = PCI_AD[19]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 9 = PCI_AD[20]
|
|
{ 0xff, 0xff, 0xff, 0xff }, // Virtual Slot 10 = PCI_AD[21]
|
|
{ 0x12, 0x13, 0x22, 0x23 }, // Virtual Slot 11 = PCI_AD[22] Slot #0
|
|
{ 0x14, 0x15, 0x24, 0x25 }, // Virtual Slot 12 = PCI_AD[23] Slot #1
|
|
{ 0x16, 0x17, 0x26, 0x27 }, // Virtual Slot 13 = PCI_AD[24] Slot #2
|
|
{ 0x18, 0x19, 0x28, 0x29 } // Virtual Slot 14 = PCI_AD[25] Slot #3
|
|
};
|
|
|
|
|