Compute the number of ticks to wait to measure TSC frequency. Instead of (ACPI_TIMER_FREQUENCY / 10000) = 357 and 357 * 10000 = 3570000, use 363 * 9861 = 3579543 Hz which is within 2 Hz of ACPI_TIMER_FREQUENCY. 363 counts is a calibration time of 101.4 uS. The idea comes from Michael and Paolo. Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Paul A Lohr <paul.a.lohr@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  ACPI Timer implements one instance of Timer Library.
 | 
						|
 | 
						|
  Copyright (c) 2013 - 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
 | 
						|
  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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Base.h>
 | 
						|
#include <Library/TimerLib.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
 | 
						|
/**
 | 
						|
  Calculate TSC frequency.
 | 
						|
 | 
						|
  The TSC counting frequency is determined by comparing how far it counts
 | 
						|
  during a 101.4 us period as determined by the ACPI timer.
 | 
						|
  The ACPI timer is used because it counts at a known frequency.
 | 
						|
  The TSC is sampled, followed by waiting 363 counts of the ACPI timer,
 | 
						|
  or 101.4 us. The TSC is then sampled again. The difference multiplied by
 | 
						|
  9861 is the TSC frequency. There will be a small error because of the
 | 
						|
  overhead of reading the ACPI timer. An attempt is made to determine and
 | 
						|
  compensate for this error.
 | 
						|
 | 
						|
  @return The number of TSC counts per second.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
InternalCalculateTscFrequency (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Cached performance counter frequency
 | 
						|
//
 | 
						|
UINT64  mPerformanceCounterFrequency = 0;
 | 
						|
 | 
						|
/**
 | 
						|
  Internal function to retrieves the 64-bit frequency in Hz.
 | 
						|
 | 
						|
  Internal function to retrieves the 64-bit frequency in Hz.
 | 
						|
 | 
						|
  @return The frequency in Hz.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
InternalGetPerformanceCounterFrequency (
 | 
						|
  VOID
 | 
						|
  ) 
 | 
						|
{
 | 
						|
  if (mPerformanceCounterFrequency == 0) {
 | 
						|
    mPerformanceCounterFrequency = InternalCalculateTscFrequency ();
 | 
						|
  }
 | 
						|
  return  mPerformanceCounterFrequency;
 | 
						|
}
 |