{"id":2232142,"url":"http://patchwork.ozlabs.org/api/patches/2232142/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260503015756.99176-5-54weasels@gmail.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260503015756.99176-5-54weasels@gmail.com>","list_archive_url":null,"date":"2026-05-03T01:57:53","name":"[4/7] hw/timer: Introduce Intersil 7170 RTC implementation","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"5301e936170415efb6b47bcd1937cd8df95f9ff6","submitter":{"id":93309,"url":"http://patchwork.ozlabs.org/api/people/93309/?format=json","name":"54weasels","email":"54weasels@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260503015756.99176-5-54weasels@gmail.com/mbox/","series":[{"id":502564,"url":"http://patchwork.ozlabs.org/api/series/502564/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502564","date":"2026-05-03T01:57:51","name":"m68k: Add Sun-3 Machine Emulation","version":1,"mbox":"http://patchwork.ozlabs.org/series/502564/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2232142/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2232142/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=MSREn1KA;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g7YyW3fT2z1yJ0\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 03 May 2026 15:59:47 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wJPrE-0001Dk-Sl; Sun, 03 May 2026 01:59:13 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <54weasels@gmail.com>)\n id 1wJM6B-0004vn-Vj\n for qemu-devel@nongnu.org; Sat, 02 May 2026 21:58:24 -0400","from mail-dy1-x1334.google.com ([2607:f8b0:4864:20::1334])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <54weasels@gmail.com>)\n id 1wJM6A-0000U3-0b\n for qemu-devel@nongnu.org; Sat, 02 May 2026 21:58:23 -0400","by mail-dy1-x1334.google.com with SMTP id\n 5a478bee46e88-2ecf9e398f4so6483088eec.1\n for <qemu-devel@nongnu.org>; Sat, 02 May 2026 18:58:21 -0700 (PDT)","from newsled.lan ([76.133.142.170]) by smtp.gmail.com with ESMTPSA\n id\n 5a478bee46e88-2ee38d79eb9sm14361735eec.8.2026.05.02.18.58.19\n (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256);\n Sat, 02 May 2026 18:58:19 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1777773500; x=1778378300; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=O85A+8mTtk4dus5AdYbZBy3FLqoryx7HTG4VFhPinZ8=;\n b=MSREn1KA9YlfJJMXx8WERucqsq66ryQwJVXdIOL0PJ7SNPigg6y6/uAznqjP9VIhzl\n pnI/djsEcWPfiVfTR0/2J1nNoyB0WVHlRMuSC4n4YTJJiPAmXQ7HhPpuLoZ1f9cibUil\n Of37Qtw6EvqfHcUAS2suaa97A+JwxEAclf6g86svEr5p16bvsPSxZc5ht90ksZzjLsEb\n wAJ8z/FpEz3A2e3Svt/1NT0wUKKwxAPjZ1BJXXglDe9Pji5lmA9YuyssUX/OG15Uv2f6\n MfVfaEwCXl1yJbgDCYIFgI3N+dLdbptEmFYQxw2dskpdSsHCegznC39mh8PWQKsFf6nB\n vUQg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777773500; x=1778378300;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=O85A+8mTtk4dus5AdYbZBy3FLqoryx7HTG4VFhPinZ8=;\n b=CwUdfoN/LAa1Ta7hwEZ+Bdgo6a2K1POEYcBlPgG/Gc8kTESqcwzJgehgiW/UWGh4Ch\n AiD840hpis/5AgyvRUiE2xZeuAQ/YYVjpzcRqq+YqBxhILXJzKOPub/aBe0H+8bUDrYi\n 8JKsr/8G0Cp1Jji9O2OVq5cmDTbrFpiSrI85IHSWcFZ4Sl9VN6g90ojmFOb6CauQALkT\n IStrzGQdn3jZRPXumfQaR3/iYIHP139/6KwF3DKyb1dp9yzwuZGewJx+5nUelGkxvfre\n Xp2IBOyVlxzQxkK/FJ74S6M3muAWhe2mX5gXNT20zJZmnTo5IJ+vpQ7B7P4rNid/GXtV\n lEWw==","X-Gm-Message-State":"AOJu0YyyUMMwcQ5Qf/f+zHgVrp86J/lt6PZm6cgkjnI+2iCJR3ADkKap\n C+J+FqyoJ8QlpwPJQQ8Iz6GhApXZ5/+i09oNcpDjnPOMvytwG633jSTRghD6ew==","X-Gm-Gg":"AeBDievFrsN8PGs6gQFxpg5QWemHCwD5RwmwZvcA+W6SuOolezJk4vR/phx6y1YEQx2\n OkAb+2Qu9bjbJWaom7RGrl7Sh7W5N2FdFvE05yl9u+EKG5IHqtoU3feMSY3bYh6UIANlNjRMkj+\n ugKf1PREO45hl9vxy9X1Ou4vlLnV4JeB1oLqGbQIzeAT7XQbW6Aazrvn/Ey0Fv39TJkd7rX1slB\n iyzhF+aFkoOYGIxho4C8MEgNXSC4BAP9ED3NSmh2d79IKwVc0p1DhkozzgSCATwcDEacckv2l4A\n 1ZooXdDpQ12jN0m8oVNOcwnMmMOYDijtztG8mWiSbdF89IXC3oUqlAaQmAHm90wfZKSuiD5nb/8\n AaaQW6H21vBixoeIcftb4wOHELI0UcSTTQTJ6MoBh3UgqNWBIDgSKJTA1g8A1hVNQ8UZ3GGUUyq\n OZW5x5cXaICEZAyBWkX6oLZUWpOMqntvDFxBkKxb/WueTSf9OF+Q==","X-Received":"by 2002:a05:7301:9f06:b0:2be:142f:d499 with SMTP id\n 5a478bee46e88-2efb99a10e1mr2273410eec.16.1777773499981;\n Sat, 02 May 2026 18:58:19 -0700 (PDT)","From":"54weasels <54weasels@gmail.com>","To":"qemu-devel@nongnu.org","Cc":"laurent@vivier.eu,\n\tthuth@redhat.com,\n\t54weasels <54weasels@gmail.com>","Subject":"[PATCH 4/7] hw/timer: Introduce Intersil 7170 RTC implementation","Date":"Sat,  2 May 2026 18:57:53 -0700","Message-ID":"<20260503015756.99176-5-54weasels@gmail.com>","X-Mailer":"git-send-email 2.50.1","In-Reply-To":"<20260503015756.99176-1-54weasels@gmail.com>","References":"<20260503015756.99176-1-54weasels@gmail.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2607:f8b0:4864:20::1334;\n envelope-from=54weasels@gmail.com; helo=mail-dy1-x1334.google.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-Mailman-Approved-At":"Sun, 03 May 2026 01:59:06 -0400","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"This adds the Intersil 7170 Time-of-Day clock / CMOS RAM chip. It implements the register map, alarm interrupt logic, and persistent 32-byte battery-backed NVRAM used by the Sun-3 architecture for storing the MAC address, EEPROM checksums, and boot parameters.\n\nSigned-off-by: 54weasels <54weasels@gmail.com>\n---\n hw/timer/Kconfig                |   3 +\n hw/timer/intersil7170.c         | 216 ++++++++++++++++++++++++++++++++\n hw/timer/meson.build            |   1 +\n include/hw/timer/intersil7170.h |   9 ++\n 4 files changed, 229 insertions(+)\n create mode 100644 hw/timer/intersil7170.c\n create mode 100644 include/hw/timer/intersil7170.h","diff":"diff --git a/hw/timer/Kconfig b/hw/timer/Kconfig\nindex b3d823ce2c..a828273b6c 100644\n--- a/hw/timer/Kconfig\n+++ b/hw/timer/Kconfig\n@@ -65,3 +65,6 @@ config STELLARIS_GPTM\n \n config AVR_TIMER16\n     bool\n+\n+config INTERSIL7170\n+    bool\ndiff --git a/hw/timer/intersil7170.c b/hw/timer/intersil7170.c\nnew file mode 100644\nindex 0000000000..138151fdc1\n--- /dev/null\n+++ b/hw/timer/intersil7170.c\n@@ -0,0 +1,216 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * QEMU Intersil 7170 Real Time Clock and Timer Emulation\n+ *\n+ * This device mimics the core functionality of the Intersil 7170 RTC,\n+ * specifically targeting the 1/100th second periodic interrupt requested\n+ * by the Sun-3 Boot PROM diagnostic routines.\n+ */\n+\n+#include \"qemu/osdep.h\"\n+\n+#include \"hw/timer/intersil7170.h\"\n+#include \"hw/core/irq.h\"\n+#include \"hw/core/qdev.h\"\n+#include \"hw/core/sysbus.h\"\n+#include \"qemu/log.h\"\n+#include \"qemu/module.h\"\n+#include \"qemu/timer.h\"\n+#include \"qom/object.h\"\n+\n+OBJECT_DECLARE_SIMPLE_TYPE(Intersil7170State, INTERSIL_7170)\n+\n+struct Intersil7170State {\n+    SysBusDevice parent_obj;\n+\n+    MemoryRegion iomem;\n+    qemu_irq irq;\n+    QEMUTimer *timer;\n+\n+    /* Registers */\n+    uint8_t int_status; /* 0x10 */\n+    uint8_t int_mask;\n+    uint8_t command; /* 0x11 */\n+};\n+\n+#define REG_INT 0x10\n+#define REG_CMD 0x11\n+\n+/* Interrupt Register bits */\n+#define RTC_INT_PENDING 0x80\n+#define RTC_INT_DAY 0x40\n+#define RTC_INT_HOUR 0x20\n+#define RTC_INT_MIN 0x10\n+#define RTC_INT_SEC 0x08\n+#define RTC_INT_TSEC 0x04\n+#define RTC_INT_HSEC 0x02\n+#define RTC_INT_ALARM 0x01\n+\n+/* Command Register bits */\n+#define RTC_CMD_INTENA 0x10\n+#define RTC_CMD_RUN 0x08\n+\n+static void intersil7170_update_irq(Intersil7170State *s)\n+{\n+    bool level = (s->int_status & s->int_mask) && (s->command & RTC_CMD_INTENA);\n+\n+    if (level) {\n+        s->int_status |= RTC_INT_PENDING;\n+    } else {\n+        s->int_status &= ~RTC_INT_PENDING;\n+    }\n+\n+    qemu_set_irq(s->irq, level);\n+}\n+\n+static void intersil7170_timer_cb(void *opaque)\n+{\n+    Intersil7170State *s = opaque;\n+\n+    if (!(s->command & RTC_CMD_RUN)) {\n+        return;\n+    }\n+\n+    /*\n+     * Timer fired. Set pending bit based on what is unmasked.\n+     * The Sun-3 PROM primarily demands the Hundredth-Second\n+     * (RTC_INT_HSEC) tick.\n+     */\n+    if (s->int_mask & RTC_INT_HSEC) {\n+        s->int_status |= RTC_INT_HSEC;\n+        intersil7170_update_irq(s);\n+\n+        /* Reschedule for 1/100th of a second (10,000,000 ns) */\n+        timer_mod(s->timer,\n+                      qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10000000);\n+    }\n+}\n+\n+static uint64_t intersil7170_read(void *opaque, hwaddr addr, unsigned size)\n+{\n+    Intersil7170State *s = opaque;\n+    uint32_t val = 0;\n+\n+    switch (addr) {\n+    case REG_INT:\n+        val = s->int_status;\n+        /*\n+         * Reading the interrupt register formally clears all\n+         * pending interrupts.\n+         */\n+        s->int_status = 0;\n+        intersil7170_update_irq(s);\n+        break;\n+    case REG_CMD:\n+        val = s->command;\n+        break;\n+    default:\n+        val = 0;\n+        break;\n+    }\n+\n+    return val;\n+}\n+\n+static void intersil7170_write(void *opaque, hwaddr addr, uint64_t val,\n+                               unsigned size)\n+{\n+    Intersil7170State *s = opaque;\n+\n+    switch (addr) {\n+    case REG_INT:\n+        /*\n+         * Writing to the INT register sets the mask!\n+         * Pending flag is read-only.\n+         */\n+        s->int_mask = val & ~RTC_INT_PENDING;\n+        intersil7170_update_irq(s);\n+\n+        /* If timer requires starting, schedule immediately */\n+        if ((s->command & RTC_CMD_RUN) && (s->int_mask & RTC_INT_HSEC)) {\n+            timer_mod(s->timer,\n+                      qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10000000);\n+        }\n+        break;\n+    case REG_CMD:\n+        s->command = val;\n+        intersil7170_update_irq(s);\n+\n+        if ((s->command & RTC_CMD_RUN) && (s->int_mask & RTC_INT_HSEC)) {\n+            timer_mod(s->timer,\n+                      qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10000000);\n+        } else if (!(s->command & RTC_CMD_RUN)) {\n+            timer_del(s->timer);\n+        }\n+        break;\n+    default:\n+        break;\n+    }\n+}\n+\n+static const MemoryRegionOps intersil7170_ops = {\n+    .read = intersil7170_read,\n+    .write = intersil7170_write,\n+    .endianness = DEVICE_BIG_ENDIAN,\n+    .impl = {\n+            .min_access_size = 1,\n+            .max_access_size = 4,\n+            .unaligned = true,\n+        },\n+    .valid = {\n+            .min_access_size = 1,\n+            .max_access_size = 4,\n+            .unaligned = true,\n+        },\n+};\n+\n+static void intersil7170_realize(DeviceState *dev, Error **errp)\n+{\n+    Intersil7170State *s = INTERSIL_7170(OBJECT(dev));\n+\n+    s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, intersil7170_timer_cb, s);\n+}\n+\n+static void intersil7170_reset(DeviceState *dev)\n+{\n+    Intersil7170State *s = INTERSIL_7170(OBJECT(dev));\n+\n+    s->int_status = 0;\n+    s->int_mask = 0;\n+    s->command = 0;\n+    timer_del(s->timer);\n+}\n+\n+static void intersil7170_init(Object *obj)\n+{\n+    Intersil7170State *s = INTERSIL_7170(obj);\n+    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);\n+\n+    memory_region_init_io(&s->iomem, obj, &intersil7170_ops, s, \"intersil7170\",\n+                        8192);\n+    sysbus_init_mmio(sbd, &s->iomem);\n+    sysbus_init_irq(sbd, &s->irq);\n+}\n+\n+static void intersil7170_class_init(ObjectClass *klass, const void *data)\n+{\n+    DeviceClass *dc = DEVICE_CLASS(klass);\n+\n+    dc->realize = intersil7170_realize;\n+    device_class_set_legacy_reset(dc, intersil7170_reset);\n+}\n+\n+static const TypeInfo intersil7170_info = {\n+    .name = TYPE_INTERSIL_7170,\n+    .parent = TYPE_SYS_BUS_DEVICE,\n+    .instance_size = sizeof(Intersil7170State),\n+    .instance_init = intersil7170_init,\n+    .class_init = intersil7170_class_init,\n+};\n+\n+static void intersil7170_register_types(void)\n+{\n+    type_register_static(&intersil7170_info);\n+}\n+\n+type_init(intersil7170_register_types)\ndiff --git a/hw/timer/meson.build b/hw/timer/meson.build\nindex 178321c029..72f33ec31f 100644\n--- a/hw/timer/meson.build\n+++ b/hw/timer/meson.build\n@@ -15,6 +15,7 @@ system_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210_pwm.c'))\n system_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_gptimer.c'))\n system_ss.add(when: 'CONFIG_HPET_C', if_true: files('hpet.c'))\n system_ss.add(when: 'CONFIG_I8254', if_true: files('i8254_common.c', 'i8254.c'))\n+system_ss.add(when: 'CONFIG_INTERSIL7170', if_true: files('intersil7170.c'))\n system_ss.add(when: 'CONFIG_IMX', if_true: files('imx_epit.c'))\n system_ss.add(when: 'CONFIG_IMX', if_true: files('imx_gpt.c'))\n system_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('mips_gictimer.c'))\ndiff --git a/include/hw/timer/intersil7170.h b/include/hw/timer/intersil7170.h\nnew file mode 100644\nindex 0000000000..cab42b4cc0\n--- /dev/null\n+++ b/include/hw/timer/intersil7170.h\n@@ -0,0 +1,9 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+#ifndef HW_TIMER_INTERSIL7170_H\n+#define HW_TIMER_INTERSIL7170_H\n+\n+#define TYPE_INTERSIL_7170 \"intersil7170\"\n+\n+typedef struct Intersil7170State Intersil7170State;\n+\n+#endif\n","prefixes":["4/7"]}