4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Interpret and execute the S3 data in S3 boot script.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the BSD License which accompanies this distribution. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "InternalBootScriptLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks the parameter of SmbusExecute().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function checks the input parameters of SmbusExecute(). If the input parameters are valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for certain SMBus bus protocol, it will return EFI_SUCCESS; otherwise, it will return certain
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error code based on the input SMBus bus protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SmBusAddress Address that encodes the SMBUS Slave Address, SMBUS Command, SMBUS Data Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and PEC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Operation Signifies which particular SMBus hardware protocol instance that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync it will use to execute the SMBus transactions. This SMBus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hardware protocol is defined by the SMBus Specification and is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not related to EFI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Length Signifies the number of bytes that this operation will do. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync maximum number of bytes can be revision specific and operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specific. This field will contain the actual number of bytes that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are executed for this operation. Not all operations require this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync argument.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Contains the value of data to execute to the SMBus slave device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Not all operations require this argument. The length of this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer is identified by Length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS All the parameters are valid for the corresponding SMBus bus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Operation is not defined in EFI_SMBUS_OPERATION.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Length/Buffer is NULL for operations except for EfiSmbusQuickRead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and EfiSmbusQuickWrite. Length is outside the range of valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync values.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The SMBus operation or PEC is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL Buffer is not sufficient for this operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCheckParameters (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SmBusAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SMBUS_OPERATION Operation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN RequiredLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SMBUS_DEVICE_COMMAND Command;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN PecCheck;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Command = SMBUS_LIB_COMMAND (SmBusAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PecCheck = SMBUS_LIB_PEC (SmBusAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set default value to be 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // for SmbusReadWord, SmbusWriteWord and SmbusProcessCall.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredLen = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Operation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusQuickRead:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusQuickWrite:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PecCheck || Command != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReceiveByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusSendByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Command != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Cascade to check length parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReadByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusWriteByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredLen = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Cascade to check length parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReadWord:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusWriteWord:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusProcessCall:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL || Length == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (*Length < RequiredLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Length = RequiredLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReadBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusWriteBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Buffer == NULL) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Length == NULL) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Length < MIN_SMBUS_BLOCK_LEN) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Length > MAX_SMBUS_BLOCK_LEN)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusBWBRProcessCall:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Executes an SMBus operation to an SMBus controller. Returns when either the command has been
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync executed or an error is encountered in doing the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The SmbusExecute() function provides a standard way to execute an operation as defined in the System
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Management Bus (SMBus) Specification. The resulting transaction will be either that the SMBus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync slave devices accept this transaction or that this function returns with error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SmbusAddress Address that encodes the SMBUS Slave Address, SMBUS Command, SMBUS Data Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and PEC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Operation Signifies which particular SMBus hardware protocol instance that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync it will use to execute the SMBus transactions. This SMBus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hardware protocol is defined by the SMBus Specification and is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not related to EFI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Length Signifies the number of bytes that this operation will do. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync maximum number of bytes can be revision specific and operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specific. This field will contain the actual number of bytes that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are executed for this operation. Not all operations require this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync argument.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Contains the value of data to execute to the SMBus slave device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Not all operations require this argument. The length of this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer is identified by Length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The last data that was returned from the access matched the poll
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exit criteria.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_CRC_ERROR Checksum is not correct (PEC is incorrect).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIMEOUT Timeout expired before the operation was completed. Timeout is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync determined by the SMBus host controller device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The request was not completed because a failure that was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync reflected in the Host Status Register bit. Device errors are a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync result of a transaction collision, illegal command field,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unclaimed cycle (host initiated), or bus errors (collisions).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Operation is not defined in EFI_SMBUS_OPERATION.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Length/Buffer is NULL for operations except for EfiSmbusQuickRead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and EfiSmbusQuickWrite. Length is outside the range of valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync values.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The SMBus operation or PEC is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL Buffer is not sufficient for this operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSmbusExecute (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SmbusAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SMBUS_OPERATION Operation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN WorkBufferLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 WorkBuffer[MAX_SMBUS_BLOCK_LEN];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CheckParameters (SmbusAddress, Operation, Length, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Operation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusQuickRead:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusQuickRead - 0x%08x\n", SmbusAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusQuickRead (SmbusAddress, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusQuickWrite:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusQuickWrite - 0x%08x\n", SmbusAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusQuickWrite (SmbusAddress, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReceiveByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusReceiveByte - 0x%08x\n", SmbusAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(UINT8 *) Buffer = SmBusReceiveByte (SmbusAddress, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusSendByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusReceiveByte - 0x%08x (0x%02x)\n", SmbusAddress, (UINTN)*(UINT8 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusSendByte (SmbusAddress, *(UINT8 *) Buffer, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReadByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusReadByte - 0x%08x\n", SmbusAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(UINT8 *) Buffer = SmBusReadDataByte (SmbusAddress, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusWriteByte:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusWriteByte - 0x%08x (0x%02x)\n", SmbusAddress, (UINTN)*(UINT8 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusWriteDataByte (SmbusAddress, *(UINT8 *) Buffer, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReadWord:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusReadWord - 0x%08x\n", SmbusAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(UINT16 *) Buffer = SmBusReadDataWord (SmbusAddress, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusWriteWord:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusWriteByte - 0x%08x (0x%04x)\n", SmbusAddress, (UINTN)*(UINT16 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusWriteDataWord (SmbusAddress, *(UINT16 *) Buffer, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusProcessCall:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusProcessCall - 0x%08x (0x%04x)\n", SmbusAddress, (UINTN)*(UINT16 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(UINT16 *) Buffer = SmBusProcessCall (SmbusAddress, *(UINT16 *) Buffer, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusReadBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusReadBlock - 0x%08x\n", SmbusAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WorkBufferLen = SmBusReadBlock (SmbusAddress, WorkBuffer, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read block transaction is complete successfully, and then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check whether the output buffer is large enough.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Length >= WorkBufferLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Buffer, WorkBuffer, WorkBufferLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Length = WorkBufferLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusWriteBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EfiSmbusWriteBlock - 0x%08x (0x%04x)\n", SmbusAddress, (UINTN)*(UINT16 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusWriteBlock ((SmbusAddress + SMBUS_LIB_ADDRESS (0, 0, (*Length), FALSE)) , Buffer, &Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSmbusBWBRProcessCall:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BUGBUG: Should this case be handled?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translates boot script width and address stride to MDE library interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AddressStride Instride for stepping input buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferStride Outstride for stepping output buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Successful translation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width or Address is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBuildLoopData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *AddressStride,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *BufferStride
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AlignMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width >= S3BootScriptWidthMaximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AddressStride = (UINT32)(1 << (Width & 0x03));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BufferStride = *AddressStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlignMask = *AddressStride - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Address & AlignMask) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width >= S3BootScriptWidthFifoUint8 && Width <= S3BootScriptWidthFifoUint64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AddressStride = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width >= S3BootScriptWidthFillUint8 && Width <= S3BootScriptWidthFillUint64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BufferStride = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translates boot script to MDE library interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Count Count of the number of accesses to perform.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Pointer to the buffer to read from I/O space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address is outside the legal range of I/O ports.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptIoRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AddressStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTR Out;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Out.Buf = (UINT8 *) Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Address > MAX_IO_ADDRESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BuildLoopData (Width, Address, &AddressStride, &BufferStride);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Loop for each iteration and move the data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; Count > 0; Count--, Address += AddressStride, Out.Buf += BufferStride) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8Read - 0x%08x\n", Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint8 = IoRead8 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16Read - 0x%08x\n", Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint16 = IoRead16 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32Read - 0x%08x\n", Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint32 = IoRead32 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform a write operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Count Count of the number of accesses to perform.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Pointer to the buffer to write to I/O space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address is outside the legal range of I/O ports.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptIoWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AddressStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 OriginalAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTR In;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTR OriginalIn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In.Buf = (UINT8 *) Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Address > MAX_IO_ADDRESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BuildLoopData (Width, Address, &AddressStride, &BufferStride);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Loop for each iteration and move the data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalAddress = Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalIn.Buf = In.Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; Count > 0; Count--, Address += AddressStride, In.Buf += BufferStride) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%08x (0x%02x)\n", (UINTN)Address, (UINTN)*In.Uint8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite8 ((UINTN) Address, *In.Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint8 - 0x%08x (0x%02x)\n", (UINTN)OriginalAddress, (UINTN)*In.Uint8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite8 ((UINTN) OriginalAddress, *In.Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint8 - 0x%08x (0x%02x)\n", (UINTN)Address, (UINTN)*In.Uint8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite8 ((UINTN) Address, *OriginalIn.Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%08x (0x%04x)\n", (UINTN)Address, (UINTN)*In.Uint16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite16 ((UINTN) Address, *In.Uint16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint16 - 0x%08x (0x%04x)\n", (UINTN)OriginalAddress, (UINTN)*In.Uint16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite16 ((UINTN) OriginalAddress, *In.Uint16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint16 - 0x%08x (0x%04x)\n", (UINTN)Address, (UINTN)*In.Uint16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite16 ((UINTN) Address, *OriginalIn.Uint16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%08x (0x%08x)\n", (UINTN)Address, (UINTN)*In.Uint32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite32 ((UINTN) Address, *In.Uint32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint32 - 0x%08x (0x%08x)\n", (UINTN)OriginalAddress, (UINTN)*In.Uint32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite32 ((UINTN) OriginalAddress, *In.Uint32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint32 - 0x%08x (0x%08x)\n", (UINTN)Address, (UINTN)*In.Uint32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite32 ((UINTN) Address, *OriginalIn.Uint32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint64 - 0x%08x (0x%016lx)\n", (UINTN)Address, *In.Uint64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite64 ((UINTN) Address, *In.Uint64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint64 - 0x%08x (0x%016lx)\n", (UINTN)Address, *In.Uint64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite64 ((UINTN) OriginalAddress, *In.Uint64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint64 - 0x%08x (0x%016lx)\n", (UINTN)Address, *In.Uint64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoWrite64 ((UINTN) Address, *OriginalIn.Uint64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Interprete the IO write entry in S3 boot script and perform the write operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script Pointer to the node which is to be interpreted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address is outside the legal range of I/O ports.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteIoWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3_BOOT_SCRIPT_LIB_WIDTH Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_IO_WRITE IoWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&IoWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_IO_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (S3_BOOT_SCRIPT_LIB_WIDTH) IoWrite.Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = IoWrite.Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = IoWrite.Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = Script + sizeof (EFI_BOOT_SCRIPT_IO_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ScriptIoWrite(Width, Address, Count, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform memory read operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Count Count of the number of accesses to perform.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the buffer read from memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The address range specified by Address, Width, and Count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not valid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptMemoryRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AddressStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTR Out;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Out.Buf = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BuildLoopData (Width, Address, &AddressStride, &BufferStride);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Loop for each iteration and move the data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; Count > 0; Count--, Address += AddressStride, Out.Buf += BufferStride) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%08x\n", (UINTN)Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint8 = MmioRead8 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%08x\n", (UINTN)Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint16 = MmioRead16 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%08x\n", (UINTN)Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint32 = MmioRead32 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint64 - 0x%08x\n", (UINTN)Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Out.Uint64 = MmioRead64 ((UINTN) Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translates boot script to MDE library interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Count Count of the number of accesses to perform.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the buffer write to memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The address range specified by Address, Width, and Count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not valid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptMemoryWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AddressStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 OriginalAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTR In;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PTR OriginalIn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In.Buf = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BuildLoopData (Width, Address, &AddressStride, &BufferStride);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Loop for each iteration and move the data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalAddress = Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalIn.Buf = In.Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; Count > 0; Count--, Address += AddressStride, In.Buf += BufferStride) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%08x (0x%02x)\n", (UINTN)Address, (UINTN)*In.Uint8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite8 ((UINTN) Address, *In.Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint8 - 0x%08x (0x%02x)\n", (UINTN)OriginalAddress, (UINTN)*In.Uint8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite8 ((UINTN) OriginalAddress, *In.Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint8 - 0x%08x (0x%02x)\n", (UINTN)Address, (UINTN)*In.Uint8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite8 ((UINTN) Address, *OriginalIn.Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%08x (0x%04x)\n", (UINTN)Address, (UINTN)*In.Uint16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite16 ((UINTN) Address, *In.Uint16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint16 - 0x%08x (0x%04x)\n", (UINTN)OriginalAddress, (UINTN)*In.Uint16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite16 ((UINTN) OriginalAddress, *In.Uint16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint16 - 0x%08x (0x%04x)\n", (UINTN)Address, (UINTN)*In.Uint16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite16 ((UINTN) Address, *OriginalIn.Uint16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%08x (0x%08x)\n", (UINTN)Address, (UINTN)*In.Uint32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite32 ((UINTN) Address, *In.Uint32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint32 - 0x%08x (0x%08x)\n", (UINTN)OriginalAddress, (UINTN)*In.Uint32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite32 ((UINTN) OriginalAddress, *In.Uint32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint32 - 0x%08x (0x%08x)\n", (UINTN)Address, (UINTN)*In.Uint32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite32 ((UINTN) Address, *OriginalIn.Uint32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint64 - 0x%08x (0x%016lx)\n", (UINTN)Address, *In.Uint64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite64 ((UINTN) Address, *In.Uint64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint64 - 0x%08x (0x%016lx)\n", (UINTN)OriginalAddress, *In.Uint64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite64 ((UINTN) OriginalAddress, *In.Uint64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint64 - 0x%08x (0x%016lx)\n", (UINTN)Address, *In.Uint64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MmioWrite64 ((UINTN) Address, *OriginalIn.Uint64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Interprete the boot script node with EFI_BOOT_SCRIPT_MEM_WRITE OP code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Script Pointer to the node which is to be interpreted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The address range specified by Address, Width, and Count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not valid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteMemoryWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3_BOOT_SCRIPT_LIB_WIDTH Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_MEM_WRITE MemWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((VOID*)&MemWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_MEM_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (S3_BOOT_SCRIPT_LIB_WIDTH)MemWrite.Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = MemWrite.Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = MemWrite.Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = Script + sizeof(EFI_BOOT_SCRIPT_MEM_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteMemoryWrite - 0x%08x, 0x%08x, 0x%08x\n", (UINTN)Address, (UINTN)Count, (UINTN)Width));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ScriptMemoryWrite (Width,Address, Count, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translates boot script to MDE library interface for PCI configuration read operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the buffer reaf from PCI config space
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The read succeed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER if Width is not defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptPciCfgRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%016lx\n", Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (UINT8 *) Buffer = PciRead8 (PCI_ADDRESS_ENCODE(Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%016lx\n", Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (UINT16 *) Buffer = PciRead16 (PCI_ADDRESS_ENCODE(Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%016lx\n", Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (UINT32 *) Buffer = PciRead32 (PCI_ADDRESS_ENCODE(Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translates boot script to MDE library interface for PCI configuration write operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the buffer reaf from PCI config space
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The write succeed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER if Width is not defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptPciCfgWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%016lx (0x%02x)\n", Address, (UINTN)*(UINT8 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciWrite8 (PCI_ADDRESS_ENCODE(Address), *(UINT8 *) Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%016lx (0x%04x)\n", Address, (UINTN)*(UINT16 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciWrite16 (PCI_ADDRESS_ENCODE(Address), *(UINT16 *) Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFifoUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthFillUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%016lx (0x%08x)\n", Address, (UINTN)*(UINT32 *) Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciWrite32 (PCI_ADDRESS_ENCODE(Address), *(UINT32 *) Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform pci configure 2 read operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Segment Pci segment number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the buffer to write to I/O space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address is outside the legal range of I/O ports.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @note A known Limitations in the implementation which is the 'Segment' parameter is assumed as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Zero, or else, assert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptPciCfg2Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Segment==0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ScriptPciCfgRead (Width, Address, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform pci configure write operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Segment Pci segment number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the buffer to write to I/O space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written to the EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Width is invalid for this EFI System.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Buffer is not aligned for the given Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address is outside the legal range of I/O ports.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @note A known Limitations in the implementation which is the 'Segment' parameter is assumed as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Zero, or else, assert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncScriptPciCfg2Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN S3_BOOT_SCRIPT_LIB_WIDTH Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Segment==0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ScriptPciCfgWrite (Width, Address, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform Pci configuration Write operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecutePciCfgWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 PciAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE PciConfigWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&PciConfigWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAddress = PciConfigWrite.Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataWidth = (UINT32)(0x01 << (PciConfigWrite.Width));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfgWrite - 0x%08x, 0x%08x, 0x%08x\n", (UINTN)PciAddress, (UINTN)PciConfigWrite.Count, (UINTN)DataWidth));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PciConfigWrite.Count; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfgWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciConfigWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( S3BootScriptWidthFillUint8 != PciConfigWrite.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFillUint16 != PciConfigWrite.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFillUint32 != PciConfigWrite.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFillUint64 != PciConfigWrite.Width){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reg = (UINT8) ((UINT8) PciAddress + DataWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAddress = (PciAddress & 0xFFFFFFFFFFFFFF00ULL) + Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (S3BootScriptWidthFifoUint8 != PciConfigWrite.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFifoUint16 != PciConfigWrite.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFifoUint32 != PciConfigWrite.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFifoUint64 != PciConfigWrite.Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer += DataWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Excute the script to perform IO modification operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteIoReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_IO_READ_WRITE IoReadWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((VOID*)&IoReadWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_IO_READ_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteIoReadWrite - 0x%08x, 0x%016lx, 0x%016lx\n", (UINTN)IoReadWrite.Address, (UINT64)AndMask, (UINT64)OrMask));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptIoRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) IoReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = (Data & AndMask) | OrMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptIoWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) IoReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Excute the script to perform memory modification operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteMemoryReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_MEM_READ_WRITE MemReadWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((VOID*)&MemReadWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_MEM_READ_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteMemoryReadWrite - 0x%08x, 0x%016lx, 0x%016lx\n", (UINTN)MemReadWrite.Address, (UINT64)AndMask, (UINT64)OrMask));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptMemoryRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) MemReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MemReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = (Data & AndMask) | OrMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptMemoryWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) MemReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MemReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Excute the script to perform PCI IO modification operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecutePciCfgReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE PciCfgReadWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((VOID*)&PciCfgReadWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfgReadWrite - 0x%08x, 0x%016lx, 0x%016lx\n", (UINTN)PciCfgReadWrite.Address, (UINT64)AndMask, (UINT64)OrMask));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfgRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfgReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfgReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = (Data & AndMask) | OrMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfgWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfgReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfgReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To Execute SMBUS command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Cannot locate smbus ppi or occur error of script execution
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Result of script execution
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteSmbusExecute (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SmBusAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_SMBUS_EXECUTE SmbusExecuteEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&SmbusExecuteEntry, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_SMBUS_EXECUTE ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteSmbusExecute - 0x%08x, 0x%08x\n", (UINTN)SmbusExecuteEntry.SmBusAddress, (UINTN)SmbusExecuteEntry.Operation));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusAddress = (UINTN)SmbusExecuteEntry.SmBusAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = (UINTN) SmbusExecuteEntry.DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SmbusExecute (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmBusAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_SMBUS_OPERATION) SmbusExecuteEntry.Operation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script + sizeof (EFI_BOOT_SCRIPT_SMBUS_EXECUTE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Execute stall operation in boot script table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteStall (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_STALL Stall;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&Stall, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_STALL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteStall - 0x%08x\n", (UINTN)Stall.Duration));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MicroSecondDelay ((UINTN) Stall.Duration);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To execute assigned function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteDispatch (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DISPATCH_ENTRYPOINT_FUNC EntryFunc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_DISPATCH ScriptDispatch;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&ScriptDispatch, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_DISPATCH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EntryFunc = (DISPATCH_ENTRYPOINT_FUNC) (UINTN) (ScriptDispatch.EntryPoint);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteDispatch - 0x%08x\n", (UINTN)ScriptDispatch.EntryPoint));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EntryFunc (NULL, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Execute dispach2 opertion code which is to invoke a spcified function with one parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteDispatch2 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DISPATCH_ENTRYPOINT_FUNC EntryFunc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_DISPATCH_2 ScriptDispatch2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&ScriptDispatch2, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_DISPATCH_2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteDispatch2 - 0x%08x(0x%08x)\n", (UINTN)ScriptDispatch2.EntryPoint, (UINTN)ScriptDispatch2.Context));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EntryFunc = (DISPATCH_ENTRYPOINT_FUNC) (UINTN) (ScriptDispatch2.EntryPoint);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EntryFunc (NULL, (VOID *) (UINTN) ScriptDispatch2.Context);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Excute the script to poll memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Data polled from memory does not equal to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the epecting data within the Loop Times.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteMemPoll (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 LoopTimes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_MEM_POLL MemPoll;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&MemPoll, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_MEM_POLL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteMemPoll - 0x%08x\n", (UINTN)MemPoll.Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptMemoryRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) MemPoll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MemPoll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) && (Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopTimes = 0; LoopTimes < MemPoll.LoopTimes; LoopTimes++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NanoSecondDelay ((UINTN)MemPoll.Duration);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptMemoryRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) MemPoll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MemPoll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) && (Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopTimes < MemPoll.LoopTimes) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Execute the boot script to interpret the Store arbitrary information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This opcode is a no-op on dispatch and is only used for debugging script issues.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteInformation (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_INFORMATION Information;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&Information, (VOID*)Script, sizeof(Information));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteInformation - 0x%08x\n", (UINTN)Information.Information));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptInformation: "));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Information.InformationLength; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "%02x ", *(UINT8 *)(UINTN)(Information.Information + Index)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync calculate the mask value for 'and' and 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ScriptHeader The pointer of header of node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask The Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask The Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script Pointer to the entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCheckAndOrMask (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_BOOT_SCRIPT_COMMON_HEADER *ScriptHeader,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *OrMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DataPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (ScriptHeader->OpCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_IO_READ_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_MEM_READ_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_MEM_POLL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_IO_POLL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_POLL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataPtr = Script + Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (ScriptHeader->Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AndMask = (UINT64) *(DataPtr + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *OrMask = (UINT64) (*DataPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint16:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AndMask = (UINT64) (*(UINT16 *) (DataPtr + 2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *OrMask = (UINT64) (*(UINT16 *) DataPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint32:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AndMask = (UINT64) (*(UINT32 *) (DataPtr + 4));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *OrMask = (UINT64) (*(UINT32 *) DataPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3BootScriptWidthUint64:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AndMask = (UINT64) (*(UINT64 *) (DataPtr + 8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *OrMask = (UINT64) (*(UINT64 *) DataPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Excute the script to poll Io port for some time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of typed node in boot script table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Data polled from memory does not equal to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the epecting data within the Loop Times.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecuteIoPoll (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 LoopTimes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_IO_POLL IoPoll;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&IoPoll, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_IO_POLL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecuteIoPoll - 0x%08x\n", (UINTN)IoPoll.Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptIoRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) IoPoll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoPoll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) && (Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopTimes = 0; LoopTimes < IoPoll.Delay; LoopTimes++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NanoSecondDelay (100);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptIoRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) IoPoll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IoPoll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) &&(Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopTimes < IoPoll.Delay) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform Pci configuration Write operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of S3 boot script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecutePciCfg2Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Segment;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 PciAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE PciCfg2Write;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&PciCfg2Write, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Segment = PciCfg2Write.Segment;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAddress = PciCfg2Write.Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataWidth = (UINT32)(0x01 << (PciCfg2Write.Width));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfg2Write - 0x%08x\n", (UINTN)PciAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PciCfg2Write.Count; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfg2Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2Write.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (S3BootScriptWidthFillUint8 != PciCfg2Write.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFillUint16 != PciCfg2Write.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFillUint32 != PciCfg2Write.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFillUint64 != PciCfg2Write.Width){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reg = (UINT8) ((UINT8) PciAddress + DataWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAddress = (PciAddress & 0xFFFFFFFFFFFFFF00ULL) + Reg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (S3BootScriptWidthFifoUint8 != PciCfg2Write.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFifoUint16 != PciCfg2Write.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFifoUint32 != PciCfg2Write.Width ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync S3BootScriptWidthFifoUint64 != PciCfg2Write.Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer += DataWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Perform pci configuration read & Write operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of S3 boot script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptExecutePciCfg2ReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE PciCfg2ReadWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&PciCfg2ReadWrite, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfg2ReadWrite - 0x%08x\n", (UINTN)PciCfg2ReadWrite.Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfg2Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2ReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2ReadWrite.Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2ReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = (Data & AndMask) | OrMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfg2Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2ReadWrite.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2ReadWrite.Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2ReadWrite.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To perform poll pci configure operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of S3 boot script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Data polled from Pci configuration space does not equal to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync epecting data within the Loop Times.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptPciCfgPoll (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 LoopTimes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG_POLL PciCfgPoll;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&PciCfgPoll, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG_POLL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptPciCfgPoll - 0x%08x\n", (UINTN)PciCfgPoll.Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfgRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfgPoll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfgPoll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) &&(Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopTimes = 0; LoopTimes < PciCfgPoll.Delay; LoopTimes++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NanoSecondDelay (100);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfgRead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfgPoll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfgPoll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopTimes < PciCfgPoll.Delay) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To perform poll pci configure operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Script The pointer of S3 Boot Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndMask Mask value for 'and' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrMask Mask value for 'or' operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was executed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Data polled from Pci configuration space does not equal to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync epecting data within the Loop Times.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBootScriptPciCfg2Poll (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 LoopTimes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL PciCfg2Poll;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&PciCfg2Poll, (VOID*)Script, sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "BootScriptPciCfg2Poll - 0x%08x\n", (UINTN)PciCfg2Poll.Address));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfg2Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2Poll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2Poll.Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2Poll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) && (Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopTimes = 0; LoopTimes < PciCfg2Poll.Delay; LoopTimes++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NanoSecondDelay (100);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ScriptPciCfg2Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2Poll.Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2Poll.Segment,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciCfg2Poll.Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!EFI_ERROR (Status)) && (Data & AndMask) == OrMask) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopTimes < PciCfg2Poll.Delay) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Executes the S3 boot script table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS The boot script table was executed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_UNSUPPORTED Invalid script table or opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @note A known Limitations in the implementation: When interpreting the opcode EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE and EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE, the 'Segment' parameter is assumed as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Zero, or else, assert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncS3BootScriptExecute (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8* Script;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StartAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 TableLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 AndMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 OrMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_COMMON_HEADER ScriptHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BOOT_SCRIPT_TABLE_HEADER TableHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script = mS3BootScriptTablePtr->TableBase;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&TableHeader, Script, sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptExecute:\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TableHeader.OpCode != S3_BOOT_SCRIPT_LIB_TABLE_OPCODE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "TableHeader - 0x%08x\n", Script));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress = (UINTN) Script;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TableLength = TableHeader.TableLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script = Script + TableHeader.Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndMask = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrMask = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "TableHeader.TableLength - 0x%08x\n", (UINTN)TableLength));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((UINTN) Script < (UINTN) (StartAddress + TableLength)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "ExecuteBootScript - %08x\n", (UINTN)Script));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem ((VOID*)&ScriptHeader, Script, sizeof(EFI_BOOT_SCRIPT_COMMON_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (ScriptHeader.OpCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteMemoryWrite (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteMemoryReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_IO_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteIoWrite (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecutePciCfgWrite (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecutePciCfgReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecutePciCfg2Write (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecutePciCfg2ReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_DISPATCH_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteDispatch (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteDispatch2 (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_INFORMATION_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BootScriptExecuteInformation (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3_BOOT_SCRIPT_LIB_TERMINATE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3_BOOT_SCRIPT_LIB_TERMINATE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteIoReadWrite (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteSmbusExecute (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_STALL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_STALL_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteStall (Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_MEM_POLL_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteMemPoll (Script, AndMask, OrMask);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_IO_POLL_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptExecuteIoPoll (Script, AndMask, OrMask);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptPciCfgPoll (Script, AndMask, OrMask);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckAndOrMask (&ScriptHeader, &AndMask, &OrMask, Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = BootScriptPciCfg2Poll (Script, AndMask, OrMask);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case S3_BOOT_SCRIPT_LIB_LABEL_OPCODE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For label
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3_BOOT_SCRIPT_LIB_LABEL_OPCODE\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptDone - %r\n", EFI_UNSUPPORTED));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptDone - %r\n", Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script = Script + ScriptHeader.Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "S3BootScriptDone - %r\n", Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync