From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ml01.01.org (Postfix) with ESMTP id 8D6E01A1DF2 for ; Wed, 17 Aug 2016 08:49:32 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga101.jf.intel.com with ESMTP; 17 Aug 2016 08:49:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,529,1464678000"; d="scan'208";a="1042858180" Received: from orsmsx108.amr.corp.intel.com ([10.22.240.6]) by fmsmga002.fm.intel.com with ESMTP; 17 Aug 2016 08:49:23 -0700 Received: from orsmsx113.amr.corp.intel.com ([169.254.9.118]) by ORSMSX108.amr.corp.intel.com ([169.254.2.61]) with mapi id 14.03.0248.002; Wed, 17 Aug 2016 08:49:23 -0700 From: "Kinney, Michael D" To: "Zeng, Star" , "edk2-devel@lists.01.org" , "Kinney, Michael D" CC: "Gao, Liming" , Paolo Bonzini , "Lohr, Paul A" Thread-Topic: [PATCH] PcAtChipsetPkg AcpiTimerLib: Wait 363 ACPI timer counts to get TSC Freq Thread-Index: AQHR+C7Zo8HEzrhiFkiFTuRav2afq6BNTU3Q Date: Wed, 17 Aug 2016 15:49:23 +0000 Message-ID: References: <1471400803-129280-1-git-send-email-star.zeng@intel.com> In-Reply-To: <1471400803-129280-1-git-send-email-star.zeng@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_IC x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNzQwYWE0ZGQtOTJjYy00M2M0LTk1OTgtNWE5NmM0MWIyZjg0IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IjJnbmdsRFN0RFBGS0lSRVE5dXRDK0tcL0pMR3RHeERJK2JpMnU5VEh1Y0o4PSJ9 x-originating-ip: [10.22.254.139] MIME-Version: 1.0 Subject: Re: [PATCH] PcAtChipsetPkg AcpiTimerLib: Wait 363 ACPI timer counts to get TSC Freq X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Aug 2016 15:49:32 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Michael Kinney > -----Original Message----- > From: Zeng, Star > Sent: Tuesday, August 16, 2016 7:27 PM > To: edk2-devel@lists.01.org > Cc: Zeng, Star ; Kinney, Michael D ; > Gao, Liming ; Paolo Bonzini ; = Lohr, Paul A > > Subject: [PATCH] PcAtChipsetPkg AcpiTimerLib: Wait 363 ACPI timer counts = to get TSC > Freq >=20 > Compute the number of ticks to wait to measure TSC frequency. > Instead of (ACPI_TIMER_FREQUENCY / 10000) =3D 357 and 357 * 10000 =3D 357= 0000, > use 363 * 9861 =3D 3579543 Hz which is within 2 Hz of ACPI_TIMER_FREQUENC= Y. > 363 counts is a calibration time of 101.4 uS. >=20 > The idea comes from Michael and Paolo. >=20 > Cc: Michael D Kinney > Cc: Liming Gao > Cc: Paolo Bonzini > Cc: Paul A Lohr > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Star Zeng > --- > PcAtChipsetPkg/Library/AcpiTimerLib/AcpiTimerLib.c | 32 +++++++++++++---= ------ > .../Library/AcpiTimerLib/BaseAcpiTimerLib.c | 14 +++++----- > .../Library/AcpiTimerLib/DxeAcpiTimerLib.c | 14 +++++----- > 3 files changed, 33 insertions(+), 27 deletions(-) >=20 > diff --git a/PcAtChipsetPkg/Library/AcpiTimerLib/AcpiTimerLib.c > b/PcAtChipsetPkg/Library/AcpiTimerLib/AcpiTimerLib.c > index e6fea231123d..020031e3f4a5 100644 > --- a/PcAtChipsetPkg/Library/AcpiTimerLib/AcpiTimerLib.c > +++ b/PcAtChipsetPkg/Library/AcpiTimerLib/AcpiTimerLib.c > @@ -340,13 +340,13 @@ GetTimeInNanoSecond ( > Calculate TSC frequency. >=20 > The TSC counting frequency is determined by comparing how far it count= s > - during a 100us 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 for ACPI_TIMER_FREQUENCY / 100= 00 > - clocks of the ACPI timer, or 100us. The TSC is then sampled again. The > - difference multiplied by 10000 is the TSC frequency. There will be a s= mall > - error because of the overhead of reading the ACPI timer. An attempt is > - made to determine and compensate for this error. > + 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 an= d > + compensate for this error. >=20 > @return The number of TSC counts per second. >=20 > @@ -366,22 +366,28 @@ InternalCalculateTscFrequency ( > InterruptState =3D SaveAndDisableInterrupts (); >=20 > TimerAddr =3D InternalAcpiGetAcpiTimerIoPort (); > - Ticks =3D IoRead32 (TimerAddr) + (ACPI_TIMER_FREQUENCY / 10000); //= Set Ticks to > 100us in the future > + // > + // Compute the number of ticks to wait to measure TSC frequency. > + // Use 363 * 9861 =3D 3579543 Hz which is within 2 Hz of ACPI_TIMER_FR= EQUENCY. > + // 363 counts is a calibration time of 101.4 uS. > + // > + Ticks =3D IoRead32 (TimerAddr) + 363; >=20 > StartTSC =3D AsmReadTsc (); //= Get base > value for the TSC > // > - // Wait until the ACPI timer has counted 100us. > + // Wait until the ACPI timer has counted 101.4 us. > // Timer wrap-arounds are handled correctly by this function. > - // When the current ACPI timer value is greater than 'Ticks', the whil= e loop will > exit. > + // When the current ACPI timer value is greater than 'Ticks', > + // the while loop will exit. > // > while (((Ticks - IoRead32 (TimerAddr)) & BIT23) =3D=3D 0) { > CpuPause(); > } > - EndTSC =3D AsmReadTsc (); //= TSC value > 100us later > + EndTSC =3D AsmReadTsc (); //= TSC value > 101.4 us later >=20 > TscFrequency =3D MultU64x32 ( > - (EndTSC - StartTSC), // N= umber of TSC > counts in 100us > - 10000 // N= umber of > 100us in a second > + (EndTSC - StartTSC), // N= umber of TSC > counts in 101.4 us > + 9861 // N= umber of > 101.4 us in a second > ); >=20 > SetInterruptState (InterruptState); > diff --git a/PcAtChipsetPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > b/PcAtChipsetPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > index 8819ebcfccef..29521f8b220b 100644 > --- a/PcAtChipsetPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > +++ b/PcAtChipsetPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > @@ -20,13 +20,13 @@ > Calculate TSC frequency. >=20 > The TSC counting frequency is determined by comparing how far it count= s > - during a 100us 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 for ACPI_TIMER_FREQUENCY / 100= 00 > - clocks of the ACPI timer, or 100us. The TSC is then sampled again. The > - difference multiplied by 10000 is the TSC frequency. There will be a s= mall > - error because of the overhead of reading the ACPI timer. An attempt is > - made to determine and compensate for this error. > + 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 an= d > + compensate for this error. >=20 > @return The number of TSC counts per second. >=20 > diff --git a/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > b/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > index 7f7b0f8f6294..b141c680fb82 100644 > --- a/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > +++ b/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > @@ -20,13 +20,13 @@ > Calculate TSC frequency. >=20 > The TSC counting frequency is determined by comparing how far it count= s > - during a 100us 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 for ACPI_TIMER_FREQUENCY / 100= 00 > - clocks of the ACPI timer, or 100us. The TSC is then sampled again. The > - difference multiplied by 10000 is the TSC frequency. There will be a s= mall > - error because of the overhead of reading the ACPI timer. An attempt is > - made to determine and compensate for this error. > + 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 an= d > + compensate for this error. >=20 > @return The number of TSC counts per second. >=20 > -- > 2.7.0.windows.1