/** @file This file defines edk2 extended firmware performance records. These records will be added into ACPI FPDT Firmware Basic Boot Performance Table. Copyright (c) 2018, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __EXTENDED_FIRMWARE_PERFORMANCE_H__ #define __EXTENDED_FIRMWARE_PERFORMANCE_H__ #include <IndustryStandard/Acpi.h> // // Known performance tokens // #define SEC_TOK "SEC" ///< SEC Phase #define DXE_TOK "DXE" ///< DXE Phase #define PEI_TOK "PEI" ///< PEI Phase #define BDS_TOK "BDS" ///< BDS Phase #define DRIVERBINDING_START_TOK "DB:Start:" ///< Driver Binding Start() function call #define DRIVERBINDING_SUPPORT_TOK "DB:Support:" ///< Driver Binding Support() function call #define DRIVERBINDING_STOP_TOK "DB:Stop:" ///< Driver Binding Stop() function call #define LOAD_IMAGE_TOK "LoadImage:" ///< Load a dispatched module #define START_IMAGE_TOK "StartImage:" ///< Dispatched Modules Entry Point execution #define PEIM_TOK "PEIM" ///< PEIM Modules Entry Point execution // // Misc defines // #define FPDT_RECORD_REVISION_1 (0x01) // // Length field in EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER is a UINT8, thus: // #define FPDT_MAX_PERF_RECORD_SIZE (MAX_UINT8) // // FPDT Record Types // #define FPDT_GUID_EVENT_TYPE 0x1010 #define FPDT_DYNAMIC_STRING_EVENT_TYPE 0x1011 #define FPDT_DUAL_GUID_STRING_EVENT_TYPE 0x1012 #define FPDT_GUID_QWORD_EVENT_TYPE 0x1013 #define FPDT_GUID_QWORD_STRING_EVENT_TYPE 0x1014 // // EDKII extended Fpdt record structures // #define FPDT_STRING_EVENT_RECORD_NAME_LENGTH 24 #pragma pack(1) // // FPDT Boot Performance Guid Event Record Structure // typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; /// /// ProgressID < 0x10 are reserved for core performance entries. /// Start measurement point shall have lowered one nibble set to zero and /// corresponding end points shall have lowered one nibble set to non-zero value; /// keeping other nibbles same as start point. /// UINT16 ProgressID; /// /// APIC ID for the processor in the system used as a timestamp clock source. /// If only one timestamp clock source is used, this field is Reserved and populated as 0. /// UINT32 ApicID; /// /// 64-bit value (nanosecond) describing elapsed time since the most recent deassertion of processor reset. /// UINT64 Timestamp; /// /// If ProgressID < 0x10, GUID of the referenced module; otherwise, GUID of the module logging the event. /// EFI_GUID Guid; } FPDT_GUID_EVENT_RECORD; // // FPDT Boot Performance Dynamic String Event Record Structure // typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; /// /// ProgressID < 0x10 are reserved for core performance entries. /// Start measurement point shall have lowered one nibble set to zero and /// corresponding end points shall have lowered one nibble set to non-zero value; /// keeping other nibbles same as start point. /// UINT16 ProgressID; /// /// APIC ID for the processor in the system used as a timestamp clock source. /// If only one timestamp clock source is used, this field is Reserved and populated as 0. /// UINT32 ApicID; /// /// 64-bit value (nanosecond) describing elapsed time since the most recent deassertion of processor reset. /// UINT64 Timestamp; /// /// If ProgressID < 0x10, GUID of the referenced module; otherwise, GUID of the module logging the event. /// EFI_GUID Guid; /// /// ASCII string describing the module. Padding supplied at the end if necessary with null characters (0x00). /// It may be module name, function name, or token name. /// CHAR8 String[0]; } FPDT_DYNAMIC_STRING_EVENT_RECORD; // // FPDT Boot Performance Dual GUID String Event Record Structure // typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; /// /// ProgressID < 0x10 are reserved for core performance entries. /// Start measurement point shall have lowered one nibble set to zero and /// corresponding end points shall have lowered one nibble set to non-zero value; /// keeping other nibbles same as start point. /// UINT16 ProgressID; /// /// APIC ID for the processor in the system used as a timestamp clock source. /// If only one timestamp clock source is used, this field is Reserved and populated as 0. /// UINT32 ApicID; /// /// 64-bit value (nanosecond) describing elapsed time since the most recent deassertion of processor reset. /// UINT64 Timestamp; /// /// GUID of the module logging the event. /// EFI_GUID Guid1; /// /// Event or Ppi or Protocol GUID for Callback. /// EFI_GUID Guid2; /// /// ASCII string describing the module. Padding supplied at the end if necessary with null characters (0x00). /// It is the function name. /// CHAR8 String[0]; } FPDT_DUAL_GUID_STRING_EVENT_RECORD; // // FPDT Boot Performance GUID Qword Event Record Structure // typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; /// /// ProgressID < 0x10 are reserved for core performance entries. /// Start measurement point shall have lowered one nibble set to zero and /// corresponding end points shall have lowered one nibble set to non-zero value; /// keeping other nibbles same as start point. /// UINT16 ProgressID; /// /// APIC ID for the processor in the system used as a timestamp clock source. /// If only one timestamp clock source is used, this field is Reserved and populated as 0. /// UINT32 ApicID; /// /// 64-bit value (nanosecond) describing elapsed time since the most recent deassertion of processor reset. /// UINT64 Timestamp; /// /// GUID of the module logging the event /// EFI_GUID Guid; /// /// Qword of misc data, meaning depends on the ProgressId /// UINT64 Qword; } FPDT_GUID_QWORD_EVENT_RECORD; // // FPDT Boot Performance GUID Qword String Event Record Structure // typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; /// /// ProgressID < 0x10 are reserved for core performance entries. /// Start measurement point shall have lowered one nibble set to zero and /// corresponding end points shall have lowered one nibble set to non-zero value; /// keeping other nibbles same as start point. /// UINT16 ProgressID; /// /// APIC ID for the processor in the system used as a timestamp clock source. /// If only one timestamp clock source is used, this field is Reserved and populated as 0. /// UINT32 ApicID; /// /// 64-bit value (nanosecond) describing elapsed time since the most recent deassertion of processor reset. /// UINT64 Timestamp; /// /// GUID of the module logging the event /// EFI_GUID Guid; /// /// Qword of misc data, meaning depends on the ProgressId /// UINT64 Qword; /// /// ASCII string describing the module. Padding supplied at the end if necessary with null characters (0x00). /// CHAR8 String[0]; } FPDT_GUID_QWORD_STRING_EVENT_RECORD; #pragma pack() // // Union of all FPDT records // typedef union { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER RecordHeader; FPDT_GUID_EVENT_RECORD GuidEvent; FPDT_DYNAMIC_STRING_EVENT_RECORD DynamicStringEvent; FPDT_DUAL_GUID_STRING_EVENT_RECORD DualGuidStringEvent; FPDT_GUID_QWORD_EVENT_RECORD GuidQwordEvent; FPDT_GUID_QWORD_STRING_EVENT_RECORD GuidQwordStringEvent; } FPDT_RECORD; // // Union of all pointers to FPDT records // typedef union { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *RecordHeader; FPDT_GUID_EVENT_RECORD *GuidEvent; FPDT_DYNAMIC_STRING_EVENT_RECORD *DynamicStringEvent; FPDT_DUAL_GUID_STRING_EVENT_RECORD *DualGuidStringEvent; FPDT_GUID_QWORD_EVENT_RECORD *GuidQwordEvent; FPDT_GUID_QWORD_STRING_EVENT_RECORD *GuidQwordStringEvent; } FPDT_RECORD_PTR; /// /// Hob: /// GUID - gEdkiiFpdtExtendedFirmwarePerformanceGuid; /// Data - FPDT_PEI_EXT_PERF_HEADER + one or more FPDT records /// typedef struct { UINT32 SizeOfAllEntries; UINT32 LoadImageCount; UINT32 HobIsFull; } FPDT_PEI_EXT_PERF_HEADER; extern EFI_GUID gEdkiiFpdtExtendedFirmwarePerformanceGuid; #endif