From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::342; helo=mail-wm1-x342.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wm1-x342.google.com (mail-wm1-x342.google.com [IPv6:2a00:1450:4864:20::342]) (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 EBA7121A07A92 for ; Wed, 14 Nov 2018 09:20:34 -0800 (PST) Received: by mail-wm1-x342.google.com with SMTP id r63-v6so16299892wma.4 for ; Wed, 14 Nov 2018 09:20:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=jg5AYoRK5BpzGX7vuvsX+dXlkwFoZBiyLnnzm1KTZd4=; b=SeNVBFVHLCWuRRCvNPunBH4MGBP3JB3wC32KwZm0/2VMsiD2AIW5mTrFHf1AwI9m81 SYhu0g3DKdwhfCysm+3VcOoXknV/n6PeEVQZl/D3TnhsCZsbZORN3Fm66IRsPIffCTff vbZ5qFH2Z6hj71jRro1fKF+LzIjZYQrOxA35g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=jg5AYoRK5BpzGX7vuvsX+dXlkwFoZBiyLnnzm1KTZd4=; b=QR6hRaPwd6Sq+r52fMlx4XwCyf3qYPLihJ9h3ma5RhlFfpb+ISqxkJYO135IcdzPsG KG/l8mz6BeTu89isuO9YDgMSlqLKjoiY5GNAg9Gle0mHG5xoy/R83MVTz2FA4p2+eKDS hQHjnzqyQYN+mz70I5Hcs5nU+vGzhiLXDOf8brtD9iEjXRG3zJGK8U+HkUVvjSkB+Tf4 jwQQYbJF12ZVSzvgAj72YloTbRWQUs2YOagBOTmKAVityazh4XIlu6AyrUIJ9XcTNiy2 nDAfICA3H9LBgMBz+xDCVpMhUMIKRYJfjUpxEzmgU1zcMhdqhYqFoFaIIQoW5E6kvc8K +BUA== X-Gm-Message-State: AGRZ1gIClaemWF4/V6n2Z5oguaqTqYz8k8WcgI4/FeCY9+PlPyqAUjOc c8SEEOE2fha1/CWghzp//5ihGg== X-Google-Smtp-Source: AJdET5dFmf28XBenfFa9Am158P3KTRKStyBMVd/0r26FVnR/wRuHi1rjkTB+F+5mqMAgs0ZAVjBKcA== X-Received: by 2002:a1c:9ce:: with SMTP id 197-v6mr2745540wmj.51.1542216032618; Wed, 14 Nov 2018 09:20:32 -0800 (PST) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id 201-v6sm12652093wma.3.2018.11.14.09.20.31 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Nov 2018 09:20:31 -0800 (PST) Date: Wed, 14 Nov 2018 17:20:29 +0000 From: Leif Lindholm To: Ming Huang Cc: linaro-uefi@lists.linaro.org, edk2-devel@lists.01.org, graeme.gregory@linaro.org, ard.biesheuvel@linaro.org, michael.d.kinney@intel.com, lersek@redhat.com, wanghuiqiang@huawei.com, huangming23@huawei.com, zhangjinsong2@huawei.com, huangdaode@hisilicon.com, john.garry@huawei.com, xinliang.liu@linaro.org, zhangfeng56@huawei.com Message-ID: <20181114172029.lmpu2chhjvcgpldg@bivouac.eciton.net> References: <20181029033249.45363-1-ming.huang@linaro.org> <20181029033249.45363-7-ming.huang@linaro.org> <20181113235222.amykmhqlh5gltg7p@bivouac.eciton.net> <225d1a9d-add3-b348-2a3e-4e6567475f5e@linaro.org> MIME-Version: 1.0 In-Reply-To: <225d1a9d-add3-b348-2a3e-4e6567475f5e@linaro.org> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH edk2-platforms v1 06/12] Silicon/Hisilicon: Modify for SBBR fwts SetTime_Func test case X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Nov 2018 17:20:35 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 14, 2018 at 10:31:12PM +0800, Ming Huang wrote: > On 11/14/2018 7:52 AM, Leif Lindholm wrote: > > On Mon, Oct 29, 2018 at 11:32:43AM +0800, Ming Huang wrote: > >> There is no variable to keep timezone and daylight, so read it from > >> the hardware first and create a new variable to keep it for the next > >> gettime process. > > > > Can you make use of EmbeddedPkg/RealTimeClockRuntimeDxe instead? > > Do you mean merge this patch into EmbeddedPkg/RealTimeClockRuntimeDxe? If that makes sense. Certainly the bits that deal with saving timezone ariables should be in core rather than in a component-specific library. It already has NON_VOLATILE_TIME_SETTINGS. / Leif > > > > / > > Leif > > > >> Contributed-under: TianoCore Contribution Agreement 1.1 > >> Signed-off-by: Ming Huang > >> --- > >> Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf | 2 +- > >> Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h | 4 + > >> Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c | 175 +++++++++++++++++++- > >> 3 files changed, 179 insertions(+), 2 deletions(-) > >> > >> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf > >> index 4e963fd453..8e559d7b70 100644 > >> --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf > >> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf > >> @@ -42,4 +42,4 @@ > >> UefiRuntimeLib # Use EFiAtRuntime to check stage > >> > >> [Depex] > >> - gEfiCpuArchProtocolGuid > >> + gEfiCpuArchProtocolGuid AND gEfiVariableWriteArchProtocolGuid > >> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h > >> index f329108858..b95ebc654a 100644 > >> --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h > >> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h > >> @@ -41,6 +41,10 @@ > >> #define M41T83_REGADDR_ALARM2DATE 0x15 > >> #define M41T83_REGADDR_ALARM2MONTH 0x14 > >> > >> +//UEFI SPEC 2.7,page 295 > >> +#define TIME_ZONE_MIN -1440 > >> +#define TIME_ZONE_MAX 1440 > >> + > >> typedef union { > >> struct { > >> UINT8 TD0:1; > >> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c > >> index 1f50ad4b64..a2063aff76 100644 > >> --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c > >> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c > >> @@ -32,6 +32,9 @@ extern I2C_DEVICE gRtcDevice; > >> > >> STATIC EFI_LOCK mRtcLock; > >> > >> +STATIC CONST CHAR16 mTimeZoneVariableName[] = L"M41T83RtcTimeZone"; > >> +STATIC CONST CHAR16 mDaylightVariableName[] = L"M41T83RtcDaylight"; > >> + > >> /** > >> Read RTC content through its registers. > >> > >> @@ -182,6 +185,7 @@ LibSetTime ( > >> RTC_M41T83_TIME BcdTime; > >> UINT16 CenturyBase = 2000; > >> UINTN LineNum = 0; > >> + UINTN EpochSeconds; > >> > >> if (NULL == Time) { > >> return EFI_INVALID_PARAMETER; > >> @@ -206,6 +210,21 @@ LibSetTime ( > >> > >> SetMem (&BcdTime, sizeof (RTC_M41T83_TIME), 0); > >> > >> + EpochSeconds = EfiTimeToEpoch (Time); > >> + > >> + // Adjust for the correct time zone, i.e. convert to UTC time zone > >> + if (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE) { > >> + EpochSeconds -= Time->TimeZone * SEC_PER_MIN; > >> + } > >> + > >> + // Adjust for the correct period > >> + if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) { > >> + // Convert to un-adjusted time, i.e. fall back one hour > >> + EpochSeconds -= SEC_PER_HOUR; > >> + } > >> + > >> + EpochToEfiTime (EpochSeconds, Time); > >> + > >> // Acquire RTC Lock to make access to RTC atomic > >> if (!EfiAtRuntime ()) { > >> EfiAcquireLock (&mRtcLock); > >> @@ -254,6 +273,43 @@ LibSetTime ( > >> LineNum = __LINE__; > >> goto Exit; > >> } > >> + // Save the current time zone information into non-volatile storage > >> + Status = EfiSetVariable ( > >> + (CHAR16 *)mTimeZoneVariableName, > >> + &gEfiCallerIdGuid, > >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > >> + sizeof (Time->TimeZone), > >> + (VOID *)&(Time->TimeZone) > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG (( > >> + DEBUG_ERROR, > >> + "LibSetTime: can not save %s variable to non-volatile storage, Status = %r\n", > >> + mTimeZoneVariableName, > >> + Status > >> + )); > >> + LineNum = __LINE__; > >> + goto Exit; > >> + } > >> + > >> + // Save the current daylight information into non-volatile storage > >> + Status = EfiSetVariable ( > >> + (CHAR16 *)mDaylightVariableName, > >> + &gEfiCallerIdGuid, > >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > >> + sizeof (Time->Daylight), > >> + (VOID *)&(Time->Daylight) > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG (( > >> + DEBUG_ERROR, > >> + "LibSetTime: can not to save %s variable to non-volatile storage, Status = %r\n", > >> + mDaylightVariableName, > >> + Status > >> + )); > >> + LineNum = __LINE__; > >> + goto Exit; > >> + } > >> > >> Exit: > >> OemReleaseOwnershipOfRtc (); > >> @@ -295,6 +351,10 @@ LibGetTime ( > >> UINTN LineNum = 0; > >> BOOLEAN IsTimeInvalid = FALSE; > >> UINT8 TimeTemp[7] = {0}; > >> + UINTN EpochSeconds; > >> + INT16 TimeZone; > >> + UINT8 Daylight; > >> + UINTN Size; > >> > >> // Ensure Time is a valid pointer > >> if (Time == NULL) { > >> @@ -336,7 +396,6 @@ LibGetTime ( > >> Time->Hour = BcdToDecimal8 (BcdTime.Hour.Bits.Hours); > >> Time->Minute = BcdToDecimal8 (BcdTime.Minute.Bits.Minutes); > >> Time->Second = BcdToDecimal8 (BcdTime.Second.Bits.Seconds); > >> - Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE; > >> > >> if (!IsTimeValid (Time)) { > >> Status = EFI_DEVICE_ERROR; > >> @@ -345,6 +404,120 @@ LibGetTime ( > >> goto Exit; > >> } > >> > >> + EpochSeconds = EfiTimeToEpoch (Time); > >> + > >> + Size = sizeof (TimeZone); > >> + Status = EfiGetVariable ( > >> + (CHAR16 *)mTimeZoneVariableName, > >> + &gEfiCallerIdGuid, > >> + NULL, > >> + &Size, > >> + (VOID *)&TimeZone > >> + ); > >> + > >> + if (EFI_ERROR (Status)) { > >> + DEBUG (( > >> + DEBUG_ERROR, > >> + "LibGetTime: can not get %s variable, Status = %r\n", > >> + mTimeZoneVariableName, > >> + Status > >> + )); > >> + if (Status != EFI_NOT_FOUND) { > >> + LineNum = __LINE__; > >> + goto Exit; > >> + } > >> + > >> + // The time zone variable does not exist in non-volatile storage, so create it. > >> + Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE; > >> + // Store it > >> + Status = EfiSetVariable ( > >> + (CHAR16 *)mTimeZoneVariableName, > >> + &gEfiCallerIdGuid, > >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > >> + Size, > >> + (VOID *)&(Time->TimeZone) > >> + ); > >> + > >> + if (EFI_ERROR (Status)) { > >> + DEBUG (( > >> + DEBUG_ERROR, > >> + "LibGetTime: can not save %s variable to non-volatile storage, Status = %r\n", > >> + mTimeZoneVariableName, > >> + Status > >> + )); > >> + LineNum = __LINE__; > >> + goto Exit; > >> + } > >> + } else { > >> + // Got the time zone > >> + Time->TimeZone = TimeZone; > >> + > >> + // Check TimeZone bounds: -1440 to 1440 or 2047 > >> + if (((Time->TimeZone < TIME_ZONE_MIN) || (Time->TimeZone > TIME_ZONE_MAX)) > >> + && (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE)) { > >> + Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE; > >> + } > >> + > >> + // Adjust for the correct time zone > >> + if (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE) { > >> + EpochSeconds += Time->TimeZone * SEC_PER_MIN; > >> + } > >> + } > >> + > >> + // Get the current daylight information from non-volatile storage > >> + Size = sizeof (Daylight); > >> + Status = EfiGetVariable ( > >> + (CHAR16 *)mDaylightVariableName, > >> + &gEfiCallerIdGuid, > >> + NULL, > >> + &Size, > >> + (VOID *)&Daylight > >> + ); > >> + > >> + if (EFI_ERROR (Status)) { > >> + DEBUG (( > >> + DEBUG_ERROR, > >> + "LibGetTime: Failed to get %s variable, Status = %r\n", > >> + mDaylightVariableName, > >> + Status > >> + )); > >> + if (Status != EFI_NOT_FOUND) { > >> + goto Exit; > >> + } > >> + // The daylight variable does not exist in non-volatile storage, so create it. > >> + Time->Daylight = 0; > >> + // Store it > >> + Status = EfiSetVariable ( > >> + (CHAR16 *)mDaylightVariableName, > >> + &gEfiCallerIdGuid, > >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > >> + Size, > >> + (VOID *)&(Time->Daylight) > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG (( > >> + DEBUG_ERROR, > >> + "LibGetTime: can not save %s variable to non-volatile storage, Status = %r\n", > >> + mDaylightVariableName, > >> + Status > >> + )); > >> + LineNum = __LINE__; > >> + goto Exit; > >> + } > >> + } else { > >> + // Got the daylight information > >> + Time->Daylight = Daylight; > >> + > >> + // Adjust for the correct period > >> + if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) { > >> + // Convert to adjusted time, i.e. spring forwards one hour > >> + EpochSeconds += SEC_PER_HOUR; > >> + } > >> + } > >> + > >> + // Convert from internal 32-bit time to UEFI time > >> + EpochToEfiTime (EpochSeconds, Time); > >> + > >> Exit: > >> OemReleaseOwnershipOfRtc (); > >> // Release RTC Lock. > >> -- > >> 2.18.0 > >>