/** @file Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SmmTestPoint.h" /** Returns the current state information for the adapter. This function returns information of type InformationType from the adapter. If an adapter does not support the requested informational type, then EFI_UNSUPPORTED is returned. @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance. @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock. @param[out] InformationBlock The service returns a pointer to the buffer with the InformationBlock structure which contains details about the data specific to InformationType. @param[out] InformationBlockSize The driver returns the size of the InformationBlock in bytes. @retval EFI_SUCCESS The InformationType information was retrieved. @retval EFI_UNSUPPORTED The InformationType is not known. @retval EFI_DEVICE_ERROR The device reported an error. @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. @retval EFI_INVALID_PARAMETER This is NULL. @retval EFI_INVALID_PARAMETER InformationBlock is NULL. @retval EFI_INVALID_PARAMETER InformationBlockSize is NULL. **/ EFI_STATUS EFIAPI TestPointAipGetInfo ( IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, IN EFI_GUID *InformationType, OUT VOID **InformationBlock, OUT UINTN *InformationBlockSize ) { TEST_POINT_AIP_PRIVATE_DATA *TestPointAip; if ((This == NULL) || (InformationBlock == NULL) || (InformationBlockSize == NULL)) { return EFI_INVALID_PARAMETER; } if (!CompareGuid (InformationType, &gAdapterInfoPlatformTestPointGuid)) { return EFI_UNSUPPORTED; } TestPointAip = TEST_POINT_AIP_PRIVATE_DATA_FROM_THIS(This); *InformationBlock = AllocateCopyPool (TestPointAip->TestPointSize, TestPointAip->TestPoint); if (*InformationBlock == NULL) { return EFI_OUT_OF_RESOURCES; } *InformationBlockSize = TestPointAip->TestPointSize; return EFI_SUCCESS; } /** Sets state information for an adapter. This function sends information of type InformationType for an adapter. If an adapter does not support the requested information type, then EFI_UNSUPPORTED is returned. @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance. @param[in] InformationType A pointer to an EFI_GUID that defines the contents of InformationBlock. @param[in] InformationBlock A pointer to the InformationBlock structure which contains details about the data specific to InformationType. @param[in] InformationBlockSize The size of the InformationBlock in bytes. @retval EFI_SUCCESS The information was received and interpreted successfully. @retval EFI_UNSUPPORTED The InformationType is not known. @retval EFI_DEVICE_ERROR The device reported an error. @retval EFI_INVALID_PARAMETER This is NULL. @retval EFI_INVALID_PARAMETER InformationBlock is NULL. @retval EFI_WRITE_PROTECTED The InformationType cannot be modified using EFI_ADAPTER_INFO_SET_INFO(). **/ EFI_STATUS EFIAPI TestPointAipSetInfo ( IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, IN EFI_GUID *InformationType, IN VOID *InformationBlock, IN UINTN InformationBlockSize ) { TEST_POINT_AIP_PRIVATE_DATA *TestPointAip; VOID *NewTestPoint; if ((This == NULL) || (InformationBlock == NULL)) { return EFI_INVALID_PARAMETER; } if (!CompareGuid (InformationType, &gAdapterInfoPlatformTestPointGuid)) { return EFI_UNSUPPORTED; } if (!InternalTestPointIsValidTable (InformationBlock, InformationBlockSize)) { return EFI_VOLUME_CORRUPTED; } TestPointAip = TEST_POINT_AIP_PRIVATE_DATA_FROM_THIS(This); if (InformationBlockSize > TestPointAip->TestPointMaxSize) { NewTestPoint = AllocateZeroPool (InformationBlockSize); if (NewTestPoint == NULL) { return EFI_OUT_OF_RESOURCES; } FreePool (TestPointAip->TestPoint); TestPointAip->TestPoint = NewTestPoint; TestPointAip->TestPointSize = 0; TestPointAip->TestPointMaxSize = InformationBlockSize; } CopyMem (TestPointAip->TestPoint, InformationBlock, InformationBlockSize); TestPointAip->TestPointSize = InformationBlockSize; return EFI_SUCCESS; } /** Get a list of supported information types for this instance of the protocol. This function returns a list of InformationType GUIDs that are supported on an adapter with this instance of EFI_ADAPTER_INFORMATION_PROTOCOL. The list is returned in InfoTypesBuffer, and the number of GUID pointers in InfoTypesBuffer is returned in InfoTypesBufferCount. @param[in] This A pointer to the EFI_ADAPTER_INFORMATION_PROTOCOL instance. @param[out] InfoTypesBuffer A pointer to the array of InformationType GUIDs that are supported by This. @param[out] InfoTypesBufferCount A pointer to the number of GUIDs present in InfoTypesBuffer. @retval EFI_SUCCESS The list of information type GUIDs that are supported on this adapter was returned in InfoTypesBuffer. The number of information type GUIDs was returned in InfoTypesBufferCount. @retval EFI_INVALID_PARAMETER This is NULL. @retval EFI_INVALID_PARAMETER InfoTypesBuffer is NULL. @retval EFI_INVALID_PARAMETER InfoTypesBufferCount is NULL. @retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the results. **/ EFI_STATUS EFIAPI TestPointAipGetSupportedTypes ( IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, OUT EFI_GUID **InfoTypesBuffer, OUT UINTN *InfoTypesBufferCount ) { if ((This == NULL) || (InfoTypesBuffer == NULL) || (InfoTypesBufferCount == NULL)) { return EFI_INVALID_PARAMETER; } *InfoTypesBuffer = AllocateCopyPool (sizeof(gAdapterInfoPlatformTestPointGuid), &gAdapterInfoPlatformTestPointGuid); if (*InfoTypesBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } *InfoTypesBufferCount = 1; return EFI_SUCCESS; } EFI_ADAPTER_INFORMATION_PROTOCOL mSmmAdapterInformationProtocol = { TestPointAipGetInfo, TestPointAipSetInfo, TestPointAipGetSupportedTypes, };