Current UefiDpLib implementation depends on TimerLib,
as different platforms may implement and use their
own TimerLib, it makes the dp command needs to be built
by platform. The TimerLib dependency can be removed by
using PEI performance log HOB to make UefiDpLib to be
generic.

Cc: Liming Gao <[email protected]>
Cc: Jiewen Yao <[email protected]>
Cc: Cinnamon Shia <[email protected]>
Cc: Jaben Carsey <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <[email protected]>
---
 ShellPkg/Library/UefiDpLib/Dp.c          | 40 +++++++++++++++++---------------
 ShellPkg/Library/UefiDpLib/DpInternal.h  |  6 ++---
 ShellPkg/Library/UefiDpLib/DpProfile.c   |  3 +--
 ShellPkg/Library/UefiDpLib/DpTrace.c     | 23 +-----------------
 ShellPkg/Library/UefiDpLib/DpUtilities.c |  1 -
 ShellPkg/Library/UefiDpLib/Literals.c    |  3 +--
 ShellPkg/Library/UefiDpLib/UefiDpLib.inf |  7 ++++--
 ShellPkg/Library/UefiDpLib/UefiDpLib.uni |  4 +++-
 ShellPkg/ShellPkg.dsc                    |  2 +-
 9 files changed, 35 insertions(+), 54 deletions(-)

diff --git a/ShellPkg/Library/UefiDpLib/Dp.c b/ShellPkg/Library/UefiDpLib/Dp.c
index 54fd0d1ae163..4c7a44a6bb68 100644
--- a/ShellPkg/Library/UefiDpLib/Dp.c
+++ b/ShellPkg/Library/UefiDpLib/Dp.c
@@ -13,7 +13,7 @@
   Dp uses this information to group records in different ways.  It also uses
   timer information to calculate elapsed time for each measurement.
  
-  Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
+  Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
   (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
@@ -25,16 +25,12 @@
 **/
 
 #include "UefiDpLib.h"
-#include <Guid/GlobalVariable.h>
-#include <Library/PrintLib.h>
-#include <Library/HandleParsingLib.h>
-#include <Library/DevicePathLib.h>
-
+#include <Pi/PiMultiPhase.h>
 #include <Library/ShellLib.h>
 #include <Library/BaseLib.h>
 #include <Library/MemoryAllocationLib.h>
 #include <Library/DebugLib.h>
-#include <Library/TimerLib.h>
+#include <Library/HobLib.h>
 #include <Library/UefiLib.h>
 
 #include <Guid/Performance.h>
@@ -153,9 +149,9 @@ ShellCommandRunDp (
   CONST CHAR16              *CmdLineArg;
   EFI_STATUS                Status;
 
-  UINT64                    Freq;
-  UINT64                    Ticker;
-  UINTN                     Number2Display;
+  EFI_HOB_GUID_TYPE           *GuidHob;
+  PEI_PERFORMANCE_LOG_HEADER  *LogHob;
+  UINTN                       Number2Display;
 
   EFI_STRING                StringPtr;
   BOOLEAN                   SummaryMode;
@@ -182,11 +178,6 @@ ShellCommandRunDp (
   CustomCumulativeData = NULL;
   ShellStatus = SHELL_SUCCESS;
 
-  // Get DP's entry time as soon as possible.
-  // This is used as the Shell-Phase end time.
-  //
-  Ticker  = GetPerformanceCounter ();
-
   //
   // initialize the shell lib (we must be in non-auto-init...)
   //
@@ -275,10 +266,21 @@ ShellCommandRunDp (
   //    StartCount = Value loaded into the counter when it starts counting
   //      EndCount = Value counter counts to before it needs to be reset
   //
-  Freq = GetPerformanceCounterProperties (&TimerInfo.StartCount, 
&TimerInfo.EndCount);
+  GuidHob = GetFirstGuidHob (&gPerformanceProtocolGuid);
+  if (GuidHob != NULL) {
+    LogHob = GET_GUID_HOB_DATA (GuidHob);
+    if (LogHob->Revision < 1) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_DP_HOB_REV_UNSUPPORTED), gDpHiiHandle);
+      goto Done;
+    }
+  } else {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HOB_NOT_FOUND), 
gDpHiiHandle);
+    goto Done;
+  }
 
-  // Convert the Frequency from Hz to KHz
-  TimerInfo.Frequency = (UINT32)DivU64x32 (Freq, 1000);
+  TimerInfo.Frequency = (UINT32)DivU64x32 (LogHob->CpuFreq, 1000);
+  TimerInfo.StartCount = LogHob->TimerStartValue;
+  TimerInfo.EndCount = LogHob->TimerEndValue;
 
   // Determine in which direction the performance counter counts.
   TimerInfo.CountUp = (BOOLEAN) (TimerInfo.EndCount >= TimerInfo.StartCount);
