+++ /dev/null
-/** @file\r
-This module provides an implementation of the SMM Control PPI for use with\r
-the QNC.\r
-\r
-Copyright (c) 2013-2015 Intel Corporation.\r
-\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include <PiPei.h>\r
-\r
-#include <Ppi/SmmControl.h>\r
-\r
-#include <Library/DebugLib.h>\r
-#include <Library/HobLib.h>\r
-#include <Library/PeiServicesLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/IoLib.h>\r
-#include <Library/PciLib.h>\r
-\r
-#include <IntelQNCPeim.h>\r
-#include <Library/QNCAccessLib.h>\r
-#include <Uefi/UefiBaseType.h>\r
-\r
-/**\r
- Generates an SMI using the parameters passed in.\r
-\r
- @param PeiServices Describes the list of possible PEI Services.\r
- @param This A pointer to an instance of\r
- EFI_SMM_CONTROL_PPI\r
- @param ArgumentBuffer The argument buffer\r
- @param ArgumentBufferSize The size of the argument buffer\r
- @param Periodic TRUE to indicate a periodical SMI\r
- @param ActivationInterval Interval of the periodical SMI\r
-\r
- @retval EFI_INVALID_PARAMETER Periodic is TRUE or ArgumentBufferSize > 1\r
- @retval EFI_SUCCESS SMI generated\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiActivate (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN PEI_SMM_CONTROL_PPI *This,\r
- IN OUT INT8 *ArgumentBuffer OPTIONAL,\r
- IN OUT UINTN *ArgumentBufferSize OPTIONAL,\r
- IN BOOLEAN Periodic OPTIONAL,\r
- IN UINTN ActivationInterval OPTIONAL\r
- );\r
-\r
-/**\r
- Clears an SMI.\r
-\r
- @param PeiServices Describes the list of possible PEI Services.\r
- @param This Pointer to an instance of EFI_SMM_CONTROL_PPI\r
- @param Periodic TRUE to indicate a periodical SMI\r
-\r
- @return Return value from SmmClear()\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiDeactivate (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN PEI_SMM_CONTROL_PPI *This,\r
- IN BOOLEAN Periodic OPTIONAL\r
- );\r
-\r
-PEI_SMM_CONTROL_PPI mSmmControlPpi = {\r
- PeiActivate,\r
- PeiDeactivate\r
-};\r
-\r
-EFI_PEI_PPI_DESCRIPTOR mPpiList = {\r
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gPeiSmmControlPpiGuid,\r
- &mSmmControlPpi\r
-};\r
-\r
-/**\r
- Clear SMI related chipset status and re-enable SMI by setting the EOS bit.\r
-\r
- @retval EFI_SUCCESS The requested operation has been carried out successfully\r
- @retval EFI_DEVICE_ERROR The EOS bit could not be set.\r
-\r
-**/\r
-EFI_STATUS\r
-SmmClear (\r
- VOID\r
- )\r
-{\r
- UINT16 GPE0BLK_Base;\r
-\r
- //\r
- // Get GPE0BLK_Base\r
- //\r
- GPE0BLK_Base = PcdGet16 (PcdGpe0blkIoBaseAddress);\r
-\r
- //\r
- // Clear the Power Button Override Status Bit, it gates EOS from being set.\r
- // In QuarkNcSocId - Bit is read only. Handled by external SMC, do nothing.\r
- //\r
-\r
- //\r
- // Clear the APM SMI Status Bit\r
- //\r
- IoWrite32 ((GPE0BLK_Base + R_QNC_GPE0BLK_SMIS), B_QNC_GPE0BLK_SMIS_APM);\r
-\r
- //\r
- // Set the EOS Bit\r
- //\r
- IoOr32 ((GPE0BLK_Base + R_QNC_GPE0BLK_SMIS), B_QNC_GPE0BLK_SMIS_EOS);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SmmTrigger (\r
- IN UINT8 Data\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Trigger the software SMI\r
-\r
-Arguments:\r
-\r
- Data The value to be set on the software SMI data port\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS Function completes successfully\r
-\r
---*/\r
-{\r
- UINT16 GPE0BLK_Base;\r
- UINT32 NewValue;\r
-\r
- //\r
- // Get GPE0BLK_Base\r
- //\r
- GPE0BLK_Base = PcdGet16 (PcdGpe0blkIoBaseAddress);\r
-\r
- //\r
- // Enable the APMC SMI\r
- //\r
- IoOr32 (GPE0BLK_Base + R_QNC_GPE0BLK_SMIE, B_QNC_GPE0BLK_SMIE_APM);\r
-\r
- //\r
- // Enable SMI globally\r
- //\r
- NewValue = QNCPortRead (QUARK_NC_HOST_BRIDGE_SB_PORT_ID, QNC_MSG_FSBIC_REG_HMISC);\r
- NewValue |= SMI_EN;\r
- QNCPortWrite (QUARK_NC_HOST_BRIDGE_SB_PORT_ID, QNC_MSG_FSBIC_REG_HMISC, NewValue);\r
-\r
-\r
- //\r
- // Generate the APMC SMI\r
- //\r
- IoWrite8 (PcdGet16 (PcdSmmActivationPort), Data);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Generates an SMI using the parameters passed in.\r
-\r
- @param PeiServices Describes the list of possible PEI Services.\r
- @param This A pointer to an instance of\r
- EFI_SMM_CONTROL_PPI\r
- @param ArgumentBuffer The argument buffer\r
- @param ArgumentBufferSize The size of the argument buffer\r
- @param Periodic TRUE to indicate a periodical SMI\r
- @param ActivationInterval Interval of the periodical SMI\r
-\r
- @retval EFI_INVALID_PARAMETER Periodic is TRUE or ArgumentBufferSize > 1\r
- @retval EFI_SUCCESS SMI generated\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiActivate (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN PEI_SMM_CONTROL_PPI *This,\r
- IN OUT INT8 *ArgumentBuffer OPTIONAL,\r
- IN OUT UINTN *ArgumentBufferSize OPTIONAL,\r
- IN BOOLEAN Periodic OPTIONAL,\r
- IN UINTN ActivationInterval OPTIONAL\r
- )\r
-{\r
- INT8 Data;\r
- EFI_STATUS Status;\r
- //\r
- // Periodic SMI not supported.\r
- //\r
- if (Periodic) {\r
- DEBUG ((DEBUG_WARN, "Invalid parameter\n"));\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (ArgumentBuffer == NULL) {\r
- Data = 0xFF;\r
- } else {\r
- if (ArgumentBufferSize == NULL || *ArgumentBufferSize != 1) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Data = *ArgumentBuffer;\r
- }\r
- //\r
- // Clear any pending the APM SMI\r
- //\r
- Status = SmmClear ();\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- return SmmTrigger (Data);\r
-}\r
-\r
-/**\r
- Clears an SMI.\r
-\r
- @param PeiServices Describes the list of possible PEI Services.\r
- @param This Pointer to an instance of EFI_SMM_CONTROL_PPI\r
- @param Periodic TRUE to indicate a periodical SMI\r
-\r
- @return Return value from SmmClear()\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiDeactivate (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN PEI_SMM_CONTROL_PPI *This,\r
- IN BOOLEAN Periodic OPTIONAL\r
- )\r
-{\r
- if (Periodic) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- return SmmClear ();\r
-}\r
-\r
-/**\r
- This is the constructor for the SMM Control Ppi.\r
-\r
- This function installs EFI_SMM_CONTROL_PPI.\r
-\r
- @param FileHandle Handle of the file being invoked.\r
- @param PeiServices Describes the list of possible PEI Services.\r
-\r
- @retval EFI_UNSUPPORTED There's no Intel ICH on this platform\r
- @return The status returned from InstallPpi().\r
-\r
---*/\r
-EFI_STATUS\r
-EFIAPI\r
-SmmControlPeiEntry (\r
- IN EFI_PEI_FILE_HANDLE FileHandle,\r
- IN CONST EFI_PEI_SERVICES **PeiServices\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = (**PeiServices).InstallPpi (PeiServices, &mPpiList);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Status;\r
-}\r