Reviewed-by: Chuong Tran <chu...@os.amperecomputing.com>

Thanks,
Chuong

On 8/15/2024 1:55 PM, Nhi Pham wrote:
This implements ACPI SPMI table as defined in the IPMI specification.

Signed-off-by: Nhi Pham <n...@os.amperecomputing.com>
---
v2:
     + Remove EFIAPI
     + Make the function UpdateIpmiSpecRevision() static
     + Change 0x0F to 0xF to be more readable.

  Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   4 +
  Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h      |  12 +++
  Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.c   |   5 +
  Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiSpmi.c          | 113 
++++++++++++++++++++
  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..5fac393bb9e8 100644
--- a/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h
+++ b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiPlatform.h
@@ -83,4 +83,16 @@ 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
+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..937f02093185
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/AcpiPlatformDxe/AcpiSpmi.c
@@ -0,0 +1,113 @@
+/** @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
+};
+
+static
+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 & 0xF) 
<< 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;
+}



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#120396): https://edk2.groups.io/g/devel/message/120396
Mute This Topic: https://groups.io/mt/107909806/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to