| /** @file | |
| Public include file for Local APIC library. | |
| Local APIC library assumes local APIC is enabled. It does not | |
| handles cases where local APIC is disabled. | |
| Copyright (c) 2010 - 2023, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef __LOCAL_APIC_LIB_H__ | |
| #define __LOCAL_APIC_LIB_H__ | |
| #define LOCAL_APIC_MODE_XAPIC 0x1 ///< xAPIC mode. | |
| #define LOCAL_APIC_MODE_X2APIC 0x2 ///< x2APIC mode. | |
| /** | |
| Retrieve the base address of local APIC. | |
| @return The base address of local APIC. | |
| **/ | |
| UINTN | |
| EFIAPI | |
| GetLocalApicBaseAddress ( | |
| VOID | |
| ); | |
| /** | |
| Set the base address of local APIC. | |
| If BaseAddress is not aligned on a 4KB boundary, then ASSERT(). | |
| @param[in] BaseAddress Local APIC base address to be set. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SetLocalApicBaseAddress ( | |
| IN UINTN BaseAddress | |
| ); | |
| /** | |
| Get the current local APIC mode. | |
| If local APIC is disabled, then ASSERT. | |
| @retval LOCAL_APIC_MODE_XAPIC current APIC mode is xAPIC. | |
| @retval LOCAL_APIC_MODE_X2APIC current APIC mode is x2APIC. | |
| **/ | |
| UINTN | |
| EFIAPI | |
| GetApicMode ( | |
| VOID | |
| ); | |
| /** | |
| Set the current local APIC mode. | |
| If the specified local APIC mode is not valid, then ASSERT. | |
| If the specified local APIC mode can't be set as current, then ASSERT. | |
| @param ApicMode APIC mode to be set. | |
| @note This API must not be called from an interrupt handler or SMI handler. | |
| It may result in unpredictable behavior. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SetApicMode ( | |
| IN UINTN ApicMode | |
| ); | |
| /** | |
| Get the initial local APIC ID of the executing processor assigned by hardware upon power on or reset. | |
| In xAPIC mode, the initial local APIC ID may be different from current APIC ID. | |
| In x2APIC mode, the local APIC ID can't be changed and there is no concept of initial APIC ID. In this case, | |
| the 32-bit local APIC ID is returned as initial APIC ID. | |
| @return 32-bit initial local APIC ID of the executing processor. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetInitialApicId ( | |
| VOID | |
| ); | |
| /** | |
| Get the local APIC ID of the executing processor. | |
| @return 32-bit local APIC ID of the executing processor. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetApicId ( | |
| VOID | |
| ); | |
| /** | |
| Get the value of the local APIC version register. | |
| @return the value of the local APIC version register. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetApicVersion ( | |
| VOID | |
| ); | |
| /** | |
| Send a Fixed IPI to a specified target processor. | |
| This function returns after the IPI has been accepted by the target processor. | |
| @param ApicId The local APIC ID of the target processor. | |
| @param Vector The vector number of the interrupt being sent. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendFixedIpi ( | |
| IN UINT32 ApicId, | |
| IN UINT8 Vector | |
| ); | |
| /** | |
| Send a Fixed IPI to all processors excluding self. | |
| This function returns after the IPI has been accepted by the target processors. | |
| @param Vector The vector number of the interrupt being sent. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendFixedIpiAllExcludingSelf ( | |
| IN UINT8 Vector | |
| ); | |
| /** | |
| Send a SMI IPI to a specified target processor. | |
| This function returns after the IPI has been accepted by the target processor. | |
| @param ApicId Specify the local APIC ID of the target processor. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendSmiIpi ( | |
| IN UINT32 ApicId | |
| ); | |
| /** | |
| Send a SMI IPI to all processors excluding self. | |
| This function returns after the IPI has been accepted by the target processors. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendSmiIpiAllExcludingSelf ( | |
| VOID | |
| ); | |
| /** | |
| Send an INIT IPI to a specified target processor. | |
| This function returns after the IPI has been accepted by the target processor. | |
| @param ApicId Specify the local APIC ID of the target processor. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendInitIpi ( | |
| IN UINT32 ApicId | |
| ); | |
| /** | |
| Send an INIT IPI to all processors excluding self. | |
| This function returns after the IPI has been accepted by the target processors. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendInitIpiAllExcludingSelf ( | |
| VOID | |
| ); | |
| /** | |
| Send a Start-up IPI to all processors excluding self. | |
| This function returns after the IPI has been accepted by the target processors. | |
| if StartupRoutine >= 1M, then ASSERT. | |
| if StartupRoutine is not multiple of 4K, then ASSERT. | |
| @param StartupRoutine Points to a start-up routine which is below 1M physical | |
| address and 4K aligned. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendStartupIpiAllExcludingSelf ( | |
| IN UINT32 StartupRoutine | |
| ); | |
| /** | |
| Send an INIT-Start-up-Start-up IPI sequence to a specified target processor. | |
| This function returns after the IPI has been accepted by the target processor. | |
| if StartupRoutine >= 1M, then ASSERT. | |
| if StartupRoutine is not multiple of 4K, then ASSERT. | |
| @param ApicId Specify the local APIC ID of the target processor. | |
| @param StartupRoutine Points to a start-up routine which is below 1M physical | |
| address and 4K aligned. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendInitSipiSipi ( | |
| IN UINT32 ApicId, | |
| IN UINT32 StartupRoutine | |
| ); | |
| /** | |
| Send an INIT-Start-up-Start-up IPI sequence to all processors excluding self. | |
| This function returns after the IPI has been accepted by the target processors. | |
| if StartupRoutine >= 1M, then ASSERT. | |
| if StartupRoutine is not multiple of 4K, then ASSERT. | |
| @param StartupRoutine Points to a start-up routine which is below 1M physical | |
| address and 4K aligned. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendInitSipiSipiAllExcludingSelf ( | |
| IN UINT32 StartupRoutine | |
| ); | |
| /** | |
| Initialize the state of the SoftwareEnable bit in the Local APIC | |
| Spurious Interrupt Vector register. | |
| @param Enable If TRUE, then set SoftwareEnable to 1 | |
| If FALSE, then set SoftwareEnable to 0. | |
| **/ | |
| VOID | |
| EFIAPI | |
| InitializeLocalApicSoftwareEnable ( | |
| IN BOOLEAN Enable | |
| ); | |
| /** | |
| Programming Virtual Wire Mode. | |
| This function programs the local APIC for virtual wire mode following | |
| the example described in chapter A.3 of the MP 1.4 spec. | |
| IOxAPIC is not involved in this type of virtual wire mode. | |
| **/ | |
| VOID | |
| EFIAPI | |
| ProgramVirtualWireMode ( | |
| VOID | |
| ); | |
| /** | |
| Disable LINT0 & LINT1 interrupts. | |
| This function sets the mask flag in the LVT LINT0 & LINT1 registers. | |
| **/ | |
| VOID | |
| EFIAPI | |
| DisableLvtInterrupts ( | |
| VOID | |
| ); | |
| /** | |
| Read the initial count value from the init-count register. | |
| @return The initial count value read from the init-count register. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetApicTimerInitCount ( | |
| VOID | |
| ); | |
| /** | |
| Read the current count value from the current-count register. | |
| @return The current count value read from the current-count register. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetApicTimerCurrentCount ( | |
| VOID | |
| ); | |
| /** | |
| Initialize the local APIC timer. | |
| The local APIC timer is initialized and enabled. | |
| @param DivideValue The divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. | |
| If it is 0, then use the current divide value in the DCR. | |
| @param InitCount The initial count value. | |
| @param PeriodicMode If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. | |
| @param Vector The timer interrupt vector number. | |
| **/ | |
| VOID | |
| EFIAPI | |
| InitializeApicTimer ( | |
| IN UINTN DivideValue, | |
| IN UINT32 InitCount, | |
| IN BOOLEAN PeriodicMode, | |
| IN UINT8 Vector | |
| ); | |
| /** | |
| Get the state of the local APIC timer. | |
| @param DivideValue Return the divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. | |
| @param PeriodicMode Return the timer mode. If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. | |
| @param Vector Return the timer interrupt vector number. | |
| **/ | |
| VOID | |
| EFIAPI | |
| GetApicTimerState ( | |
| OUT UINTN *DivideValue OPTIONAL, | |
| OUT BOOLEAN *PeriodicMode OPTIONAL, | |
| OUT UINT8 *Vector OPTIONAL | |
| ); | |
| /** | |
| Enable the local APIC timer interrupt. | |
| **/ | |
| VOID | |
| EFIAPI | |
| EnableApicTimerInterrupt ( | |
| VOID | |
| ); | |
| /** | |
| Disable the local APIC timer interrupt. | |
| **/ | |
| VOID | |
| EFIAPI | |
| DisableApicTimerInterrupt ( | |
| VOID | |
| ); | |
| /** | |
| Get the local APIC timer interrupt state. | |
| @retval TRUE The local APIC timer interrupt is enabled. | |
| @retval FALSE The local APIC timer interrupt is disabled. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| GetApicTimerInterruptState ( | |
| VOID | |
| ); | |
| /** | |
| Send EOI to the local APIC. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SendApicEoi ( | |
| VOID | |
| ); | |
| /** | |
| Get the 32-bit address that a device should use to send a Message Signaled | |
| Interrupt (MSI) to the Local APIC of the currently executing processor. | |
| @return 32-bit address used to send an MSI to the Local APIC. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetApicMsiAddress ( | |
| VOID | |
| ); | |
| /** | |
| Get the 64-bit data value that a device should use to send a Message Signaled | |
| Interrupt (MSI) to the Local APIC of the currently executing processor. | |
| If Vector is not in range 0x10..0xFE, then ASSERT(). | |
| If DeliveryMode is not supported, then ASSERT(). | |
| @param Vector The 8-bit interrupt vector associated with the MSI. | |
| Must be in the range 0x10..0xFE | |
| @param DeliveryMode A 3-bit value that specifies how the recept of the MSI | |
| is handled. The only supported values are: | |
| 0: LOCAL_APIC_DELIVERY_MODE_FIXED | |
| 1: LOCAL_APIC_DELIVERY_MODE_LOWEST_PRIORITY | |
| 2: LOCAL_APIC_DELIVERY_MODE_SMI | |
| 4: LOCAL_APIC_DELIVERY_MODE_NMI | |
| 5: LOCAL_APIC_DELIVERY_MODE_INIT | |
| 7: LOCAL_APIC_DELIVERY_MODE_EXTINT | |
| @param LevelTriggered TRUE specifies a level triggered interrupt. | |
| FALSE specifies an edge triggered interrupt. | |
| @param AssertionLevel Ignored if LevelTriggered is FALSE. | |
| TRUE specifies a level triggered interrupt that active | |
| when the interrupt line is asserted. | |
| FALSE specifies a level triggered interrupt that active | |
| when the interrupt line is deasserted. | |
| @return 64-bit data value used to send an MSI to the Local APIC. | |
| **/ | |
| UINT64 | |
| EFIAPI | |
| GetApicMsiValue ( | |
| IN UINT8 Vector, | |
| IN UINTN DeliveryMode, | |
| IN BOOLEAN LevelTriggered, | |
| IN BOOLEAN AssertionLevel | |
| ); | |
| /** | |
| Get Package ID/Core ID/Thread ID of a processor. | |
| The algorithm assumes the target system has symmetry across physical | |
| package boundaries with respect to the number of logical processors | |
| per package, number of cores per package. | |
| @param[in] InitialApicId Initial APIC ID of the target logical processor. | |
| @param[out] Package Returns the processor package ID. | |
| @param[out] Core Returns the processor core ID. | |
| @param[out] Thread Returns the processor thread ID. | |
| **/ | |
| VOID | |
| EFIAPI | |
| GetProcessorLocationByApicId ( | |
| IN UINT32 InitialApicId, | |
| OUT UINT32 *Package OPTIONAL, | |
| OUT UINT32 *Core OPTIONAL, | |
| OUT UINT32 *Thread OPTIONAL | |
| ); | |
| /** | |
| Get Package ID/Module ID/Tile ID/Die ID/Core ID/Thread ID of a processor. | |
| The algorithm assumes the target system has symmetry across physical | |
| package boundaries with respect to the number of threads per core, number of | |
| cores per module, number of modules per tile, number of tiles per die, number | |
| of dies per package. | |
| @param[in] InitialApicId Initial APIC ID of the target logical processor. | |
| @param[out] Package Returns the processor package ID. | |
| @param[out] Die Returns the processor die ID. | |
| @param[out] Tile Returns the processor tile ID. | |
| @param[out] Module Returns the processor module ID. | |
| @param[out] Core Returns the processor core ID. | |
| @param[out] Thread Returns the processor thread ID. | |
| **/ | |
| VOID | |
| EFIAPI | |
| GetProcessorLocation2ByApicId ( | |
| IN UINT32 InitialApicId, | |
| OUT UINT32 *Package OPTIONAL, | |
| OUT UINT32 *Die OPTIONAL, | |
| OUT UINT32 *Tile OPTIONAL, | |
| OUT UINT32 *Module OPTIONAL, | |
| OUT UINT32 *Core OPTIONAL, | |
| OUT UINT32 *Thread OPTIONAL | |
| ); | |
| #endif |