From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 183311A1DF5 for ; Wed, 17 Aug 2016 03:31:25 -0700 (PDT) Received: by mail-wm0-x241.google.com with SMTP id q128so22561765wma.1 for ; Wed, 17 Aug 2016 03:31:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=iF+32eMkAgYAU1nG0TcjpXjAvdlfGMkHaZANBtMiyUE=; b=ZgkiBWg8of1qmbGPbtrWdoVUxskPykapbxOIjOBZc28Imx0+LPiKmG0Z1A9sdnAZy9 Arc7ofIdxgoyNg2kqGd4Js/q3saHfCljWrHdd/7afX1JjEE4IxHDBZFnCGEVQqRN24W+ ikcwktfNq7xu21D6VyfCHJyDwPB+DBIl+HN82eunqG1QpEIFYXCXd0nOr3/4qzCtEaGW 15u2wLsQqvPfJghP5FWXklNiCHbrjsjNiZONWGUReGcthZJNHYzLFDl4ZFY2iDucPpbi AX1Ln2h9TI/pLfvTwNnIkobIDPQxe3EkGROeMHwbtUYxSOLjqhG04C03zjiioNwmlRkY JYag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=iF+32eMkAgYAU1nG0TcjpXjAvdlfGMkHaZANBtMiyUE=; b=GfBkWrDZap5XgiEtAF796vYzUvtIgTBS209gHNlDtQLHVhUJf8V7N6TiM39J9R99LL x9Od72r08yEFMTuITDI5T68erGH05FnKoGwPI+49CiSapk0DNq2bFibWQOy7HIq5J772 1bHBGMnxpz5x0nG58bMKWfS4JpFsPmXdBZibN7qsMncf6ghIqGvDPNVeITJppVmuQKCg tkWQU/oQWGW+n7s7zpomaEYrBXvIoA3FaCBTTydX/tPqUyxZ5bfF+Ly5Ohtc4YQtvEKA SSZ6BVey3XuutQc84I7zMmmoWteuS6Dm3ueW5KEv62W5gTMzdDOHPetv69qXMW1/+JWN 79tw== X-Gm-Message-State: AEkoousiGonGdt4hnUucXzM3CUxAduvdQpgGVQ/IzgdSvh8RhiZ2ijEL5x6mqDO8mGHrgw== X-Received: by 10.194.236.132 with SMTP id uu4mr41244292wjc.176.1471429882620; Wed, 17 Aug 2016 03:31:22 -0700 (PDT) Received: from [192.168.10.165] (94-39-152-88.adsl-ull.clienti.tiscali.it. [94.39.152.88]) by smtp.googlemail.com with ESMTPSA id x6sm30972792wjk.26.2016.08.17.03.31.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Aug 2016 03:31:21 -0700 (PDT) Sender: Paolo Bonzini To: Star Zeng , edk2-devel@lists.01.org References: <1471400803-129280-1-git-send-email-star.zeng@intel.com> Cc: Michael D Kinney , Liming Gao From: Paolo Bonzini Message-ID: Date: Wed, 17 Aug 2016 12:31:12 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1471400803-129280-1-git-send-email-star.zeng@intel.com> 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 10:31:25 -0000 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit On 17/08/2016 04:26, Star Zeng wrote: > 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 > 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(-) > > 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. > > The TSC counting frequency is determined by comparing how far it counts > - 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 / 10000 > - 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 small > - 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 and > + compensate for this error. > > @return The number of TSC counts per second. > > @@ -366,22 +366,28 @@ InternalCalculateTscFrequency ( > InterruptState = SaveAndDisableInterrupts (); > > TimerAddr = InternalAcpiGetAcpiTimerIoPort (); > - Ticks = 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 = 3579543 Hz which is within 2 Hz of ACPI_TIMER_FREQUENCY. > + // 363 counts is a calibration time of 101.4 uS. > + // > + Ticks = IoRead32 (TimerAddr) + 363; > > StartTSC = 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 while loop will exit. > + // When the current ACPI timer value is greater than 'Ticks', > + // the while loop will exit. > // > while (((Ticks - IoRead32 (TimerAddr)) & BIT23) == 0) { > CpuPause(); > } > - EndTSC = AsmReadTsc (); // TSC value 100us later > + EndTSC = AsmReadTsc (); // TSC value 101.4 us later > > TscFrequency = MultU64x32 ( > - (EndTSC - StartTSC), // Number of TSC counts in 100us > - 10000 // Number of 100us in a second > + (EndTSC - StartTSC), // Number of TSC counts in 101.4 us > + 9861 // Number of 101.4 us in a second > ); > > 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. > > The TSC counting frequency is determined by comparing how far it counts > - 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 / 10000 > - 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 small > - 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 and > + compensate for this error. > > @return The number of TSC counts per second. > > 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. > > The TSC counting frequency is determined by comparing how far it counts > - 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 / 10000 > - 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 small > - 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 and > + compensate for this error. > > @return The number of TSC counts per second. > > Reviewed-by: Paolo Bonzini On top of this you can add the logic to wait for the beginning of a tick before calling rdtsc. Paolo