You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
4.9 KiB
210 lines
4.9 KiB
/*++
|
|
|
|
Module Name:
|
|
|
|
iosapic.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the definitions used by HAL to manipulate
|
|
the IO SAPIC interrupt controller and SAPIC-specific constants.
|
|
|
|
Author:
|
|
|
|
Todd Kjos (v-tkjos) 1-30-98
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define STATIC
|
|
|
|
#include "halp.h"
|
|
#include "acpitabl.h"
|
|
|
|
//
|
|
// MPS INTi Flags related macros:
|
|
//
|
|
// Warning: these definitions do not consider the POLARITY or EL comformity with bus.
|
|
//
|
|
|
|
#define IS_LEVEL_TRIGGERED_MPS(vectorFlags) \
|
|
((vectorFlags & EL_LEVEL_TRIGGERED) == EL_LEVEL_TRIGGERED)
|
|
|
|
#define IS_EDGE_TRIGGERED_MPS(vectorFlags) \
|
|
((vectorFlags & EL_EDGE_TRIGGERED) == EL_EDGE_TRIGGERED)
|
|
|
|
#define IS_ACTIVE_LOW_MPS(vectorFlags) \
|
|
((vectorFlags & POLARITY_LOW) == POLARITY_LOW)
|
|
|
|
#define IS_ACTIVE_HIGH_MPS(vectorFlags) \
|
|
((vectorFlags & POLARITY_HIGH) == POLARITY_HIGH)
|
|
|
|
typedef struct {
|
|
ULONG GlobalVector; // This is Node+IDT vector value seen by kernel
|
|
ULONG Vector; // Bits 31:0 of the Rte entry (IDT vector+polarity...)
|
|
ULONG Destination; // Bits 63:32 of Rte entry
|
|
} IOSAPICINTI, *PIOSAPICINTI;
|
|
|
|
typedef struct _INTR_METHODS INTR_METHODS, *PINTR_METHODS;
|
|
|
|
typedef struct _IO_INTR_CONTROL IO_INTR_CONTROL, *PIO_INTR_CONTROL;
|
|
|
|
typedef VOID (*PINTRMETHOD) (PIO_INTR_CONTROL,ULONG);
|
|
typedef volatile ULONG * (*PGETEOI) (PIO_INTR_CONTROL);
|
|
|
|
struct _INTR_METHODS {
|
|
PINTRMETHOD MaskEntry;
|
|
PINTRMETHOD SetEntry;
|
|
PINTRMETHOD EnableEntry;
|
|
};
|
|
|
|
//
|
|
// External interrupt controller structure.
|
|
//
|
|
struct _IO_INTR_CONTROL {
|
|
ULONG IntiBase;
|
|
ULONG IntiMax;
|
|
ULONG InterruptAffinity;
|
|
PVOID RegBaseVirtual;
|
|
PHYSICAL_ADDRESS RegBasePhysical;
|
|
PINTR_METHODS IntrMethods;
|
|
PIO_INTR_CONTROL flink;
|
|
USHORT FreeVectors[16];
|
|
IOSAPICINTI Inti[ANYSIZE_ARRAY];
|
|
};
|
|
|
|
extern struct _MPINFO HalpMpInfo;
|
|
extern PIO_INTR_CONTROL HalpIoSapicList;
|
|
extern INTR_METHODS HalpIoSapicMethods;
|
|
|
|
//
|
|
// IO Unit definition
|
|
//
|
|
typedef struct {
|
|
volatile ULONG RegisterSelect; // Write register number to access register
|
|
volatile ULONG Reserved1[3];
|
|
volatile ULONG RegisterWindow; // Data read/written here
|
|
volatile ULONG Reserved2[3];
|
|
volatile ULONG Reserved3[8];
|
|
volatile ULONG Eoi; // EOI register for level triggered interrupts
|
|
} IO_SAPIC_REGS, *PIO_SAPIC_REGS;
|
|
|
|
//
|
|
// IO SAPIC Version Register
|
|
//
|
|
|
|
struct SapicVersion {
|
|
UCHAR Version; // either 0.x or 1.x
|
|
UCHAR Reserved1;
|
|
UCHAR MaxRedirEntries; // Number of INTIs on unit
|
|
UCHAR Reserved2;
|
|
};
|
|
|
|
typedef struct SapicVersion SAPIC_VERSION, *PSAPIC_VERSION;
|
|
|
|
BOOLEAN
|
|
HalpGetSapicInterruptDesc (
|
|
IN INTERFACE_TYPE BusType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG BusInterruptLevel,
|
|
OUT PULONG SapicInti,
|
|
OUT PKAFFINITY InterruptAffinity
|
|
);
|
|
|
|
VOID
|
|
HalpGetFreeVectors(
|
|
IN ULONG InterruptInput,
|
|
OUT PUSHORT *FreeVectors
|
|
);
|
|
|
|
VOID
|
|
HalpSetVectorAllocated(
|
|
IN ULONG InterruptInput,
|
|
IN UCHAR Vector
|
|
);
|
|
|
|
VOID
|
|
HalpEnableRedirEntry(
|
|
ULONG Inti
|
|
);
|
|
|
|
VOID
|
|
HalpDisableRedirEntry(
|
|
ULONG Inti
|
|
);
|
|
|
|
VOID
|
|
HalpWriteRedirEntry (
|
|
IN ULONG GlobalInterrupt,
|
|
IN UCHAR SapicVector,
|
|
IN USHORT DestinationCPU,
|
|
IN ULONG Flags,
|
|
IN ULONG InterruptType
|
|
);
|
|
|
|
BOOLEAN
|
|
HalpIsActiveLow(
|
|
ULONG Inti
|
|
);
|
|
|
|
BOOLEAN
|
|
HalpIsLevelTriggered(
|
|
ULONG Inti
|
|
);
|
|
|
|
VOID
|
|
HalpSetPolarity(
|
|
ULONG Inti,
|
|
BOOLEAN ActiveLow
|
|
);
|
|
|
|
VOID
|
|
HalpSetLevel(
|
|
ULONG Inti,
|
|
BOOLEAN LevelTriggered
|
|
);
|
|
|
|
//
|
|
// I/O SAPIC defines
|
|
//
|
|
|
|
#define IO_REGISTER_SELECT 0x00000000
|
|
#define IO_REGISTER_WINDOW 0x00000010
|
|
#define IO_EOI_REGISTER 0x00000040
|
|
|
|
#define IO_ID_REGISTER 0x00000000 // Exists, but ignored by SAPIC
|
|
#define IO_VERS_REGISTER 0x00000001
|
|
#define IO_REDIR_00_LOW 0x00000010
|
|
#define IO_REDIR_00_HIGH 0x00000011
|
|
|
|
#define IO_MAX_REDIR_MASK 0x00FF0000
|
|
#define IO_VERSION_MASK 0x000000FF
|
|
|
|
#define SAPIC_ID_MASK 0xFF000000
|
|
#define SAPIC_ID_SHIFT 24
|
|
#define SAPIC_EID_MASK 0x00FF0000
|
|
#define SAPIC_EID_SHIFT 16
|
|
#define SAPIC_XID_MASK 0xFFFF0000
|
|
#define SAPIC_XID_SHIFT 16
|
|
|
|
#define INT_VECTOR_MASK 0x000000FF
|
|
#define DELIVER_FIXED 0x00000000
|
|
#define DELIVER_LOW_PRIORITY 0x00000100
|
|
#define DELIVER_SMI 0x00000200
|
|
#define DELIVER_NMI 0x00000400
|
|
#define DELIVER_INIT 0x00000500
|
|
#define DELIVER_EXTINT 0x00000700
|
|
#define INT_TYPE_MASK 0x00000700
|
|
#define ACTIVE_LOW 0x00002000
|
|
#define ACTIVE_HIGH 0x00000000
|
|
#define LEVEL_TRIGGERED 0x00008000
|
|
#define EDGE_TRIGGERED 0x00000000
|
|
#define INTERRUPT_MASKED 0x00010000
|
|
#define INTERRUPT_MOT_MASKED 0x00000000
|
|
|
|
#define MAX_INTR_VECTOR 256
|