From nobody Mon Feb 9 09:23:06 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+110231+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+110231+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1698446282; cv=none; d=zohomail.com; s=zohoarc; b=JJ/aAhKRceW6GxfTyrs8t7CVVq3ESrjH3+YwUzs7nb5tX+3/gCddQBWZyHAIQzxMKghe6y+XKxynth+zXDR0M2gIyriLMuORjdAdUmvxAs6+L0AX9Nl7m0GIpGcQFpFj8H+KghhY5sob77sMsVwJiX/+JBdvc4hBqThM3XGsb7I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1698446282; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=KQ6pOm2IBL8a2h4KBBfwALsCXHkGW81uEvBwWBEjNDo=; b=KypMf0coz32p6KfMxEBaP5lhFc7qOmQYw1Di4sg7klu+3IV3pT3MsNyokE+TBKgzAND2flaN1wSlenR4rI5PA4pViLAvxRi5CBpHbY4lLy9yv/VfNuWUZ+SphpnhpuXLw+RYoMho3bk0SXD4nTdFGuv2g8ik3Xfzdv7nyFDJG2c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+110231+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1698446282298837.1047177092104; Fri, 27 Oct 2023 15:38:02 -0700 (PDT) Return-Path: DKIM-Signature: a=rsa-sha256; bh=NIstFUyx6CJJqEIyv9bbv3jLNZ7yJ4v6MIC6YIiribc=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1698446282; v=1; b=WfD46z0MSWPF6AI6Bj/I6OKfV+6QJPYQWvUhjWRI8YCEOH5XDjN/M2wGI47gciR1GSmqWsj/ GAXF1k+Xt2hw9zXLsDZ6YYuU6jvVMCw5mzplFxaX4MQpx9rSrPtW1FLV/KEcQb/Mh8dGOxWRagw T46t6dkzuvLISsRAx7o6kb+A= X-Received: by 127.0.0.2 with SMTP id uM6gYY1788612xYVLuwb2fIk; Fri, 27 Oct 2023 15:38:02 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by mx.groups.io with SMTP id smtpd.web10.16429.1698437520175802004 for ; Fri, 27 Oct 2023 13:12:04 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10876"; a="372897524" X-IronPort-AV: E=Sophos;i="6.03,257,1694761200"; d="scan'208";a="372897524" X-Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Oct 2023 13:12:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.03,257,1694761200"; d="scan'208";a="948627" X-Received: from scsrds0181.amr.corp.intel.com ([10.116.50.7]) by fmviesa002.fm.intel.com with ESMTP; 27 Oct 2023 13:11:52 -0700 From: Zhen Gong To: devel@edk2.groups.io Cc: Zhen Gong Subject: [edk2-devel] [PATCH edk2-platforms 3/4] IpmiFeaturePkg: Add ACPI power state drivers Date: Fri, 27 Oct 2023 13:11:15 -0700 Message-Id: <5518582e9e3665c3a474b1e65980ed0c12123243.1698437221.git.zhen.gong@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,zhen.gong@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: nPAOAHcP3kt1upNKRz4wyO83x1787277AA= Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1698446284459100014 Content-Type: text/plain; charset="utf-8" Add DXE and SMM drivers that send "Set ACPI Power State" command to BMC. Signed-off-by: Zhen Gong --- .../IpmiFeaturePkg/IpmiFeaturePkg.dec | 1 + .../IpmiFeaturePkg/Include/IpmiFeature.dsc | 2 + .../IpmiFeaturePkg/Include/PostMemory.fdf | 2 + .../BmcAcpiState/BmcAcpiState.inf | 40 ++++ .../BmcAcpiSwChild/BmcAcpiSwChild.inf | 39 ++++ .../BmcAcpiState/BmcAcpiState.h | 26 +++ .../BmcAcpiSwChild/BmcAcpiSwChild.h | 82 ++++++++ .../Include/Protocol/BmcAcpiSwChildPolicy.h | 31 +++ .../BmcAcpiState/BmcAcpiState.c | 93 +++++++++ .../BmcAcpiSwChild/BmcAcpiSwChild.c | 189 ++++++++++++++++++ 10 files changed, 505 insertions(+) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piState/BmcAcpiState.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piSwChild/BmcAcpiSwChild.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piState/BmcAcpiState.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piSwChild/BmcAcpiSwChild.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/Protocol/BmcAcpiSwChildPolicy.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piState/BmcAcpiState.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piSwChild/BmcAcpiSwChild.c diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeatureP= kg.dec b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.d= ec index 22bc4e69be8a..be0a11e2adb1 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec @@ -75,6 +75,7 @@ [Protocols] gEfiVideoPrintProtocolGuid =3D {0x3dbf3e06, 0x9d0c, 0x40d3, {0xb2, 0= x17, 0x45, 0x5f, 0x33, 0x9e, 0x29, 0x09}} gIpmiTransport2ProtocolGuid =3D { 0x4A1D0E66, 0x5271, 0x4E22, { 0x83, 0x= FE, 0x90, 0x92, 0x1B, 0x74, 0x82, 0x13 }} gSmmIpmiTransport2ProtocolGuid =3D { 0x1DBD1503, 0x0A60, 0x4230, { 0xAA,= 0xA3, 0x80, 0x16, 0xD8, 0xC3, 0xDE, 0x2F }} + gEfiBmcAcpiSwChildPolicyProtocolGuid =3D { 0x89843c0b, 0x5701, 0x4ff6, {= 0xa4, 0x73, 0x65, 0x75, 0x99, 0x04, 0xf7, 0x35 } } gEfiGenericElogProtocolGuid =3D { 0x59d02fcd, 0x9233, 0x4d34, { 0xbc, 0x= fe, 0x87, 0xca, 0x81, 0xd3, 0xdd, 0xa7 } } gSmmGenericElogProtocolGuid =3D { 0x664ef1f6, 0x19bf, 0x4498, { 0xab, 0x= 6a, 0xfc, 0x05, 0x72, 0xfb, 0x98, 0x51 } } gEfiRedirElogProtocolGuid =3D { 0x16d11030, 0x71ba, 0x4e5e, { 0xa9, 0xf9= , 0xb4, 0x75, 0xa5, 0x49, 0x4, 0x8a } } diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Ipmi= Feature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Ipm= iFeature.dsc index fc9001e98473..7e663236d9a1 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature= .dsc +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature= .dsc @@ -122,6 +122,8 @@ [Components.X64] IpmiFeaturePkg/GenericIpmi/Dxe/GenericIpmi.inf IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf IpmiFeaturePkg/BmcAcpi/BmcAcpi.inf + IpmiFeaturePkg/BmcAcpiState/BmcAcpiState.inf + IpmiFeaturePkg/BmcAcpiSwChild/BmcAcpiSwChild.inf IpmiFeaturePkg/BmcElog/DxeBmcElog.inf IpmiFeaturePkg/BmcElog/SmmBmcElog.inf IpmiFeaturePkg/GenericElog/Dxe/GenericElog.inf diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Post= Memory.fdf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Post= Memory.fdf index f29810bc0b34..9b692f07dcd8 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/PostMemory.= fdf +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/PostMemory.= fdf @@ -10,6 +10,8 @@ INF IpmiFeaturePkg/GenericIpmi/Dxe/GenericIpmi.inf INF IpmiFeaturePkg/IpmiInit/DxeIpmiInit.inf INF RuleOverride =3D DRIVER_ACPITABLE IpmiFeaturePkg/BmcAcpi/BmcAcpi.inf +INF IpmiFeaturePkg/BmcAcpiState/BmcAcpiState.inf +INF IpmiFeaturePkg/BmcAcpiSwChild/BmcAcpiSwChild.inf INF IpmiFeaturePkg/BmcElog/DxeBmcElog.inf INF IpmiFeaturePkg/BmcElog/SmmBmcElog.inf INF IpmiFeaturePkg/Frb/FrbDxe.inf diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiState= /BmcAcpiState.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAc= piState/BmcAcpiState.inf new file mode 100644 index 000000000000..f1b750d6a20a --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiState/BmcAcp= iState.inf @@ -0,0 +1,40 @@ +### @file +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +### + + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D BmcAcpiState + FILE_GUID =3D 04103e59-48cc-417a-baec-9929c69c20f6 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D BmcAcpiStateEntryPoint + +[Sources] + BmcAcpiState.c + BmcAcpiState.h + +[Packages] + IpmiFeaturePkg/IpmiFeaturePkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + DebugLib + UefiDriverEntryPoint + UefiBootServicesTableLib + IpmiBaseLib + +[Protocols] + gIpmiTransportProtocolGuid + +[Guids] + gEfiEventExitBootServicesGuid ## CONSUMES ## Event + +[Depex] + gIpmiTransportProtocolGuid diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiSwChi= ld/BmcAcpiSwChild.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/B= mcAcpiSwChild/BmcAcpiSwChild.inf new file mode 100644 index 000000000000..59a9f77d9f10 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiSwChild/BmcA= cpiSwChild.inf @@ -0,0 +1,39 @@ +### @file +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +### + + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D BmcAcpiSwChild + FILE_GUID =3D BB5BEBD1-CE71-4cd0-9E2F-C07886502661 + MODULE_TYPE =3D DXE_SMM_DRIVER + PI_SPECIFICATION_VERSION =3D 0x0001000A + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D InitializeBmcAcpiSwChild + +[Sources] + BmcAcpiSwChild.c + BmcAcpiSwChild.h + +[Packages] + IpmiFeaturePkg/IpmiFeaturePkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DebugLib + SmmServicesTableLib + ServerManagementLib + IpmiBaseLib + +[Protocols] + gEfiBmcAcpiSwChildPolicyProtocolGuid # PROTOCOL ALWAYS_PRODUCED + +[Depex] + gSmmIpmiTransportProtocolGuid diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiState= /BmcAcpiState.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpi= State/BmcAcpiState.h new file mode 100644 index 000000000000..4352652a2bda --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiState/BmcAcp= iState.h @@ -0,0 +1,26 @@ +/** @file + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _ACPI_BMC_STATE_H_ +#define _ACPI_BMC_STATE_H_ + +// +// Statements that include other header files +// +#include +#include +#include +#include +#include +#include +#include +#include +#include + +EFI_EVENT mExitBootServicesEvent =3D NULL; + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiSwChi= ld/BmcAcpiSwChild.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Bmc= AcpiSwChild/BmcAcpiSwChild.h new file mode 100644 index 000000000000..10d687ed2b84 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiSwChild/BmcA= cpiSwChild.h @@ -0,0 +1,82 @@ +/** @file + This driver produces the ACPI enable and disable SMI handlers. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _BMC_ACPI_SW_CHILD_H_ +#define _BMC_ACPI_SW_CHILD_H_ + +// +// Statements that include other files +// +#include +#include +#include +#include +#include +#include +#include + +#include "ServerManagement.h" + +#include +#include +#include +#include +#include + +// +// Module prototypes +// + +/** + This is the standard EFI driver entrypoint. This function initializes + the BMC ACPI SW Child protocol. + + @param ImageHandle - ImageHandle of the loaded driver + @param SystemTable - Pointer to the System Table + + @retval EFI_SUCCESS - If all services discovered. + @retval Other - Failure in constructor. + +**/ +EFI_STATUS +EFIAPI +InitializeBmcAcpiSwChild ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +/** + Send the time to the BMC, in the UNIX 32 bit format. + + @retval Status - result of sending the time stamp + +**/ +EFI_STATUS +SyncTimeStamp ( + VOID + ); + +/** + Send a command to BMC to set the present power state. + + @param This + @param PowerState + @param DeviceState + + @retval EFI_SUCCESS if successful + @retval Other than EFI_SUCCESS if not successful + +**/ +EFI_STATUS +SetACPIPowerStateInBMC ( + IN EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL *This, + IN UINT8 PowerState, + IN UINT8 DeviceState + ); + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Prot= ocol/BmcAcpiSwChildPolicy.h b/Features/Intel/OutOfBandManagement/IpmiFeatur= ePkg/Include/Protocol/BmcAcpiSwChildPolicy.h new file mode 100644 index 000000000000..7958f8c63899 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Protocol/Bm= cAcpiSwChildPolicy.h @@ -0,0 +1,31 @@ +/** @file + This protocol produces BmcAcpiSwChildPolicy Protocol. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _BMC_ACPI_SW_CHILD_POLICY_H_ +#define _BMC_ACPI_SW_CHILD_POLICY_H_ + +typedef struct _EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL EFI_BMC_ACPI_SW_CHIL= D_POLICY_PROTOCOL; + +#define EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL_GUID \ + { 0x89843c0b, 0x5701, 0x4ff6, 0xa4, 0x73, 0x65, 0x75, 0x99, 0x04, 0xf7, = 0x35 } + +typedef +EFI_STATUS +(EFIAPI *EFI_SET_ACPI_POWER_STATE_IN_BMC)( + IN EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL *This, + IN UINT8 PowerState, + IN UINT8 DeviceState + ); + +struct _EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL { + EFI_SET_ACPI_POWER_STATE_IN_BMC SetACPIPowerStateInBMC; +}; + +extern EFI_GUID gEfiBmcAcpiSwChildPolicyProtocolGuid; + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiState= /BmcAcpiState.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpi= State/BmcAcpiState.c new file mode 100644 index 000000000000..04fe2d80307e --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiState/BmcAcp= iState.c @@ -0,0 +1,93 @@ +/** @file + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +/** + Notification function of Exit Boot Services event group. + + Send a command to BMC to set power state to S0. + + @param Event Event whose notification function is being invoked. + @param Context Pointer to the notification function's context. + +**/ +VOID +EFIAPI +BmcAcpiPowerStateS0Notify ( + EFI_EVENT Event, + VOID *Context + ) +{ + EFI_STATUS Status =3D EFI_SUCCESS; + IPMI_SET_ACPI_POWER_STATE_REQUEST AcpiPowerStateRequest; + UINT8 AcpiPowerStateResponse; + UINT32 ResponseDataSize =3D 0; + + AcpiPowerStateRequest.SystemPowerState.Bits.PowerState =3D IPMI_SYSTEM_= POWER_STATE_S0_G0; // System Power State S0 + AcpiPowerStateRequest.SystemPowerState.Bits.StateChange =3D 1; + AcpiPowerStateRequest.DevicePowerState.Bits.PowerState =3D IPMI_DEVICE_= POWER_STATE_D0; // Device State State S0 + AcpiPowerStateRequest.DevicePowerState.Bits.StateChange =3D 1; + + ResponseDataSize =3D sizeof (AcpiPowerStateResponse); + + // + // Send a command to BMC to set power state to S0. + // + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_APP, + IPMI_APP_SET_ACPI_POWERSTATE, + (UINT8 *)&AcpiPowerStateRequest, + sizeof (IPMI_SET_ACPI_POWER_STATE_REQUEST), + (UINT8 *)&AcpiPowerStateResponse, + &ResponseDataSize + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IpmiSubmitCommand App Set Acpi Power State Faile= d %r\n", Status)); + } +} + +/** + + Entry point for the Bmc Acpi State Dxe driver. + Use this function to replace previous ACPI Enable SMM handler to set BMC= ACPI power state. + + @param ImageHandle - Image Handle. + @param SystemTable - EFI System Table. + + @retval EFI_SUCCESS - Function has completed successfully. + +**/ +EFI_STATUS +EFIAPI +BmcAcpiStateEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // Create an Exit Boot Service to Send a command to BMC to set the prese= nt power state + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + BmcAcpiPowerStateS0Notify, + NULL, + &gEfiEventExitBootServicesGuid, + &mExitBootServicesEvent + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Create Exit Boot Services Event Failed\n")); + } else { + return EFI_SUCCESS; + } + + return EFI_UNSUPPORTED; +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiSwChi= ld/BmcAcpiSwChild.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Bmc= AcpiSwChild/BmcAcpiSwChild.c new file mode 100644 index 000000000000..ba134db8d50d --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/BmcAcpiSwChild/BmcA= cpiSwChild.c @@ -0,0 +1,189 @@ +/** @file + This driver publishes a protocol that is used by the ACPI SMM Platform + driver to notify the BMC of Power State transitions. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "BmcAcpiSwChild.h" + +// +// Global variables +// +EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL mBmcAcpiSwChild; + +/** + This is the standard EFI driver entrypoint. This function initializes + the BMC ACPI SW Child protocol. + + @param ImageHandle - ImageHandle of the loaded driver + @param SystemTable - Pointer to the System Table + + @retval EFI_SUCCESS - If all services discovered. + @retval Other - Failure in constructor. + +**/ +EFI_STATUS +EFIAPI +InitializeBmcAcpiSwChild ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + Status =3D EFI_SUCCESS; + + mBmcAcpiSwChild.SetACPIPowerStateInBMC =3D (EFI_SET_ACPI_POWER_STATE_IN_= BMC)SetACPIPowerStateInBMC; + + // + // Install protocol + // + Handle =3D NULL; + Status =3D gSmst->SmmInstallProtocolInterface ( + &Handle, + &gEfiBmcAcpiSwChildPolicyProtocolGuid, + EFI_NATIVE_INTERFACE, + &mBmcAcpiSwChild + ); + + return Status; +} + +/** + Send the time to the BMC, in the UNIX 32 bit format. + + @retval Status - result of sending the time stamp + +**/ +EFI_STATUS +SyncTimeStamp ( + VOID + ) +{ + EFI_STATUS Status; + UINT32 ResponseDataSize; + IPMI_ADD_SEL_ENTRY_REQUEST TimeStampEvtRecord; + IPMI_ADD_SEL_ENTRY_RESPONSE AddSelEntryResponse; + IPMI_SET_SEL_TIME_REQUEST SelTimeReq; + UINT8 SelTimeResponse; + + TimeStampEvtRecord.RecordData.RecordId =3D 0; = // Record Id + TimeStampEvtRecord.RecordData.RecordType =3D IPMI_SEL_SYSTEM_RECORD; = // Record Type + TimeStampEvtRecord.RecordData.TimeStamp =3D 0; = // Time stamp + TimeStampEvtRecord.RecordData.GeneratorId =3D 0x0003; = // GenID:BIOS + TimeStampEvtRecord.RecordData.EvMRevision =3D IPMI_EVM_REVISION; = // EVM REV + TimeStampEvtRecord.RecordData.SensorType =3D 0x12; = // Sensor Type + TimeStampEvtRecord.RecordData.SensorNumber =3D 0x83; = // Sensor No + TimeStampEvtRecord.RecordData.EventDirType =3D IPMI_SENSOR_TYPE_EVENT_CO= DE_DISCRETE; // Event Dir + TimeStampEvtRecord.RecordData.OEMEvData1 =3D 05; = // Sensor specific Offset for Timestamp Clock Synch Event. + TimeStampEvtRecord.RecordData.OEMEvData2 =3D 00; = // ED2 + TimeStampEvtRecord.RecordData.OEMEvData3 =3D 0xFF; = // ED3 + + // + // Log Timestamp Clock Synch Event 1st pair. + // + ResponseDataSize =3D sizeof (AddSelEntryResponse); + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_STORAGE, + IPMI_STORAGE_ADD_SEL_ENTRY, + (UINT8 *)&TimeStampEvtRecord, + sizeof (TimeStampEvtRecord), + (UINT8 *)&AddSelEntryResponse, + &ResponseDataSize + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IpmiSubmitCommand Storage Add SEL Entry Failed %= r\n", Status)); + return Status; + } + + Status =3D EfiSmGetTimeStamp (&SelTimeReq.Timestamp); + if (EFI_ERROR (Status)) { + return Status; + } + + ResponseDataSize =3D sizeof (SelTimeResponse); + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_STORAGE, + IPMI_STORAGE_SET_SEL_TIME, + (UINT8 *)&SelTimeReq, + sizeof (SelTimeReq), + (UINT8 *)&SelTimeResponse, + &ResponseDataSize + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IpmiSubmitCommand Storage Set SEL Time Failed %r= \n", Status)); + return Status; + } + + // + // Log Timestamp Clock Sync Event 2nd pair. + // + TimeStampEvtRecord.RecordData.OEMEvData2 =3D 0x80; + ResponseDataSize =3D sizeof (AddSelEntryResponse= ); + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_STORAGE, + IPMI_STORAGE_ADD_SEL_ENTRY, + (UINT8 *)&TimeStampEvtRecor= d, + sizeof (TimeStampEvtRecord), + (UINT8 *)&AddSelEntryRespon= se, + &ResponseDataSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IpmiSubmitCommand Storage Add SEL Entry Failed %= r\n", Status)); + return Status; + } + + return EFI_SUCCESS; +} + +/** + Send a command to BMC to set the present power state. + + @param This + @param PowerState + @param DeviceState + + @retval EFI_SUCCESS if successful + @retval Other than EFI_SUCCESS if not successful + +**/ +EFI_STATUS +SetACPIPowerStateInBMC ( + IN EFI_BMC_ACPI_SW_CHILD_POLICY_PROTOCOL *This, + IN UINT8 PowerState, + IN UINT8 DeviceState + ) +{ + EFI_STATUS Status; + IPMI_SET_ACPI_POWER_STATE_REQUEST AcpiPowerStateRequest; + UINT8 AcpiPowerStateResponse; + UINT32 ResponseDataSize; + + AcpiPowerStateRequest.SystemPowerState.Bits.PowerState =3D PowerState; + AcpiPowerStateRequest.SystemPowerState.Bits.StateChange =3D 1; + AcpiPowerStateRequest.DevicePowerState.Bits.PowerState =3D DeviceState; + AcpiPowerStateRequest.DevicePowerState.Bits.StateChange =3D 1; + + ResponseDataSize =3D sizeof (AcpiPowerStateResponse); + + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_APP, + IPMI_APP_SET_ACPI_POWERSTATE, + (UINT8 *)&AcpiPowerStateRequest, + sizeof (AcpiPowerStateRequest), + (UINT8 *)&AcpiPowerStateResponse, + &ResponseDataSize + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IpmiSubmitCommand App Set Acpi Power State Faile= d %r\n", Status)); + } + + return Status; +} --=20 2.39.2.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#110231): https://edk2.groups.io/g/devel/message/110231 Mute This Topic: https://groups.io/mt/102231768/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-