From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:400e:c00::243; helo=mail-pf0-x243.google.com; envelope-from=masahisa.kojima@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-pf0-x243.google.com (mail-pf0-x243.google.com [IPv6:2607:f8b0:400e:c00::243]) (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 52A35210D7F55 for ; Mon, 18 Jun 2018 05:33:16 -0700 (PDT) Received: by mail-pf0-x243.google.com with SMTP id c22-v6so8113879pfi.2 for ; Mon, 18 Jun 2018 05:33:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=vmUYi0dNYtD0XLkS5rb7rqddNoqOYz15G84/FSUzmPk=; b=b6O5+n0mYBxb/MIT3k+lQ5vBD2qs9K2gdw9Mz7uULDO1LOO6TyYurPk1N7W0wM+trr 7hmBCr1siGV/KXSngmNCsnBjM1PewJDuKYMICbjTz2OQgZhjL2ObhMRriG/kll4YS4sG wwxqSuejkfyafwlkZhqT4R4bZmGriKCtz9Ais= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=vmUYi0dNYtD0XLkS5rb7rqddNoqOYz15G84/FSUzmPk=; b=MljXF/pke1Es0vVMTR0f4XxH4WvE/tD+8AfGQUbhLwUCTwMiTzVcLy+bSBIfJowuHu K/uClWYYs6IevToELF/5B68sVKN/oDg5IXrI2KvpWrhxGEIxeyBPaapoVdLl8ahw3AeN pSyxGL6w9qdz3qxIs0VVzCY73pJ/iTUF89kBhdjmXEAv61ICM6NmURv5u2y/72ogy4p4 irLt6G1VtL+TmhQyVjprYkkBb83gQlpGulilY5ooBNot813AMunkd6nJbHisE+5Rp31v lrYGZIk1fBFb1Nzy8TLCC0P0rsoQI7vUttpeFe7GlIhBjREfqvIUOs/cpiFOEAaMVmN3 Pe6g== X-Gm-Message-State: APt69E2p2LCIiuh4+DUBIF9nPMg/MU+7YNlTSipoZidksqSAnMnKTH0q boNQ3woLJYApRp4YdC1fdsWFTeyHXD0= X-Google-Smtp-Source: ADUXVKKl0rvtgSHxUgnbKp8zeRsXdtKUSkLPhcKW840pX2UhS8IOsK1M747MxL3r/F/z/g/f3UQr1Q== X-Received: by 2002:a65:5106:: with SMTP id f6-v6mr10773148pgq.122.1529325195638; Mon, 18 Jun 2018 05:33:15 -0700 (PDT) Received: from localhost ([121.95.100.191]) by smtp.gmail.com with ESMTPSA id e16-v6sm21443804pff.185.2018.06.18.05.33.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 18 Jun 2018 05:33:15 -0700 (PDT) From: masahisa.kojima@linaro.org To: edk2-devel@lists.01.org Cc: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, Masahisa Kojima , Yoshitoyo Osaki Date: Mon, 18 Jun 2018 21:31:55 +0900 Message-Id: <20180618123155.2141-1-masahisa.kojima@linaro.org> X-Mailer: git-send-email 2.14.2 Subject: [PATCH] Silicon/NXP/Pcf8563RealTimeClockLib: add rtc device initialization X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jun 2018 12:33:16 -0000 From: Masahisa Kojima BcdToDecimal8() in LibGetTime() asserts with the following condition. 1) RTC device has not been initialized yet, RTC device returns indeterminate value 2) DEBUG build UEFI shell commands "date/time" expect that getting time from RTC should success when user sets the time. ShellCommandRunTime() performs GetTime()->update time->SetTime(), if the first GetTime() fails, user can not set time. To avoid this situation, even if it only occurs in DEBUG build, RTC driver should check the VL bit in the VL_seconds register. This VL bit is voltage-low detector, it means integrity of the clock information is not guaranteed if it sets to 1. In this case, driver set dummy date/time(01/01/2000 00:00:00) to proceed succeeding SetTime process. linux driver also checks this bit when driver gets the time from RTC. If VL bit is 1, linux driver discard the retreived time data. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Masahisa Kojima Signed-off-by: Yoshitoyo Osaki --- .../Pcf8563RealTimeClockLib.c | 32 ++++++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c index fb58e1feb4..7be0d23eea 100644 --- a/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c +++ b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c @@ -19,11 +19,13 @@ #include #include #include +#include #include #define SLAVE_ADDRESS (FixedPcdGet8 (PcdI2cSlaveAddress)) #define PCF8563_DATA_REG_OFFSET 0x2 +#define PCF8563_CLOCK_INVALID 0x80 #define PCF8563_SECONDS_MASK 0x7f #define PCF8563_MINUTES_MASK 0x7f #define PCF8563_HOURS_MASK 0x3f @@ -95,6 +97,7 @@ LibGetTime ( RTC_DATETIME DateTime; EFI_STATUS Status; UINT8 Reg; + EFI_TIME InitTime; if (Time == NULL) { return EFI_INVALID_PARAMETER; @@ -122,15 +125,26 @@ LibGetTime ( return EFI_DEVICE_ERROR; } - Time->Second = BcdToDecimal8 (DateTime.VL_seconds & PCF8563_SECONDS_MASK); - Time->Minute = BcdToDecimal8 (DateTime.Minutes & PCF8563_MINUTES_MASK); - Time->Hour = BcdToDecimal8 (DateTime.Hours & PCF8563_HOURS_MASK); - Time->Day = BcdToDecimal8 (DateTime.Days & PCF8563_DAYS_MASK); - Time->Month = BcdToDecimal8 (DateTime.Century_months & PCF8563_MONTHS_MASK); - Time->Year = BcdToDecimal8 (DateTime.Years) + EPOCH_BASE; - - if (DateTime.Century_months & PCF8563_CENTURY_MASK) { - Time->Year += 100; + if ((DateTime.VL_seconds & PCF8563_CLOCK_INVALID) != 0) { + InitTime.Second = 0; + InitTime.Minute = 0; + InitTime.Hour = 0; + InitTime.Day = 1; + InitTime.Month = 1; + InitTime.Year = EPOCH_BASE; + (VOID)LibSetTime (&InitTime); + (VOID)CopyMem (Time, &InitTime, sizeof(EFI_TIME)); + } else { + Time->Second = BcdToDecimal8 (DateTime.VL_seconds & PCF8563_SECONDS_MASK); + Time->Minute = BcdToDecimal8 (DateTime.Minutes & PCF8563_MINUTES_MASK); + Time->Hour = BcdToDecimal8 (DateTime.Hours & PCF8563_HOURS_MASK); + Time->Day = BcdToDecimal8 (DateTime.Days & PCF8563_DAYS_MASK); + Time->Month = BcdToDecimal8 (DateTime.Century_months & PCF8563_MONTHS_MASK); + Time->Year = BcdToDecimal8 (DateTime.Years) + EPOCH_BASE; + + if (DateTime.Century_months & PCF8563_CENTURY_MASK) { + Time->Year += 100; + } } if (Capabilities != NULL) { -- 2.14.2