/** @file
IoApic policy
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _IOAPIC_CONFIG_H_
#define _IOAPIC_CONFIG_H_
#define IOAPIC_CONFIG_REVISION 1
extern EFI_GUID gIoApicConfigGuid;
#pragma pack (push,1)
/**
The PCH_IOAPIC_CONFIG block describes the expected configuration of the PCH
IO APIC, it's optional and PCH code would ignore it if the BdfValid bit is
not TRUE. Bus:device:function fields will be programmed to the register
P2SB IBDF(P2SB PCI offset R6Ch-6Dh), it's using for the following purpose:
As the Requester ID when initiating Interrupt Messages to the processor.
As the Completer ID when responding to the reads targeting the IOxAPI's
Memory-Mapped I/O registers.
This field defaults to Bus 0: Device 31: Function 0 after reset. BIOS can
program this field to provide a unique Bus:Device:Function number for the
internal IOxAPIC.
The address resource range of IOAPIC must be reserved in E820 and ACPI as
system resource.
**/
typedef struct {
/**
Revision 1: Init version
**/
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
UINT32 BdfValid : 1; ///< Set to 1 if BDF value is valid, PCH code will not program these fields if this bit is not TRUE. 0: Disable; 1: Enable.
UINT32 RsvdBits0 : 7; ///< Reserved bits
UINT32 BusNumber : 8; ///< Bus/Device/Function used as Requestor / Completer ID. Default is 0xF0.
UINT32 DeviceNumber : 5; ///< Bus/Device/Function used as Requestor / Completer ID. Default is 0x1F.
UINT32 FunctionNumber : 3; ///< Bus/Device/Function used as Requestor / Completer ID. Default is 0x00.
UINT32 IoApicEntry24_119 : 1; ///< 0: Disable; 1: Enable IOAPIC Entry 24-119
/**
Enable 8254 Static Clock Gating during early POST time. 0: Disable, 1: Enable
Set 8254CGE=1 in POST time might fail to boot legacy OS which using 8254 timer.
Make sure it won't break legacy OS boot before enabling this.
**/
UINT32 Early8254ClockGatingEnable : 1;
UINT32 RsvdBits1 : 6; ///< Reserved bits
UINT8 IoApicId; ///< This member determines IOAPIC ID. Default is 0x02.
UINT8 ApicRangeSelect; ///< Define address bits 19:12 for the IOxAPIC range. Default is 0
UINT8 Rsvd0[2]; ///< Reserved bytes
} PCH_IOAPIC_CONFIG;
#pragma pack (pop)
#endif // _IOAPIC_CONFIG_H_