From: "Abdul Lateef Attar via groups.io" <AbdulLateef.Attar=amd.com@groups.io>
To: <devel@edk2.groups.io>
Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>,
Abner Chang <abner.chang@amd.com>,
Paul Grimes <paul.grimes@amd.com>
Subject: [edk2-devel] [edk2-platforms 3/3] AmdPlatformPkg: Adds SPI smm core platform hook
Date: Tue, 28 May 2024 19:37:52 +0530 [thread overview]
Message-ID: <34726328bd35e35c1c8ac4953d98bc71099a7f10.1716905162.git.AbdulLateef.Attar@amd.com> (raw)
In-Reply-To: <cover.1716905162.git.AbdulLateef.Attar@amd.com>
Register a smm core platform hook handler for SPI device,
using AMD SmmCorePlatformHookLib library.
This platform hook saves the SPI host controller state.
Cc: Abner Chang <abner.chang@amd.com>
Cc: Paul Grimes <paul.grimes@amd.com>
Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
---
.../AMD/AmdPlatformPkg/AmdPlatformPkg.dec | 3 +
.../AMD/AmdPlatformPkg/AmdPlatformPkg.dsc | 2 +
.../Include/Protocol/AmdSpiSmmHcState.h | 107 +++++++++++++
.../SmmCoreAmdSpiHcHookLib.c | 145 ++++++++++++++++++
.../SmmCoreAmdSpiHcHookLib.h | 20 +++
.../SmmCoreAmdSpiHcHookLib.inf | 41 +++++
.../SmmCoreAmdSpiHcHookLib.uni | 11 ++
7 files changed, 329 insertions(+)
create mode 100644 Platform/AMD/AmdPlatformPkg/Include/Protocol/AmdSpiSmmHcState.h
create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.c
create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.h
create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.inf
create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.uni
diff --git a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec
index 3020e628a3..907c5b9b74 100644
--- a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec
+++ b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec
@@ -29,6 +29,9 @@
[Guids]
gAmdPlatformPkgTokenSpaceGuid = { 0x663DE733, 0x70E0, 0x4D37, { 0xBB, 0x30, 0x7D, 0x9E, 0xAF, 0x9B, 0xDA, 0xE9 }}
+[Protocols]
+ gAmdSpiHcStateProtocolGuid = { 0x189566ab, 0x245, 0x43ae, {0x9d, 0x1, 0xd2, 0x21, 0x1c, 0xb9, 0x1a, 0xda }}
+
[PcdsDynamic]
## Event GUID to trigger logo displaying
# Default set to gMinPlatformPkgTokenSpaceGuid.gBdsEventAfterConsoleReadyBeforeBootOptionGuid
diff --git a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc
index 482e6f2f30..012270074d 100644
--- a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc
+++ b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc
@@ -64,6 +64,7 @@
[LibraryClasses.common.SMM_CORE]
SmmCorePlatformHookLib|AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
+ SmmCoreAmdSpiHcHookLib|AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.inf
[Components]
AmdPlatformPkg/Library/BaseAlwaysFalseDepexLib/BaseAlwaysFalseDepexLib.inf
@@ -79,3 +80,4 @@
[Components.common.SMM_CORE]
AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
+ AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.inf
diff --git a/Platform/AMD/AmdPlatformPkg/Include/Protocol/AmdSpiSmmHcState.h b/Platform/AMD/AmdPlatformPkg/Include/Protocol/AmdSpiSmmHcState.h
new file mode 100644
index 0000000000..0e2bccb3ef
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Include/Protocol/AmdSpiSmmHcState.h
@@ -0,0 +1,107 @@
+/** @file
+ Header file of AMD SMM SPI host controller state protocol
+
+ Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef AMD_SMM_SPI_HC_STATE_PROTOCOL_H_
+#define AMD_SMM_SPI_HC_STATE_PROTOCOL_H_
+
+typedef struct _SMM_EFI_SPI_HC_STATE_PROTOCOL SMM_EFI_SPI_HC_STATE_PROTOCOL;
+
+/**
+ Save/Restore the state of the SPI Host Controller
+
+ Use a chipset specific method to save the state of the SPI Host controller so
+ it can be used without disturbing other transactions.
+
+ @param[in] This Pointer to an SMM_EFI_SPI_HC_STATE_PROTOCOL structure.
+
+ @retval EFI_SUCCESS The State was saved successfully
+ @retval DEVICE_ERROR SPI Executes command failed
+
+**/
+typedef EFI_STATUS
+(EFIAPI *SMM_SPI_HC_STATE)(
+ IN CONST SMM_EFI_SPI_HC_STATE_PROTOCOL *This
+ );
+
+/**
+ Lock/Unlock the SPI host controller register
+
+ Use a chipset specific method to lock or unlock SPI host controller register.
+
+ @param[in] This Pointer to an SMM_EFI_SPI_HC_STATE_PROTOCOL structure.
+
+ @retval EFI_SUCCESS The clock was set up successfully
+ @retval DEVICE_ERROR SPI Executes command failed
+
+
+**/
+typedef EFI_STATUS
+(EFIAPI *SMM_SPI_HC_LOCK_UNLOCK)(
+ IN CONST SMM_EFI_SPI_HC_STATE_PROTOCOL *This
+ );
+
+/**
+ Block/Unblock SPI opcode
+
+ Use a chipset specific method to block and unclock specific SPI opcode.
+
+ @param[in] This Pointer to an SMM_EFI_SPI_HC_STATE_PROTOCOL structure.
+
+ @retval EFI_SUCCESS The clock was set up successfully
+ @retval DEVICE_ERROR SPI Executes command failed
+
+**/
+typedef EFI_STATUS
+(EFIAPI *SMM_SPI_HC_BLOCK_UNBLOCK_OPCODE)(
+ IN CONST SMM_EFI_SPI_HC_STATE_PROTOCOL *This,
+ IN UINT8 Opcode
+ );
+
+/**
+ Block/Unblock any SPI opcodes
+
+ Use a chipset specific method to block and unclock all SPI opcodes.
+
+ @param[in] This Pointer to an SMM_EFI_SPI_HC_STATE_PROTOCOL structure.
+
+ @retval EFI_SUCCESS The clock was set up successfully
+ @retval DEVICE_ERROR SPI Executes command failed
+
+**/
+typedef EFI_STATUS
+(EFIAPI *SMM_SPI_HC_BLOCK_UNBLOCK_ALL_OPCODES)(
+ IN CONST SMM_EFI_SPI_HC_STATE_PROTOCOL *This
+ );
+
+///
+/// Manage and control the SPI host controller state.
+///
+struct _SMM_EFI_SPI_HC_STATE_PROTOCOL {
+ ///
+ /// Save and Restore SPI host controller state.
+ ///
+ SMM_SPI_HC_STATE SaveState;
+ SMM_SPI_HC_STATE RestoreState;
+
+ ///
+ /// Lock and Unlock SPI host controller registers
+ ///
+ SMM_SPI_HC_LOCK_UNLOCK Lock;
+ SMM_SPI_HC_LOCK_UNLOCK Unlock;
+
+ ///
+ /// Block and Unblock SPI Opcode
+ ///
+ SMM_SPI_HC_BLOCK_UNBLOCK_OPCODE BlockOpcode;
+ SMM_SPI_HC_BLOCK_UNBLOCK_OPCODE UnblockOpcode;
+ SMM_SPI_HC_BLOCK_UNBLOCK_ALL_OPCODES UnblockAllOpcodes;
+};
+
+extern EFI_GUID gAmdSpiHcStateProtocolGuid;
+
+#endif // AMD_SMM_SPI_HC_STATE_PROTOCOL_H__
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.c b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.c
new file mode 100644
index 0000000000..4284f13a5e
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.c
@@ -0,0 +1,145 @@
+/** @file
+ SMM core hook for AMD SPI Host Controller State
+
+ Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+#include <PiSmm.h>
+#include <Library/SmmServicesTableLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Protocol/AmdSpiSmmHcState.h>
+
+#include <Library/AmdSmmCorePlatformHookLib.h>
+#include "SmmCoreAmdSpiHcHookLib.h"
+
+VOID *mSmmCorePlatformHookHcStateRegistration = NULL;
+
+SMM_CORE_HOOK_AMD_SPI_HC_STATE_CONTEXT mSmmCorePlatformHookContext;
+
+/**
+ Performs platform specific tasks before invoking registered SMI handlers.
+
+ This function performs platform specific tasks before invoking registered SMI handlers.
+
+ @retval EFI_SUCCESS The platform hook completes successfully.
+ @retval Other values The platform hook cannot complete due to some error.
+
+**/
+EFI_STATUS
+EFIAPI
+SmmCoreSpiHcHookBeforeSmmDispatch (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+ SMM_EFI_SPI_HC_STATE_PROTOCOL *SpiHcState;
+
+ Status = EFI_SUCCESS;
+ SpiHcState = mSmmCorePlatformHookContext.SmmSpiHcStateInterface;
+ if (SpiHcState != NULL) {
+ Status = SpiHcState->SaveState (SpiHcState);
+ // Open up SPI HC for SMM, Restore state will automatically return back to
+ // state on SMM entry
+ Status = SpiHcState->Unlock (SpiHcState);
+ Status = SpiHcState->UnblockAllOpcodes (SpiHcState);
+ }
+
+ return Status;
+}
+
+/**
+ Performs platform specific tasks after invoking registered SMI handlers.
+
+ This function performs platform specific tasks after invoking registered SMI handlers.
+
+ @retval EFI_SUCCESS The platform hook completes successfully.
+ @retval Other values The platform hook cannot complete due to some error.
+
+**/
+EFI_STATUS
+EFIAPI
+SmmCoreSpiHcHookAfterSmmDispatch (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+ SMM_EFI_SPI_HC_STATE_PROTOCOL *SpiHcState;
+
+ Status = EFI_SUCCESS;
+ SpiHcState = mSmmCorePlatformHookContext.SmmSpiHcStateInterface;
+ if (SpiHcState != NULL) {
+ Status = SpiHcState->RestoreState (SpiHcState);
+ }
+
+ return Status;
+}
+
+/**
+ Notification for SMM ReadyToLock protocol.
+
+ @param[in] Protocol Points to the protocol's unique identifier.
+ @param[in] Interface Points to the interface instance.
+ @param[in] Handle The handle on which the interface was installed.
+
+ @retval EFI_SUCCESS Notification runs successfully.
+**/
+EFI_STATUS
+EFIAPI
+SmmCorePlatformHookHcStateNotify (
+ IN CONST EFI_GUID *Protocol,
+ IN VOID *Interface,
+ IN EFI_HANDLE Handle
+ )
+{
+ mSmmCorePlatformHookContext.SmmSpiHcStateInterface = Interface;
+ mSmmCorePlatformHookContext.SmmSpiHcStateHandle = Handle;
+ return EFI_SUCCESS;
+}
+
+/**
+ Constructor for SmmLockBox library.
+ This is used to set SmmLockBox context, which will be used in PEI phase in S3 boot path later.
+
+ @param[in] ImageHandle Image handle of this driver.
+ @param[in] SystemTable A Pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS
+ @return Others Some error occurs.
+**/
+EFI_STATUS
+EFIAPI
+SmmCoreAmdSpiHcHookConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ SetMem (
+ &mSmmCorePlatformHookContext,
+ sizeof (mSmmCorePlatformHookContext),
+ 0
+ );
+ //
+ // Register gAmdSpiHcStateProtocolGuid notification.
+ //
+ Status = gSmst->SmmRegisterProtocolNotify (
+ &gAmdSpiHcStateProtocolGuid,
+ SmmCorePlatformHookHcStateNotify,
+ &mSmmCorePlatformHookHcStateRegistration
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Register AMD SMM Dispatcher hook instance.
+ //
+ Status = RegisterSmmDispatcherHook (
+ SmmCoreSpiHcHookBeforeSmmDispatch,
+ SmmCoreSpiHcHookAfterSmmDispatch,
+ 0
+ );
+ return Status;
+}
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.h b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.h
new file mode 100644
index 0000000000..8a5dfe623c
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.h
@@ -0,0 +1,20 @@
+/** @file
+ Header file of SMM core platform hook for AMD SPI Host Controller state library
+
+ Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef SMM_CORE_AMD_SPI_HC_HOOK_LIB_H_
+#define SMM_CORE_AMD_SPI_HC_HOOK_LIB_H_
+
+///
+/// Structure of AMD SPI HC State record
+///
+typedef struct {
+ VOID *SmmSpiHcStateInterface; ///< AMD SMM SPI HC State Protocol Interface
+ EFI_HANDLE SmmSpiHcStateHandle; ///< Handle of MD SMM SPI HC State Protocol handle
+} SMM_CORE_HOOK_AMD_SPI_HC_STATE_CONTEXT;
+
+#endif // SMM_CORE_AMD_SPI_HC_HOOK_LIB_H_
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.inf b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.inf
new file mode 100644
index 0000000000..9855aa8543
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.inf
@@ -0,0 +1,41 @@
+## @file
+# INF of SMM Core AMD SPI Host Contoller State hook library.
+#
+# Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SmmCoreAmdSpiHcHookLib
+ MODULE_UNI_FILE = SmmCoreAmdSpiHcHookLib.uni
+ FILE_GUID = 65D0E2A5-C8C6-4DEE-8FD0-5A006A49E9B7
+ MODULE_TYPE = SMM_CORE
+ VERSION_STRING = 1.0
+ PI_SPECIFICATION_VERSION = 0x0001000A
+ LIBRARY_CLASS = SmmCoreAmdSpiHcHookLib|SMM_CORE
+ CONSTRUCTOR = SmmCoreAmdSpiHcHookConstructor
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[Sources]
+ SmmCoreAmdSpiHcHookLib.c
+ SmmCoreAmdSpiHcHookLib.h
+
+[Packages]
+ AmdPlatformPkg/AmdPlatformPkg.dec
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+ SmmServicesTableLib
+ BaseLib
+ DebugLib
+ BaseMemoryLib
+
+[Protocols]
+ gAmdSpiHcStateProtocolGuid
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.uni b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.uni
new file mode 100644
index 0000000000..0a73c4acb4
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCoreAmdSpiHcHookLib/SmmCoreAmdSpiHcHookLib.uni
@@ -0,0 +1,11 @@
+## @file
+# UNI file of SMM Core AMD SPI Host Controller State hook library module
+#
+# Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+#string STR_MODULE_ABSTRACT #language en-US "SMM Core AMD SPI HC State Hook Library instance"
+
+#string STR_MODULE_DESCRIPTION #language en-US "SMM Core AMD SPI Host Controller Hook Library instance"
--
2.34.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119306): https://edk2.groups.io/g/devel/message/119306
Mute This Topic: https://groups.io/mt/106349079/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-05-28 14:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-28 14:07 [edk2-devel] [edk2-platforms 0/3] AmdPlatformPkg: SmbiosDxe and SPI supporting libraries Abdul Lateef Attar via groups.io
2024-05-28 14:07 ` [edk2-devel] [edk2-platforms 1/3] AmdPlatformPkg: Removes unused gBoardBdsBootFromDevicePathProtocolGuid Abdul Lateef Attar via groups.io
2024-05-29 8:56 ` Chang, Abner via groups.io
2024-05-28 14:07 ` [edk2-devel] [edk2-platforms 2/3] AmdPlatformPkg: Implements SmmCorePlatformHookLib library Abdul Lateef Attar via groups.io
2024-05-29 8:57 ` Chang, Abner via groups.io
2024-05-28 14:07 ` Abdul Lateef Attar via groups.io [this message]
2024-05-29 8:57 ` [edk2-devel] [edk2-platforms 3/3] AmdPlatformPkg: Adds SPI smm core platform hook Chang, Abner via groups.io
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=34726328bd35e35c1c8ac4953d98bc71099a7f10.1716905162.git.AbdulLateef.Attar@amd.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox