X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FInclude%2FGuid%2FPerformance.h;h=72e39787a6166a9b93b845cca59b663f742b568f;hp=3659ccc3280d1443d549d1bf7313352648761864;hb=9917def3294bac4d14cd86ba382652aa41c6c1d6;hpb=d042c6e830756e63248f1d760a1dc0817c5ec0e8 diff --git a/MdeModulePkg/Include/Guid/Performance.h b/MdeModulePkg/Include/Guid/Performance.h index 3659ccc328..72e39787a6 100644 --- a/MdeModulePkg/Include/Guid/Performance.h +++ b/MdeModulePkg/Include/Guid/Performance.h @@ -2,15 +2,15 @@ This file defines performance-related definitions, including the format of: * performance GUID HOB. * performance protocol interfaces. - * performance variables. + * performance variables. -Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
-This program and the accompanying materials are licensed and made available under -the terms and conditions of the BSD License that accompanies this distribution. +Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php. +http://opensource.org/licenses/bsd-license.php. -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ @@ -18,6 +18,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #ifndef __PERFORMANCE_DATA_H__ #define __PERFORMANCE_DATA_H__ +#define PERFORMANCE_PROPERTY_REVISION 0x1 + +typedef struct { + UINT32 Revision; + UINT32 Reserved; + UINT64 Frequency; + UINT64 TimerStartValue; + UINT64 TimerEndValue; +} PERFORMANCE_PROPERTY; + // // PEI_PERFORMANCE_STRING_SIZE must be a multiple of 8. // @@ -26,7 +36,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. typedef struct { EFI_PHYSICAL_ADDRESS Handle; - CHAR8 Token[PEI_PERFORMANCE_STRING_SIZE]; ///< Measured token string name. + CHAR8 Token[PEI_PERFORMANCE_STRING_SIZE]; ///< Measured token string name. CHAR8 Module[PEI_PERFORMANCE_STRING_SIZE]; ///< Module string name. UINT64 StartTimeStamp; ///< Start time point. UINT64 EndTimeStamp; ///< End time point. @@ -34,44 +44,24 @@ typedef struct { // // The header must be aligned at 8 bytes. -// +// typedef struct { UINT32 NumberOfEntries; ///< The number of all performance log entries. UINT32 Reserved; } PEI_PERFORMANCE_LOG_HEADER; -// -// The data structure for performance data in ACPI memory. -// -#define PERFORMANCE_SIGNATURE SIGNATURE_32 ('P', 'e', 'r', 'f') -#define PERF_TOKEN_SIZE 28 -#define PERF_TOKEN_LENGTH (PERF_TOKEN_SIZE - 1) -#define PERF_PEI_ENTRY_MAX_NUM 50 - -typedef struct { - CHAR8 Token[PERF_TOKEN_SIZE]; - UINT32 Duration; -} PERF_DATA; - -typedef struct { - UINT64 BootToOs; - UINT64 S3Resume; - UINT32 S3EntryNum; - PERF_DATA S3Entry[PERF_PEI_ENTRY_MAX_NUM]; - UINT64 CpuFreq; - UINT64 BDSRaw; - UINT32 Count; - UINT32 Signiture; -} PERF_HEADER; - #define PERFORMANCE_PROTOCOL_GUID \ - { 0x76b6bdfa, 0x2acd, 0x4462, {0x9E, 0x3F, 0xcb, 0x58, 0xC9, 0x69, 0xd9, 0x37 } } + { 0x76b6bdfa, 0x2acd, 0x4462, { 0x9E, 0x3F, 0xcb, 0x58, 0xC9, 0x69, 0xd9, 0x37 } } + +#define PERFORMANCE_EX_PROTOCOL_GUID \ + { 0x1ea81bec, 0xf01a, 0x4d98, { 0xa2, 0x1, 0x4a, 0x61, 0xce, 0x2f, 0xc0, 0x22 } } // // Forward reference for pure ANSI compatibility // typedef struct _PERFORMANCE_PROTOCOL PERFORMANCE_PROTOCOL; +typedef struct _PERFORMANCE_EX_PROTOCOL PERFORMANCE_EX_PROTOCOL; // // DXE_PERFORMANCE_STRING_SIZE must be a multiple of 8. @@ -86,12 +76,21 @@ typedef struct _PERFORMANCE_PROTOCOL PERFORMANCE_PROTOCOL; typedef struct { EFI_PHYSICAL_ADDRESS Handle; - CHAR8 Token[DXE_PERFORMANCE_STRING_SIZE]; ///< Measured token string name. + CHAR8 Token[DXE_PERFORMANCE_STRING_SIZE]; ///< Measured token string name. CHAR8 Module[DXE_PERFORMANCE_STRING_SIZE]; ///< Module string name. UINT64 StartTimeStamp; ///< Start time point. UINT64 EndTimeStamp; ///< End time point. } GAUGE_DATA_ENTRY; +typedef struct { + EFI_PHYSICAL_ADDRESS Handle; + CHAR8 Token[DXE_PERFORMANCE_STRING_SIZE]; ///< Measured token string name. + CHAR8 Module[DXE_PERFORMANCE_STRING_SIZE]; ///< Module string name. + UINT64 StartTimeStamp; ///< Start time point. + UINT64 EndTimeStamp; ///< End time point. + UINT32 Identifier; ///< Identifier. +} GAUGE_DATA_ENTRY_EX; + // // The header must be aligned at 8 bytes // @@ -105,7 +104,10 @@ typedef struct { // #define SMM_PERFORMANCE_PROTOCOL_GUID \ - { 0xf866226a, 0xeaa5, 0x4f5a, { 0xa9, 0xa, 0x6c, 0xfb, 0xa5, 0x7c, 0x58, 0x8e } } + { 0xf866226a, 0xeaa5, 0x4f5a, { 0xa9, 0xa, 0x6c, 0xfb, 0xa5, 0x7c, 0x58, 0x8e } } + +#define SMM_PERFORMANCE_EX_PROTOCOL_GUID \ + { 0x931fc048, 0xc71d, 0x4455, { 0x89, 0x30, 0x47, 0x6, 0x30, 0xe3, 0xe, 0xe5 } } // // SMM_PERFORMANCE_STRING_SIZE. @@ -126,6 +128,14 @@ typedef struct { GAUGE_DATA_ENTRY *GaugeData; } SMM_PERF_COMMUNICATE; +typedef struct { + UINTN Function; + EFI_STATUS ReturnStatus; + UINTN NumberOfEntries; + UINTN LogEntryKey; + GAUGE_DATA_ENTRY_EX *GaugeDataEx; +} SMM_PERF_COMMUNICATE_EX; + #define SMM_PERF_FUNCTION_GET_GAUGE_ENTRY_NUMBER 1 #define SMM_PERF_FUNCTION_GET_GAUGE_DATA 2 @@ -195,6 +205,8 @@ EFI_STATUS /** Retrieves a previously logged performance measurement. + It can also retrieve the log created by StartGaugeEx and EndGaugeEx of PERFORMANCE_EX_PROTOCOL, + and then eliminate the Identifier. Retrieves the performance log entry from the performance log specified by LogEntryKey. If it stands for a valid entry, then EFI_SUCCESS is returned and @@ -203,7 +215,7 @@ EFI_STATUS @param LogEntryKey The key for the previous performance measurement log entry. If 0, then the first performance measurement log entry is retrieved. @param GaugeDataEntry Out parameter for the indirect pointer to the gauge data entry specified by LogEntryKey. - + @retval EFI_SUCCESS The GuageDataEntry is successfully found based on LogEntryKey. @retval EFI_NOT_FOUND There is no entry after the measurement referred to by LogEntryKey. @retval EFI_INVALID_PARAMETER The LogEntryKey is not a valid entry, or GaugeDataEntry is NULL. @@ -216,13 +228,116 @@ EFI_STATUS OUT GAUGE_DATA_ENTRY **GaugeDataEntry ); +/** + Adds a record at the end of the performance measurement log + that records the start time of a performance measurement. + + The added record contains the Handle, Token, Module and Identifier. + The end time of the new record is not recorded, so it is set to zero. + If TimeStamp is not zero, then TimeStamp is used to fill in the start time in the record. + If TimeStamp is zero, the start time in the record is filled in with the value + read from the current time stamp. + + @param Handle The pointer to environment specific context used + to identify the component being measured. + @param Token The pointer to a Null-terminated ASCII string + that identifies the component being measured. + @param Module The pointer to a Null-terminated ASCII string + that identifies the module being measured. + @param TimeStamp The 64-bit time stamp. + @param Identifier 32-bit identifier. If the value is 0, the created record + is same as the one created by StartGauge of PERFORMANCE_PROTOCOL. + + @retval EFI_SUCCESS The data was read correctly from the device. + @retval EFI_OUT_OF_RESOURCES There are not enough resources to record the measurement. + +**/ +typedef +EFI_STATUS +(EFIAPI * PERFORMANCE_START_GAUGE_EX)( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp, + IN UINT32 Identifier + ); + +/** + Searches the performance measurement log from the beginning of the log + for the first matching record that contains a zero end time and fills in a valid end time. + + Searches the performance measurement log from the beginning of the log + for the first record that matches Handle, Token, Module and Identifier, and has an end time value of zero. + If the record can not be found then return EFI_NOT_FOUND. + If the record is found and TimeStamp is not zero, + then the end time in the record is filled in with the value specified by TimeStamp. + If the record is found and TimeStamp is zero, then the end time in the matching record + is filled in with the current time stamp value. + + @param Handle The pointer to environment specific context used + to identify the component being measured. + @param Token The pointer to a Null-terminated ASCII string + that identifies the component being measured. + @param Module The pointer to a Null-terminated ASCII string + that identifies the module being measured. + @param TimeStamp The 64-bit time stamp. + @param Identifier 32-bit identifier. If the value is 0, the found record + is same as the one found by EndGauge of PERFORMANCE_PROTOCOL. + + @retval EFI_SUCCESS The end of the measurement was recorded. + @retval EFI_NOT_FOUND The specified measurement record could not be found. + +**/ +typedef +EFI_STATUS +(EFIAPI * PERFORMANCE_END_GAUGE_EX)( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp, + IN UINT32 Identifier + ); + +/** + Retrieves a previously logged performance measurement. + It can also retrieve the log created by StartGauge and EndGauge of PERFORMANCE_PROTOCOL, + and then assign the Identifier with 0. + + Retrieves the performance log entry from the performance log specified by LogEntryKey. + If it stands for a valid entry, then EFI_SUCCESS is returned and + GaugeDataEntryEx stores the pointer to that entry. + + @param LogEntryKey The key for the previous performance measurement log entry. + If 0, then the first performance measurement log entry is retrieved. + @param GaugeDataEntryEx Out parameter for the indirect pointer to the extented gauge data entry specified by LogEntryKey. + + @retval EFI_SUCCESS The GuageDataEntryEx is successfully found based on LogEntryKey. + @retval EFI_NOT_FOUND There is no entry after the measurement referred to by LogEntryKey. + @retval EFI_INVALID_PARAMETER The LogEntryKey is not a valid entry, or GaugeDataEntryEx is NULL. + +**/ +typedef +EFI_STATUS +(EFIAPI * PERFORMANCE_GET_GAUGE_EX)( + IN UINTN LogEntryKey, + OUT GAUGE_DATA_ENTRY_EX **GaugeDataEntryEx + ); + struct _PERFORMANCE_PROTOCOL { PERFORMANCE_START_GAUGE StartGauge; PERFORMANCE_END_GAUGE EndGauge; PERFORMANCE_GET_GAUGE GetGauge; }; +struct _PERFORMANCE_EX_PROTOCOL { + PERFORMANCE_START_GAUGE_EX StartGaugeEx; + PERFORMANCE_END_GAUGE_EX EndGaugeEx; + PERFORMANCE_GET_GAUGE_EX GetGaugeEx; +}; + extern EFI_GUID gPerformanceProtocolGuid; extern EFI_GUID gSmmPerformanceProtocolGuid; +extern EFI_GUID gPerformanceExProtocolGuid; +extern EFI_GUID gSmmPerformanceExProtocolGuid; #endif