summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Ersek <lersek@redhat.com>2023-11-11 00:58:05 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-12-07 18:04:57 +0000
commitbc495d89d4ad1615946fd5a5dd1dcc4f69c8c4e9 (patch)
tree69fc10fafe79983b3d70362855e90f14bebf076b
parent86cc0f15d9b120c435e285b38df0072ca404522b (diff)
downloadedk2-bc495d89d4ad1615946fd5a5dd1dcc4f69c8c4e9.tar.gz
edk2-bc495d89d4ad1615946fd5a5dd1dcc4f69c8c4e9.tar.bz2
edk2-bc495d89d4ad1615946fd5a5dd1dcc4f69c8c4e9.zip
OvmfPkg: remove CsmSupportLib
CsmSupportLib is not used by any platform at this point, remove it. This patch removes mentions of the following CSM resources from the source code [*]: - GUIDs (protocols or otherwise): - SYSTEM_ROM_FILE_GUID (1547B4F3-3E8A-4FEF-81C8-328ED647AB1A) - gEfiFirmwareVolumeProtocolGuid (by cutting the <Protocol/FirmwareVolume.h> link) - gEfiLegacyBiosPlatformProtocolGuid - gEfiLegacyBiosProtocolGuid - gEfiLegacyInterruptProtocolGuid - headers: - FrameworkDxe.h - Protocol/FirmwareVolume.h - Protocol/LegacyBiosPlatform.h - Protocol/LegacyInterrupt.h which extends the list of resources scheduled for removal to: - GUIDs (protocols or otherwise): - SYSTEM_ROM_FILE_GUID (1547B4F3-3E8A-4FEF-81C8-328ED647AB1A) - gEfiFirmwareVolumeProtocolGuid - gEfiLegacy8259ProtocolGuid - gEfiLegacyBiosPlatformProtocolGuid - gEfiLegacyBiosProtocolGuid - gEfiLegacyInterruptProtocolGuid - headers: - FrameworkDxe.h - Protocol/FirmwareVolume.h - Protocol/Legacy8259.h - Protocol/LegacyBios.h - Protocol/LegacyBiosPlatform.h - Protocol/LegacyInterrupt.h [*] Note that gEfiLegacyRegion2ProtocolGuid, while a CSM-related protocol, cannot be scheduled for removal, because the protocol GUID is defined in "MdePkg.dec", and it's not only "OvmfPkg/Csm/CsmSupportLib" that produces it in all of edk2, but also "MdeModulePkg/Universal/LegacyRegion2Dxe" (not used by OVMF). For the same reason, the "Protocol/LegacyRegion2.h" header (from MdePkg) cannot be scheduled for removal. Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=4588 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20231110235820.644381-23-lersek@redhat.com> Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Acked-by: Corvin Köhne <corvink@FreeBSD.org> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.c31
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.h48
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf55
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c212
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h115
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.c1086
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.h97
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c506
-rw-r--r--OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h202
9 files changed, 0 insertions, 2352 deletions
diff --git a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.c b/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.c
deleted file mode 100644
index 3ffd6e92b2..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/** @file
- Platform CSM Support Library
-
- Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "CsmSupportLib.h"
-
-/**
- The constructor function for the platform CSM support library
-
- @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS.
-
-**/
-RETURN_STATUS
-EFIAPI
-CsmSupportLibConstructor (
- VOID
- )
-{
- LegacyRegionInit ();
-
- LegacyInterruptInstall ();
-
- LegacyBiosPlatformInstall ();
-
- return EFI_SUCCESS;
-}
diff --git a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.h b/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.h
deleted file mode 100644
index a6ee93f167..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/** @file
- Platform CSM Support Library
-
- Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _CSM_SUPPORT_LIB_H_
-#define _CSM_SUPPORT_LIB_H_
-
-#include <Uefi.h>
-
-/**
- Initialize Legacy Region support
-
- @retval EFI_SUCCESS Successfully initialized
-
-**/
-EFI_STATUS
-LegacyRegionInit (
- VOID
- );
-
-/**
- Initialize Legacy Interrupt support
-
- @retval EFI_SUCCESS Successfully initialized
-
-**/
-EFI_STATUS
-LegacyInterruptInstall (
- VOID
- );
-
-/**
- Initialize Legacy Platform support
-
- @retval EFI_SUCCESS Successfully initialized
-
-**/
-EFI_STATUS
-LegacyBiosPlatformInstall (
- VOID
- );
-
-#endif
diff --git a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf b/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf
deleted file mode 100644
index 45f201f07b..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf
+++ /dev/null
@@ -1,55 +0,0 @@
-## @file
-# Platform CSM Support Library
-#
-# Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = CsmSupportLib
- FILE_GUID = 04e03541-4663-417d-93f6-976378247d61
- MODULE_TYPE = BASE
- VERSION_STRING = 1.0
- LIBRARY_CLASS = CsmSupportLib
-
- CONSTRUCTOR = CsmSupportLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 EBC
-#
-
-[Sources]
- CsmSupportLib.c
- CsmSupportLib.h
- LegacyInterrupt.c
- LegacyInterrupt.h
- LegacyPlatform.c
- LegacyPlatform.h
- LegacyRegion.c
- LegacyRegion.h
-
-[Packages]
- MdePkg/MdePkg.dec
- OvmfPkg/OvmfPkg.dec
-
-[Pcd]
- gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
-
-[Protocols]
- gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED
- gEfiDiskInfoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
- gEfiLegacyBiosPlatformProtocolGuid # PROTOCOL ALWAYS_CONSUMED
- gEfiLegacyBiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
- gEfiLegacyInterruptProtocolGuid # PROTOCOL ALWAYS_PRODUCED
- gEfiLegacyRegion2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED
- gEfiPciIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
-
-[LibraryClasses]
- BaseLib
- PciLib
- IoLib
-
diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c b/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c
deleted file mode 100644
index 410e4e457d..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/** @file
- Legacy Interrupt Support
-
- Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "LegacyInterrupt.h"
-
-//
-// Handle for the Legacy Interrupt Protocol instance produced by this driver
-//
-STATIC EFI_HANDLE mLegacyInterruptHandle = NULL;
-
-//
-// Legacy Interrupt Device number (0x01 on piix4, 0x1f on q35/mch)
-//
-STATIC UINT8 mLegacyInterruptDevice;
-
-//
-// The Legacy Interrupt Protocol instance produced by this driver
-//
-STATIC EFI_LEGACY_INTERRUPT_PROTOCOL mLegacyInterrupt = {
- GetNumberPirqs,
- GetLocation,
- ReadPirq,
- WritePirq
-};
-
-STATIC UINT8 PirqReg[MAX_PIRQ_NUMBER] = { PIRQA, PIRQB, PIRQC, PIRQD, PIRQE, PIRQF, PIRQG, PIRQH };
-
-/**
- Return the number of PIRQs supported by this chipset.
-
- @param[in] This Pointer to LegacyInterrupt Protocol
- @param[out] NumberPirqs The pointer to return the max IRQ number supported
-
- @retval EFI_SUCCESS Max PIRQs successfully returned
-
-**/
-EFI_STATUS
-EFIAPI
-GetNumberPirqs (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- OUT UINT8 *NumberPirqs
- )
-{
- *NumberPirqs = MAX_PIRQ_NUMBER;
-
- return EFI_SUCCESS;
-}
-
-/**
- Return PCI location of this device.
- $PIR table requires this info.
-
- @param[in] This - Protocol instance pointer.
- @param[out] Bus - PCI Bus
- @param[out] Device - PCI Device
- @param[out] Function - PCI Function
-
- @retval EFI_SUCCESS Bus/Device/Function returned
-
-**/
-EFI_STATUS
-EFIAPI
-GetLocation (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- OUT UINT8 *Bus,
- OUT UINT8 *Device,
- OUT UINT8 *Function
- )
-{
- *Bus = LEGACY_INT_BUS;
- *Device = mLegacyInterruptDevice;
- *Function = LEGACY_INT_FUNC;
-
- return EFI_SUCCESS;
-}
-
-/**
- Builds the PCI configuration address for the register specified by PirqNumber
-
- @param[in] PirqNumber - The PIRQ number to build the PCI configuration address for
-
- @return The PCI Configuration address for the PIRQ
-**/
-UINTN
-GetAddress (
- UINT8 PirqNumber
- )
-{
- return PCI_LIB_ADDRESS (
- LEGACY_INT_BUS,
- mLegacyInterruptDevice,
- LEGACY_INT_FUNC,
- PirqReg[PirqNumber]
- );
-}
-
-/**
- Read the given PIRQ register
-
- @param[in] This Protocol instance pointer
- @param[in] PirqNumber The Pirq register 0 = A, 1 = B etc
- @param[out] PirqData Value read
-
- @retval EFI_SUCCESS Decoding change affected.
- @retval EFI_INVALID_PARAMETER Invalid PIRQ number
-
-**/
-EFI_STATUS
-EFIAPI
-ReadPirq (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- IN UINT8 PirqNumber,
- OUT UINT8 *PirqData
- )
-{
- if (PirqNumber >= MAX_PIRQ_NUMBER) {
- return EFI_INVALID_PARAMETER;
- }
-
- *PirqData = PciRead8 (GetAddress (PirqNumber));
- *PirqData = (UINT8)(*PirqData & 0x7f);
-
- return EFI_SUCCESS;
-}
-
-/**
- Write the given PIRQ register
-
- @param[in] This Protocol instance pointer
- @param[in] PirqNumber The Pirq register 0 = A, 1 = B etc
- @param[out] PirqData Value to write
-
- @retval EFI_SUCCESS Decoding change affected.
- @retval EFI_INVALID_PARAMETER Invalid PIRQ number
-
-**/
-EFI_STATUS
-EFIAPI
-WritePirq (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- IN UINT8 PirqNumber,
- IN UINT8 PirqData
- )
-{
- if (PirqNumber >= MAX_PIRQ_NUMBER) {
- return EFI_INVALID_PARAMETER;
- }
-
- PciWrite8 (GetAddress (PirqNumber), PirqData);
- return EFI_SUCCESS;
-}
-
-/**
- Initialize Legacy Interrupt support
-
- @retval EFI_SUCCESS Successfully initialized
-
-**/
-EFI_STATUS
-LegacyInterruptInstall (
- VOID
- )
-{
- UINT16 HostBridgeDevId;
- EFI_STATUS Status;
-
- //
- // Make sure the Legacy Interrupt Protocol is not already installed in the system
- //
- ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiLegacyInterruptProtocolGuid);
-
- //
- // Query Host Bridge DID to determine platform type, then set device number
- //
- HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
- switch (HostBridgeDevId) {
- case INTEL_82441_DEVICE_ID:
- mLegacyInterruptDevice = LEGACY_INT_DEV_PIIX4;
- break;
- case INTEL_Q35_MCH_DEVICE_ID:
- mLegacyInterruptDevice = LEGACY_INT_DEV_Q35;
- break;
- default:
- DEBUG ((
- DEBUG_ERROR,
- "%a: Unknown Host Bridge Device ID: 0x%04x\n",
- __func__,
- HostBridgeDevId
- ));
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
- }
-
- //
- // Make a new handle and install the protocol
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &mLegacyInterruptHandle,
- &gEfiLegacyInterruptProtocolGuid,
- &mLegacyInterrupt,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
-
- return Status;
-}
diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h b/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h
deleted file mode 100644
index 132365b9cc..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/** @file
- Legacy Region Support
-
- Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _LEGACY_INTERRUPT_H_
-#define _LEGACY_INTERRUPT_H_
-
-#include <PiDxe.h>
-
-#include <Protocol/LegacyInterrupt.h>
-
-#include <Library/PcdLib.h>
-#include <Library/PciLib.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <OvmfPlatforms.h>
-
-#define LEGACY_INT_BUS 0
-#define LEGACY_INT_DEV_PIIX4 0x01
-#define LEGACY_INT_DEV_Q35 0x1f
-#define LEGACY_INT_FUNC 0
-
-#define PIRQN 0x00 // PIRQ Null
-#define PIRQA 0x60
-#define PIRQB 0x61
-#define PIRQC 0x62
-#define PIRQD 0x63
-#define PIRQE 0x68
-#define PIRQF 0x69
-#define PIRQG 0x6A
-#define PIRQH 0x6B
-
-#define MAX_PIRQ_NUMBER 8
-
-/**
- Return the number of PIRQs supported by this chipset.
-
- @param[in] This Pointer to LegacyInterrupt Protocol
- @param[out] NumberPirqs The pointer to return the max IRQ number supported
-
- @retval EFI_SUCCESS Max PIRQs successfully returned
-
-**/
-EFI_STATUS
-EFIAPI
-GetNumberPirqs (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- OUT UINT8 *NumberPirqs
- );
-
-/**
- Return PCI location of this device.
- $PIR table requires this info.
-
- @param[in] This - Protocol instance pointer.
- @param[out] Bus - PCI Bus
- @param[out] Device - PCI Device
- @param[out] Function - PCI Function
-
- @retval EFI_SUCCESS Bus/Device/Function returned
-
-**/
-EFI_STATUS
-EFIAPI
-GetLocation (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- OUT UINT8 *Bus,
- OUT UINT8 *Device,
- OUT UINT8 *Function
- );
-
-/**
- Read the given PIRQ register
-
- @param[in] This Protocol instance pointer
- @param[in] PirqNumber The Pirq register 0 = A, 1 = B etc
- @param[out] PirqData Value read
-
- @retval EFI_SUCCESS Decoding change affected.
- @retval EFI_INVALID_PARAMETER Invalid PIRQ number
-
-**/
-EFI_STATUS
-EFIAPI
-ReadPirq (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- IN UINT8 PirqNumber,
- OUT UINT8 *PirqData
- );
-
-/**
- Write the given PIRQ register
-
- @param[in] This Protocol instance pointer
- @param[in] PirqNumber The Pirq register 0 = A, 1 = B etc
- @param[out] PirqData Value to write
-
- @retval EFI_SUCCESS Decoding change affected.
- @retval EFI_INVALID_PARAMETER Invalid PIRQ number
-
-**/
-EFI_STATUS
-EFIAPI
-WritePirq (
- IN EFI_LEGACY_INTERRUPT_PROTOCOL *This,
- IN UINT8 PirqNumber,
- IN UINT8 PirqData
- );
-
-#endif
diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.c b/OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.c
deleted file mode 100644
index 491897adbd..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.c
+++ /dev/null
@@ -1,1086 +0,0 @@
-/** @file
- Legacy BIOS Platform support
-
- Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "LegacyPlatform.h"
-
-EFI_SETUP_BBS_MAP mSetupBbsMap[] = {
- { 1, 2, 1, 1 }, // ATA HardDrive
- { 2, 3, 1, 1 }, // ATAPI CDROM
- { 3, 0x80, 2, 0 }, // PXE
- { 4, 1, 0, 6 }, // USB Floppy
- { 4, 2, 0, 6 }, // USB HDD
- { 4, 3, 0, 6 }, // USB CD
- { 4, 1, 0, 0 }, // USB ZIP Bugbug since Class/SubClass code is uninitialized
- { 4, 2, 0, 0 } // USB ZIP Bugbug since Class/SubClass code is uninitialized
-};
-
-//
-// Global variables for System ROMs
-//
-#define SYSTEM_ROM_FILE_GUID \
-{ 0x1547B4F3, 0x3E8A, 0x4FEF, { 0x81, 0xC8, 0x32, 0x8E, 0xD6, 0x47, 0xAB, 0x1A } }
-
-#define NULL_ROM_FILE_GUID \
-{ 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
-
-SYSTEM_ROM_TABLE mSystemRomTable[] = {
- { SYSTEM_ROM_FILE_GUID, 1 },
- { NULL_ROM_FILE_GUID, 0 }
-};
-
-EFI_HANDLE mVgaHandles[0x20];
-EFI_HANDLE mDiskHandles[0x20];
-EFI_HANDLE mIsaHandles[0x20];
-
-EFI_LEGACY_IRQ_PRIORITY_TABLE_ENTRY IrqPriorityTable[MAX_IRQ_PRIORITY_ENTRIES] = {
- { 0x0B, 0 },
- { 0x09, 0 },
- { 0x0A, 0 },
- { 0x05, 0 },
- { 0x07, 0 },
- { 0x00, 0 },
- { 0x00, 0 }
-};
-
-//
-// PIRQ Table
-// - Slot numbering will be used to update the bus number and determine bridge
-// to check to get bus number. The Slot number - 1 is an index into a decode
-// table to get the bridge information.
-//
-EFI_LEGACY_PIRQ_TABLE PirqTableHead = {
- {
- EFI_LEGACY_PIRQ_TABLE_SIGNATURE, // UINT32 Signature
- 0x00, // UINT8 MinorVersion
- 0x01, // UINT8 MajorVersion
- 0x0000, // UINT16 TableSize
- 0x00, // UINT8 Bus
- 0x08, // UINT8 DevFun
- 0x0000, // UINT16 PciOnlyIrq
- 0x8086, // UINT16 CompatibleVid
- 0x122e, // UINT16 CompatibleDid
- 0x00000000, // UINT32 Miniport
- { // UINT8 Reserved[11]
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00
- },
- 0x00, // UINT8 Checksum
- },
- {
- // -- Pin 1 -- -- Pin 2 -- -- Pin 3 -- -- Pin 4 --
- // Bus Dev Reg Map Reg Map Reg Map Reg Map
- //
- { 0x00, 0x08, {
- { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }
- }, 0x00, 0x00 },
- { 0x00, 0x10, {
- { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }
- }, 0x01, 0x00 },
- { 0x00, 0x18, {
- { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }
- }, 0x02, 0x00 },
- { 0x00, 0x20, {
- { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }
- }, 0x03, 0x00 },
- { 0x00, 0x28, {
- { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }
- }, 0x04, 0x00 },
- { 0x00, 0x30, {
- { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }
- }, 0x05, 0x00 },
- }
-};
-
-LEGACY_BIOS_PLATFORM_INSTANCE mPrivateData;
-EFI_HANDLE mImageHandle = NULL;
-
-/**
- Return the handles and assorted information for the specified PCI Class code
-
- @param[in] PciClasses Array of PCI_CLASS_RECORD to find terminated with ClassCode 0xff
- @param[in,out] DeviceTable Table to place handles etc in.
- @param[in,out] DeviceIndex Number of devices found
- @param[in] DeviceFlags FALSE if a valid legacy ROM is required, TRUE otherwise.
-
- @retval EFI_SUCCESS One or more devices found
- @retval EFI_NOT_FOUND No device found
-
-**/
-EFI_STATUS
-FindAllDeviceTypes (
- IN PCI_CLASS_RECORD *PciClasses,
- IN OUT DEVICE_STRUCTURE *DeviceTable,
- IN OUT UINT16 *DeviceIndex,
- IN BOOLEAN DeviceFlags
- )
-{
- UINTN HandleCount;
- EFI_HANDLE *HandleBuffer;
- UINTN Index;
- UINTN StartIndex;
- PCI_TYPE00 PciConfigHeader;
- EFI_PCI_IO_PROTOCOL *PciIo;
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
- UINTN Flags;
- EFI_STATUS Status;
- UINTN Index2;
-
- //
- // Get legacy BIOS protocol as it is required to deal with Option ROMs.
- //
- StartIndex = *DeviceIndex;
- Status = gBS->LocateProtocol (
- &gEfiLegacyBiosProtocolGuid,
- NULL,
- (VOID **)&LegacyBios
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Get all PCI handles and check them to generate a list of matching devices.
- //
- gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiPciIoProtocolGuid,
- NULL,
- &HandleCount,
- &HandleBuffer
- );
- for (Index = 0; Index < HandleCount; Index++) {
- gBS->HandleProtocol (
- HandleBuffer[Index],
- &gEfiPciIoProtocolGuid,
- (VOID **)&PciIo
- );
- PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint32,
- 0,
- sizeof (PciConfigHeader) / sizeof (UINT32),
- &PciConfigHeader
- );
- for (Index2 = 0; PciClasses[Index2].Class != 0xff; Index2++) {
- if ((PciConfigHeader.Hdr.ClassCode[2] == PciClasses[Index2].Class) &&
- (PciConfigHeader.Hdr.ClassCode[1] == PciClasses[Index2].SubClass))
- {
- LegacyBios->CheckPciRom (
- LegacyBios,
- HandleBuffer[Index],
- NULL,
- NULL,
- &Flags
- );
-
- //
- // Verify that results of OPROM check match request.
- // The two valid requests are:
- // DeviceFlags = 0 require a valid legacy ROM
- // DeviceFlags = 1 require either no ROM or a valid legacy ROM
- //
- if (
- ((DeviceFlags != 0) && (Flags == NO_ROM)) ||
- ((Flags & (ROM_FOUND | VALID_LEGACY_ROM)) == (ROM_FOUND | VALID_LEGACY_ROM))
- )
- {
- DeviceTable->Handle = HandleBuffer[Index];
- DeviceTable->Vid = PciConfigHeader.Hdr.VendorId;
- DeviceTable->Did = PciConfigHeader.Hdr.DeviceId;
- DeviceTable->SvId = PciConfigHeader.Device.SubsystemVendorID;
- DeviceTable->SysId = PciConfigHeader.Device.SubsystemID;
- ++*DeviceIndex;
- DeviceTable++;
- }
- }
- }
- }
-
- //
- // Free any allocated buffers
- //
- gBS->FreePool (HandleBuffer);
-
- if (*DeviceIndex != StartIndex) {
- return EFI_SUCCESS;
- } else {
- return EFI_NOT_FOUND;
- }
-}
-
-/**
- Load and initialize the Legacy BIOS SMM handler.
-
- @param This The protocol instance pointer.
- @param EfiToLegacy16BootTable A pointer to Legacy16 boot table.
-
- @retval EFI_SUCCESS SMM code loaded.
- @retval EFI_DEVICE_ERROR SMM code failed to load
-
-**/
-EFI_STATUS
-EFIAPI
-SmmInit (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- IN VOID *EfiToLegacy16BootTable
- )
-{
- return EFI_SUCCESS;
-}
-
-/**
- Finds the device path that should be used as the primary display adapter.
-
- @param VgaHandle - The handle of the video device
-
-**/
-VOID
-GetSelectedVgaDeviceInfo (
- OUT EFI_HANDLE *VgaHandle
- )
-{
- EFI_STATUS Status;
- UINTN HandleCount;
- EFI_HANDLE *HandleBuffer;
- UINTN Index;
- EFI_PCI_IO_PROTOCOL *PciIo;
- PCI_TYPE00 Pci;
- UINT8 MinBus;
- UINT8 MaxBus;
- UINTN Segment;
- UINTN Bus;
- UINTN Device;
- UINTN Function;
- UINTN SelectedAddress;
- UINTN CurrentAddress;
-
- //
- // Initialize return to 'not found' state
- //
- *VgaHandle = NULL;
-
- //
- // Initialize variable states. This is important for selecting the VGA
- // device if multiple devices exist behind a single bridge.
- //
- HandleCount = 0;
- HandleBuffer = NULL;
- SelectedAddress = PCI_LIB_ADDRESS (0xff, 0x1f, 0x7, 0);
-
- //
- // The bus range to search for a VGA device in.
- //
- MinBus = MaxBus = 0;
-
- //
- // Start to check all the pci io to find all possible VGA device
- //
- HandleCount = 0;
- HandleBuffer = NULL;
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiPciIoProtocolGuid,
- NULL,
- &HandleCount,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- return;
- }
-
- for (Index = 0; Index < HandleCount; Index++) {
- Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiPciIoProtocolGuid, (VOID **)&PciIo);
- if (!EFI_ERROR (Status)) {
- //
- // Determine if this is in the correct bus range.
- //
- Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
- if (EFI_ERROR (Status) || ((Bus < MinBus) || (Bus > MaxBus))) {
- continue;
- }
-
- //
- // Read device information.
- //
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint32,
- 0,
- sizeof (Pci) / sizeof (UINT32),
- &Pci
- );
- if (EFI_ERROR (Status)) {
- continue;
- }
-
- //
- // Make sure the device is a VGA device.
- //
- if (!IS_PCI_VGA (&Pci)) {
- continue;
- }
-
- DEBUG ((
- DEBUG_INFO,
- "PCI VGA: 0x%04x:0x%04x\n",
- Pci.Hdr.VendorId,
- Pci.Hdr.DeviceId
- ));
-
- //
- // Currently we use the lowest numbered bus/device/function if multiple
- // devices are found in the target bus range.
- //
- CurrentAddress = PCI_LIB_ADDRESS (Bus, Device, Function, 0);
- if (CurrentAddress < SelectedAddress) {
- SelectedAddress = CurrentAddress;
- *VgaHandle = HandleBuffer[Index];
- }
- }
- }
-
- FreePool (HandleBuffer);
-}
-
-/**
- Returns a buffer of handles for the requested subfunction.
-
- @param This The protocol instance pointer.
- @param Mode Specifies what handle to return. See EFI_GET_PLATFORM_HANDLE_MODE enum.
- @param Type Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
- @param HandleBuffer Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
- @param HandleCount Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
- @param AdditionalData Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
-
- @retval EFI_SUCCESS Handle is valid.
- @retval EFI_UNSUPPORTED Mode is not supported on the platform.
- @retval EFI_NOT_FOUND Handle is not known.
-
-**/
-EFI_STATUS
-EFIAPI
-GetPlatformHandle (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- IN EFI_GET_PLATFORM_HANDLE_MODE Mode,
- IN UINT16 Type,
- OUT EFI_HANDLE **HandleBuffer,
- OUT UINTN *HandleCount,
- OUT VOID **AdditionalData OPTIONAL
- )
-{
- DEVICE_STRUCTURE LocalDevice[0x40];
- UINT32 LocalIndex;
- UINT32 Index;
- DEVICE_STRUCTURE TempDevice;
- EFI_STATUS Status;
- EFI_PCI_IO_PROTOCOL *PciIo;
- UINTN Segment;
- UINTN Bus;
- UINTN Device;
- UINTN Function;
- HDD_INFO *HddInfo;
- PCI_TYPE00 PciConfigHeader;
- UINT32 HddIndex;
- EFI_HANDLE IdeHandle;
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
- PCI_CLASS_RECORD ClassLists[10];
- UINTN PriorityIndex;
-
- static BOOLEAN bConnected = FALSE;
-
- LocalIndex = 0x00;
- HddInfo = NULL;
- HddIndex = 0;
-
- Status = gBS->LocateProtocol (
- &gEfiLegacyBiosProtocolGuid,
- NULL,
- (VOID **)&LegacyBios
- );
-
- //
- // Process mode specific operations
- //
- switch (Mode) {
- case EfiGetPlatformVgaHandle:
- //
- // Get the handle for the currently selected VGA device.
- //
- GetSelectedVgaDeviceInfo (&mVgaHandles[0]);
- *HandleBuffer = &mVgaHandles[0];
- *HandleCount = (mVgaHandles[0] != NULL) ? 1 : 0;
- return EFI_SUCCESS;
- case EfiGetPlatformIdeHandle:
- IdeHandle = NULL;
- if (AdditionalData != NULL) {
- HddInfo = (HDD_INFO *)*AdditionalData;
- }
-
- //
- // Locate all found block io devices
- //
- ClassLists[0].Class = PCI_CLASS_MASS_STORAGE;
- ClassLists[0].SubClass = PCI_CLASS_MASS_STORAGE_SCSI;
- ClassLists[1].Class = PCI_CLASS_MASS_STORAGE;
- ClassLists[1].SubClass = PCI_CLASS_MASS_STORAGE_IDE;
- ClassLists[2].Class = PCI_CLASS_MASS_STORAGE;
- ClassLists[2].SubClass = PCI_CLASS_MASS_STORAGE_RAID;
- ClassLists[3].Class = PCI_CLASS_MASS_STORAGE;
- ClassLists[3].SubClass = PCI_CLASS_MASS_STORAGE_SATADPA;
- ClassLists[4].Class = 0xff;
- FindAllDeviceTypes (ClassLists, LocalDevice, (UINT16 *)&LocalIndex, TRUE);
- if (LocalIndex == 0) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Make sure all IDE controllers are connected. This is necessary
- // in NO_CONFIG_CHANGE boot path to ensure IDE controller is correctly
- // initialized and all IDE drives are enumerated
- //
- if (!bConnected) {
- for (Index = 0; Index < LocalIndex; Index++) {
- gBS->ConnectController (LocalDevice[Index].Handle, NULL, NULL, TRUE);
- }
- }
-
- //
- // Locate onboard controllers.
- //
- for (Index = 0; Index < LocalIndex; Index++) {
- if (LocalDevice[Index].Vid == V_INTEL_VENDOR_ID) {
- if (LocalDevice[Index].Did == V_PIIX4_IDE_DEVICE_ID) {
- IdeHandle = LocalDevice[Index].Handle;
- }
- }
- }
-
- //
- // Set the IDE contorller as primary devices.
- //
- PriorityIndex = 0;
- for (Index = 0; Index < LocalIndex; Index++) {
- if ((LocalDevice[Index].Handle == IdeHandle) && (PriorityIndex == 0)) {
- TempDevice = LocalDevice[PriorityIndex];
- LocalDevice[PriorityIndex] = LocalDevice[Index];
- LocalDevice[Index] = TempDevice;
- PriorityIndex++;
- break;
- }
- }
-
- //
- // Copy over handles and update return values.
- //
- for (Index = 0; Index < LocalIndex; Index++) {
- mDiskHandles[Index] = LocalDevice[Index].Handle;
- }
-
- *HandleBuffer = &mDiskHandles[0];
- *HandleCount = LocalIndex;
-
- //
- // We have connected all IDE controllers once. No more needed
- //
- bConnected = TRUE;
-
- //
- // Log all onboard controllers.
- //
- for (Index = 0; (Index < LocalIndex) && (AdditionalData != NULL); Index++) {
- if ((LocalDevice[Index].Handle != NULL) &&
- (LocalDevice[Index].Handle == IdeHandle))
- {
- Status = gBS->HandleProtocol (
- LocalDevice[Index].Handle,
- &gEfiPciIoProtocolGuid,
- (VOID **)&PciIo
- );
- PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint32,
- 0,
- sizeof (PciConfigHeader) / sizeof (UINT32),
- &PciConfigHeader
- );
- if (!EFI_ERROR (Status)) {
- PciIo->GetLocation (
- PciIo,
- &Segment,
- &Bus,
- &Device,
- &Function
- );
-
- //
- // Be sure to only fill out correct information based on platform
- // configuration.
- //
- HddInfo[HddIndex].Status |= HDD_PRIMARY;
- HddInfo[HddIndex].Bus = (UINT32)Bus;
- HddInfo[HddIndex].Device = (UINT32)Device;
- HddInfo[HddIndex].Function = (UINT32)Function;
- HddInfo[HddIndex + 1].Status |= HDD_SECONDARY;
- HddInfo[HddIndex + 1].Bus = (UINT32)Bus;
- HddInfo[HddIndex + 1].Device = (UINT32)Device;
- HddInfo[HddIndex + 1].Function = (UINT32)Function;
-
- //
- // Primary controller data
- //
- if ((PciConfigHeader.Hdr.ClassCode[0] & 0x01) != 0) {
- HddInfo[HddIndex].CommandBaseAddress =
- (UINT16)(PciConfigHeader.Device.Bar[0] & 0xfffc);
- HddInfo[HddIndex].ControlBaseAddress =
- (UINT16)((PciConfigHeader.Device.Bar[1] & 0xfffc)+2);
- HddInfo[HddIndex].BusMasterAddress =
- (UINT16)(PciConfigHeader.Device.Bar[4] & 0xfffc);
- HddInfo[HddIndex].HddIrq = PciConfigHeader.Device.InterruptLine;
- } else {
- HddInfo[HddIndex].HddIrq = 14;
- HddInfo[HddIndex].CommandBaseAddress = 0x1f0;
- HddInfo[HddIndex].ControlBaseAddress = 0x3f6;
- HddInfo[HddIndex].BusMasterAddress = 0;
- }
-
- HddIndex++;
-
- //
- // Secondary controller data
- //
- if ((PciConfigHeader.Hdr.ClassCode[0] & 0x04) != 0) {
- HddInfo[HddIndex].CommandBaseAddress =
- (UINT16)(PciConfigHeader.Device.Bar[2] & 0xfffc);
- HddInfo[HddIndex].ControlBaseAddress =
- (UINT16)((PciConfigHeader.Device.Bar[3] & 0xfffc)+2);
- HddInfo[HddIndex].BusMasterAddress =
- (UINT16)(HddInfo[HddIndex].BusMasterAddress + 8);
- HddInfo[HddIndex].HddIrq = PciConfigHeader.Device.InterruptLine;
- } else {
- HddInfo[HddIndex].HddIrq = 15;
- HddInfo[HddIndex].CommandBaseAddress = 0x170;
- HddInfo[HddIndex].ControlBaseAddress = 0x376;
- HddInfo[HddIndex].BusMasterAddress = 0;
- }
-
- HddIndex++;
- }
- }
- }
-
- return EFI_SUCCESS;
- case EfiGetPlatformIsaBusHandle:
- ClassLists[0].Class = (UINT8)PCI_CLASS_BRIDGE;
- ClassLists[0].SubClass = (UINT8)PCI_CLASS_BRIDGE_ISA_PDECODE;
- ClassLists[1].Class = (UINT8)PCI_CLASS_BRIDGE;
- ClassLists[1].SubClass = (UINT8)PCI_CLASS_BRIDGE_ISA;
- ClassLists[2].Class = 0xff;
-
- //
- // Locate all found block io devices
- //
- FindAllDeviceTypes (ClassLists, LocalDevice, (UINT16 *)(&LocalIndex), TRUE);
- if (LocalIndex == 0) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Find our ISA bridge.
- //
- for (Index = 0; Index < LocalIndex; Index++) {
- if (LocalDevice[Index].Vid == V_INTEL_VENDOR_ID) {
- TempDevice = LocalDevice[0];
- LocalDevice[0] = LocalDevice[Index];
- LocalDevice[Index] = TempDevice;
- }
- }
-
- //
- // Perform copy and update return values.
- //
- for (Index = 0; Index < LocalIndex; Index++) {
- mIsaHandles[Index] = LocalDevice[Index].Handle;
- }
-
- *HandleBuffer = &mIsaHandles[0];
- *HandleCount = LocalIndex;
- return EFI_SUCCESS;
- case EfiGetPlatformUsbHandle:
- default:
- return EFI_UNSUPPORTED;
- }
-}
-
-/**
- Allows platform to perform any required action after a LegacyBios operation.
- Invokes the specific sub function specified by Mode.
-
- @param This The protocol instance pointer.
- @param Mode Specifies what handle to return. See EFI_GET_PLATFORM_HOOK_MODE enum.
- @param Type Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum.
- @param DeviceHandle Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum.
- @param ShadowAddress Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum.
- @param Compatibility16Table Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum.
- @param AdditionalData Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum.
-
- @retval EFI_SUCCESS The operation performed successfully. Mode specific.
- @retval EFI_UNSUPPORTED Mode is not supported on the platform.
-
-**/
-EFI_STATUS
-EFIAPI
-PlatformHooks (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- IN EFI_GET_PLATFORM_HOOK_MODE Mode,
- IN UINT16 Type,
- OUT EFI_HANDLE DeviceHandle OPTIONAL,
- IN OUT UINTN *Shadowaddress OPTIONAL,
- IN EFI_COMPATIBILITY16_TABLE *Compatibility16Table OPTIONAL,
- OUT VOID **AdditionalData OPTIONAL
- )
-{
- EFI_IA32_REGISTER_SET Regs;
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
- EFI_STATUS Status;
-
- switch (Mode) {
- case EfiPlatformHookPrepareToScanRom:
- Status = gBS->LocateProtocol (
- &gEfiLegacyBiosProtocolGuid,
- NULL,
- (VOID **)&LegacyBios
- );
-
- //
- // Set the 80x25 Text VGA Mode
- //
- Regs.H.AH = 0x00;
- Regs.H.AL = 0x03;
- Status = LegacyBios->Int86 (LegacyBios, 0x10, &Regs);
- return Status;
- case EfiPlatformHookShadowServiceRoms:
- return EFI_SUCCESS;
- case EfiPlatformHookAfterRomInit:
- default:
- return EFI_UNSUPPORTED;
- }
-}
-
-/**
- Returns information associated with PCI IRQ routing.
- This function returns the following information associated with PCI IRQ routing:
- * An IRQ routing table and number of entries in the table.
- * The $PIR table and its size.
- * A list of PCI IRQs and the priority order to assign them.
-
- @param This The protocol instance pointer.
- @param RoutingTable The pointer to PCI IRQ Routing table.
- This location is the $PIR table minus the header.
- @param RoutingTableEntries The number of entries in table.
- @param LocalPirqTable $PIR table.
- @param PirqTableSize $PIR table size.
- @param LocalIrqPriorityTable A list of interrupts in priority order to assign.
- @param IrqPriorityTableEntries The number of entries in the priority table.
-
- @retval EFI_SUCCESS Data was successfully returned.
-
-**/
-EFI_STATUS
-EFIAPI
-GetRoutingTable (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- OUT VOID **RoutingTable,
- OUT UINTN *RoutingTableEntries,
- OUT VOID **LocalPirqTable OPTIONAL,
- OUT UINTN *PirqTableSize OPTIONAL,
- OUT VOID **LocalIrqPriorityTable OPTIONAL,
- OUT UINTN *IrqPriorityTableEntries OPTIONAL
- )
-{
- UINT16 PTableSize;
- UINT32 Index;
- UINT8 Bus;
- UINT8 Device;
- UINT8 Function;
- UINT8 Checksum;
- UINT8 *Ptr;
- EFI_STATUS Status;
- EFI_LEGACY_INTERRUPT_PROTOCOL *LegacyInterrupt;
-
- Checksum = 0;
-
- if (LocalPirqTable != NULL) {
- PTableSize = sizeof (EFI_LEGACY_PIRQ_TABLE_HEADER) +
- sizeof (EFI_LEGACY_IRQ_ROUTING_ENTRY) * MAX_IRQ_ROUTING_ENTRIES;
-
- Status = gBS->LocateProtocol (
- &gEfiLegacyInterruptProtocolGuid,
- NULL,
- (VOID **)&LegacyInterrupt
- );
- ASSERT_EFI_ERROR (Status);
- LegacyInterrupt->GetLocation (
- LegacyInterrupt,
- &Bus,
- &Device,
- &Function
- );
-
- //
- // Update fields in $PIR table header
- //
- PirqTableHead.PirqTable.TableSize = PTableSize;
- PirqTableHead.PirqTable.Bus = Bus;
- PirqTableHead.PirqTable.DevFun = (UINT8)((Device << 3) + Function);
- Ptr = (UINT8 *)(&PirqTableHead);
-
- //
- // Calculate checksum.
- //
- for (Index = 0; Index < PTableSize; Index++) {
- Checksum = (UINT8)(Checksum + (UINT8)*Ptr);
- Ptr += 1;
- }
-
- Checksum = (UINT8)(0x00 - Checksum);
- PirqTableHead.PirqTable.Checksum = Checksum;
-
- //
- // Update return values.
- //
- *LocalPirqTable = (VOID *)(&PirqTableHead);
- *PirqTableSize = PTableSize;
- }
-
- //
- // More items to return.
- //
- *RoutingTable = PirqTableHead.IrqRoutingEntry;
- *RoutingTableEntries = MAX_IRQ_ROUTING_ENTRIES;
- if (LocalIrqPriorityTable != NULL) {
- *LocalIrqPriorityTable = IrqPriorityTable;
- *IrqPriorityTableEntries = MAX_IRQ_PRIORITY_ENTRIES;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Finds the binary data or other platform information.
-
- @param This The protocol instance pointer.
- @param Mode Specifies what data to return. See See EFI_GET_PLATFORM_INFO_MODE enum.
- @param Table Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum.
- @param TableSize Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum.
- @param Location Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum.
- @param Alignment Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum.
- @param LegacySegment Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum.
- @param LegacyOffset Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum.
-
- @retval EFI_SUCCESS Data returned successfully.
- @retval EFI_UNSUPPORTED Mode is not supported on the platform.
- @retval EFI_NOT_FOUND Binary image or table not found.
-
-**/
-EFI_STATUS
-EFIAPI
-GetPlatformInfo (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- IN EFI_GET_PLATFORM_INFO_MODE Mode,
- OUT VOID **Table,
- OUT UINTN *TableSize,
- OUT UINTN *Location,
- OUT UINTN *Alignment,
- IN UINT16 LegacySegment,
- IN UINT16 LegacyOffset
- )
-{
- EFI_STATUS Status;
- UINTN Index;
-
- switch (Mode) {
- case EfiGetPlatformBinarySystemRom:
- //
- // Loop through table of System rom descriptions
- //
- for (Index = 0; mSystemRomTable[Index].Valid != 0; Index++) {
- Status = GetSectionFromFv (
- &mSystemRomTable[Index].FileName,
- EFI_SECTION_RAW,
- 0,
- Table,
- (UINTN *)TableSize
- );
- if (EFI_ERROR (Status)) {
- continue;
- }
-
- return EFI_SUCCESS;
- }
-
- return EFI_NOT_FOUND;
- case EfiGetPlatformBinaryOem16Data:
- case EfiGetPlatformBinaryMpTable:
- case EfiGetPlatformBinaryOemIntData:
- case EfiGetPlatformBinaryOem32Data:
- case EfiGetPlatformBinaryTpmBinary:
- case EfiGetPlatformPciExpressBase:
- default:
- return EFI_UNSUPPORTED;
- }
-}
-
-/**
- Translates the given PIRQ accounting for bridge.
- This function translates the given PIRQ back through all buses, if required,
- and returns the true PIRQ and associated IRQ.
-
- @param This The protocol instance pointer.
- @param PciBus The PCI bus number for this device.
- @param PciDevice The PCI device number for this device.
- @param PciFunction The PCI function number for this device.
- @param Pirq Input is PIRQ reported by device, and output is true PIRQ.
- @param PciIrq The IRQ already assigned to the PIRQ, or the IRQ to be
- assigned to the PIRQ.
-
- @retval EFI_SUCCESS The PIRQ was translated.
-
-**/
-EFI_STATUS
-EFIAPI
-TranslatePirq (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- IN UINTN PciBus,
- IN UINTN PciDevice,
- IN UINTN PciFunction,
- IN OUT UINT8 *Pirq,
- OUT UINT8 *PciIrq
- )
-{
- EFI_LEGACY_INTERRUPT_PROTOCOL *LegacyInterrupt;
- EFI_STATUS Status;
- UINTN Index;
- UINTN Index1;
- UINT8 LocalPirq;
- UINT8 PirqData;
- UINT8 MatchData;
-
- Status = gBS->LocateProtocol (
- &gEfiLegacyInterruptProtocolGuid,
- NULL,
- (VOID **)&LegacyInterrupt
- );
- ASSERT_EFI_ERROR (Status);
- LocalPirq = (UINT8)(*Pirq);
-
- for (Index = 0; Index < MAX_IRQ_ROUTING_ENTRIES; Index++) {
- if ((PirqTableHead.IrqRoutingEntry[Index].Bus == PciBus) &&
- (PirqTableHead.IrqRoutingEntry[Index].Device == PciDevice))
- {
- LocalPirq = (UINT8)(PirqTableHead.IrqRoutingEntry[Index].PirqEntry[LocalPirq].Pirq & 0x0f);
- if (LocalPirq > 4) {
- LocalPirq -= 4;
- }
-
- LegacyInterrupt->ReadPirq (LegacyInterrupt, LocalPirq, &PirqData);
- MatchData = PCI_UNUSED;
- while (PirqData == 0) {
- for (Index1 = 0; Index1 < MAX_IRQ_PRIORITY_ENTRIES; Index1++) {
- if ((IrqPriorityTable[Index1].Used == MatchData) &&
- (IrqPriorityTable[Index1].Irq != 0))
- {
- PirqData = IrqPriorityTable[Index1].Irq;
- IrqPriorityTable[Index1].Used = 0xff;
- LegacyInterrupt->WritePirq (
- LegacyInterrupt,
- LocalPirq,
- PirqData
- );
- break;
- }
- }
-
- if (PirqData == 0) {
- //
- // No unused interrupts, so start reusing them.
- //
- MatchData = (UINT8)(~MatchData);
- }
- }
-
- *PciIrq = PirqData;
- *Pirq = LocalPirq;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Attempt to legacy boot the BootOption. If the EFI contexted has been
- compromised this function will not return.
-
- @param This The protocol instance pointer.
- @param BbsDevicePath The EFI Device Path from BootXXXX variable.
- @param BbsTable The Internal BBS table.
- @param LoadOptionSize The size of LoadOption in size.
- @param LoadOption The LoadOption from BootXXXX variable
- @param EfiToLegacy16BootTable A pointer to BootTable structure
-
- @retval EFI_SUCCESS Ready to boot.
-
-**/
-EFI_STATUS
-EFIAPI
-PrepareToBoot (
- IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This,
- IN BBS_BBS_DEVICE_PATH *BbsDevicePath,
- IN VOID *BbsTable,
- IN UINT32 LoadOptionsSize,
- IN VOID *LoadOptions,
- IN VOID *EfiToLegacy16BootTable
- )
-{
- BBS_TABLE *LocalBbsTable;
- EFI_TO_COMPATIBILITY16_BOOT_TABLE *Legacy16BootTable;
- DEVICE_PRODUCER_DATA_HEADER *SioPtr;
- UINT16 DevicePathType;
- UINT16 Index;
- UINT16 Priority;
-
- //
- // Initialize values
- //
- Priority = 0;
- Legacy16BootTable = (EFI_TO_COMPATIBILITY16_BOOT_TABLE *)EfiToLegacy16BootTable;
-
- //
- // Set how Gate A20 is gated by hardware
- //
- SioPtr = &Legacy16BootTable->SioData;
- SioPtr->Flags.A20Kybd = 1;
- SioPtr->Flags.A20Port90 = 1;
- SioPtr->MousePresent = 1;
-
- LocalBbsTable = BbsTable;
-
- //
- // There are 2 cases that must be covered.
- // Case 1: Booting to a legacy OS - BbsDevicePath is non-NULL.
- // Case 2: Booting to an EFI aware OS - BbsDevicePath is NULL.
- // We need to perform the PrepareToBoot function to assign
- // drive numbers to HDD devices to allow the shell or EFI
- // to access them.
- //
- if (BbsDevicePath != NULL) {
- DevicePathType = BbsDevicePath->DeviceType;
- } else {
- DevicePathType = BBS_HARDDISK;
- }
-
- //
- // Skip the boot devices where priority is set by BDS and set the next one
- //
- for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) {
- if ((LocalBbsTable[Index].BootPriority != BBS_UNPRIORITIZED_ENTRY) &&
- (LocalBbsTable[Index].BootPriority != BBS_IGNORE_ENTRY) &&
- (LocalBbsTable[Index].BootPriority != BBS_LOWEST_PRIORITY) &&
- (Priority <= LocalBbsTable[Index].BootPriority))
- {
- Priority = (UINT16)(LocalBbsTable[Index].BootPriority + 1);
- }
- }
-
- switch (DevicePathType) {
- case BBS_FLOPPY:
- case BBS_HARDDISK:
- case BBS_CDROM:
- case BBS_EMBED_NETWORK:
- for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) {
- if ((LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) &&
- (LocalBbsTable[Index].DeviceType == DevicePathType))
- {
- LocalBbsTable[Index].BootPriority = Priority;
- ++Priority;
- }
- }
-
- break;
- case BBS_BEV_DEVICE:
- for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) {
- if ((LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) &&
- (LocalBbsTable[Index].Class == 01) &&
- (LocalBbsTable[Index].SubClass == 01))
- {
- LocalBbsTable[Index].BootPriority = Priority;
- ++Priority;
- }
- }
-
- break;
- case BBS_USB:
- case BBS_PCMCIA:
- case BBS_UNKNOWN:
- default:
- break;
- }
-
- //
- // Set priority for rest of devices
- //
- for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) {
- if (LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) {
- LocalBbsTable[Index].BootPriority = Priority;
- ++Priority;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Initialize Legacy Platform support
-
- @retval EFI_SUCCESS Successfully initialized
-
-**/
-EFI_STATUS
-LegacyBiosPlatformInstall (
- VOID
- )
-{
- EFI_STATUS Status;
- LEGACY_BIOS_PLATFORM_INSTANCE *Private;
-
- mImageHandle = gImageHandle;
- Private = &mPrivateData;
-
- //
- // Grab a copy of all the protocols we depend on.
- //
- Private->Signature = LEGACY_BIOS_PLATFORM_INSTANCE_SIGNATURE;
- Private->LegacyBiosPlatform.GetPlatformInfo = GetPlatformInfo;
- Private->LegacyBiosPlatform.GetPlatformHandle = GetPlatformHandle;
- Private->LegacyBiosPlatform.SmmInit = SmmInit;
- Private->LegacyBiosPlatform.PlatformHooks = PlatformHooks;
- Private->LegacyBiosPlatform.GetRoutingTable = GetRoutingTable;
- Private->LegacyBiosPlatform.TranslatePirq = TranslatePirq;
- Private->LegacyBiosPlatform.PrepareToBoot = PrepareToBoot;
- Private->ImageHandle = gImageHandle;
-
- //
- // Make a new handle and install the protocol
- //
- Private->Handle = NULL;
- Status = gBS->InstallProtocolInterface (
- &Private->Handle,
- &gEfiLegacyBiosPlatformProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &Private->LegacyBiosPlatform
- );
- return Status;
-}
diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.h b/OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.h
deleted file mode 100644
index 7dddd5200f..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/LegacyPlatform.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/** @file
- Legacy BIOS Platform support
-
- Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef LEGACY_BIOS_PLATFORM_H_
-#define LEGACY_BIOS_PLATFORM_H_
-
-#include <FrameworkDxe.h>
-
-#include <Protocol/PciIo.h>
-#include <Protocol/PciRootBridgeIo.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/LegacyInterrupt.h>
-#include <Protocol/LegacyRegion2.h>
-#include <Protocol/LegacyBiosPlatform.h>
-#include <Protocol/FirmwareVolume.h>
-#include <Protocol/DiskInfo.h>
-
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/IoLib.h>
-#include <Library/PciLib.h>
-#include <Library/PcdLib.h>
-#include <Library/DxeServicesLib.h>
-#include <Library/DevicePathLib.h>
-
-#include <IndustryStandard/Pci.h>
-
-//
-// PIRQ information constants.
-//
-#define MAX_IRQ_ROUTING_ENTRIES 6
-#define MAX_IRQ_PRIORITY_ENTRIES 7
-
-#define V_INTEL_VENDOR_ID 0x8086
-#define V_PIIX4_IDE_DEVICE_ID 0x7010
-
-//
-// Type declarations
-//
-typedef struct {
- UINT8 SetupValue;
- UINT16 DeviceType;
- UINT8 Class;
- UINT8 SubClass;
-} EFI_SETUP_BBS_MAP;
-
-typedef struct {
- UINT8 Class;
- UINT8 SubClass;
-} PCI_CLASS_RECORD;
-
-typedef struct {
- EFI_LEGACY_PIRQ_TABLE_HEADER PirqTable;
- EFI_LEGACY_IRQ_ROUTING_ENTRY IrqRoutingEntry[MAX_IRQ_ROUTING_ENTRIES];
-} EFI_LEGACY_PIRQ_TABLE;
-
-typedef struct {
- EFI_HANDLE Handle;
- UINT16 Vid;
- UINT16 Did;
- UINT16 SvId;
- UINT16 SysId;
-} DEVICE_STRUCTURE;
-
-typedef struct {
- EFI_GUID FileName;
- UINTN Valid;
-} SYSTEM_ROM_TABLE;
-
-typedef struct {
- UINT32 Signature;
- EFI_HANDLE Handle;
- EFI_LEGACY_BIOS_PLATFORM_PROTOCOL LegacyBiosPlatform;
- EFI_HANDLE ImageHandle;
- EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
-} LEGACY_BIOS_PLATFORM_INSTANCE;
-
-#define LEGACY_BIOS_PLATFORM_INSTANCE_SIGNATURE SIGNATURE_32('P','B','I','O')
-
-#define LEGACY_BIOS_PLATFORM_INSTANCE_FROM_THIS(this) \
- CR (this, \
- LEGACY_BIOS_PLATFORM_INSTANCE, \
- LegacyBiosPlatform, \
- LEGACY_BIOS_PLATFORM_INSTANCE_SIGNATURE \
- )
-
-#endif
diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c b/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c
deleted file mode 100644
index 3c32b75bd6..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/** @file
- Legacy Region Support
-
- Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "LegacyRegion.h"
-
-//
-// 440/Q35 PAM map.
-//
-// PAM Range Offset Bits Operation
-// 440 Q35
-// =============== ==== ==== ==== ===============================================================
-// 0xC0000-0xC3FFF 0x5a 0x91 1:0 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xC4000-0xC7FFF 0x5a 0x91 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xC8000-0xCBFFF 0x5b 0x92 1:0 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xCC000-0xCFFFF 0x5b 0x92 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xD0000-0xD3FFF 0x5c 0x93 1:0 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xD4000-0xD7FFF 0x5c 0x93 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xD8000-0xDBFFF 0x5d 0x94 1:0 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xDC000-0xDFFFF 0x5d 0x94 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xE0000-0xE3FFF 0x5e 0x95 1:0 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xE4000-0xE7FFF 0x5e 0x95 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xE8000-0xEBFFF 0x5f 0x96 1:0 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xEC000-0xEFFFF 0x5f 0x96 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-// 0xF0000-0xFFFFF 0x59 0x90 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
-//
-STATIC LEGACY_MEMORY_SECTION_INFO mSectionArray[] = {
- { 0xC0000, SIZE_16KB, FALSE, FALSE },
- { 0xC4000, SIZE_16KB, FALSE, FALSE },
- { 0xC8000, SIZE_16KB, FALSE, FALSE },
- { 0xCC000, SIZE_16KB, FALSE, FALSE },
- { 0xD0000, SIZE_16KB, FALSE, FALSE },
- { 0xD4000, SIZE_16KB, FALSE, FALSE },
- { 0xD8000, SIZE_16KB, FALSE, FALSE },
- { 0xDC000, SIZE_16KB, FALSE, FALSE },
- { 0xE0000, SIZE_16KB, FALSE, FALSE },
- { 0xE4000, SIZE_16KB, FALSE, FALSE },
- { 0xE8000, SIZE_16KB, FALSE, FALSE },
- { 0xEC000, SIZE_16KB, FALSE, FALSE },
- { 0xF0000, SIZE_64KB, FALSE, FALSE }
-};
-
-STATIC PAM_REGISTER_VALUE mRegisterValues440[] = {
- { PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x01, 0x02 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x10, 0x20 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x01, 0x02 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x10, 0x20 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x01, 0x02 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x10, 0x20 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x01, 0x02 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x10, 0x20 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x01, 0x02 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x10, 0x20 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x01, 0x02 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x10, 0x20 },
- { PMC_REGISTER_PIIX4 (PIIX4_PAM0), 0x10, 0x20 }
-};
-
-STATIC PAM_REGISTER_VALUE mRegisterValuesQ35[] = {
- { DRAMC_REGISTER_Q35 (MCH_PAM1), 0x01, 0x02 },
- { DRAMC_REGISTER_Q35 (MCH_PAM1), 0x10, 0x20 },
- { DRAMC_REGISTER_Q35 (MCH_PAM2), 0x01, 0x02 },
- { DRAMC_REGISTER_Q35 (MCH_PAM2), 0x10, 0x20 },
- { DRAMC_REGISTER_Q35 (MCH_PAM3), 0x01, 0x02 },
- { DRAMC_REGISTER_Q35 (MCH_PAM3), 0x10, 0x20 },
- { DRAMC_REGISTER_Q35 (MCH_PAM4), 0x01, 0x02 },
- { DRAMC_REGISTER_Q35 (MCH_PAM4), 0x10, 0x20 },
- { DRAMC_REGISTER_Q35 (MCH_PAM5), 0x01, 0x02 },
- { DRAMC_REGISTER_Q35 (MCH_PAM5), 0x10, 0x20 },
- { DRAMC_REGISTER_Q35 (MCH_PAM6), 0x01, 0x02 },
- { DRAMC_REGISTER_Q35 (MCH_PAM6), 0x10, 0x20 },
- { DRAMC_REGISTER_Q35 (MCH_PAM0), 0x10, 0x20 }
-};
-
-STATIC PAM_REGISTER_VALUE *mRegisterValues;
-
-//
-// Handle used to install the Legacy Region Protocol
-//
-STATIC EFI_HANDLE mHandle = NULL;
-
-//
-// Instance of the Legacy Region Protocol to install into the handle database
-//
-STATIC EFI_LEGACY_REGION2_PROTOCOL mLegacyRegion2 = {
- LegacyRegion2Decode,
- LegacyRegion2Lock,
- LegacyRegion2BootLock,
- LegacyRegion2Unlock,
- LegacyRegionGetInfo
-};
-
-STATIC
-EFI_STATUS
-LegacyRegionManipulationInternal (
- IN UINT32 Start,
- IN UINT32 Length,
- IN BOOLEAN *ReadEnable,
- IN BOOLEAN *WriteEnable,
- OUT UINT32 *Granularity
- )
-{
- UINT32 EndAddress;
- UINTN Index;
- UINTN StartIndex;
-
- //
- // Validate input parameters.
- //
- if ((Length == 0) || (Granularity == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- EndAddress = Start + Length - 1;
- if ((Start < PAM_BASE_ADDRESS) || (EndAddress > PAM_LIMIT_ADDRESS)) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Loop to find the start PAM.
- //
- StartIndex = 0;
- for (Index = 0; Index < ARRAY_SIZE (mSectionArray); Index++) {
- if ((Start >= mSectionArray[Index].Start) && (Start < (mSectionArray[Index].Start + mSectionArray[Index].Length))) {
- StartIndex = Index;
- break;
- }
- }
-
- ASSERT (Index < ARRAY_SIZE (mSectionArray));
-
- //
- // Program PAM until end PAM is encountered
- //
- for (Index = StartIndex; Index < ARRAY_SIZE (mSectionArray); Index++) {
- if (ReadEnable != NULL) {
- if (*ReadEnable) {
- PciOr8 (
- mRegisterValues[Index].PAMRegPciLibAddress,
- mRegisterValues[Index].ReadEnableData
- );
- } else {
- PciAnd8 (
- mRegisterValues[Index].PAMRegPciLibAddress,
- (UINT8)(~mRegisterValues[Index].ReadEnableData)
- );
- }
- }
-
- if (WriteEnable != NULL) {
- if (*WriteEnable) {
- PciOr8 (
- mRegisterValues[Index].PAMRegPciLibAddress,
- mRegisterValues[Index].WriteEnableData
- );
- } else {
- PciAnd8 (
- mRegisterValues[Index].PAMRegPciLibAddress,
- (UINT8)(~mRegisterValues[Index].WriteEnableData)
- );
- }
- }
-
- //
- // If the end PAM is encountered, record its length as granularity and jump out.
- //
- if ((EndAddress >= mSectionArray[Index].Start) && (EndAddress < (mSectionArray[Index].Start + mSectionArray[Index].Length))) {
- *Granularity = mSectionArray[Index].Length;
- break;
- }
- }
-
- ASSERT (Index < ARRAY_SIZE (mSectionArray));
-
- return EFI_SUCCESS;
-}
-
-STATIC
-EFI_STATUS
-LegacyRegionGetInfoInternal (
- OUT UINT32 *DescriptorCount,
- OUT LEGACY_MEMORY_SECTION_INFO **Descriptor
- )
-{
- UINTN Index;
- UINT8 PamValue;
-
- //
- // Check input parameters
- //
- if ((DescriptorCount == NULL) || (Descriptor == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Fill in current status of legacy region.
- //
- *DescriptorCount = sizeof (mSectionArray) / sizeof (mSectionArray[0]);
- for (Index = 0; Index < *DescriptorCount; Index++) {
- PamValue = PciRead8 (mRegisterValues[Index].PAMRegPciLibAddress);
- mSectionArray[Index].ReadEnabled = FALSE;
- if ((PamValue & mRegisterValues[Index].ReadEnableData) != 0) {
- mSectionArray[Index].ReadEnabled = TRUE;
- }
-
- mSectionArray[Index].WriteEnabled = FALSE;
- if ((PamValue & mRegisterValues[Index].WriteEnableData) != 0) {
- mSectionArray[Index].WriteEnabled = TRUE;
- }
- }
-
- *Descriptor = mSectionArray;
- return EFI_SUCCESS;
-}
-
-/**
- Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region.
-
- If the On parameter evaluates to TRUE, this function enables memory reads in the address range
- Start to (Start + Length - 1).
- If the On parameter evaluates to FALSE, this function disables memory reads in the address range
- Start to (Start + Length - 1).
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose attributes
- should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address
- was not aligned to a region's starting address or if the length
- was greater than the number of bytes in the first region.
- @param On[in] Decode / Non-Decode flag.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2Decode (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity,
- IN BOOLEAN *On
- )
-{
- return LegacyRegionManipulationInternal (Start, Length, On, NULL, Granularity);
-}
-
-/**
- Modify the hardware to disallow memory attribute changes in a region.
-
- This function makes the attributes of a region read only. Once a region is boot-locked with this
- function, the read and write attributes of that region cannot be changed until a power cycle has
- reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose
- attributes should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address was
- not aligned to a region's starting address or if the length was
- greater than the number of bytes in the first region.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
- @retval EFI_UNSUPPORTED The chipset does not support locking the configuration registers in
- a way that will not affect memory regions outside the legacy memory
- region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2BootLock (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity
- )
-{
- if ((Start < 0xC0000) || ((Start + Length - 1) > 0xFFFFF)) {
- return EFI_INVALID_PARAMETER;
- }
-
- return EFI_UNSUPPORTED;
-}
-
-/**
- Modify the hardware to disallow memory writes in a region.
-
- This function changes the attributes of a memory range to not allow writes.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose
- attributes should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address was
- not aligned to a region's starting address or if the length was
- greater than the number of bytes in the first region.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2Lock (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity
- )
-{
- BOOLEAN WriteEnable;
-
- WriteEnable = FALSE;
- return LegacyRegionManipulationInternal (Start, Length, NULL, &WriteEnable, Granularity);
-}
-
-/**
- Modify the hardware to allow memory writes in a region.
-
- This function changes the attributes of a memory range to allow writes.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose
- attributes should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address was
- not aligned to a region's starting address or if the length was
- greater than the number of bytes in the first region.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2Unlock (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity
- )
-{
- BOOLEAN WriteEnable;
-
- WriteEnable = TRUE;
- return LegacyRegionManipulationInternal (Start, Length, NULL, &WriteEnable, Granularity);
-}
-
-/**
- Get region information for the attributes of the Legacy Region.
-
- This function is used to discover the granularity of the attributes for the memory in the legacy
- region. Each attribute may have a different granularity and the granularity may not be the same
- for all memory ranges in the legacy region.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param DescriptorCount[out] The number of region descriptor entries returned in the Descriptor
- buffer.
- @param Descriptor[out] A pointer to a pointer used to return a buffer where the legacy
- region information is deposited. This buffer will contain a list of
- DescriptorCount number of region descriptors. This function will
- provide the memory for the buffer.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegionGetInfo (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- OUT UINT32 *DescriptorCount,
- OUT EFI_LEGACY_REGION_DESCRIPTOR **Descriptor
- )
-{
- LEGACY_MEMORY_SECTION_INFO *SectionInfo;
- UINT32 SectionCount;
- EFI_LEGACY_REGION_DESCRIPTOR *DescriptorArray;
- UINTN Index;
- UINTN DescriptorIndex;
-
- //
- // Get section numbers and information
- //
- LegacyRegionGetInfoInternal (&SectionCount, &SectionInfo);
-
- //
- // Each section has 3 descriptors, corresponding to readability, writeability, and lock status.
- //
- DescriptorArray = AllocatePool (sizeof (EFI_LEGACY_REGION_DESCRIPTOR) * SectionCount * 3);
- if (DescriptorArray == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- DescriptorIndex = 0;
- for (Index = 0; Index < SectionCount; Index++) {
- DescriptorArray[DescriptorIndex].Start = SectionInfo[Index].Start;
- DescriptorArray[DescriptorIndex].Length = SectionInfo[Index].Length;
- DescriptorArray[DescriptorIndex].Granularity = SectionInfo[Index].Length;
- if (SectionInfo[Index].ReadEnabled) {
- DescriptorArray[DescriptorIndex].Attribute = LegacyRegionDecoded;
- } else {
- DescriptorArray[DescriptorIndex].Attribute = LegacyRegionNotDecoded;
- }
-
- DescriptorIndex++;
-
- //
- // Create descriptor for writeability, according to lock status
- //
- DescriptorArray[DescriptorIndex].Start = SectionInfo[Index].Start;
- DescriptorArray[DescriptorIndex].Length = SectionInfo[Index].Length;
- DescriptorArray[DescriptorIndex].Granularity = SectionInfo[Index].Length;
- if (SectionInfo[Index].WriteEnabled) {
- DescriptorArray[DescriptorIndex].Attribute = LegacyRegionWriteEnabled;
- } else {
- DescriptorArray[DescriptorIndex].Attribute = LegacyRegionWriteDisabled;
- }
-
- DescriptorIndex++;
-
- //
- // Chipset does not support bootlock.
- //
- DescriptorArray[DescriptorIndex].Start = SectionInfo[Index].Start;
- DescriptorArray[DescriptorIndex].Length = SectionInfo[Index].Length;
- DescriptorArray[DescriptorIndex].Granularity = SectionInfo[Index].Length;
- DescriptorArray[DescriptorIndex].Attribute = LegacyRegionNotLocked;
- DescriptorIndex++;
- }
-
- *DescriptorCount = (UINT32)DescriptorIndex;
- *Descriptor = DescriptorArray;
-
- return EFI_SUCCESS;
-}
-
-/**
- Initialize Legacy Region support
-
- @retval EFI_SUCCESS Successfully initialized
-
-**/
-EFI_STATUS
-LegacyRegionInit (
- VOID
- )
-{
- EFI_STATUS Status;
- UINT16 HostBridgeDevId;
-
- //
- // Query Host Bridge DID to determine platform type
- //
- HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
- switch (HostBridgeDevId) {
- case INTEL_82441_DEVICE_ID:
- mRegisterValues = mRegisterValues440;
- break;
- case INTEL_Q35_MCH_DEVICE_ID:
- mRegisterValues = mRegisterValuesQ35;
- break;
- default:
- DEBUG ((
- DEBUG_ERROR,
- "%a: Unknown Host Bridge Device ID: 0x%04x\n",
- __func__,
- HostBridgeDevId
- ));
- ASSERT (FALSE);
- return RETURN_UNSUPPORTED;
- }
-
- //
- // Install the Legacy Region Protocol on a new handle
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &mHandle,
- &gEfiLegacyRegion2ProtocolGuid,
- &mLegacyRegion2,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
-
- return Status;
-}
diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h b/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h
deleted file mode 100644
index 8ffe42a6a5..0000000000
--- a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/** @file
- Legacy Region Support
-
- Copyright (c) 2008 - 2016, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _LEGACY_REGION_DXE_H_
-#define _LEGACY_REGION_DXE_H_
-
-#include <PiDxe.h>
-
-#include <Protocol/LegacyRegion2.h>
-
-#include <IndustryStandard/Pci.h>
-#include <IndustryStandard/Q35MchIch9.h>
-#include <IndustryStandard/I440FxPiix4.h>
-
-#include <Library/PciLib.h>
-#include <Library/PcdLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-
-#define PAM_BASE_ADDRESS 0xc0000
-#define PAM_LIMIT_ADDRESS BASE_1MB
-
-//
-// Describes Legacy Region blocks and status.
-//
-typedef struct {
- UINT32 Start;
- UINT32 Length;
- BOOLEAN ReadEnabled;
- BOOLEAN WriteEnabled;
-} LEGACY_MEMORY_SECTION_INFO;
-
-//
-// Provides a map of the PAM registers and bits used to set Read/Write access.
-//
-typedef struct {
- UINTN PAMRegPciLibAddress;
- UINT8 ReadEnableData;
- UINT8 WriteEnableData;
-} PAM_REGISTER_VALUE;
-
-/**
- Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region.
-
- If the On parameter evaluates to TRUE, this function enables memory reads in the address range
- Start to (Start + Length - 1).
- If the On parameter evaluates to FALSE, this function disables memory reads in the address range
- Start to (Start + Length - 1).
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose attributes
- should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address
- was not aligned to a region's starting address or if the length
- was greater than the number of bytes in the first region.
- @param On[in] Decode / Non-Decode flag.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2Decode (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity,
- IN BOOLEAN *On
- );
-
-/**
- Modify the hardware to disallow memory writes in a region.
-
- This function changes the attributes of a memory range to not allow writes.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose
- attributes should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address was
- not aligned to a region's starting address or if the length was
- greater than the number of bytes in the first region.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2Lock (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity
- );
-
-/**
- Modify the hardware to disallow memory attribute changes in a region.
-
- This function makes the attributes of a region read only. Once a region is boot-locked with this
- function, the read and write attributes of that region cannot be changed until a power cycle has
- reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose
- attributes should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address was
- not aligned to a region's starting address or if the length was
- greater than the number of bytes in the first region.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
- @retval EFI_UNSUPPORTED The chipset does not support locking the configuration registers in
- a way that will not affect memory regions outside the legacy memory
- region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2BootLock (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity
- );
-
-/**
- Modify the hardware to allow memory writes in a region.
-
- This function changes the attributes of a memory range to allow writes.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param Start[in] The beginning of the physical address of the region whose
- attributes should be modified.
- @param Length[in] The number of bytes of memory whose attributes should be modified.
- The actual number of bytes modified may be greater than the number
- specified.
- @param Granularity[out] The number of bytes in the last region affected. This may be less
- than the total number of bytes affected if the starting address was
- not aligned to a region's starting address or if the length was
- greater than the number of bytes in the first region.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegion2Unlock (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- IN UINT32 Start,
- IN UINT32 Length,
- OUT UINT32 *Granularity
- );
-
-/**
- Get region information for the attributes of the Legacy Region.
-
- This function is used to discover the granularity of the attributes for the memory in the legacy
- region. Each attribute may have a different granularity and the granularity may not be the same
- for all memory ranges in the legacy region.
-
- @param This[in] Indicates the EFI_LEGACY_REGION_PROTOCOL instance.
- @param DescriptorCount[out] The number of region descriptor entries returned in the Descriptor
- buffer.
- @param Descriptor[out] A pointer to a pointer used to return a buffer where the legacy
- region information is deposited. This buffer will contain a list of
- DescriptorCount number of region descriptors. This function will
- provide the memory for the buffer.
-
- @retval EFI_SUCCESS The region's attributes were successfully modified.
- @retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region.
-
-**/
-EFI_STATUS
-EFIAPI
-LegacyRegionGetInfo (
- IN EFI_LEGACY_REGION2_PROTOCOL *This,
- OUT UINT32 *DescriptorCount,
- OUT EFI_LEGACY_REGION_DESCRIPTOR **Descriptor
- );
-
-#endif