From: Michael Davidsaver <mdavidsaver@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>, Thomas Huth <thuth@redhat.com>
Cc: Antoine Mathys <barsamin@gmail.com>,
David Gibson <david@gibson.dropbear.id.au>,
qemu-devel@nongnu.org, Michael Davidsaver <mdavidsaver@gmail.com>
Subject: [Qemu-devel] [PATCH 12/14] timer: ds-rtc handle CENTURY bit
Date: Sat, 24 Mar 2018 12:24:53 -0700 [thread overview]
Message-ID: <20180324192455.12254-13-mdavidsaver@gmail.com> (raw)
In-Reply-To: <20180324192455.12254-1-mdavidsaver@gmail.com>
Signed-off-by: Michael Davidsaver <mdavidsaver@gmail.com>
---
hw/timer/ds-rtc.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/hw/timer/ds-rtc.c b/hw/timer/ds-rtc.c
index 2df1bce3f8..5a4df1b115 100644
--- a/hw/timer/ds-rtc.c
+++ b/hw/timer/ds-rtc.c
@@ -70,6 +70,7 @@ typedef struct DSRTCState {
typedef struct DSRTCClass {
I2CSlaveClass parent_obj;
+ bool has_century;
/* actual address space size must be <= NVRAM_SIZE */
unsigned addr_size;
unsigned ctrl_offset;
@@ -91,7 +92,7 @@ static const VMStateDescription vmstate_dsrtc = {
}
};
-static void capture_current_time(DSRTCState *s)
+static void capture_current_time(DSRTCState *s, DSRTCClass *k)
{
/* Capture the current time into the secondary registers
* which will be actually read by the data transfer operation.
@@ -123,25 +124,28 @@ static void capture_current_time(DSRTCState *s)
}
s->nvram[R_DATE] = to_bcd(now.tm_mday);
s->nvram[R_MONTH] = to_bcd(now.tm_mon + 1);
- s->nvram[R_YEAR] = to_bcd(now.tm_year - 100);
+ s->nvram[R_YEAR] = to_bcd(now.tm_year % 100u);
+
+ ARRAY_FIELD_DP32(s->nvram, MONTH, CENTURY,
+ k->has_century && now.tm_year >= 100)
}
-static void inc_regptr(DSRTCState *s)
+static void inc_regptr(DSRTCState *s, DSRTCClass *k)
{
- DSRTCClass *k = DSRTC_GET_CLASS(s);
/* The register pointer wraps around after k->addr_size-1; wraparound
* causes the current time/date to be retransferred into
* the secondary registers.
*/
s->ptr = (s->ptr + 1) % k->addr_size;
if (!s->ptr) {
- capture_current_time(s);
+ capture_current_time(s, k);
}
}
static int dsrtc_event(I2CSlave *i2c, enum i2c_event event)
{
DSRTCState *s = DSRTC(i2c);
+ DSRTCClass *k = DSRTC_GET_CLASS(s);
switch (event) {
case I2C_START_RECV:
@@ -150,7 +154,7 @@ static int dsrtc_event(I2CSlave *i2c, enum i2c_event event)
* START_SEND, because the guest can't get at that data
* without going through a START_RECV which would overwrite it.
*/
- capture_current_time(s);
+ capture_current_time(s, k);
break;
case I2C_START_SEND:
s->addr_byte = true;
@@ -165,10 +169,11 @@ static int dsrtc_event(I2CSlave *i2c, enum i2c_event event)
static int dsrtc_recv(I2CSlave *i2c)
{
DSRTCState *s = DSRTC(i2c);
+ DSRTCClass *k = DSRTC_GET_CLASS(s);
uint8_t res;
res = s->nvram[s->ptr];
- inc_regptr(s);
+ inc_regptr(s, k);
return res;
}
@@ -230,7 +235,7 @@ static int dsrtc_send(I2CSlave *i2c, uint8_t data)
if (s->ptr <= R_YEAR) {
dsrtc_update(s);
}
- inc_regptr(s);
+ inc_regptr(s, k);
return 0;
}
@@ -278,6 +283,7 @@ static void ds1338_class_init(ObjectClass *klass, void *data)
{
DSRTCClass *k = DSRTC_CLASS(klass);
+ k->has_century = false;
k->addr_size = 0x40;
k->ctrl_offset = R_DS1338_CTRL;
k->ctrl_write = ds1338_control_write;
--
2.11.0
next prev parent reply other threads:[~2018-03-24 19:30 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-24 19:24 [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2 Michael Davidsaver
2018-03-24 19:24 ` [Qemu-devel] [PATCH 01/14] tests: more thorough tests of ds1338 Michael Davidsaver
2018-03-26 9:18 ` Paolo Bonzini
2018-03-26 16:34 ` Michael Davidsaver
2018-03-24 19:24 ` [Qemu-devel] [PATCH 02/14] timer: ds1338 use registerfields.h Michael Davidsaver
2018-04-12 18:01 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 03/14] timer: ds1338 persist 12-hour mode selection Michael Davidsaver
2018-04-12 18:03 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 04/14] timer: ds1338 clarify HOUR handling Michael Davidsaver
2018-04-12 18:04 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 05/14] timer: ds1338 change write handling Michael Davidsaver
2018-04-13 12:42 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 06/14] tests: ds-rtc test 12 hour mode Michael Davidsaver
2018-03-24 19:24 ` [Qemu-devel] [PATCH 07/14] timer: ds1338 fix wday_offset handling Michael Davidsaver
2018-04-13 12:45 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 08/14] tests: ds-rtc test wday offset Michael Davidsaver
2018-03-24 19:24 ` [Qemu-devel] [PATCH 09/14] timer: rename ds1338 -> dsrtc Michael Davidsaver
2018-04-13 12:49 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 10/14] timer: rename file ds1338.c -> ds-rtc.c Michael Davidsaver
2018-04-13 12:50 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 11/14] timer: generalize ds1338 Michael Davidsaver
2018-04-13 12:55 ` Peter Maydell
2018-03-24 19:24 ` Michael Davidsaver [this message]
2018-04-13 13:00 ` [Qemu-devel] [PATCH 12/14] timer: ds-rtc handle CENTURY bit Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 13/14] timer: ds-rtc model ds1375 Michael Davidsaver
2018-04-13 13:01 ` Peter Maydell
2018-03-24 19:24 ` [Qemu-devel] [PATCH 14/14] tests: drop ds1338-test Michael Davidsaver
2018-03-24 22:02 ` [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2 no-reply
2018-03-24 22:05 ` no-reply
2018-03-24 22:08 ` no-reply
2018-03-26 8:34 ` [Qemu-devel] Patchew failure ? (was: Re: [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2) Thomas Huth
2018-03-26 8:59 ` Fam Zheng
2018-04-13 13:07 ` [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2 Peter Maydell
-- strict thread matches above, loose matches on Subject: below --
2018-07-05 18:19 [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v3 Michael Davidsaver
2018-07-05 18:19 ` [Qemu-devel] [PATCH 12/14] timer: ds-rtc handle CENTURY bit Michael Davidsaver
2018-07-16 9:43 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180324192455.12254-13-mdavidsaver@gmail.com \
--to=mdavidsaver@gmail.com \
--cc=barsamin@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).