@@ -354,7 +356,7 @@ ShellCommandRunDp (
   } else {
     //------------- Begin Cooked Mode Processing
     if (TraceMode) {
-      ProcessPhases ( Ticker );
+      ProcessPhases ();
       if ( ! SummaryMode) {
         Status = ProcessHandles ( ExcludeMode);
         if (Status == EFI_ABORTED) {
diff --git a/ShellPkg/Library/UefiDpLib/DpInternal.h 
b/ShellPkg/Library/UefiDpLib/DpInternal.h
index b5ec5f0401c0..507adb7c14d5 100644
--- a/ShellPkg/Library/UefiDpLib/DpInternal.h
+++ b/ShellPkg/Library/UefiDpLib/DpInternal.h
@@ -6,7 +6,7 @@
   Dp application.  In addition to global data, function declarations for
   DpUtilities.c, DpTrace.c, and DpProfile.c are included here.
 
-  Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.
+  Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
   (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
@@ -236,12 +236,10 @@ DumpRawTrace(
 /** 
   Gather and print Major Phase metrics.
   
-  @param[in]    Ticker      The timer value for the END of Shell phase
-  
 **/
 VOID
 ProcessPhases(
-  IN UINT64 Ticker
+  VOID
   );
 
 
diff --git a/ShellPkg/Library/UefiDpLib/DpProfile.c 
b/ShellPkg/Library/UefiDpLib/DpProfile.c
index 64583988c183..7218bfe0af96 100644
--- a/ShellPkg/Library/UefiDpLib/DpProfile.c
+++ b/ShellPkg/Library/UefiDpLib/DpProfile.c
@@ -1,7 +1,7 @@
 /** @file
   Measured Profiling reporting for the Dp utility.
 
-  Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.
+  Copyright (c) 2009 - 2016, 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
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -16,7 +16,6 @@
 #include <Library/MemoryAllocationLib.h>
 #include <Library/DebugLib.h>
 #include <Library/UefiBootServicesTableLib.h>
-#include <Library/TimerLib.h>
 #include <Library/PeCoffGetEntryPointLib.h>
 #include <Library/PerformanceLib.h>
 #include <Library/PrintLib.h>
diff --git a/ShellPkg/Library/UefiDpLib/DpTrace.c 
b/ShellPkg/Library/UefiDpLib/DpTrace.c
index dcb1ca500bef..f49710998d4c 100644
--- a/ShellPkg/Library/UefiDpLib/DpTrace.c
+++ b/ShellPkg/Library/UefiDpLib/DpTrace.c
@@ -17,7 +17,6 @@
 #include <Library/MemoryAllocationLib.h>
 #include <Library/DebugLib.h>
 #include <Library/UefiBootServicesTableLib.h>
-#include <Library/TimerLib.h>
 #include <Library/PeCoffGetEntryPointLib.h>
 #include <Library/PerformanceLib.h>
 #include <Library/PrintLib.h>
@@ -386,12 +385,10 @@ DumpRawTrace(
 /** 
   Gather and print Major Phase metrics.
   
-  @param[in]    Ticker      The timer value for the END of Shell phase
-  
 **/
 VOID
 ProcessPhases(
-  IN UINT64            Ticker
+  VOID
   )
 {
   MEASUREMENT_RECORD        Measurement;
@@ -400,7 +397,6 @@ ProcessPhases(
   UINT64                    PeiTime;
   UINT64                    DxeTime;
   UINT64                    BdsTime;
-  UINT64                    ShellTime;
   UINT64                    ElapsedTime;
   UINT64                    Duration;
   UINT64                    Total;
@@ -413,7 +409,6 @@ ProcessPhases(
   PeiTime         = 0;
   DxeTime         = 0;
   BdsTime         = 0;
-  ShellTime       = 0;   
   //
   // Get Execution Phase Statistics
   //
@@ -434,9 +429,6 @@ ProcessPhases(
                           &Measurement.EndTimeStamp,
                           &Measurement.Identifier)) != 0)
   {
-    if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) {
-      Measurement.EndTimeStamp = Ticker;
-    }
     if (Measurement.EndTimeStamp == 0) { // Skip "incomplete" records
       continue;
     }
@@ -454,8 +446,6 @@ ProcessPhases(
       DxeTime      = Duration;
     } else if (AsciiStrnCmp (Measurement.Token, ALit_BDS, PERF_TOKEN_LENGTH) 
== 0) {
       BdsTime      = Duration;
-    } else if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) 
== 0) {
-      ShellTime    = Duration;
     }
   }
 
@@ -510,17 +500,6 @@ ProcessPhases(
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_BDSTO), 
gDpHiiHandle, ALit_BdsTO, ElapsedTime);
   }
 
-  // print SHELL phase duration time
-  //
-  if (ShellTime > 0) {
-    ElapsedTime = DivU64x32 (
-                    ShellTime,
-                    (UINT32)TimerInfo.Frequency
-                    );
-    Total += ElapsedTime;
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_DURATION), 
gDpHiiHandle, ALit_SHELL, ElapsedTime);
-  }
-
   ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOTAL_DURATION), 
