From nobody Mon Feb 9 23:01:15 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1521928671493886.6030666560661; Sat, 24 Mar 2018 14:57:51 -0700 (PDT) Received: from localhost ([::1]:48880 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ezrAY-0003o9-Os for importer@patchew.org; Sat, 24 Mar 2018 17:57:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40552) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ezr6C-0001b3-Ow for qemu-devel@nongnu.org; Sat, 24 Mar 2018 17:56:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ezr0C-0005Hr-Fe for qemu-devel@nongnu.org; Sat, 24 Mar 2018 17:48:10 -0400 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]:40226) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ezon5-0005qq-FI for qemu-devel@nongnu.org; Sat, 24 Mar 2018 15:25:23 -0400 Received: by mail-pf0-x241.google.com with SMTP id v66so3513525pfv.7 for ; Sat, 24 Mar 2018 12:25:23 -0700 (PDT) Received: from localhost.localdomain (c-73-158-53-43.hsd1.ca.comcast.net. [73.158.53.43]) by smtp.gmail.com with ESMTPSA id o2sm13353501pgq.87.2018.03.24.12.25.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Mar 2018 12:25:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=b6PputySXM1oWN3mYQiwzdNIoScKz0/Ufx2ZkRcpnBw=; b=EBqy9AMlk1zvQtFzNrLdcDYSbMaLFJb0ZS+R31Io1E4Wc5cFApXoQwhyhkWSozHaNE 79d2CBF7lzSlrVbRr8QwT52F7fVcPP4cFB0vUoQR4Nh33B7MfyHlRX+6CwKMl5DAoemQ xdr4YJuUPLnnm/01KRCfJ95Ut3IcRxrLpo3F0n794NlRSOdFauVptEt6LV8DriaFJIEb rKnRPfKxGNVham7d87n4JOS8gAyrSFfXA6F/MTCIra9Lq/awhmCKhvezx8IwqcNDoQH2 /WVf0eh2Owtsv7xls67udaJqxisBitcI6ZFZIMH7lwubDYzE9sAd5Tdiu3oo52YipRAo RfNg== 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:in-reply-to :references; bh=b6PputySXM1oWN3mYQiwzdNIoScKz0/Ufx2ZkRcpnBw=; b=ACedn1aXctspKM3KlKQvMFPnHHu+vQrjdXg9I7LXEhCuxsqLsRb8i1cM0q883JF4SS b/hp4WIiG6yfMHpQn9f/NXZSuXyt3yCi3ggpPDVk+a7b4x497AzHnApebLEUvpF+mvNM WQ7SQmll/mKb0E9URRz1vVKeMeLiVl9GX+GmGCQIj1ZmVR8+UuysvXBHn72t3pwerYkz 6is5itjtU+EnLxchCMx/VwmcDOJKkk8y+LLRxHm69JQv3zVq17AtkBRVh/8ctlm2ZCxW n03wHi96juwhrz2G26iJHJjxzQa+4jdJoaBmUnHL4ZxyoO6F77bVQ9I7BS9MEvXdHYqF pJVQ== X-Gm-Message-State: AElRT7ExMynLinrGggNvTkcVrzG1neQwmz+FJv8yiiwXZJGJvfZlRuLW I3e6ENYe06U3AZcvB9mIvxA= X-Google-Smtp-Source: AG47ELsPHymJUoqtDI9h757R/gg3GsGcKMyWqst5fxAKmMt7HPV7HnRriMLgFEQ4PlP6HlyD+EA5IQ== X-Received: by 10.99.145.193 with SMTP id l184mr23876987pge.394.1521919522460; Sat, 24 Mar 2018 12:25:22 -0700 (PDT) From: Michael Davidsaver To: Peter Maydell , Thomas Huth Date: Sat, 24 Mar 2018 12:24:52 -0700 Message-Id: <20180324192455.12254-12-mdavidsaver@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180324192455.12254-1-mdavidsaver@gmail.com> References: <20180324192455.12254-1-mdavidsaver@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::241 Subject: [Qemu-devel] [PATCH 11/14] timer: generalize ds1338 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Antoine Mathys , Michael Davidsaver , qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add class level handling for address space size and control register. Signed-off-by: Michael Davidsaver --- hw/timer/ds-rtc.c | 63 ++++++++++++++++++++++++++++++++++++++++-----------= ---- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/hw/timer/ds-rtc.c b/hw/timer/ds-rtc.c index 28f788dd8e..2df1bce3f8 100644 --- a/hw/timer/ds-rtc.c +++ b/hw/timer/ds-rtc.c @@ -21,10 +21,10 @@ */ #define NVRAM_SIZE 64 =20 -#define CTRL_OSF 0x20 - -#define TYPE_DSRTC "ds1338" +#define TYPE_DSRTC "dsrtc" #define DSRTC(obj) OBJECT_CHECK(DSRTCState, (obj), TYPE_DSRTC) +#define DSRTC_CLASS(klass) OBJECT_CLASS_CHECK(DSRTCClass, (klass), TYPE_DS= RTC) +#define DSRTC_GET_CLASS(obj) OBJECT_GET_CLASS(DSRTCClass, (obj), TYPE_DSRT= C) =20 /* values stored in BCD */ /* 00-59 */ @@ -40,7 +40,7 @@ /* 0-99 */ #define R_YEAR (0x6) =20 -#define R_CTRL (0x7) +#define R_DS1338_CTRL (0x7) =20 /* use 12 hour mode when set */ FIELD(HOUR, SET12, 6, 1) @@ -67,6 +67,15 @@ typedef struct DSRTCState { bool addr_byte; } DSRTCState; =20 +typedef struct DSRTCClass { + I2CSlaveClass parent_obj; + + /* actual address space size must be <=3D NVRAM_SIZE */ + unsigned addr_size; + unsigned ctrl_offset; + void (*ctrl_write)(DSRTCState *s, uint8_t); +} DSRTCClass; + static const VMStateDescription vmstate_dsrtc =3D { .name =3D "ds1338", .version_id =3D 2, @@ -119,11 +128,12 @@ static void capture_current_time(DSRTCState *s) =20 static void inc_regptr(DSRTCState *s) { - /* The register pointer wraps around after 0x3F; wraparound + DSRTCClass *k =3D 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 =3D (s->ptr + 1) & (NVRAM_SIZE - 1); + s->ptr =3D (s->ptr + 1) % k->addr_size; if (!s->ptr) { capture_current_time(s); } @@ -206,22 +216,15 @@ static void dsrtc_update(DSRTCState *s) static int dsrtc_send(I2CSlave *i2c, uint8_t data) { DSRTCState *s =3D DSRTC(i2c); + DSRTCClass *k =3D DSRTC_GET_CLASS(s); =20 if (s->addr_byte) { - s->ptr =3D data & (NVRAM_SIZE - 1); + s->ptr =3D data % k->addr_size; s->addr_byte =3D false; return 0; } - if (s->ptr =3D=3D R_CTRL) { - /* Control register. */ - - /* Ensure bits 2, 3 and 6 will read back as zero. */ - data &=3D 0xB3; - - /* Attempting to write the OSF flag to logic 1 leaves the - value unchanged. */ - data =3D (data & ~CTRL_OSF) | (data & s->nvram[s->ptr] & CTRL_OSF); - + if (s->ptr =3D=3D k->ctrl_offset) { + (k->ctrl_write)(s, data); } s->nvram[s->ptr] =3D data; if (s->ptr <=3D R_YEAR) { @@ -256,15 +259,41 @@ static void dsrtc_class_init(ObjectClass *klass, void= *data) } =20 static const TypeInfo dsrtc_info =3D { + .abstract =3D true, .name =3D TYPE_DSRTC, .parent =3D TYPE_I2C_SLAVE, .instance_size =3D sizeof(DSRTCState), .class_init =3D dsrtc_class_init, }; =20 +static void ds1338_control_write(DSRTCState *s, uint8_t data) +{ + /* Control register. */ + + /* allow guest to set no-op controls for clock out pin */ + s->nvram[R_DS1338_CTRL] =3D data & 0x93; +} + +static void ds1338_class_init(ObjectClass *klass, void *data) +{ + DSRTCClass *k =3D DSRTC_CLASS(klass); + + k->addr_size =3D 0x40; + k->ctrl_offset =3D R_DS1338_CTRL; + k->ctrl_write =3D ds1338_control_write; +} + +static const TypeInfo ds1338_info =3D { + .name =3D "ds1338", + .parent =3D TYPE_DSRTC, + .class_size =3D sizeof(DSRTCClass), + .class_init =3D ds1338_class_init, +}; + static void dsrtc_register_types(void) { type_register_static(&dsrtc_info); + type_register_static(&ds1338_info); } =20 type_init(dsrtc_register_types) --=20 2.11.0