blob: 20be7654c81ba0ddb7c50732c7349dc8a5d3e056 [file] [log] [blame]
/** @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