This implements ACPI SPMI table as defined in the IPMI specification. Signed-off-by: Nhi Pham <n...@os.amperecomputing.com> --- Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 4 + Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h | 13 +++ Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.c | 5 + Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiSpmi.c | 112 ++++++++++++++++++++ 4 files changed, 134 insertions(+)
diff --git a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf index 8ab6a790ce07..6c26b6e7141c 100644 --- a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -27,12 +27,14 @@ [Sources.common] AcpiPlatformDxe.c AcpiPptt.c AcpiSlit.c + AcpiSpmi.c AcpiSrat.c [Packages] ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec EmbeddedPkg/EmbeddedPkg.dec + Features/ManageabilityPkg/ManageabilityPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dec @@ -46,6 +48,7 @@ [LibraryClasses] DebugLib FlashLib HobLib + IpmiCommandLib MailboxInterfaceLib SystemFirmwareInterfaceLib TimerLib @@ -64,6 +67,7 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision gAmpereTokenSpaceGuid.PcdPmproDbBaseReg gAmpereTokenSpaceGuid.PcdSmproDbBaseReg + gEfiMdePkgTokenSpaceGuid.PcdIpmiSsifSmbusSlaveAddr [Guids] gArmMpCoreInfoGuid diff --git a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h index 170aeff24d59..ff60bbe9fc27 100644 --- a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h +++ b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h @@ -83,4 +83,17 @@ AcpiInstallIort ( VOID ); +/** + Install SPMI (Service Processor Management Interface table) table. + + @retval EFI_SUCCESS The table was installed successfully. + @retval Others Failed to install the table. + +**/ +EFI_STATUS +EFIAPI +AcpiInstallSpmiTable ( + VOID + ); + #endif /* ACPI_PLATFORM_H_ */ diff --git a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.c b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.c index 28c422dff166..a82a93d23fa2 100644 --- a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.c +++ b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.c @@ -114,6 +114,11 @@ InstallAcpiOnReadyToBoot ( DEBUG ((DEBUG_INFO, "Populate BERT record\n")); } + Status = AcpiInstallSpmiTable (); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "Installed SPMI table\n")); + } + // // Close the event, so it will not be signalled again. // diff --git a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiSpmi.c b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiSpmi.c new file mode 100644 index 000000000000..eefc419b07aa --- /dev/null +++ b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiSpmi.c @@ -0,0 +1,112 @@ +/** @file + + Copyright (c) 2024, Ampere Computing LLC. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <IndustryStandard/Ipmi.h> +#include <IndustryStandard/ServiceProcessorManagementInterfaceTable.h> +#include <Library/IpmiCommandLib.h> +#include "AcpiPlatform.h" + +// +// SPMI Revision (as defined in IPMI v2.0 spec.) +// +#define EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE_REVISION 0x05 + +STATIC EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE mSpmiTable = { + __ACPI_HEADER ( + EFI_ACPI_6_3_SERVER_PLATFORM_MANAGEMENT_INTERFACE_TABLE_SIGNATURE, + EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE, + EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE_REVISION + ), + 0x04, // SMBUS System Interface (SSIF) + 0x01, // Reserved - Must be 0x01 for backward compatiblity + 0, // Specification Revision + 0, // Interrupt Type + 0, // GPE + EFI_ACPI_RESERVED_BYTE, // Reserved + 0, // PCI Device Flag + 0, // Global System Interrupt + { + 0x04, // Address Space ID: 4 (SMBUS) + 0, // Register Bit Width + 0, // Register Bit Offset + 0x01, // Address Size: 1 (Byte Access) + FixedPcdGet8 (PcdIpmiSsifSmbusSlaveAddr), // Address (7-bit SMBUS Address of BMC SSIF) + }, + { + { + 0, // UID Byte 1 + 0, // UID Byte 2 + 0, // UID Byte 3 + 0 // UID Byte 4 + } + }, + EFI_ACPI_RESERVED_BYTE // Reserved for backward compatiblity +}; + +EFI_STATUS +UpdateIpmiSpecRevision ( + EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE *SpmiTable + ) +{ + EFI_STATUS Status; + IPMI_GET_DEVICE_ID_RESPONSE DeviceId; + + Status = IpmiGetDeviceId (&DeviceId); + if (!EFI_ERROR (Status) && (DeviceId.CompletionCode == IPMI_COMP_CODE_NORMAL)) { + // BCD Format + SpmiTable->SpecificationRevision = DeviceId.SpecificationVersion & 0xF0; + SpmiTable->SpecificationRevision |= (DeviceId.SpecificationVersion & 0x0F) << 8; + } + + return Status; +} + +/** + Install SPMI (Service Processor Management Interface table) table. + + @retval EFI_SUCCESS The table was installed successfully. + @retval Others Failed to install the table. + +**/ +EFI_STATUS +AcpiInstallSpmiTable ( + VOID + ) +{ + EFI_STATUS Status; + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + UINTN SpmiTableKey; + + Status = gBS->LocateProtocol ( + &gEfiAcpiTableProtocolGuid, + NULL, + (VOID **)&AcpiTableProtocol + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = UpdateIpmiSpecRevision (&mSpmiTable); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to update IPMI Specification Revision - %r\n", __func__, Status)); + return Status; + } + + Status = AcpiTableProtocol->InstallAcpiTable ( + AcpiTableProtocol, + (VOID *)&mSpmiTable, + mSpmiTable.Header.Length, + &SpmiTableKey + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to install SPMI table - %r\n", __func__, Status)); + return Status; + } + + return EFI_SUCCESS; +} -- 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#120335): https://edk2.groups.io/g/devel/message/120335 Mute This Topic: https://groups.io/mt/107889268/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-