gDpHiiHandle, Total);
 }
 
diff --git a/ShellPkg/Library/UefiDpLib/DpUtilities.c 
b/ShellPkg/Library/UefiDpLib/DpUtilities.c
index fbdd938bc3bf..86147cf997a3 100644
--- a/ShellPkg/Library/UefiDpLib/DpUtilities.c
+++ b/ShellPkg/Library/UefiDpLib/DpUtilities.c
@@ -17,7 +17,6 @@
 #include <Library/MemoryAllocationLib.h>
 #include <Library/DebugLib.h>
 #include <Library/UefiBootServicesTableLib.h>
-#include <Library/TimerLib.h>
 #include <Library/PeCoffGetEntryPointLib.h>
 #include <Library/PrintLib.h>
 #include <Library/HiiLib.h>
diff --git a/ShellPkg/Library/UefiDpLib/Literals.c 
b/ShellPkg/Library/UefiDpLib/Literals.c
index 68de0fbc9ece..13773bdc3a5a 100644
--- a/ShellPkg/Library/UefiDpLib/Literals.c
+++ b/ShellPkg/Library/UefiDpLib/Literals.c
@@ -1,7 +1,7 @@
 /** @file
   Definitions of ASCII string literals used by DP.
 
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2009 - 2016, 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
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -16,7 +16,6 @@
 CHAR8 const ALit_TimerLibError[] = "Timer library instance error!\n";
 CHAR8 const ALit_SEC[]    = SEC_TOK;
 CHAR8 const ALit_DXE[]    = DXE_TOK;
-CHAR8 const ALit_SHELL[]  = SHELL_TOK;
 CHAR8 const ALit_PEI[]    = PEI_TOK;
 CHAR8 const ALit_BDS[]    = BDS_TOK;
 CHAR8 const ALit_BdsTO[]  = "BdsTimeOut";
diff --git a/ShellPkg/Library/UefiDpLib/UefiDpLib.inf 
b/ShellPkg/Library/UefiDpLib/UefiDpLib.inf
index 70d2163d2bd2..ad690de6bf61 100644
--- a/ShellPkg/Library/UefiDpLib/UefiDpLib.inf
+++ b/ShellPkg/Library/UefiDpLib/UefiDpLib.inf
@@ -1,7 +1,7 @@
 ##  @file
 #  Display Performance Application, Module information file.
 #
-# Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) 2009 - 2016, 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
 # which accompanies this distribution.  The full text of the license may be 
found at
@@ -48,7 +48,7 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
 
 [LibraryClasses]
-  TimerLib
+  HobLib
   PerformanceLib
   DxeServicesLib
   MemoryAllocationLib
@@ -64,6 +64,9 @@ [LibraryClasses]
   PrintLib
   DevicePathLib
 
+[Guids]
+  gPerformanceProtocolGuid                                ## CONSUMES ## HOB
+
 [Protocols]
   gEfiLoadedImageProtocolGuid                             ## CONSUMES
   gEfiDriverBindingProtocolGuid                           ## SOMETIMES_CONSUMES
diff --git a/ShellPkg/Library/UefiDpLib/UefiDpLib.uni 
b/ShellPkg/Library/UefiDpLib/UefiDpLib.uni
index b09227451078..d4a1d51eb0bb 100644
--- a/ShellPkg/Library/UefiDpLib/UefiDpLib.uni
+++ b/ShellPkg/Library/UefiDpLib/UefiDpLib.uni
@@ -1,7 +1,7 @@
 // *++
 //
 // (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>
-// Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
+// Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
 // (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD 
License
@@ -35,6 +35,8 @@
 #string STR_DP_INVALID_ARG             #language en-US  "Invalid argument(s)\n"
 #string STR_DP_HANDLES_ERROR           #language en-US  "Locate all handles 
error - %r\n"
 #string STR_DP_ERROR_NAME              #language en-US  "Unknown driver name"
+#string STR_DP_HOB_NOT_FOUND           #language en-US  "PEI performance log 
HOB not found\n"
+#string STR_DP_HOB_REV_UNSUPPORTED     #language en-US  "Do not support PEI 
performance log HOB revision < 1\n"
 #string STR_DP_BUILD_REVISION          #language en-US  "\nDP Build Version:   
    %d.%d\n"
 #string STR_DP_KHZ                     #language en-US  "System Performance 
Timer Frequency:   %,8d (KHz)\n"
 #string STR_DP_TIMER_PROPERTIES        #language en-US  "System Performance 
Timer counts %s from 0x%Lx to 0x%Lx\n"
diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc
index 25c4fadc61f1..4b1e5e20c076 100644
--- a/ShellPkg/ShellPkg.dsc
+++ b/ShellPkg/ShellPkg.dsc
@@ -97,7 +97,7 @@ [Components]
 
   ShellPkg/Library/UefiDpLib/UefiDpLib.inf {
     <LibraryClasses>
-      
TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
+      HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
       
PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
       DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
   }
-- 
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to