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>
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.6 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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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
 | |
|   ) 
 | |
| {
 | |
|   return InternalCalculateTscFrequency ();
 | |
| }
 |