108 lines
2.6 KiB
C
108 lines
2.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
msi.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file defines structures and data types used by the
|
||
|
MSI (Message Signalled Interrupt) support
|
||
|
functionality of the ACPI IRQ arbiter.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Elliot Shmukler (t-ellios) 7-15-98
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode only.
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _ACPI_MSI_H_
|
||
|
#define _ACPI_MSI_H_
|
||
|
|
||
|
//
|
||
|
// APIC Version Register
|
||
|
//
|
||
|
struct _ApicVersion {
|
||
|
UCHAR Version; // either 0.x or 1.x
|
||
|
UCHAR Reserved1:7;
|
||
|
UCHAR MSICapable:1; // is this APIC an MSI receiver?
|
||
|
UCHAR MaxRedirEntries; // Number of INTIs on unit
|
||
|
UCHAR Reserved2;
|
||
|
};
|
||
|
|
||
|
typedef struct _ApicVersion APIC_VERSION, *PAPIC_VERSION;
|
||
|
|
||
|
//
|
||
|
// The Offset from the IO APIC base address of the APIC Assertion Register.
|
||
|
// It is this register that is the target of MSI writes.
|
||
|
//
|
||
|
|
||
|
#define APIC_ASSERTION_REGISTER_OFFSET 0x20
|
||
|
|
||
|
//
|
||
|
// Useful info maintained by the arbiter about an individual IO APIC
|
||
|
//
|
||
|
|
||
|
typedef struct _IOAPIC_MSI_INFO
|
||
|
{
|
||
|
BOOLEAN MSICapable; // Is this IO APIC an MSI receiver?
|
||
|
ULONG VectorBase; // The Global System Interrupt Vector base for this APIC
|
||
|
ULONG MaxVectors; // The number of vectors supported by this APIC
|
||
|
ULONG BaseAddress; // The IO APIC Unit base address
|
||
|
|
||
|
} IOAPIC_MSI_INFO, *PIOAPIC_MSI_INFO;
|
||
|
|
||
|
//
|
||
|
// MSI information structure
|
||
|
// (basically the APIC information needed for MSI vector allocation
|
||
|
// & routing)
|
||
|
//
|
||
|
|
||
|
typedef struct _MSI_INFORMATION
|
||
|
{
|
||
|
BOOLEAN PRTMappingsScanned; // Have we determined the _PRT mapped vectors?
|
||
|
PRTL_BITMAP PRTMappedVectors; // A BitMap of the vectors mapped by the _PRT
|
||
|
USHORT NumIOApics; // The number of IO APICs in this system
|
||
|
IOAPIC_MSI_INFO ApicInfo[ANYSIZE_ARRAY]; // Information about each IO APIC in the system
|
||
|
} MSI_INFORMATION, *PMSI_INFORMATION;
|
||
|
|
||
|
//
|
||
|
// Global variable to hold MSI information
|
||
|
// (this is non-NULL only if this system supports MSI)
|
||
|
//
|
||
|
|
||
|
extern PMSI_INFORMATION MsiInformation;
|
||
|
|
||
|
//
|
||
|
// Prototype of a callback used by AcpiArbFindAndProcessEachPRT to initiate the processing
|
||
|
// of each PRT it finds
|
||
|
//
|
||
|
|
||
|
|
||
|
typedef
|
||
|
VOID
|
||
|
(*PACPI_ARB_PROCESS_PRT)(IN PSNOBJ);
|
||
|
|
||
|
|
||
|
// Prototypes from msi.c (used by arbiter)
|
||
|
|
||
|
VOID AcpiMSIInitializeInfo(VOID);
|
||
|
BOOLEAN AcpiMSIFindAvailableVector(OUT PULONG Vector);
|
||
|
BOOLEAN AcpiMSICreateRoutingToken(IN ULONG Vector, IN OUT PROUTING_TOKEN Token);
|
||
|
|
||
|
VOID AcpiArbFindAndProcessEachPRT(IN PDEVICE_OBJECT Root,
|
||
|
IN PACPI_ARB_PROCESS_PRT ProcessCallback
|
||
|
);
|
||
|
VOID AcpiMSIExtractMappedVectorsFromPRT(IN PNSOBJ prtObj);
|
||
|
|
||
|
|
||
|
#endif
|