public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Dandan Bi <dandan.bi@intel.com>
To: edk2-devel@lists.01.org
Cc: "Gao, Liming" <liming.gao@intel.com>, Star Zeng <star.zeng@intel.com>
Subject: [patch 1/8] MdeModulePkg:Add definitions for new Performance infrastructure
Date: Tue, 23 Jan 2018 11:47:28 +0800	[thread overview]
Message-ID: <1516679255-12328-2-git-send-email-dandan.bi@intel.com> (raw)
In-Reply-To: <1516679255-12328-1-git-send-email-dandan.bi@intel.com>

From: "Gao, Liming" <liming.gao@intel.com>

Cc: Liming Gao <liming.gao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Liming Gao <liming.gao@intel.com>
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
---
 .../Include/Guid/ExtendedFirmwarePerformance.h     | 291 +++++++++++++++++++++
 MdeModulePkg/MdeModulePkg.dec                      |  11 +-
 MdeModulePkg/MdeModulePkg.uni                      |   8 +-
 3 files changed, 308 insertions(+), 2 deletions(-)
 create mode 100644 MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h

diff --git a/MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h b/MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h
new file mode 100644
index 0000000..05588a4
--- /dev/null
+++ b/MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h
@@ -0,0 +1,291 @@
+/** @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>
+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.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#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
+
+//
+// Public Progress Identifiers for Event Records to map the above known token
+//
+#define MODULE_START_ID                 0x01
+#define MODULE_END_ID                   0x02
+#define MODULE_LOADIMAGE_START_ID       0x03
+#define MODULE_LOADIMAGE_END_ID         0x04
+#define MODULE_DB_START_ID              0x05
+#define MODULE_DB_END_ID                0x06
+#define MODULE_DB_SUPPORT_START_ID      0x07
+#define MODULE_DB_SUPPORT_END_ID        0x08
+#define MODULE_DB_STOP_START_ID         0x09
+#define MODULE_DB_STOP_END_ID           0x0A
+
+#define PERF_EVENTSIGNAL_START_ID       0x10
+#define PERF_EVENTSIGNAL_END_ID         0x11
+#define PERF_CALLBACK_START_ID          0x20
+#define PERF_CALLBACK_END_ID            0x21
+#define PERF_FUNCTION_START_ID          0x30
+#define PERF_FUNCTION_END_ID            0x31
+#define PERF_INMODULE_START_ID          0x40
+#define PERF_INMODULE_END_ID            0x41
+#define PERF_CROSSMODULE_START_ID       0x50
+#define PERF_CROSSMODULE_END_ID         0x51
+
+//
+// Misc defines
+//
+#define RECORD_REVISION_1      (0x01)
+
+//
+// Length field in EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER is a UINT8, thus:
+//
+#define MAX_PERF_RECORD_SIZE   (0xFF)
+
+//
+// FPDT Record Types
+//
+#define GUID_EVENT_TYPE               0x1010
+#define DYNAMIC_STRING_EVENT_TYPE     0x1011
+#define DUAL_GUID_STRING_EVENT_TYPE   0x1012
+#define GUID_QWORD_EVENT_TYPE         0x1013
+#define GUID_QWORD_STRING_EVENT_TYPE  0x1014
+
+//
+// EDKII extended Fpdt record structures
+//
+#define EDKII_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;
+} 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];
+} 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];
+} 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;
+} 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];
+} GUID_QWORD_STRING_EVENT_RECORD;
+
+#pragma pack()
+
+typedef struct {
+  UINT16                                      ProgressID;
+  UINT16                                      Type;
+  UINT8                                       RecordSize;
+} BASIC_RECORD_INFO;
+
+//
+// Union of all FPDT records
+//
+typedef union {
+  EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER  RecordHeader;
+  GUID_EVENT_RECORD                            GuidEvent;
+  DYNAMIC_STRING_EVENT_RECORD                  DynamicStringEvent;
+  DUAL_GUID_STRING_EVENT_RECORD                DualGuidStringEvent;
+  GUID_QWORD_EVENT_RECORD                      GuidQwordEvent;
+  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;
+  GUID_EVENT_RECORD                            *GuidEvent;
+  DYNAMIC_STRING_EVENT_RECORD                  *DynamicStringEvent;
+  DUAL_GUID_STRING_EVENT_RECORD                *DualGuidStringEvent;
+  GUID_QWORD_EVENT_RECORD                      *GuidQwordEvent;
+  GUID_QWORD_STRING_EVENT_RECORD               *GuidQwordStringEvent;
+} FPDT_RECORD_PTR;
+
+///
+/// Hob:
+///   GUID - gEdkiiExtendedFirmwarePerformanceGuid
+///   Data - PEI_EXT_FIRMWARE_PERF_HEADER + one or more FPDT records
+///
+typedef struct {
+  UINT32                SizeOfAllEntries;
+  UINT32                LoadImageCount;
+  UINT32                HobIsFull;
+} PEI_EXT_FIRMWARE_PERF_HEADER;
+
+extern EFI_GUID gEdkiiExtendedFirmwarePerformanceGuid;
+
+#endif
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 491fb27..24230be 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -1,11 +1,11 @@
 ## @file  MdeModulePkg.dec
 # This package provides the modules that conform to UEFI/PI Industry standards.
 # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs and library classes)
 # and libraries instances, which are used for those modules.
 #
-# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
 # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
 # Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
 #
 # This program and the accompanying materials are licensed and made available under
@@ -390,10 +390,13 @@
   gEdkiiNonDiscoverableXhciDeviceGuid = { 0xB1BE0BC5, 0x6C28, 0x442D, {0xAA, 0x37, 0x15, 0x1B, 0x42, 0x57, 0xBD, 0x78 } }
 
   ## Include/Guid/PlatformHasAcpi.h
   gEdkiiPlatformHasAcpiGuid = { 0xf0966b41, 0xc23f, 0x41b9, { 0x96, 0x04, 0x0f, 0xf7, 0xe1, 0x11, 0x96, 0x5a } }
 
+  ## Include/Guid/ExtendedFirmwarePerformance.h
+  gEdkiiExtendedFirmwarePerformanceGuid = { 0x3b387bfd, 0x7abc, 0x4cf2, { 0xa0, 0xca, 0xb6, 0xa1, 0x6c, 0x1b, 0x1b, 0x25 } }
+
   ## Include/Guid/EndofS3Resume.h
   gEdkiiEndOfS3ResumeGuid = { 0x96f5296d, 0x05f7, 0x4f3c, {0x84, 0x67, 0xe4, 0x56, 0x89, 0x0e, 0x0c, 0xb5 } }
 
 [Ppis]
   ## Include/Ppi/AtaController.h
@@ -1404,10 +1407,16 @@
 
   ## CapsuleMax value in capsule report variable.
   # @Prompt CapsuleMax value in capsule report variable.
   gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleMax|0xFFFF|UINT16|0x00000107
 
+  ## Control which FPDT record format will be used to store the performance entry.
+  # On TRUE, the string FPDT record will be used to store every performance entry.
+  # On FALSE, the different FPDT record will be used to store the different performance entries.
+  # @Prompt String FPDT Record Enable Only
+  gEfiMdeModulePkgTokenSpaceGuid.PcdEdkiiFpdtStringRecordEnableOnly|FALSE|BOOLEAN|0x00000109
+
 [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   ## This PCD defines the Console output row. The default value is 25 according to UEFI spec.
   #  This PCD could be set to 0 then console output would be at max column and max row.
   # @Prompt Console output row.
   gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow|25|UINT32|0x40000006
diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni
index 0e06842..dacd671 100644
--- a/MdeModulePkg/MdeModulePkg.uni
+++ b/MdeModulePkg/MdeModulePkg.uni
@@ -2,11 +2,11 @@
 // This package provides the modules that conform to UEFI/PI Industry standards.
 //
 // It also provides the definitions(including PPIs/PROTOCOLs/GUIDs and library classes)
 // and libraries instances, which are used for those modules.
 //
-// Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
+// Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
 //
 // 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.
@@ -1230,5 +1230,11 @@
                                                                                     "  When its value is set in PEI, it will trig the default setting to be applied as the default EFI variable.\n"
 
 #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdNvStoreDefaultValueBuffer_PROMPT  #language en-US "NV Storage Default Value Buffer"
 
 #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdNvStoreDefaultValueBuffer_HELP    #language en-US "This dynamic PCD holds the DynamicHii PCD value. Its value is the auto generated.\n"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEdkiiFpdtStringRecordEnableOnly_PROMPT  #language en-US "String FPDT Record Enable Only"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEdkiiFpdtStringRecordEnableOnly_HELP    #language en-US "Control which FPDT record format will be used to store the performance entry.\n"
+                                                                                                      "On TRUE, the string FPDT record will be used to store every performance entry.\n"
+                                                                                                      "On FALSE, the different FPDT record will be used to store the different performance entries."
-- 
1.9.5.msysgit.1



  reply	other threads:[~2018-01-23  3:42 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-23  3:47 [patch 0/8] Update EDKII Performance infrastructure based on ACPI FPDT table Dandan Bi
2018-01-23  3:47 ` Dandan Bi [this message]
2018-01-23  3:47 ` [patch 2/8] MdeModulePkg/PeiPerformance:Updated to track FPDT record in PEI phase Dandan Bi
2018-01-23  3:47 ` [patch 3/8] MdeModulePkg/DxeCorePerformanceLib:Track FPDT record in DXE phase Dandan Bi
2018-01-23  3:47 ` [patch 4/8] MdeModulePkg/SmmCorePerformanceLib:Track FPDT record in SMM phase Dandan Bi
2018-01-23  3:47 ` [patch 5/8] MdeModulePkg/FirmwarePerformancePei:Add FPDT records for S3 phase Dandan Bi
2018-01-23  3:47 ` [patch 6/8] MdeModulePkg/FirmwarePerfDxe:Enhance for new pref infrastructure Dandan Bi
2018-01-23  3:47 ` [patch 7/8] MdeModulePkg/FirmwarePerfSmm: Add check for collecting SMM records Dandan Bi
2018-01-23  3:47 ` [patch 8/8] ShellPkg/Dp: Updated to dump perf log based on FPDT table Dandan Bi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1516679255-12328-2-git-send-email-dandan.bi@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox