From 30522140a12f360d24babc36c9d9c8e4be8b1b5e Mon Sep 17 00:00:00 2001 From: lzeng14 Date: Tue, 15 Jan 2013 05:18:19 +0000 Subject: [PATCH] The unit of Duration for S3BootScriptSaveMemPoll() is us, but not ns, so update BootScriptExecuteMemPoll() to use MicroSecondDelay() instead of NanoSecondDelay(), and update BootScriptWriteMemPoll() to use S3BootScriptSaveMemPoll() correctly with possible minimum deviation. Signed-off-by: Star Zeng Reviewed-by: Jiewen Yao git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14048 6f19259b-4bc3-4df7-8a09-765794883524 --- .../PiDxeS3BootScriptLib/BootScriptExecute.c | 4 +-- .../Acpi/S3SaveStateDxe/S3SaveState.c | 27 +++++++++++++++---- .../Acpi/SmmS3SaveState/SmmS3SaveState.c | 27 +++++++++++++++---- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c index afb4c10776..cba331a3bd 100644 --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c @@ -1,7 +1,7 @@ /** @file Interpret and execute the S3 data in S3 boot script. - Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -1176,7 +1176,7 @@ BootScriptExecuteMemPoll ( } for (LoopTimes = 0; LoopTimes < MemPoll.LoopTimes; LoopTimes++) { - NanoSecondDelay ((UINTN)MemPoll.Duration); + MicroSecondDelay ((UINTN)MemPoll.Duration); Data = 0; Status = ScriptMemoryRead ( diff --git a/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c b/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c index 249fb8caff..723c77a52b 100644 --- a/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c +++ b/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c @@ -1,7 +1,7 @@ /** @file Implementation for S3 Boot Script Saver state driver. - Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -344,16 +344,33 @@ BootScriptWriteMemPoll ( VOID *Data; VOID *DataMask; UINTN Delay; - + UINTN LoopTimes; + UINT32 Remainder; + Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); Address = VA_ARG (Marker, UINT64); Data = VA_ARG (Marker, VOID *); DataMask = VA_ARG (Marker, VOID *); Delay = (UINTN)VA_ARG (Marker, UINT64); // - // According to the spec, the interval between 2 pools is 100ns - // - return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 100, Delay); + // According to the spec, the interval between 2 polls is 100ns, + // but the unit of Duration for S3BootScriptSaveMemPoll() is microsecond(1000ns). + // Duration * 1000ns * LoopTimes = Delay * 100ns + // Duration will be minimum 1(microsecond) to be minimum deviation, + // so LoopTimes = Delay / 10. + // + LoopTimes = DivU64x32Remainder ( + Delay, + 10, + &Remainder + ); + if (Remainder != 0) { + // + // If Remainder is not zero, LoopTimes will be rounded up by 1. + // + LoopTimes +=1; + } + return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 1, LoopTimes); } diff --git a/MdeModulePkg/Universal/Acpi/SmmS3SaveState/SmmS3SaveState.c b/MdeModulePkg/Universal/Acpi/SmmS3SaveState/SmmS3SaveState.c index d0652d3fd8..3bb086fe49 100644 --- a/MdeModulePkg/Universal/Acpi/SmmS3SaveState/SmmS3SaveState.c +++ b/MdeModulePkg/Universal/Acpi/SmmS3SaveState/SmmS3SaveState.c @@ -1,7 +1,7 @@ /** @file Implementation for S3 SMM Boot Script Saver state driver. - Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -343,16 +343,33 @@ BootScriptWriteMemPoll ( VOID *Data; VOID *DataMask; UINTN Delay; - + UINTN LoopTimes; + UINT32 Remainder; + Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); Address = VA_ARG (Marker, UINT64); Data = VA_ARG (Marker, VOID *); DataMask = VA_ARG (Marker, VOID *); Delay = (UINTN)VA_ARG (Marker, UINT64); // - // According to the spec, the interval between 2 pools is 100ns - // - return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 100, Delay); + // According to the spec, the interval between 2 polls is 100ns, + // but the unit of Duration for S3BootScriptSaveMemPoll() is microsecond(1000ns). + // Duration * 1000ns * LoopTimes = Delay * 100ns + // Duration will be minimum 1(microsecond) to be minimum deviation, + // so LoopTimes = Delay / 10. + // + LoopTimes = DivU64x32Remainder ( + Delay, + 10, + &Remainder + ); + if (Remainder != 0) { + // + // If Remainder is not zero, LoopTimes will be rounded up by 1. + // + LoopTimes +=1; + } + return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 1, LoopTimes); } -- 2.39.2