From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312987131870.470741011961; Sun, 2 Jul 2023 08:49:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzJm-0004KK-VB; Sun, 02 Jul 2023 11:48:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJl-0004Jo-6b for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:48:53 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJj-0007Nb-O9 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:48:52 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJU-0001Ji-7p; Sun, 02 Jul 2023 16:48:40 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=1PcuAptvkeB5YClylwv8vyT5N5x0JldzQusZF4870+c=; b=mAfWapXYRzdZ+qqzkcz1ylY7MU Xo1DM+J/x8pD89mI0/m/e2iC1yS1wyLUgi20n9LW0/mrmUVEonqvgTxWDRM4hMKJ/FHXVaR9CuvZQ wOvKlFeI/FDEfxyu8W9MM3hU8cJ2jcQh5Sl0fDi380Go7peTHVEJZg/oT0G14oCmp3OB6LdyKm159 4eFdv5+i+tr1bZe5Qy7URQ70edfzCQoUGrPrr/BBTnHNqsDi2GPqazmCuUcbscwOH+ErUVqgOf/9N 40XCrTrAW8MGvA6a7/YvJg7LzVI9qKkeW119TP4v7o9LXTgyEwfxTeqPjABTuaWjUbKQ/XwXoLE2F 8H7D4n3VrQNVpKVimFQK3mCwjs6WuXpTQ6gxNbaOBovTcPoBVKtc6zp+RJ0brLSMbpuf4atOpIuFb SUmgLRwnmIRPjnHmpw/cYSZCrllRP/9lzKViHbtm/tKxczdelV/4bfHlx4orxdi6Jnyd78FVKXTDx h16XxdwgqgjeoVFvZHamXgGcggGzfcte2nAWegYOsT7ixudQ/eB63qTBmbdUy9Wbrrlbk2Rc/DhaJ sKeZBlC1hOzSUow+E9GZf4lIiBb+MgORZF7WNzUim2xCdHnzsTlzztPVzIPl1XsUWfB2Qcvi/RRks 8Ip9FSVaQ7U8iYkFK30fqsnw+cjVWOlHj8YoH1y6c=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:18 +0100 Message-Id: <20230702154838.722809-2-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 01/21] q800-glue.c: convert to Resettable interface X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312987611100001 Content-Type: text/plain; charset="utf-8" Convert the GLUE device to 3-phase reset. The legacy method doesn't do anything that's invalid in the hold phase, so the conversion is simple and not a behaviour change. Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/m68k/q800-glue.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hw/m68k/q800-glue.c b/hw/m68k/q800-glue.c index 34c4f0e987..710a5c331e 100644 --- a/hw/m68k/q800-glue.c +++ b/hw/m68k/q800-glue.c @@ -166,9 +166,9 @@ static void glue_nmi_release(void *opaque) GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 0); } =20 -static void glue_reset(DeviceState *dev) +static void glue_reset_hold(Object *obj) { - GLUEState *s =3D GLUE(dev); + GLUEState *s =3D GLUE(obj); =20 s->ipr =3D 0; s->auxmode =3D 0; @@ -223,11 +223,12 @@ static void glue_init(Object *obj) static void glue_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); NMIClass *nc =3D NMI_CLASS(klass); =20 dc->vmsd =3D &vmstate_glue; - dc->reset =3D glue_reset; device_class_set_props(dc, glue_properties); + rc->phases.hold =3D glue_reset_hold; nc->nmi_monitor_handler =3D glue_nmi; } =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312976247885.5274018987366; Sun, 2 Jul 2023 08:49:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzJr-0004MK-8Q; Sun, 02 Jul 2023 11:48:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJp-0004Kg-Tp for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:48:57 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJn-0007Nr-PH for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:48:57 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJY-0001Ji-Fa; Sun, 02 Jul 2023 16:48:44 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=NT5euwqYLhsbubwgXdt51juQd1CKloTJmrl1GOIkVMg=; b=S4ogDnP/9VTvWJLfJmo3HseQ9y hXCnETxTdUxp+yjUD1yNE6oKGNUMYj0D7BPn7fdMvi0QpzDKFuqJizVtL+aZsEHQi4mOzyOgDkC8h PZmQkgz/cjRkBIBdw7THZMucGXrHcIhjNMkpeRui0V1Mg+DfumZrG1EDzS3AswrYW2k8I1w20qr1N dTdHTJeFRdnW5fHCmaKKN7FG+iFIhzOsGWhWCdWK3dsKrdJtrmDMg2WBGwsLeUNDWUUOS99YGRJbt Jk6Nw+0ikdXV2gNPmwCC+ZEKeDLKH1ZOUoAkiD8FxTZcD1sauhstSqKoLYIzYDs0is8gWbJB39nNh F6Cr5geB69XubfVdjh2OFZAna6hwyrlW4qgj/ExqsyUxDFReN6m+k0SScT5BS0APTp/q+40BsZNbR nAT6gE0iOj9/eV7L5UriNpJNpGQyZfJxyMx8OA7KG2uJ/emoXO125aQfvENx+XaQTSBPGwe1pRDSJ arpWIWxhrcdSgzWqKFGDTzqbS8z3HVNN8RXtg6fUDT072o47SYXFsUT+PrtcTadaVJ5kpuW8GNzay aSySU3bq+lbpdeNFJps4pX0ouxMuHp6Zd6Ex+y6Tupp2DLdNzeLQknWpkqOKoOgIm6Uc32A+xTvn5 0Nj4o4vSgoCyznckzOFqa8D2bzzfMNYEuTEUjtZJQ=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:19 +0100 Message-Id: <20230702154838.722809-3-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 02/21] q800: add djMEMC memory controller X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312977928100011 Content-Type: text/plain; charset="utf-8" The djMEMC controller is used to store information related to the physical = memory configuration. Co-developed-by: Laurent Vivier Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- MAINTAINERS | 2 + hw/m68k/Kconfig | 1 + hw/m68k/q800.c | 10 +++ hw/misc/Kconfig | 3 + hw/misc/djmemc.c | 135 +++++++++++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + hw/misc/trace-events | 4 ++ include/hw/m68k/q800.h | 2 + include/hw/misc/djmemc.h | 30 +++++++++ 9 files changed, 188 insertions(+) create mode 100644 hw/misc/djmemc.c create mode 100644 include/hw/misc/djmemc.h diff --git a/MAINTAINERS b/MAINTAINERS index 4feea49a6e..2d85e8c28c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1231,6 +1231,7 @@ F: hw/misc/mac_via.c F: hw/nubus/* F: hw/display/macfb.c F: hw/block/swim.c +F: hw/misc/djmemc.c F: hw/m68k/bootinfo.h F: include/standard-headers/asm-m68k/bootinfo.h F: include/standard-headers/asm-m68k/bootinfo-mac.h @@ -1240,6 +1241,7 @@ F: include/hw/display/macfb.h F: include/hw/block/swim.h F: include/hw/m68k/q800.h F: include/hw/m68k/q800-glue.h +F: include/hw/misc/djmemc.h =20 virt M: Laurent Vivier diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig index f839f8a030..330cfdfa2d 100644 --- a/hw/m68k/Kconfig +++ b/hw/m68k/Kconfig @@ -23,6 +23,7 @@ config Q800 select ESP select DP8393X select OR_IRQ + select DJMEMC =20 config M68K_VIRT bool diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index b770b71d54..f9ecc1fbb0 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -40,6 +40,7 @@ #include "hw/m68k/q800.h" #include "hw/m68k/q800-glue.h" #include "hw/misc/mac_via.h" +#include "hw/misc/djmemc.h" #include "hw/input/adb.h" #include "hw/nubus/mac-nubus-bridge.h" #include "hw/display/macfb.h" @@ -66,6 +67,7 @@ #define SONIC_PROM_BASE (IO_BASE + 0x08000) #define SONIC_BASE (IO_BASE + 0x0a000) #define SCC_BASE (IO_BASE + 0x0c020) +#define DJMEMC_BASE (IO_BASE + 0x0e000) #define ESP_BASE (IO_BASE + 0x10000) #define ESP_PDMA (IO_BASE + 0x10100) #define ASC_BASE (IO_BASE + 0x14000) @@ -257,6 +259,14 @@ static void q800_machine_init(MachineState *machine) &error_abort); sysbus_realize(SYS_BUS_DEVICE(&m->glue), &error_fatal); =20 + /* djMEMC memory controller */ + object_initialize_child(OBJECT(machine), "djmemc", &m->djmemc, + TYPE_DJMEMC); + sysbus =3D SYS_BUS_DEVICE(&m->djmemc); + sysbus_realize_and_unref(sysbus, &error_fatal); + memory_region_add_subregion(&m->macio, DJMEMC_BASE - IO_BASE, + sysbus_mmio_get_region(sysbus, 0)); + /* VIA 1 */ object_initialize_child(OBJECT(machine), "via1", &m->via1, TYPE_MOS6522_Q800_VIA1); diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index e4c2149175..9576debc70 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -183,4 +183,7 @@ config AXP2XX_PMU bool depends on I2C =20 +config DJMEMC + bool + source macio/Kconfig diff --git a/hw/misc/djmemc.c b/hw/misc/djmemc.c new file mode 100644 index 0000000000..fd02640838 --- /dev/null +++ b/hw/misc/djmemc.c @@ -0,0 +1,135 @@ +/* + * djMEMC, macintosh memory and interrupt controller + * (Quadra 610/650/800 & Centris 610/650) + * + * https://mac68k.info/wiki/display/mac68k/djMEMC+Information + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "migration/vmstate.h" +#include "hw/misc/djmemc.h" +#include "hw/qdev-properties.h" +#include "trace.h" + + +#define DJMEMC_INTERLEAVECONF 0x0 +#define DJMEMC_BANK0CONF 0x4 +#define DJMEMC_BANK1CONF 0x8 +#define DJMEMC_BANK2CONF 0xc +#define DJMEMC_BANK3CONF 0x10 +#define DJMEMC_BANK4CONF 0x14 +#define DJMEMC_BANK5CONF 0x18 +#define DJMEMC_BANK6CONF 0x1c +#define DJMEMC_BANK7CONF 0x20 +#define DJMEMC_BANK8CONF 0x24 +#define DJMEMC_BANK9CONF 0x28 +#define DJMEMC_MEMTOP 0x2c +#define DJMEMC_CONFIG 0x30 +#define DJMEMC_REFRESH 0x34 + + +static uint64_t djmemc_read(void *opaque, hwaddr addr, unsigned size) +{ + DJMEMCState *s =3D opaque; + uint64_t val =3D 0; + + switch (addr) { + case DJMEMC_INTERLEAVECONF: + case DJMEMC_BANK0CONF ... DJMEMC_BANK9CONF: + case DJMEMC_MEMTOP: + case DJMEMC_CONFIG: + case DJMEMC_REFRESH: + val =3D s->regs[addr >> 2]; + break; + default: + qemu_log_mask(LOG_UNIMP, "djMEMC: unimplemented read addr=3D0x%"PR= Ix64 + " val=3D0x%"PRIx64 " size=3D%d\n", + addr, val, size); + } + + trace_djmemc_read(addr, val, size); + return val; +} + +static void djmemc_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + DJMEMCState *s =3D opaque; + + trace_djmemc_write(addr, val, size); + + switch (addr) { + case DJMEMC_INTERLEAVECONF: + case DJMEMC_BANK0CONF ... DJMEMC_BANK9CONF: + case DJMEMC_MEMTOP: + case DJMEMC_CONFIG: + case DJMEMC_REFRESH: + s->regs[addr >> 2] =3D val; + break; + default: + qemu_log_mask(LOG_UNIMP, "djMEMC: unimplemented write addr=3D0x%"P= RIx64 + " val=3D0x%"PRIx64 " size=3D%d\n", + addr, val, size); + } +} + +static const MemoryRegionOps djmemc_mmio_ops =3D { + .read =3D djmemc_read, + .write =3D djmemc_write, + .impl =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + +static void djmemc_init(Object *obj) +{ + DJMEMCState *s =3D DJMEMC(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + + memory_region_init_io(&s->mem_regs, obj, &djmemc_mmio_ops, s, "djMEMC", + DJMEMC_SIZE); + sysbus_init_mmio(sbd, &s->mem_regs); +} + +static void djmemc_reset_hold(Object *obj) +{ + DJMEMCState *s =3D DJMEMC(obj); + + memset(s->regs, 0, sizeof(s->regs)); +} + +static const VMStateDescription vmstate_djmemc =3D { + .name =3D "djMEMC", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, DJMEMCState, DJMEMC_NUM_REGS), + VMSTATE_END_OF_LIST() + } +}; + +static void djmemc_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + ResettableClass *rc =3D RESETTABLE_CLASS(oc); + + dc->vmsd =3D &vmstate_djmemc; + rc->phases.hold =3D djmemc_reset_hold; +} + +static const TypeInfo djmemc_info_types[] =3D { + { + .name =3D TYPE_DJMEMC, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(DJMEMCState), + .instance_init =3D djmemc_init, + .class_init =3D djmemc_class_init, + }, +}; + +DEFINE_TYPES(djmemc_info_types) diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 05877f61cc..c68f30e630 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -20,6 +20,7 @@ system_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('arm= v7m_ras.c')) =20 # Mac devices system_ss.add(when: 'CONFIG_MOS6522', if_true: files('mos6522.c')) +system_ss.add(when: 'CONFIG_DJMEMC', if_true: files('djmemc.c')) =20 # virt devices system_ss.add(when: 'CONFIG_VIRT_CTRL', if_true: files('virt_ctrl.c')) diff --git a/hw/misc/trace-events b/hw/misc/trace-events index 4d1a0e17af..341adbf24c 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -297,3 +297,7 @@ virt_ctrl_instance_init(void *dev) "ctrl: %p" lasi_chip_mem_valid(uint64_t addr, uint32_t val) "access to addr 0x%"PRIx6= 4" is %d" lasi_chip_read(uint64_t addr, uint32_t val) "addr 0x%"PRIx64" val 0x%08x" lasi_chip_write(uint64_t addr, uint32_t val) "addr 0x%"PRIx64" val 0x%08x" + +# djmemc.c +djmemc_read(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value= =3D0x%"PRIx64" size=3D%u" +djmemc_write(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value= =3D0x%"PRIx64" size=3D%u" diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index b3d77f1cba..f6ae4c1c4f 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -36,6 +36,7 @@ #include "hw/block/swim.h" #include "hw/nubus/mac-nubus-bridge.h" #include "hw/display/macfb.h" +#include "hw/misc/djmemc.h" =20 /* * The main Q800 machine @@ -56,6 +57,7 @@ struct Q800MachineState { Swim swim; MacNubusBridge mac_nubus_bridge; MacfbNubusState macfb; + DJMEMCState djmemc; MemoryRegion macio; MemoryRegion macio_alias; }; diff --git a/include/hw/misc/djmemc.h b/include/hw/misc/djmemc.h new file mode 100644 index 0000000000..82d4e4a2fe --- /dev/null +++ b/include/hw/misc/djmemc.h @@ -0,0 +1,30 @@ +/* + * djMEMC, macintosh memory and interrupt controller + * (Quadra 610/650/800 & Centris 610/650) + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_MISC_DJMEMC_H +#define HW_MISC_DJMEMC_H + +#include "hw/sysbus.h" + +#define DJMEMC_SIZE 0x2000 +#define DJMEMC_NUM_REGS (0x38 / sizeof(uint32_t)) + +#define DJMEMC_MAXBANKS 10 + +struct DJMEMCState { + SysBusDevice parent_obj; + + MemoryRegion mem_regs; + + /* Memory controller */ + uint32_t regs[DJMEMC_NUM_REGS]; +}; + +#define TYPE_DJMEMC "djMEMC" +OBJECT_DECLARE_SIMPLE_TYPE(DJMEMCState, DJMEMC); + +#endif --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313063795919.7867041298786; Sun, 2 Jul 2023 08:51:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzJv-0004NQ-IZ; Sun, 02 Jul 2023 11:49:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJt-0004Mh-NE for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:01 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJs-0007Pb-4F for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:01 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJc-0001Ji-LI; Sun, 02 Jul 2023 16:48:48 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=eUeUMgj2qkfScekBhe3LJzqc3o195bUGXHc3hqmpzn0=; b=ln9FtRsOjesj9e0YaQxGr+kbr2 r3/YOfvsqgWLeWBiCY/2x2bL2yqB2RNveWPagrw+qdu0swFEwTk6E3DlYW4O4Ipb0OWjmEQDjVbky WPssVVspoav1GHdjIcEnipZDSV0yNvbdmb4f3/JfB0PjKAb9HfJWpKBLl9rXKnLJc/8/ce5lJWtML iE0co721wl5V/Db+WkrcKkEpN2Hb3QXmWQJfx0yqTFDkzOLTXWByQueTxOjTFDAuaLHDZM3E3m/eJ ELhzosvSUeYcMYs9wK2TYJw2kxCBcT35Xxyp+hG6S0F/toDo0WlxJ6bNA2mGvaB4F5CmWr2qd7Y6B h4GMO9EaqYuwqCHrQGYn9M86t1KsF5Qlj81v4iHj4z4LwJ1QT/JnzA9QpDLzYObosv5f2wUjlGitR T/Ozxd8/UIyRNNZ6HvKQMWFa4uS+deBsC0/AWMFGSKHLi8RFfKyXdaAa46hBovuhZ/oK1ykUKwfEP vblE7Wam+THo6fzPSsyrrjLpgw2LapmTu0GRlqjhLMcEUw2Dksi/0FBQ6KEiN4s12Avgk0FyuBSkZ vk3ULcj7w6lCKYKAEdWTHAOANSmN5Ggy5SQyKj70G5KSMxdSMWz2YiPebYUn3EAosa8r1zBtIZG6U ssFQsHTTm7Ds66BE4utzdz6gVbKUawM9CIVbe9Gl0=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:20 +0100 Message-Id: <20230702154838.722809-4-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 03/21] q800: add machine id register X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313065106100010 Content-Type: text/plain; charset="utf-8" MacOS reads this address to identify the hardware. This is a basic implementation returning the ID of Quadra 800. Details: http://mess.redump.net/mess/driver_info/mac_technical_notes "There are 3 ID schemes [...] The third and most scalable is a machine ID register at 0x5ffffffc. The top word must be 0xa55a to be valid. Then bits 15-11 are 0 for consumer Macs, 1 for portables, 2 for high-end 68k, and 3 for high-end PowerPC. Bit 10 is 1 if additional ID bits appear elsewhere (e.g. in VIA1). The rest of the bits are a per-model identifier. Model Lower 16 bits of ID ... Quadra/Centris 610/650/800 0x2BAD" Co-developed-by: Laurent Vivier Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/m68k/q800.c | 29 +++++++++++++++++++++++++++++ include/hw/m68k/q800.h | 1 + 2 files changed, 30 insertions(+) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index f9ecc1fbb0..ac8509ba6f 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -91,6 +91,9 @@ #define Q800_NUBUS_SLOTS_AVAILABLE (BIT(0x9) | BIT(0xc) | BIT(0xd) | \ BIT(0xe)) =20 +/* Quadra 800 machine ID */ +#define Q800_MACHINE_ID 0xa55a2bad + =20 static void main_cpu_reset(void *opaque) { @@ -192,6 +195,27 @@ static const MemoryRegionOps macio_alias_ops =3D { }, }; =20 +static uint64_t machine_id_read(void *opaque, hwaddr addr, unsigned size) +{ + return Q800_MACHINE_ID; +} + +static void machine_id_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + return; +} + +static const MemoryRegionOps machine_id_ops =3D { + .read =3D machine_id_read, + .write =3D machine_id_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + static void q800_machine_init(MachineState *machine) { Q800MachineState *m =3D Q800_MACHINE(machine); @@ -253,6 +277,11 @@ static void q800_machine_init(MachineState *machine) memory_region_add_subregion(get_system_memory(), IO_BASE + IO_SLICE, &m->macio_alias); =20 + memory_region_init_io(&m->machine_id, NULL, &machine_id_ops, NULL, + "Machine ID", 4); + memory_region_add_subregion(get_system_memory(), 0x5ffffffc, + &m->machine_id); + /* IRQ Glue */ object_initialize_child(OBJECT(machine), "glue", &m->glue, TYPE_GLUE); object_property_set_link(OBJECT(&m->glue), "cpu", OBJECT(&m->cpu), diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index f6ae4c1c4f..dd7d7a6f2c 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -60,6 +60,7 @@ struct Q800MachineState { DJMEMCState djmemc; MemoryRegion macio; MemoryRegion macio_alias; + MemoryRegion machine_id; }; =20 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800") --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312999151579.9216002734304; Sun, 2 Jul 2023 08:49:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzJy-0004Nv-SH; Sun, 02 Jul 2023 11:49:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJx-0004NX-JQ for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:05 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzJw-0007QP-61 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:05 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJg-0001Ji-QB; Sun, 02 Jul 2023 16:48:52 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=guifOHIXmEFadQVrjpEPuISFYRxfaRdhX4Zsl3uOaU8=; b=wpUvkTTq/oPy2uY2MxE1/gefyi SWRl/q6TUpuEeNa63gu0LI3og+cdvaq5mKVZDaGZvuSF1J1Xv9JHUInvCQ9dLCujgLoRrK6eut1Hr bwb6MNdnmiDVPop2yyNfXAFIYRuq8QaJI3RtJU/iYLnWw24uHcXSGmzDR8ibHLqc8w0Uyb5VBekrH R6svOB7ttN9pEMX5+mf0rBcD0Gd1++BdMW/iRb90OT0v1Y3O87lFHczDotJGE829PCq1hQWpLebpq CGUE+PEhU/hKBG4GbZ/Sdw9za2cPztahCYKxucsplLzdHeq+Dg05UPOkzONs4+lpzK4NYfEqyxUuc FF3LJaUzOCVmZFtRwLeJGp2qoEh5Snu9YPUWvKxGwzZUxtAKMYvtluYZbR2C0RibaD4+G/WiTcH43 FjHt3jkOGbk+7m3VgDh5kUYayz86FhEX6oOxT1rwOIEl/DiY0+7cjzeLh0PZYKYsYzjW/ctIeFyKn hnY1dbPGhOGtd6rfB+A3sVf9rQ8CLgSgrxh1gFayniVF6keda5Pn5Nyzm2uWCWwJiMnpmR9ONp7mH sAHZZbS5U7r/JzVC2qvtKuFtJk76zRHGIGasU/5K7bFpIXUhI2g/0kTlO/deXQ8VSJBxqMTinR/Z+ mH/hpXu4a9PFLdnh/I4fwdEy5geZAdeEv4AMl4b9s=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:21 +0100 Message-Id: <20230702154838.722809-5-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 04/21] q800: implement additional machine id bits on VIA1 port A X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313000197100005 Content-Type: text/plain; charset="utf-8" Co-developed-by: Laurent Vivier Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/misc/mac_via.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index 0787a0268d..baeb73eeb3 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -114,6 +114,9 @@ #define VIA1A_CPUID1 0x04 /* CPU id bit 0 on RBV, others */ #define VIA1A_CPUID2 0x10 /* CPU id bit 0 on RBV, others */ #define VIA1A_CPUID3 0x40 /* CPU id bit 0 on RBV, others */ +#define VIA1A_CPUID_MASK (VIA1A_CPUID0 | VIA1A_CPUID1 | \ + VIA1A_CPUID2 | VIA1A_CPUID3) +#define VIA1A_CPUID_Q800 (VIA1A_CPUID0 | VIA1A_CPUID2) =20 /* * Info on VIA1B is from Macintosh Family Hardware & MkLinux. @@ -872,9 +875,18 @@ static uint64_t mos6522_q800_via1_read(void *opaque, h= waddr addr, unsigned size) { MOS6522Q800VIA1State *s =3D MOS6522_Q800_VIA1(opaque); MOS6522State *ms =3D MOS6522(s); + uint64_t ret; =20 addr =3D (addr >> 9) & 0xf; - return mos6522_read(ms, addr, size); + ret =3D mos6522_read(ms, addr, size); + switch (addr) { + case VIA_REG_A: + case VIA_REG_ANH: + /* Quadra 800 Id */ + ret =3D (ret & ~VIA1A_CPUID_MASK) | VIA1A_CPUID_Q800; + break; + } + return ret; } =20 static void mos6522_q800_via1_write(void *opaque, hwaddr addr, uint64_t va= l, --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312975792950.0041647978693; Sun, 2 Jul 2023 08:49:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzK3-0004OD-G7; Sun, 02 Jul 2023 11:49:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzK2-0004O5-60 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:10 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzK0-0007Qi-37 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:09 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJk-0001Ji-Un; Sun, 02 Jul 2023 16:48:56 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=0F9MqVF2lpMYhtBBH0aPjcli9oFBnHvRDSHsvC7fyX4=; b=TwIa4OE/zkEyWQgg6PU6kZZNx/ 5OI9eqB/rWpJ0gIyOkxoivh+oPhelTrBxRGhL4u9HvKMXx82HMj1BBLQCSe01tLxE8Rj6Qj2Bm30a H7AaBe6POja+Cr1OgedzMSBdMQn9eSPcpHx84sG16WO/CKd++C4k6ZRCy0u/RiPyeBssh08QyD2yP BfvqZ4x3eYXg5M4jzcPbdiHUZgCn5RNaNs7DYWDY9Gmh/Pi0s8DS6D7G8gHtOM7y/CnjgmvwwSbDK Q/YyXe9H1fdrel50mp3LJrhPEBM52fIpqXyDLv+2ePlnXCwSuT6sD874EZre6s0hcKhJR9TG+eb2+ 8iYqEdwRuwKQ4C9FxuBWI4tnacX4cS2ZUl9B21pB2C6w6AUXb+v6YUHE9d6VE1LkV7RbIJ3RmKXbw nFGdwjPcTMlnRl6iFKNzYMctWK5ENG9rg5ExAGUkPIgwwIHp/kiHcoxwma/8ZXt3eB2d4oGx2wf2X h0fbfjao6LzeK7LMo29HJPP9j4iFZXNZ13xQz5bfsuzvtdJexlTIIvql1/5oiH63ViptSFIAQdDuv rm7quwJfgCDl6hB7VreffxTOhjU7IxAJhoQpT/HbZAkDmuFSzyKigao/SjnTK/5l71OC2HzS5txEa cZ7pjlECtAj7Tqi13xBqXcnzNVWSn2tZok4kEyUyU=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:22 +0100 Message-Id: <20230702154838.722809-6-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 05/21] q800: add IOSB subsystem X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312977489100005 Content-Type: text/plain; charset="utf-8" It is needed because it defines the BIOSConfig area. Co-developed-by: Laurent Vivier Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- MAINTAINERS | 2 + hw/m68k/Kconfig | 1 + hw/m68k/q800.c | 9 +++ hw/misc/Kconfig | 3 + hw/misc/iosb.c | 137 +++++++++++++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + hw/misc/trace-events | 4 ++ include/hw/m68k/q800.h | 2 + include/hw/misc/iosb.h | 25 ++++++++ 9 files changed, 184 insertions(+) create mode 100644 hw/misc/iosb.c create mode 100644 include/hw/misc/iosb.h diff --git a/MAINTAINERS b/MAINTAINERS index 2d85e8c28c..88db6540ae 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1232,6 +1232,7 @@ F: hw/nubus/* F: hw/display/macfb.c F: hw/block/swim.c F: hw/misc/djmemc.c +F: hw/misc/iosb.c F: hw/m68k/bootinfo.h F: include/standard-headers/asm-m68k/bootinfo.h F: include/standard-headers/asm-m68k/bootinfo-mac.h @@ -1242,6 +1243,7 @@ F: include/hw/block/swim.h F: include/hw/m68k/q800.h F: include/hw/m68k/q800-glue.h F: include/hw/misc/djmemc.h +F: include/hw/misc/iosb.h =20 virt M: Laurent Vivier diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig index 330cfdfa2d..64fa70a0db 100644 --- a/hw/m68k/Kconfig +++ b/hw/m68k/Kconfig @@ -24,6 +24,7 @@ config Q800 select DP8393X select OR_IRQ select DJMEMC + select IOSB =20 config M68K_VIRT bool diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index ac8509ba6f..081b95e9cf 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -41,6 +41,7 @@ #include "hw/m68k/q800-glue.h" #include "hw/misc/mac_via.h" #include "hw/misc/djmemc.h" +#include "hw/misc/iosb.h" #include "hw/input/adb.h" #include "hw/nubus/mac-nubus-bridge.h" #include "hw/display/macfb.h" @@ -71,6 +72,7 @@ #define ESP_BASE (IO_BASE + 0x10000) #define ESP_PDMA (IO_BASE + 0x10100) #define ASC_BASE (IO_BASE + 0x14000) +#define IOSB_BASE (IO_BASE + 0x18000) #define SWIM_BASE (IO_BASE + 0x1E000) =20 #define SONIC_PROM_SIZE 0x1000 @@ -296,6 +298,13 @@ static void q800_machine_init(MachineState *machine) memory_region_add_subregion(&m->macio, DJMEMC_BASE - IO_BASE, sysbus_mmio_get_region(sysbus, 0)); =20 + /* IOSB subsystem */ + object_initialize_child(OBJECT(machine), "iosb", &m->iosb, TYPE_IOSB); + sysbus =3D SYS_BUS_DEVICE(&m->iosb); + sysbus_realize_and_unref(sysbus, &error_fatal); + memory_region_add_subregion(&m->macio, IOSB_BASE - IO_BASE, + sysbus_mmio_get_region(sysbus, 0)); + /* VIA 1 */ object_initialize_child(OBJECT(machine), "via1", &m->via1, TYPE_MOS6522_Q800_VIA1); diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index 9576debc70..858742d8fc 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -186,4 +186,7 @@ config AXP2XX_PMU config DJMEMC bool =20 +config IOSB + bool + source macio/Kconfig diff --git a/hw/misc/iosb.c b/hw/misc/iosb.c new file mode 100644 index 0000000000..4fc10bcf9f --- /dev/null +++ b/hw/misc/iosb.c @@ -0,0 +1,137 @@ +/* + * QEMU IOSB emulation + * + * Copyright (c) 2019 Laurent Vivier + * Copyright (c) 2022 Mark Cave-Ayland + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "migration/vmstate.h" +#include "hw/sysbus.h" +#include "hw/misc/iosb.h" +#include "trace.h" + +#define IOSB_SIZE 0x2000 + +#define IOSB_CONFIG 0x0 +#define IOSB_CONFIG2 0x100 +#define IOSB_SONIC_SCSI 0x200 +#define IOSB_REVISION 0x300 +#define IOSB_SCSI_RESID 0x400 +#define IOSB_BRIGHTNESS 0x500 +#define IOSB_TIMEOUT 0x600 + + +static uint64_t iosb_read(void *opaque, hwaddr addr, + unsigned size) +{ + IOSBState *s =3D IOSB(opaque); + uint64_t val =3D 0; + + switch (addr) { + case IOSB_CONFIG: + case IOSB_CONFIG2: + case IOSB_SONIC_SCSI: + case IOSB_REVISION: + case IOSB_SCSI_RESID: + case IOSB_BRIGHTNESS: + case IOSB_TIMEOUT: + val =3D s->regs[addr >> 8]; + break; + default: + qemu_log_mask(LOG_UNIMP, "IOSB: unimplemented read addr=3D0x%"PRIx= 64 + " val=3D0x%"PRIx64 " size=3D%d\n", + addr, val, size); + } + + trace_iosb_read(addr, val, size); + return val; +} + +static void iosb_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + IOSBState *s =3D IOSB(opaque); + + switch (addr) { + case IOSB_CONFIG: + case IOSB_CONFIG2: + case IOSB_SONIC_SCSI: + case IOSB_REVISION: + case IOSB_SCSI_RESID: + case IOSB_BRIGHTNESS: + case IOSB_TIMEOUT: + s->regs[addr >> 8] =3D val; + break; + default: + qemu_log_mask(LOG_UNIMP, "IOSB: unimplemented write addr=3D0x%"PRI= x64 + " val=3D0x%"PRIx64 " size=3D%d\n", + addr, val, size); + } + + trace_iosb_write(addr, val, size); +} + +static const MemoryRegionOps iosb_mmio_ops =3D { + .read =3D iosb_read, + .write =3D iosb_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 4, + }, +}; + +static void iosb_reset_hold(Object *obj) +{ + IOSBState *s =3D IOSB(obj); + + memset(s->regs, 0, sizeof(s->regs)); + + /* BCLK 33 MHz */ + s->regs[IOSB_CONFIG >> 8] =3D 1; +} + +static void iosb_init(Object *obj) +{ + IOSBState *s =3D IOSB(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + + memory_region_init_io(&s->mem_regs, obj, &iosb_mmio_ops, s, "IOSB", + IOSB_SIZE); + sysbus_init_mmio(sbd, &s->mem_regs); +} + +static const VMStateDescription vmstate_iosb =3D { + .name =3D "IOSB", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, IOSBState, IOSB_REGS), + VMSTATE_END_OF_LIST() + } +}; + +static void iosb_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + ResettableClass *rc =3D RESETTABLE_CLASS(oc); + + dc->vmsd =3D &vmstate_iosb; + rc->phases.hold =3D iosb_reset_hold; +} + +static const TypeInfo iosb_info_types[] =3D { + { + .name =3D TYPE_IOSB, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(IOSBState), + .instance_init =3D iosb_init, + .class_init =3D iosb_class_init, + }, +}; + +DEFINE_TYPES(iosb_info_types) diff --git a/hw/misc/meson.build b/hw/misc/meson.build index c68f30e630..dc7d90ff3e 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -21,6 +21,7 @@ system_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('arm= v7m_ras.c')) # Mac devices system_ss.add(when: 'CONFIG_MOS6522', if_true: files('mos6522.c')) system_ss.add(when: 'CONFIG_DJMEMC', if_true: files('djmemc.c')) +system_ss.add(when: 'CONFIG_IOSB', if_true: files('iosb.c')) =20 # virt devices system_ss.add(when: 'CONFIG_VIRT_CTRL', if_true: files('virt_ctrl.c')) diff --git a/hw/misc/trace-events b/hw/misc/trace-events index 341adbf24c..d5711dcff2 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -301,3 +301,7 @@ lasi_chip_write(uint64_t addr, uint32_t val) "addr 0x%"= PRIx64" val 0x%08x" # djmemc.c djmemc_read(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value= =3D0x%"PRIx64" size=3D%u" djmemc_write(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value= =3D0x%"PRIx64" size=3D%u" + +# iosb.c +iosb_read(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value=3D= 0x%"PRIx64" size=3D%u" +iosb_write(int reg, uint64_t value, unsigned int size) "reg=3D0x%x value= =3D0x%"PRIx64" size=3D%u" diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index dd7d7a6f2c..98097165d9 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -37,6 +37,7 @@ #include "hw/nubus/mac-nubus-bridge.h" #include "hw/display/macfb.h" #include "hw/misc/djmemc.h" +#include "hw/misc/iosb.h" =20 /* * The main Q800 machine @@ -58,6 +59,7 @@ struct Q800MachineState { MacNubusBridge mac_nubus_bridge; MacfbNubusState macfb; DJMEMCState djmemc; + IOSBState iosb; MemoryRegion macio; MemoryRegion macio_alias; MemoryRegion machine_id; diff --git a/include/hw/misc/iosb.h b/include/hw/misc/iosb.h new file mode 100644 index 0000000000..377f8ca7e2 --- /dev/null +++ b/include/hw/misc/iosb.h @@ -0,0 +1,25 @@ +/* + * QEMU IOSB emulation + * + * Copyright (c) 2019 Laurent Vivier + * Copyright (c) 2022 Mark Cave-Ayland + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_MEM_IOSB_H +#define HW_MEM_IOSB_H + +#define IOSB_REGS 7 + +struct IOSBState { + SysBusDevice parent_obj; + + MemoryRegion mem_regs; + uint32_t regs[IOSB_REGS]; +}; + +#define TYPE_IOSB "IOSB" +OBJECT_DECLARE_SIMPLE_TYPE(IOSBState, IOSB); + +#endif --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312999289863.6354921138787; Sun, 2 Jul 2023 08:49:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzK7-0004PZ-Hh; Sun, 02 Jul 2023 11:49:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzK6-0004PA-AE for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:14 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzK4-0007R1-Dz for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:14 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJo-0001Ji-T4; Sun, 02 Jul 2023 16:49:00 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=NbYwBJKPZsJu1nxMNVD6PhDa955mRSYxjAw5kFMc3x8=; b=Q5TP8wULNMe1NR/Zsq3wTAUm7e Vo0VYnsWT/K6d4Z2aBdxEylyox5zQe5S5e7NOKptUv4ArT8yILT/fyCrVivAJ3vBpszBI25qWAa/N XBu4xfuCaQQnUbegBtgFrbuRsxJXbmhih3XNtFURRpezdlrqEKljqNpTva4OhZjEPgGOJvOz3c3Hi EgkEPBYXONVLKYMwi1DL6buH6K10I9kS9KoBbPDNnOtLKxAQ7IVhS1dQjzJmlLsHSHRuFTpqxrkJC r2R7FOpf6jhKyBPzTAeuwby0QIdPCchC6apjSodapnRtf/1mEsoN/OWxrkOTnqMWmgoXYCjdatEzP UOBq0b3mgczxr7YXiiu0yKTugaB+d97hGKS9tYtt1LOE/tYYQnIyYTMBlB2r60xobllapPrzajBWF HhxWzysNhAZgoCtxK+F/ZYV/rfP5ml7t92zeXAflawJNNUPaHEXVfQavuFMPIBD2Tx/vHazgujlTe oxHBZCHhufS9leXmnvK+GFmddAmD7GNWsQvY4FA+fIxMsy+q8mOV3/qED7NPZIVvdY92kbWRmQMnT bCQSbpPcz2ChKdB1hpCyOs+9ns3QYm6jqFB2lobryZoVXq0zA3WxGznYR8CucK+O8bBcT1f/3PAXU ScWeQ00l2jL4q5rIeDk+UWOdnSCvrq2OcRFkurb6U=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:23 +0100 Message-Id: <20230702154838.722809-7-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 06/21] q800: allow accesses to RAM area even if less memory is available X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312999485100001 Content-Type: text/plain; charset="utf-8" MacOS attempts a series of writes and reads over the entire RAM area in ord= er to determine the amount of RAM within the machine. Allow accesses to the entire RAM area ignoring writes and always reading zero for areas where the= re is no physical RAM installed to allow MacOS to detect the memory size witho= ut faulting. Signed-off-by: Mark Cave-Ayland Reviewed-by: Laurent Vivier Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/m68k/q800.c | 30 +++++++++++++++++++++++++++++- include/hw/m68k/q800.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index 081b95e9cf..3209309173 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -86,6 +86,9 @@ =20 #define MAC_CLOCK 3686418 =20 +/* Size of whole RAM area */ +#define RAM_SIZE 0x40000000 + /* * Slot 0x9 is reserved for use by the in-built framebuffer whilst only * slots 0xc, 0xd and 0xe physically exist on the Quadra 800 @@ -218,6 +221,27 @@ static const MemoryRegionOps machine_id_ops =3D { }, }; =20 +static uint64_t ramio_read(void *opaque, hwaddr addr, unsigned size) +{ + return 0x0; +} + +static void ramio_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + return; +} + +static const MemoryRegionOps ramio_ops =3D { + .read =3D ramio_read, + .write =3D ramio_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 1, + .max_access_size =3D 4, + }, +}; + static void q800_machine_init(MachineState *machine) { Q800MachineState *m =3D Q800_MACHINE(machine); @@ -262,7 +286,11 @@ static void q800_machine_init(MachineState *machine) qemu_register_reset(main_cpu_reset, &m->cpu); =20 /* RAM */ - memory_region_add_subregion(get_system_memory(), 0, machine->ram); + memory_region_init_io(&m->ramio, OBJECT(machine), &ramio_ops, &m->rami= o, + "ram", RAM_SIZE); + memory_region_add_subregion(get_system_memory(), 0x0, &m->ramio); + + memory_region_add_subregion(&m->ramio, 0, machine->ram); =20 /* * Create container for all IO devices diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index 98097165d9..04e4e0bce3 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -60,6 +60,7 @@ struct Q800MachineState { MacfbNubusState macfb; DJMEMCState djmemc; IOSBState iosb; + MemoryRegion ramio; MemoryRegion macio; MemoryRegion macio_alias; MemoryRegion machine_id; --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313073245265.0885569092195; Sun, 2 Jul 2023 08:51:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKD-0004Qb-3S; Sun, 02 Jul 2023 11:49:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKB-0004Q0-KQ for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:19 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzK8-0007RL-J3 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:19 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJt-0001Ji-2D; Sun, 02 Jul 2023 16:49:05 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To: Cc:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=lTp6nhJIupGAYQ8UyLuBbxIVfNsT/WQmCebdpEErUHY=; b=o4BxG0MBvNQnufBiFBQ0YmcvWA DxJTQY2gw3TGkoqcWZvXKNaoNOtPpsonGdaS5fqJ7L/bUq2n/r1gwSN+LEj0lbj3XlLzFIxhvqq6k 9zQhHsM79nIj8SWqZuDm/iU4m7MuJVHjPlv5zpcwbIydqWCdxvQvYuEYFkiA8KXapzVArlsvB9Pfy ViWKPcG155Vb/WozNkGSeCW0qmQu4uF9PBuPTOo3dePD5Cxz0117XdTlrNjjv8eOa8xpTLq3EFGIa zRRPF03/6HBrxmBVohSLPHj2qaEKFPBy2/Oooup8jTqvs0jIIw4+wTwmEcZ+HnArA2b2hXqX6b9k9 7pgc6gkVeg6P82n3eew1orLTnQnG3tQ8burJdqQn1xKyiEyyJJGvofaAQNKKao7InpRIhTfpNyvma jquvymGAR7e72fgBWPdwutL23kMzEZ8MXA2Nsn9vmmxP5wQqPzmoZaxqamCSS/7Lq6xbDeAY16e5/ QJOZh6QGHsH9HuX2COEe6i4i1qIUheefSoAWepj1ijuEynt8X0ynYd8j4UjuvM/Xj6NUZncsi3//W gWu/n2jgvVT0OVaBG7mWkW7JG9JLd9Yu2ZpDbLH3Y4uxDv6bqme9aiuoPKKjBQZEdqj7QzkGUCMab Apja3SNxwS9hWB2FvTgmN7KT1Tvssaa3HxQOB8jEo=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:24 +0100 Message-Id: <20230702154838.722809-8-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 07/21] audio: add Apple Sound Chip (ASC) emulation X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313073515100006 The Apple Sound Chip was primarily used by the Macintosh II to generate sou= nd in hardware which was previously handled by the toolbox ROM with software interrupts. Implement both the standard ASC and also the enhanced ASC (EASC) functional= ity which is used in the Quadra 800. Note that whilst real ASC hardware uses AUDIO_FORMAT_S8, this implementatio= n uses AUDIO_FORMAT_U8 instead because AUDIO_FORMAT_S8 is rarely used and not supp= orted by some audio backends like PulseAudio and DirectSound when played directly= with -audiodev out.mixing-engine=3Doff. Co-developed-by: Laurent Vivier Co-developed-by: Volker R=C3=BCmelin Signed-off-by: Mark Cave-Ayland Reviewed-by: Volker R=C3=BCmelin --- MAINTAINERS | 2 + hw/audio/Kconfig | 3 + hw/audio/asc.c | 685 +++++++++++++++++++++++++++++++++++++++++ hw/audio/meson.build | 1 + hw/audio/trace-events | 10 + hw/m68k/Kconfig | 1 + include/hw/audio/asc.h | 79 +++++ 7 files changed, 781 insertions(+) create mode 100644 hw/audio/asc.c create mode 100644 include/hw/audio/asc.h diff --git a/MAINTAINERS b/MAINTAINERS index 88db6540ae..5ab23de2a6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1233,6 +1233,7 @@ F: hw/display/macfb.c F: hw/block/swim.c F: hw/misc/djmemc.c F: hw/misc/iosb.c +F: hw/audio/asc.c F: hw/m68k/bootinfo.h F: include/standard-headers/asm-m68k/bootinfo.h F: include/standard-headers/asm-m68k/bootinfo-mac.h @@ -1244,6 +1245,7 @@ F: include/hw/m68k/q800.h F: include/hw/m68k/q800-glue.h F: include/hw/misc/djmemc.h F: include/hw/misc/iosb.h +F: include/hw/audio/asc.h =20 virt M: Laurent Vivier diff --git a/hw/audio/Kconfig b/hw/audio/Kconfig index e76c69ca7e..d0993514a1 100644 --- a/hw/audio/Kconfig +++ b/hw/audio/Kconfig @@ -47,3 +47,6 @@ config PL041 =20 config CS4231 bool + +config ASC + bool diff --git a/hw/audio/asc.c b/hw/audio/asc.c new file mode 100644 index 0000000000..ebcb8a97a6 --- /dev/null +++ b/hw/audio/asc.c @@ -0,0 +1,685 @@ +/* + * QEMU Apple Sound Chip emulation + * + * Apple Sound Chip (ASC) 344S0063 + * Enhanced Apple Sound Chip (EASC) 343S1063 + * + * Copyright (c) 2012-2018 Laurent Vivier + * Copyright (c) 2022 Mark Cave-Ayland + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/irq.h" +#include "audio/audio.h" +#include "hw/audio/asc.h" +#include "hw/qdev-properties.h" +#include "migration/vmstate.h" +#include "trace.h" + +/* + * Linux doesn't provide information about ASC, see arch/m68k/mac/macboing= .c + * and arch/m68k/include/asm/mac_asc.h + * + * best information is coming from MAME: + * https://github.com/mamedev/mame/blob/master/src/devices/sound/asc.h + * https://github.com/mamedev/mame/blob/master/src/devices/sound/asc.cpp + * Emulation by R. Belmont + * or MESS: + * http://mess.redump.net/mess/driver_info/easc + * + * 0x800: VERSION + * 0x801: MODE + * 1=3DFIFO mode, + * 2=3Dwavetable mode + * 0x802: CONTROL + * bit 0=3Danalog or PWM output, + * 1=3Dstereo/mono, + * 7=3Dprocessing time exceeded + * 0x803: FIFO MODE + * bit 7=3Dclear FIFO, + * bit 1=3D"non-ROM companding", + * bit 0=3D"ROM companding") + * 0x804: FIFO IRQ STATUS + * bit 0=3Dch A 1/2 full, + * 1=3Dch A full, + * 2=3Dch B 1/2 full, + * 3=3Dch B full) + * 0x805: WAVETABLE CONTROL + * bits 0-3 wavetables 0-3 start + * 0x806: VOLUME + * bits 2-4 =3D 3 bit internal ASC volume, + * bits 5-7 =3D volume control sent to Sony sound chip + * 0x807: CLOCK RATE + * 0 =3D Mac 22257 Hz, + * 1 =3D undefined, + * 2 =3D 22050 Hz, + * 3 =3D 44100 Hz + * 0x80a: PLAY REC A + * 0x80f: TEST + * bits 6-7 =3D digital test, + * bits 4-5 =3D analog test + * 0x810: WAVETABLE 0 PHASE + * big-endian 9.15 fixed-point, only 24 bits valid + * 0x814: WAVETABLE 0 INCREMENT + * big-endian 9.15 fixed-point, only 24 bits valid + * 0x818: WAVETABLE 1 PHASE + * 0x81C: WAVETABLE 1 INCREMENT + * 0x820: WAVETABLE 2 PHASE + * 0x824: WAVETABLE 2 INCREMENT + * 0x828: WAVETABLE 3 PHASE + * 0x82C: WAVETABLE 3 INCREMENT + * 0x830: UNKNOWN START + * NetBSD writes Wavetable data here (are there more + * wavetables/channels than we know about?) + * 0x857: UNKNOWN END + */ + +#define ASC_SIZE 0x2000 + +enum { + ASC_VERSION =3D 0x00, + ASC_MODE =3D 0x01, + ASC_CONTROL =3D 0x02, + ASC_FIFOMODE =3D 0x03, + ASC_FIFOIRQ =3D 0x04, + ASC_WAVECTRL =3D 0x05, + ASC_VOLUME =3D 0x06, + ASC_CLOCK =3D 0x07, + ASC_PLAYRECA =3D 0x0a, + ASC_TEST =3D 0x0f, + ASC_WAVETABLE =3D 0x10 +}; + +#define ASC_FIFO_STATUS_HALF_FULL 1 +#define ASC_FIFO_STATUS_FULL_EMPTY 2 + +#define ASC_EXTREGS_FIFOCTRL 0x8 +#define ASC_EXTREGS_INTCTRL 0x9 +#define ASC_EXTREGS_CDXA_DECOMP_FILT 0x10 + + +static void asc_raise_irq(ASCState *s) +{ + qemu_set_irq(s->irq, 1); +} + +static void asc_lower_irq(ASCState *s) +{ + qemu_set_irq(s->irq, 0); +} + +static uint8_t asc_fifo_get(ASCFIFOState *fs) +{ + ASCState *s =3D container_of(fs, ASCState, fifos[fs->index]); + bool fifo_half_irq_enabled =3D fs->extregs[ASC_EXTREGS_INTCTRL] & 1; + uint8_t val; + + assert(fs->cnt); + + val =3D fs->fifo[fs->rptr]; + trace_asc_fifo_get('A' + fs->index, fs->rptr, fs->cnt, val); + + fs->rptr++; + fs->rptr &=3D 0x3ff; + fs->cnt--; + + if (fs->cnt <=3D 0x1ff) { + /* FIFO less than half full */ + fs->int_status |=3D ASC_FIFO_STATUS_HALF_FULL; + } else { + /* FIFO more than half full */ + fs->int_status &=3D ~ASC_FIFO_STATUS_HALF_FULL; + } + + if (fs->cnt =3D=3D 0x1ff && fifo_half_irq_enabled) { + /* Raise FIFO half full IRQ */ + asc_raise_irq(s); + } + + if (fs->cnt =3D=3D 0) { + /* Raise FIFO empty IRQ */ + fs->int_status |=3D ASC_FIFO_STATUS_FULL_EMPTY; + asc_raise_irq(s); + } + + return val; +} + +static int generate_fifo(ASCState *s, int maxsamples) +{ + uint8_t *buf =3D s->mixbuf; + int i, limit, count =3D 0; + + limit =3D MIN(MAX(s->fifos[0].cnt, s->fifos[1].cnt), maxsamples); + + /* + * If starting a new run with no FIFO data present, update the IRQ and + * continue + */ + if (limit =3D=3D 0 && s->fifos[0].int_status =3D=3D 0 && + s->fifos[1].int_status =3D=3D 0) { + s->fifos[0].int_status |=3D ASC_FIFO_STATUS_HALF_FULL | + ASC_FIFO_STATUS_FULL_EMPTY; + s->fifos[1].int_status |=3D ASC_FIFO_STATUS_HALF_FULL | + ASC_FIFO_STATUS_FULL_EMPTY; + + asc_raise_irq(s); + return 0; + } + + while (count < limit) { + uint8_t val; + int16_t d, f0, f1; + int32_t t; + int shift, filter; + bool hasdata =3D true; + + for (i =3D 0; i < 2; i++) { + ASCFIFOState *fs =3D &s->fifos[i]; + + switch (fs->extregs[ASC_EXTREGS_FIFOCTRL] & 0x83) { + case 0x82: + /* + * CD-XA BRR mode: exit if there isn't enough data in the = FIFO + * for a complete 15 byte packet + */ + if (fs->xa_cnt =3D=3D -1 && fs->cnt < 15) { + hasdata =3D false; + continue; + } + + if (fs->xa_cnt =3D=3D -1) { + /* Start of packet, get flags */ + fs->xa_flags =3D asc_fifo_get(fs); + fs->xa_cnt =3D 0; + } + + shift =3D fs->xa_flags & 0xf; + filter =3D fs->xa_flags >> 4; + f0 =3D (int8_t)fs->extregs[ASC_EXTREGS_CDXA_DECOMP_FILT + + (filter << 1) + 1]; + f1 =3D (int8_t)fs->extregs[ASC_EXTREGS_CDXA_DECOMP_FILT + + (filter << 1)]; + if ((fs->xa_cnt & 1) =3D=3D 0) { + fs->xa_val =3D asc_fifo_get(fs); + d =3D (fs->xa_val & 0xf) << 12; + } else { + d =3D (fs->xa_val & 0xf0) << 8; + } + t =3D (d >> shift) + (((fs->xa_last[0] * f0) + + (fs->xa_last[1] * f1) + 32) >> 6); + if (t < -32768) { + t =3D -32768; + } else if (t > 32768) { + t =3D 32768; + } + + /* + * CD-XA BRR generates 16-bit signed output, so convert to + * 8-bit before writing to buffer. Does real hardware do t= he + * same? + */ + buf[count * 2 + i] =3D (uint8_t)(t / 256) ^ 0x80; + fs->xa_cnt++; + + fs->xa_last[1] =3D fs->xa_last[0]; + fs->xa_last[0] =3D (int16_t)t; + + if (fs->xa_cnt =3D=3D 28) { + /* End of packet */ + fs->xa_cnt =3D -1; + } + break; + + default: + /* fallthrough */ + case 0x80: + /* Raw mode */ + if (fs->cnt) { + val =3D asc_fifo_get(fs); + } else { + val =3D 0x80; + } + + buf[count * 2 + i] =3D val; + break; + } + } + + if (!hasdata) { + break; + } + + count++; + } + + return count; +} + +static int generate_wavetable(ASCState *s, int maxsamples) +{ + uint8_t *buf =3D s->mixbuf; + int channel, count =3D 0; + + while (count < maxsamples) { + uint32_t left =3D 0, right =3D 0; + uint8_t sample; + + for (channel =3D 0; channel < 4; channel++) { + ASCFIFOState *fs =3D &s->fifos[channel >> 1]; + int chanreg =3D ASC_WAVETABLE + (channel << 3); + uint32_t phase, incr, offset; + + phase =3D ldl_be_p(&s->regs[chanreg]); + incr =3D ldl_be_p(&s->regs[chanreg + sizeof(uint32_t)]); + + phase +=3D incr; + offset =3D (phase >> 15) & 0x1ff; + sample =3D fs->fifo[0x200 * (channel >> 1) + offset]; + + stl_be_p(&s->regs[chanreg], phase); + + left +=3D sample; + right +=3D sample; + } + + buf[count * 2] =3D left >> 2; + buf[count * 2 + 1] =3D right >> 2; + + count++; + } + + return count; +} + +static void asc_out_cb(void *opaque, int free_b) +{ + ASCState *s =3D opaque; + int samples; + + if (free_b =3D=3D 0) { + return; + } + + samples =3D MIN(s->samples, free_b >> s->shift); + + switch (s->regs[ASC_MODE] & 3) { + default: + /* Off */ + samples =3D 0; + break; + case 1: + /* FIFO mode */ + samples =3D generate_fifo(s, samples); + break; + case 2: + /* Wave table mode */ + samples =3D generate_wavetable(s, samples); + break; + } + + if (!samples) { + return; + } + + AUD_write(s->voice, s->mixbuf, samples << s->shift); +} + +static uint64_t asc_fifo_read(void *opaque, hwaddr addr, + unsigned size) +{ + ASCFIFOState *fs =3D opaque; + + trace_asc_read_fifo('A' + fs->index, addr, size, fs->fifo[addr]); + return fs->fifo[addr]; +} + +static void asc_fifo_write(void *opaque, hwaddr addr, uint64_t value, + unsigned size) +{ + ASCFIFOState *fs =3D opaque; + ASCState *s =3D container_of(fs, ASCState, fifos[fs->index]); + bool fifo_half_irq_enabled =3D fs->extregs[ASC_EXTREGS_INTCTRL] & 1; + + trace_asc_write_fifo('A' + fs->index, addr, size, fs->wptr, fs->cnt, v= alue); + + if (s->regs[ASC_MODE] =3D=3D 1) { + fs->fifo[fs->wptr++] =3D value; + fs->wptr &=3D 0x3ff; + fs->cnt++; + + if (fs->cnt <=3D 0x1ff) { + /* FIFO less than half full */ + fs->int_status |=3D ASC_FIFO_STATUS_HALF_FULL; + } else { + /* FIFO at least half full */ + fs->int_status &=3D ~ASC_FIFO_STATUS_HALF_FULL; + } + + if (fs->cnt =3D=3D 0x200 && fifo_half_irq_enabled) { + /* Raise FIFO half full interrupt */ + asc_raise_irq(s); + } + + if (fs->cnt =3D=3D 0x3ff) { + /* Raise FIFO full interrupt */ + fs->int_status |=3D ASC_FIFO_STATUS_FULL_EMPTY; + asc_raise_irq(s); + } + } else { + fs->fifo[addr] =3D value; + } + return; +} + +static const MemoryRegionOps asc_fifo_ops =3D { + .read =3D asc_fifo_read, + .write =3D asc_fifo_write, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 1, + }, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + +static void asc_fifo_reset(ASCFIFOState *fs); + +static uint64_t asc_read(void *opaque, hwaddr addr, + unsigned size) +{ + ASCState *s =3D opaque; + uint64_t prev, value; + + switch (addr) { + case ASC_VERSION: + switch (s->type) { + default: + case ASC_TYPE_ASC: + value =3D 0; + break; + case ASC_TYPE_EASC: + value =3D 0xb0; + break; + } + break; + case ASC_FIFOIRQ: + prev =3D (s->fifos[0].int_status & 0x3) | + (s->fifos[1].int_status & 0x3) << 2; + + s->fifos[0].int_status =3D 0; + s->fifos[1].int_status =3D 0; + asc_lower_irq(s); + value =3D prev; + break; + default: + value =3D s->regs[addr]; + break; + } + + trace_asc_read_reg(addr, size, value); + return value; +} + +static void asc_write(void *opaque, hwaddr addr, uint64_t value, + unsigned size) +{ + ASCState *s =3D opaque; + + switch (addr) { + case ASC_MODE: + value &=3D 3; + if (value !=3D s->regs[ASC_MODE]) { + asc_fifo_reset(&s->fifos[0]); + asc_fifo_reset(&s->fifos[1]); + asc_lower_irq(s); + if (value !=3D 0) { + AUD_set_active_out(s->voice, 1); + } else { + AUD_set_active_out(s->voice, 0); + } + } + break; + case ASC_FIFOMODE: + if (value & 0x80) { + asc_fifo_reset(&s->fifos[0]); + asc_fifo_reset(&s->fifos[1]); + asc_lower_irq(s); + } + break; + case ASC_WAVECTRL: + break; + case ASC_VOLUME: + { + int vol =3D (value & 0xe0); + + AUD_set_volume_out(s->voice, 0, vol, vol); + break; + } + } + + trace_asc_write_reg(addr, size, value); + s->regs[addr] =3D value; +} + +static const MemoryRegionOps asc_regs_ops =3D { + .read =3D asc_read, + .write =3D asc_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 1, + } +}; + +static uint64_t asc_ext_read(void *opaque, hwaddr addr, + unsigned size) +{ + ASCFIFOState *fs =3D opaque; + uint64_t value; + + value =3D fs->extregs[addr]; + + trace_asc_read_extreg('A' + fs->index, addr, size, value); + return value; +} + +static void asc_ext_write(void *opaque, hwaddr addr, uint64_t value, + unsigned size) +{ + ASCFIFOState *fs =3D opaque; + + trace_asc_write_extreg('A' + fs->index, addr, size, value); + + fs->extregs[addr] =3D value; +} + +static const MemoryRegionOps asc_extregs_ops =3D { + .read =3D asc_ext_read, + .write =3D asc_ext_write, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 1, + }, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + +static int asc_post_load(void *opaque, int version) +{ + ASCState *s =3D ASC(opaque); + + if (s->regs[ASC_MODE] !=3D 0) { + AUD_set_active_out(s->voice, 1); + } + + return 0; +} + +static const VMStateDescription vmstate_asc_fifo =3D { + .name =3D "apple-sound-chip.fifo", + .version_id =3D 0, + .minimum_version_id =3D 0, + .fields =3D (VMStateField[]) { + VMSTATE_UINT8_ARRAY(fifo, ASCFIFOState, ASC_FIFO_SIZE), + VMSTATE_UINT8(int_status, ASCFIFOState), + VMSTATE_INT32(cnt, ASCFIFOState), + VMSTATE_INT32(wptr, ASCFIFOState), + VMSTATE_INT32(rptr, ASCFIFOState), + VMSTATE_UINT8_ARRAY(extregs, ASCFIFOState, ASC_EXTREG_SIZE), + VMSTATE_INT32(xa_cnt, ASCFIFOState), + VMSTATE_UINT8(xa_val, ASCFIFOState), + VMSTATE_UINT8(xa_flags, ASCFIFOState), + VMSTATE_INT16_ARRAY(xa_last, ASCFIFOState, 2), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_asc =3D { + .name =3D "apple-sound-chip", + .version_id =3D 0, + .minimum_version_id =3D 0, + .post_load =3D asc_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT_ARRAY(fifos, ASCState, 2, 0, vmstate_asc_fifo, + ASCFIFOState), + VMSTATE_UINT8_ARRAY(regs, ASCState, ASC_REG_SIZE), + VMSTATE_END_OF_LIST() + } +}; + +static void asc_fifo_reset(ASCFIFOState *fs) +{ + fs->wptr =3D 0; + fs->rptr =3D 0; + fs->cnt =3D 0; + fs->xa_cnt =3D -1; + fs->int_status =3D 0; +} + +static void asc_fifo_init(ASCFIFOState *fs, int index) +{ + ASCState *s =3D container_of(fs, ASCState, fifos[index]); + char *name; + + fs->index =3D index; + name =3D g_strdup_printf("asc.fifo%c", 'A' + index); + memory_region_init_io(&fs->mem_fifo, OBJECT(s), &asc_fifo_ops, fs, + name, ASC_FIFO_SIZE); + g_free(name); + + name =3D g_strdup_printf("asc.extregs%c", 'A' + index); + memory_region_init_io(&fs->mem_extregs, OBJECT(s), &asc_extregs_ops, + fs, name, ASC_EXTREG_SIZE); + g_free(name); +} + +static void asc_reset_hold(Object *obj) +{ + ASCState *s =3D ASC(obj); + + AUD_set_active_out(s->voice, 0); + + memset(s->regs, 0, sizeof(s->regs)); + asc_fifo_reset(&s->fifos[0]); + asc_fifo_reset(&s->fifos[1]); + + if (s->type =3D=3D ASC_TYPE_ASC) { + /* FIFO half full IRQs enabled by default */ + s->fifos[0].extregs[ASC_EXTREGS_INTCTRL] =3D 1; + s->fifos[1].extregs[ASC_EXTREGS_INTCTRL] =3D 1; + } +} + +static void asc_unrealize(DeviceState *dev) +{ + ASCState *s =3D ASC(dev); + + g_free(s->mixbuf); + + AUD_remove_card(&s->card); +} + +static void asc_realize(DeviceState *dev, Error **errp) +{ + ASCState *s =3D ASC(dev); + struct audsettings as; + + AUD_register_card("Apple Sound Chip", &s->card); + + as.freq =3D 22257; + as.nchannels =3D 2; + as.fmt =3D AUDIO_FORMAT_U8; + as.endianness =3D AUDIO_HOST_ENDIANNESS; + + s->voice =3D AUD_open_out(&s->card, s->voice, "asc.out", s, asc_out_cb, + &as); + s->shift =3D 1; + s->samples =3D AUD_get_buffer_size_out(s->voice) >> s->shift; + s->mixbuf =3D g_malloc0(s->samples << s->shift); + + /* Add easc registers if required */ + if (s->type =3D=3D ASC_TYPE_EASC) { + memory_region_add_subregion(&s->asc, ASC_EXTREG_OFFSET, + &s->fifos[0].mem_extregs); + memory_region_add_subregion(&s->asc, + ASC_EXTREG_OFFSET + ASC_EXTREG_SIZE, + &s->fifos[1].mem_extregs); + } +} + +static void asc_init(Object *obj) +{ + ASCState *s =3D ASC(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + + memory_region_init(&s->asc, OBJECT(obj), "asc", ASC_SIZE); + + asc_fifo_init(&s->fifos[0], 0); + asc_fifo_init(&s->fifos[1], 1); + + memory_region_add_subregion(&s->asc, ASC_FIFO_OFFSET, + &s->fifos[0].mem_fifo); + memory_region_add_subregion(&s->asc, + ASC_FIFO_OFFSET + ASC_FIFO_SIZE, + &s->fifos[1].mem_fifo); + + memory_region_init_io(&s->mem_regs, OBJECT(obj), &asc_regs_ops, s, + "asc.regs", ASC_REG_SIZE); + memory_region_add_subregion(&s->asc, ASC_REG_OFFSET, &s->mem_regs); + + sysbus_init_irq(sbd, &s->irq); + sysbus_init_mmio(sbd, &s->asc); +} + +static Property asc_properties[] =3D { + DEFINE_AUDIO_PROPERTIES(ASCState, card), + DEFINE_PROP_UINT8("asctype", ASCState, type, ASC_TYPE_ASC), + DEFINE_PROP_END_OF_LIST(), +}; + +static void asc_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + ResettableClass *rc =3D RESETTABLE_CLASS(oc); + + dc->realize =3D asc_realize; + dc->unrealize =3D asc_unrealize; + set_bit(DEVICE_CATEGORY_SOUND, dc->categories); + dc->vmsd =3D &vmstate_asc; + device_class_set_props(dc, asc_properties); + rc->phases.hold =3D asc_reset_hold; +} + +static const TypeInfo asc_info_types[] =3D { + { + .name =3D TYPE_ASC, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(ASCState), + .instance_init =3D asc_init, + .class_init =3D asc_class_init, + }, +}; + +DEFINE_TYPES(asc_info_types) diff --git a/hw/audio/meson.build b/hw/audio/meson.build index d0fda1009e..8805322f5c 100644 --- a/hw/audio/meson.build +++ b/hw/audio/meson.build @@ -1,6 +1,7 @@ system_ss.add(files('soundhw.c')) system_ss.add(when: 'CONFIG_AC97', if_true: files('ac97.c')) system_ss.add(when: 'CONFIG_ADLIB', if_true: files('fmopl.c', 'adlib.c')) +system_ss.add(when: 'CONFIG_ASC', if_true: files('asc.c')) system_ss.add(when: 'CONFIG_CS4231', if_true: files('cs4231.c')) system_ss.add(when: 'CONFIG_CS4231A', if_true: files('cs4231a.c')) system_ss.add(when: 'CONFIG_ES1370', if_true: files('es1370.c')) diff --git a/hw/audio/trace-events b/hw/audio/trace-events index 4dec48a4fd..89ef2996e5 100644 --- a/hw/audio/trace-events +++ b/hw/audio/trace-events @@ -17,3 +17,13 @@ via_ac97_codec_write(uint8_t addr, uint16_t val) "0x%x <= - 0x%x" via_ac97_sgd_fetch(uint32_t curr, uint32_t addr, char stop, char eol, char= flag, uint32_t len) "curr=3D0x%x addr=3D0x%x %c%c%c len=3D%d" via_ac97_sgd_read(uint64_t addr, unsigned size, uint64_t val) "0x%"PRIx64"= %d -> 0x%"PRIx64 via_ac97_sgd_write(uint64_t addr, unsigned size, uint64_t val) "0x%"PRIx64= " %d <- 0x%"PRIx64 + +# asc.c +asc_read_fifo(const char fifo, int reg, unsigned size, uint64_t value) "fi= fo %c reg=3D0x%03x size=3D%u value=3D0x%"PRIx64 +asc_read_reg(int reg, unsigned size, uint64_t value) "reg=3D0x%03x size=3D= %u value=3D0x%"PRIx64 +asc_read_extreg(const char fifo, int reg, unsigned size, uint64_t value) "= fifo %c reg=3D0x%03x size=3D%u value=3D0x%"PRIx64 +asc_fifo_get(const char fifo, int rptr, int cnt, uint64_t value) "fifo %c = rptr=3D0x%x cnt=3D0x%x value=3D0x%"PRIx64 +asc_write_fifo(const char fifo, int reg, unsigned size, int wrptr, int cnt= , uint64_t value) "fifo %c reg=3D0x%03x size=3D%u wptr=3D0x%x cnt=3D0x%x va= lue=3D0x%"PRIx64 +asc_write_reg(int reg, unsigned size, uint64_t value) "reg=3D0x%03x size= =3D%u value=3D0x%"PRIx64 +asc_write_extreg(const char fifo, int reg, unsigned size, uint64_t value) = "fifo %c reg=3D0x%03x size=3D%u value=3D0x%"PRIx64 +asc_update_irq(int irq, int a, int b) "set IRQ to %d (A: 0x%x B: 0x%x)" diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig index 64fa70a0db..d88741ec9d 100644 --- a/hw/m68k/Kconfig +++ b/hw/m68k/Kconfig @@ -25,6 +25,7 @@ config Q800 select OR_IRQ select DJMEMC select IOSB + select ASC =20 config M68K_VIRT bool diff --git a/include/hw/audio/asc.h b/include/hw/audio/asc.h new file mode 100644 index 0000000000..41c6cba8fa --- /dev/null +++ b/include/hw/audio/asc.h @@ -0,0 +1,79 @@ +/* + * QEMU Apple Sound Chip emulation + * + * Apple Sound Chip (ASC) 344S0063 + * Enhanced Apple Sound Chip (EASC) 343S1063 + * + * Copyright (c) 2012-2018 Laurent Vivier + * Copyright (c) 2022 Mark Cave-Ayland + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_AUDIO_ASC_H +#define HW_AUDIO_ASC_H + +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "audio/audio.h" + +enum { + ASC_TYPE_ASC =3D 0, /* original discrete Apple Sound Chip */ + ASC_TYPE_EASC =3D 1 /* discrete Enhanced Apple Sound Chip */ +}; + +#define ASC_FIFO_OFFSET 0x0 +#define ASC_FIFO_SIZE 0x400 + +#define ASC_REG_OFFSET 0x800 +#define ASC_REG_SIZE 0x60 + +#define ASC_EXTREG_OFFSET 0xf00 +#define ASC_EXTREG_SIZE 0x20 + +typedef struct ASCFIFOState { + int index; + + MemoryRegion mem_fifo; + uint8_t fifo[ASC_FIFO_SIZE]; + uint8_t int_status; + + int cnt; + int wptr; + int rptr; + + MemoryRegion mem_extregs; + uint8_t extregs[ASC_EXTREG_SIZE]; + + int xa_cnt; + uint8_t xa_val; + uint8_t xa_flags; + int16_t xa_last[2]; +} ASCFIFOState; + +struct ASCState { + SysBusDevice parent_obj; + + uint8_t type; + MemoryRegion asc; + MemoryRegion mem_fifo; + MemoryRegion mem_regs; + MemoryRegion mem_extregs; + + QEMUSoundCard card; + SWVoiceOut *voice; + uint8_t *mixbuf; + int samples; + int shift; + + qemu_irq irq; + + ASCFIFOState fifos[2]; + + uint8_t regs[ASC_REG_SIZE]; +}; + +#define TYPE_ASC "apple-sound-chip" +OBJECT_DECLARE_SIMPLE_TYPE(ASCState, ASC) + +#endif --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 168831298059068.7062183743999; Sun, 2 Jul 2023 08:49:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKC-0004QO-TU; Sun, 02 Jul 2023 11:49:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKA-0004Ps-Nc for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:18 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzK8-0007RN-PI for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:18 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJx-0001Ji-A6; Sun, 02 Jul 2023 16:49:05 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=G7IDZZ2EE3/FLoDyp3shTPN+mXi9/uXytBT9RdNQXYo=; b=EYswbqDta3TRuB7WZ6uPBY7iU5 N1ceKaTWcHj8AcSAmbSV3g1DCfjoxNOzPYCOd2B3yNlYvOyIz3TR7IBrzNIv8dBY8bT+qM5+KYk9U V0TGzjHvH9R7eXK3p4859PQI9voXYzNuPJf9tUv+OIJ3oYyxNfTUK6ICqhGksWjAurLgPysPz+gUL iGpo+czpXI3wDh5+8lIpgHh738sVsmvrN3DhQCiXSeFIHqKhKkMzjxutS2ev9Du5mDnkEpfRvArEP 2YHOrz2XUIrds5oKf3U6c0LCA5SnV3baQm8PtWpn5s/wuEV4HrUGNP0YnDzXgGsL+wZNi8OZ6EODo H4U1t1JTV5FMQjbXAm6toU4o0CWlY/Gv5inPorPscJqubc9gkNO4DTnl8lJ1h+iWlezz/VLPVxDbA AbTAv6oeNMP0XO3w/8/Ay0vHDIEm+vfV7ihkBa//pEXPOmlzvQ8uKQQahJTPPZdE7K4BNhp7K3AuB tnFPqWyqE2MnuzQ+w1thtSQ3qGpo4jAlUgawAxiX8yMEuA+7nkUyGXNdx3OxgBd8rLxOEU0PdtqZe qWSJK7cvpEjakVru077hEQOVetgWTkWERd+KFUVBWS2KhhhFjm0Q6wRDkVdeNIJzi5sh2eeBdQhB3 z8Z2HTjbTZt+kJqgWyCXPsx5lRmxBhYF1MT+qIZEM=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:25 +0100 Message-Id: <20230702154838.722809-9-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 08/21] asc: generate silence if FIFO empty but engine still running X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312982520100002 Content-Type: text/plain; charset="utf-8" MacOS (un)helpfully leaves the FIFO engine running even when all the sample= s have been written to the hardware, and expects the FIFO status flags and IRQ to = be updated continuously. Since not all audio backends guarantee an all-zero output when no data is provided, explicitly generate at least one full output buffer of all-zero o= utput when the FIFO is disabled and continuously if the FIFO is empty. Otherwise = some audio backends such as Windows re-use their internal buffers causing the la= st played sound to loop indefinitely. Signed-off-by: Mark Cave-Ayland --- hw/audio/asc.c | 43 ++++++++++++++++++++++++++++++++---------- include/hw/audio/asc.h | 1 + 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/hw/audio/asc.c b/hw/audio/asc.c index ebcb8a97a6..f9bfae5168 100644 --- a/hw/audio/asc.c +++ b/hw/audio/asc.c @@ -148,6 +148,20 @@ static uint8_t asc_fifo_get(ASCFIFOState *fs) return val; } =20 +static int generate_silence(ASCState *s, int maxsamples) +{ + uint8_t *buf =3D s->mixbuf; + + if (s->flush_zero_samples) { + memset(buf, 0x80, maxsamples << s->shift); + s->flush_zero_samples -=3D MIN(maxsamples, s->flush_zero_samples); + + return maxsamples; + } + + return 0; +} + static int generate_fifo(ASCState *s, int maxsamples) { uint8_t *buf =3D s->mixbuf; @@ -156,18 +170,26 @@ static int generate_fifo(ASCState *s, int maxsamples) limit =3D MIN(MAX(s->fifos[0].cnt, s->fifos[1].cnt), maxsamples); =20 /* - * If starting a new run with no FIFO data present, update the IRQ and - * continue + * MacOS (un)helpfully leaves the FIFO engine running even when it has + * finished writing out samples. Since not all audio backends guarante= e an + * all-zero output when no data is provided, zero out the sample buffer + * and then update the FIFO flags and IRQ as normal and continue */ - if (limit =3D=3D 0 && s->fifos[0].int_status =3D=3D 0 && - s->fifos[1].int_status =3D=3D 0) { - s->fifos[0].int_status |=3D ASC_FIFO_STATUS_HALF_FULL | - ASC_FIFO_STATUS_FULL_EMPTY; - s->fifos[1].int_status |=3D ASC_FIFO_STATUS_HALF_FULL | - ASC_FIFO_STATUS_FULL_EMPTY; + if (limit =3D=3D 0) { + if (s->fifos[0].int_status =3D=3D 0 && s->fifos[1].int_status =3D= =3D 0) { + s->fifos[0].int_status |=3D ASC_FIFO_STATUS_HALF_FULL | + ASC_FIFO_STATUS_FULL_EMPTY; + s->fifos[1].int_status |=3D ASC_FIFO_STATUS_HALF_FULL | + ASC_FIFO_STATUS_FULL_EMPTY; + } + + if (s->flush_zero_samples =3D=3D 0) { + s->flush_zero_samples =3D s->samples; + } =20 + generate_silence(s, maxsamples); asc_raise_irq(s); - return 0; + return maxsamples; } =20 while (count < limit) { @@ -309,7 +331,7 @@ static void asc_out_cb(void *opaque, int free_b) switch (s->regs[ASC_MODE] & 3) { default: /* Off */ - samples =3D 0; + samples =3D generate_silence(s, samples); break; case 1: /* FIFO mode */ @@ -437,6 +459,7 @@ static void asc_write(void *opaque, hwaddr addr, uint64= _t value, asc_lower_irq(s); if (value !=3D 0) { AUD_set_active_out(s->voice, 1); + s->flush_zero_samples =3D 0; } else { AUD_set_active_out(s->voice, 0); } diff --git a/include/hw/audio/asc.h b/include/hw/audio/asc.h index 41c6cba8fa..918f6ac582 100644 --- a/include/hw/audio/asc.h +++ b/include/hw/audio/asc.h @@ -65,6 +65,7 @@ struct ASCState { uint8_t *mixbuf; int samples; int shift; + uint32_t flush_zero_samples; =20 qemu_irq irq; =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312985444215.11482741677514; Sun, 2 Jul 2023 08:49:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKF-0004Qx-MM; Sun, 02 Jul 2023 11:49:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKF-0004Qo-1y for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:23 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKD-0007Rx-ER for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:22 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzJx-0001Ji-L5; Sun, 02 Jul 2023 16:49:10 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=Z1AJRwxt+2g/RjyKM+q/yhnYY3uDv0LXDALeobAIG8I=; b=bj6pnhyqi9/S/pfL3l9XjZ1B+l WQSXLLHsWMYPORRXE+0vE2D9S2+LOV3MuytYsH8n4zSgCkOxcplagnO/LkSrLkD/4pb09yQO5D0+D fLVNQKQ/k3AdG8EwpcZvEiXM1WOrAES6YdxeGwCZDTQNrgFRf9T1579us5YjLYvYiTqKRRKgHY5VW 112xlsJJ5w+kGj2cxQPS8m/6BTx8SJfOnwfrVmaDlnv/FuGn2r8RV44zt5Z832N7zKNKldfrjvFqH A02YZmVJhuKUmEIsqkXvVIdDVgkbe7Js6s6ItQyL0KtYBqsZSSTPeibkyEFAy4s1ZfKH/aPukDvc8 3j68jYKLrp0DkLM6YWzYyIqQJN3qnN+5bdcvE57UFenNy9vQLA86CvnF4cBzZNegJ5fVWF9JiAoO/ 2xyG/Nu3NrbY+ze1smdHutIZ95xoA0AxxpBeg4LmbnJB7UObn35lh3pmdZGaROo+Xq9vGgZGLmrXJ eQc96QLsKKRk+88fQAU2FhxYGZidmdAcY7NpQJjDf65TWg66Juk876gFasP3hGkVe2MjC9vzJpPwt mVyeaaz/a9B6p8rdJzwQm+vHwX4yq4bEkqW/aIhVYZGkIrNytwl5QVNUKadKvGhbWIlPKSFnpI9qy eT8eIiw/m4HoVittF7SaVH2RMiot1YAY3h8GCDw1E=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:26 +0100 Message-Id: <20230702154838.722809-10-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 09/21] q800: add Apple Sound Chip (ASC) audio to machine X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312987630100002 Content-Type: text/plain; charset="utf-8" The Quadra 800 has the enhanced ASC (EASC) audio chip which supports both t= he legacy IRQ routing through VIA2 and also "A/UX" mode routing direct to the CPU. Co-developed-by: Laurent Vivier Signed-off-by: Mark Cave-Ayland --- hw/m68k/q800-glue.c | 11 ++++++++++- hw/m68k/q800.c | 17 +++++++++++++++++ include/hw/m68k/q800-glue.h | 4 +++- include/hw/m68k/q800.h | 2 ++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/hw/m68k/q800-glue.c b/hw/m68k/q800-glue.c index 710a5c331e..f413b1599a 100644 --- a/hw/m68k/q800-glue.c +++ b/hw/m68k/q800-glue.c @@ -97,6 +97,11 @@ static void GLUE_set_irq(void *opaque, int irq, int leve= l) irq =3D 6; break; =20 + case GLUE_IRQ_IN_ASC: + /* Route to VIA2 instead, negative edge-triggered */ + qemu_set_irq(s->irqs[GLUE_IRQ_ASC], !level); + return; + default: g_assert_not_reached(); } @@ -123,6 +128,10 @@ static void GLUE_set_irq(void *opaque, int irq, int le= vel) irq =3D 6; break; =20 + case GLUE_IRQ_IN_ASC: + irq =3D 4; + break; + default: g_assert_not_reached(); } @@ -214,7 +223,7 @@ static void glue_init(Object *obj) qdev_init_gpio_in(dev, GLUE_set_irq, 8); qdev_init_gpio_in_named(dev, glue_auxmode_set_irq, "auxmode", 1); =20 - qdev_init_gpio_out(dev, s->irqs, 1); + qdev_init_gpio_out(dev, s->irqs, 2); =20 /* NMI release timer */ s->nmi_release =3D timer_new_ms(QEMU_CLOCK_VIRTUAL, glue_nmi_release, = s); diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index 3209309173..ae07aa20ff 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -43,6 +43,7 @@ #include "hw/misc/djmemc.h" #include "hw/misc/iosb.h" #include "hw/input/adb.h" +#include "hw/audio/asc.h" #include "hw/nubus/mac-nubus-bridge.h" #include "hw/display/macfb.h" #include "hw/block/swim.h" @@ -480,6 +481,22 @@ static void q800_machine_init(MachineState *machine) =20 scsi_bus_legacy_handle_cmdline(&esp->bus); =20 + /* Apple Sound Chip */ + + object_initialize_child(OBJECT(machine), "asc", &m->asc, TYPE_ASC); + qdev_prop_set_uint8(DEVICE(&m->asc), "asctype", ASC_TYPE_EASC); + sysbus =3D SYS_BUS_DEVICE(&m->asc); + sysbus_realize_and_unref(sysbus, &error_fatal); + memory_region_add_subregion(&m->macio, ASC_BASE - IO_BASE, + sysbus_mmio_get_region(sysbus, 0)); + sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(DEVICE(&m->glue), + GLUE_IRQ_IN_ASC)); + + /* Wire ASC IRQ via GLUE for use in classic mode */ + qdev_connect_gpio_out(DEVICE(&m->glue), GLUE_IRQ_ASC, + qdev_get_gpio_in(DEVICE(&m->via2), + VIA2_IRQ_ASC_BIT)); + /* SWIM floppy controller */ =20 object_initialize_child(OBJECT(machine), "swim", &m->swim, diff --git a/include/hw/m68k/q800-glue.h b/include/hw/m68k/q800-glue.h index a35efc1c53..ceb916d16c 100644 --- a/include/hw/m68k/q800-glue.h +++ b/include/hw/m68k/q800-glue.h @@ -35,7 +35,7 @@ struct GLUEState { M68kCPU *cpu; uint8_t ipr; uint8_t auxmode; - qemu_irq irqs[1]; + qemu_irq irqs[2]; QEMUTimer *nmi_release; }; =20 @@ -44,7 +44,9 @@ struct GLUEState { #define GLUE_IRQ_IN_SONIC 2 #define GLUE_IRQ_IN_ESCC 3 #define GLUE_IRQ_IN_NMI 4 +#define GLUE_IRQ_IN_ASC 5 =20 #define GLUE_IRQ_NUBUS_9 0 +#define GLUE_IRQ_ASC 1 =20 #endif diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index 04e4e0bce3..790cf433f3 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -38,6 +38,7 @@ #include "hw/display/macfb.h" #include "hw/misc/djmemc.h" #include "hw/misc/iosb.h" +#include "hw/audio/asc.h" =20 /* * The main Q800 machine @@ -60,6 +61,7 @@ struct Q800MachineState { MacfbNubusState macfb; DJMEMCState djmemc; IOSBState iosb; + ASCState asc; MemoryRegion ramio; MemoryRegion macio; MemoryRegion macio_alias; --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313047120631.1526265340318; Sun, 2 Jul 2023 08:50:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKL-0004Rf-56; Sun, 02 Jul 2023 11:49:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKJ-0004RJ-4O for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:27 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKH-0007SK-H0 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:26 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzK2-0001Ji-3V; Sun, 02 Jul 2023 16:49:14 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=EMVpZkewzdBU5s5V36FPZUP8gSfxVj3WxFjnNF32FeQ=; b=EDOTQZ6db4XYgTP3Ex2dOuYhys mqBw8AcSWhcIychmZdzwoqiK4UbPZePWRABQSPX0wfMQS7X7Ylf387++WXVs8+7/RMLewO/AzTunF kPnsYFOX5TNfLVeHyf5yOtyf5yApqgoStYgRkQiqYCwc314g387hkgNFAE0basBuwCgQrpYzMFOq8 QQv3C+KwJ9t+Fi1uKY5EAUvfyrQv59mxu+VwDqudoJ+WZ6IRANElLjTEYo1ic0GI/5UCw+uK4iQgu 9Pqk1LQmUQ38iMyhpnm69y7L1K7Ia438ZxdJ6cegf60T4l3zkV27+6AajFrMWF0e5C/uXZ4pfRjfr Zebe1zjML7yueCmKSJH4btL8FFXbK563pcGcmy+RPBqXytC/1vyCIQUkv8fs5QPnnFfCGRYbagY5K zA56HsfICoBI7FNr7m8q+pmkT3mX11HGqsvqjhaLEd17UyHeOyJt/is3h7mPbuPDDF3f9SgZZyVzA B4ERJ+QK9QJhbbmYa4c2RhFwt/K/Rrpf9AEoufbvISKovWn6o5bMeiuID29ebWJce14EdYc87VuWv EuYwBHewxBFWvRLAkUM+iDj/IRzwgKqxHz+QEGU2dwLSixzc2WSd1GjI8Q5PJ+n0SB86vz1K2hR30 W4es3uLadElN68JVKjk7/TrHQu+L7HET8nf9gjUuk=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:27 +0100 Message-Id: <20230702154838.722809-11-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 10/21] q800: add easc bool machine class property to switch between ASC and EASC X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313047325100001 Content-Type: text/plain; charset="utf-8" This determines whether the Apple Sound Chip (ASC) is set to enhanced mode (default) or to original mode. The real Q800 hardware used an EASC chip how= ever a lot of older software only works with the older ASC chip. Adding this as a machine parameter allows QEMU to be used as an developer a= id for testing and migrating code from ASC to EASC. Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/m68k/q800.c | 30 +++++++++++++++++++++++++++++- include/hw/m68k/q800.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index ae07aa20ff..5ae7c37760 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -484,7 +484,8 @@ static void q800_machine_init(MachineState *machine) /* Apple Sound Chip */ =20 object_initialize_child(OBJECT(machine), "asc", &m->asc, TYPE_ASC); - qdev_prop_set_uint8(DEVICE(&m->asc), "asctype", ASC_TYPE_EASC); + qdev_prop_set_uint8(DEVICE(&m->asc), "asctype", m->easc ? ASC_TYPE_EASC + : ASC_TYPE_ASC= ); sysbus =3D SYS_BUS_DEVICE(&m->asc); sysbus_realize_and_unref(sysbus, &error_fatal); memory_region_add_subregion(&m->macio, ASC_BASE - IO_BASE, @@ -674,6 +675,28 @@ static void q800_machine_init(MachineState *machine) } } =20 +static bool q800_get_easc(Object *obj, Error **errp) +{ + Q800MachineState *ms =3D Q800_MACHINE(obj); + + return ms->easc; +} + +static void q800_set_easc(Object *obj, bool value, Error **errp) +{ + Q800MachineState *ms =3D Q800_MACHINE(obj); + + ms->easc =3D value; +} + +static void q800_init(Object *obj) +{ + Q800MachineState *ms =3D Q800_MACHINE(obj); + + /* Default to EASC */ + ms->easc =3D true; +} + static GlobalProperty hw_compat_q800[] =3D { { "scsi-hd", "quirk_mode_page_vendor_specific_apple", "on" }, { "scsi-hd", "vendor", " SEAGATE" }, @@ -706,11 +729,16 @@ static void q800_machine_class_init(ObjectClass *oc, = void *data) mc->block_default_type =3D IF_SCSI; mc->default_ram_id =3D "m68k_mac.ram"; compat_props_add(mc->compat_props, hw_compat_q800, hw_compat_q800_len); + + object_class_property_add_bool(oc, "easc", q800_get_easc, q800_set_eas= c); + object_class_property_set_description(oc, "easc", + "Set to off to use ASC rather than EASC"); } =20 static const TypeInfo q800_machine_typeinfo =3D { .name =3D MACHINE_TYPE_NAME("q800"), .parent =3D TYPE_MACHINE, + .instance_init =3D q800_init, .instance_size =3D sizeof(Q800MachineState), .class_init =3D q800_machine_class_init, }; diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index 790cf433f3..fbaacd88bd 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -47,6 +47,7 @@ struct Q800MachineState { MachineState parent_obj; =20 + bool easc; M68kCPU cpu; MemoryRegion rom; GLUEState glue; --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688312987240329.3523801723193; Sun, 2 Jul 2023 08:49:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKO-0004Sd-Ne; Sun, 02 Jul 2023 11:49:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKN-0004S9-9G for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:31 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKL-0007Sc-P4 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:30 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzK6-0001Ji-9P; Sun, 02 Jul 2023 16:49:18 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=3tWH303321WAcL09/DeykWySrm0JwC/AP9A1pDKJM+Q=; b=DIDuy88f0G224P1mgpIDucZhqn tWURLzY2K4Xzgl7IFQ8P5xwdAKlf3jCMvAv+gCamaKjYn1sVql8hgOGZGKISv/YL0bX1rHnR/J3Q9 kAWjdtZTAznIRZ5U2Lz5grBdRIX5njWNBSHKcaLmpThI6aIcdAi8DU6cG7UixeLEMmV/2ePaRlq5b aO8Qki0iikaJj/84kqTSODj+XEr68Xj0YXd29lPEIzVsWPFpvxaAi8VOqOLGX4oL2ttlPC7IIbWYM rqdk2kr1HOpTWeKTAcXrE1UeJVlcX67H3bewEdwYINhW6OLI4Pj67+jiFNGeLJYcii8PDRy0+QZNk zPTh/PpRGea2PsN+sgGH7VKbhdY5nmNzZebpe/tEq0szjsXQySTLJmCXJmUHzmSx4x7eecrQGuvO1 S/iJ563AnZxyQ+7y5yOzNcOygqbx2jw8TzV3EPPuVTXO8Msra4w4bJ4e4Kp1Et9BcJhEFfMDVe5yp o5vIbt3g2042JutuI7jraKUfPTh08UV7ntwkdnB7MHdYBn5R021f3rKBYM+sZ9BAqaDmo7cZpVcQT uCDQmi40N5Voj7wCUeKFsZl48HfhTWgPMY+qY1jCD7tE54AVCiQg4LMDE860puoPVa3By2Dn9s6Ui VWApEU0x5IIm+n94gEeSRSK1M1uOeK3FWsss4pG84=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:28 +0100 Message-Id: <20230702154838.722809-12-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 11/21] swim: add trace events for IWM and ISM registers X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688312987732100007 Content-Type: text/plain; charset="utf-8" Signed-off-by: Mark Cave-Ayland Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/swim.c | 14 ++++++++++++++ hw/block/trace-events | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/hw/block/swim.c b/hw/block/swim.c index 333da08ce0..7df36ea139 100644 --- a/hw/block/swim.c +++ b/hw/block/swim.c @@ -19,6 +19,7 @@ #include "hw/block/block.h" #include "hw/block/swim.h" #include "hw/qdev-properties.h" +#include "trace.h" =20 /* IWM registers */ =20 @@ -125,6 +126,13 @@ #define SWIM_HEDSEL 0x20 #define SWIM_MOTON 0x80 =20 +static const char *swim_reg_names[] =3D { + "WRITE_DATA", "WRITE_MARK", "WRITE_CRC", "WRITE_PARAMETER", + "WRITE_PHASE", "WRITE_SETUP", "WRITE_MODE0", "WRITE_MODE1", + "READ_DATA", "READ_MARK", "READ_ERROR", "READ_PARAMETER", + "READ_PHASE", "READ_SETUP", "READ_STATUS", "READ_HANDSHAKE" +}; + static void fd_recalibrate(FDrive *drive) { } @@ -267,6 +275,7 @@ static void iwmctrl_write(void *opaque, hwaddr reg, uin= t64_t value, reg >>=3D REG_SHIFT; =20 swimctrl->regs[reg >> 1] =3D reg & 1; + trace_swim_iwmctrl_write((reg >> 1), size, (reg & 1)); =20 if (swimctrl->regs[IWM_Q6] && swimctrl->regs[IWM_Q7]) { @@ -297,6 +306,7 @@ static void iwmctrl_write(void *opaque, hwaddr reg, uin= t64_t value, if (value =3D=3D 0x57) { swimctrl->mode =3D SWIM_MODE_SWIM; swimctrl->iwm_switch =3D 0; + trace_swim_iwm_switch(); } break; } @@ -312,6 +322,7 @@ static uint64_t iwmctrl_read(void *opaque, hwaddr reg, = unsigned size) =20 swimctrl->regs[reg >> 1] =3D reg & 1; =20 + trace_swim_iwmctrl_read((reg >> 1), size, (reg & 1)); return 0; } =20 @@ -327,6 +338,8 @@ static void swimctrl_write(void *opaque, hwaddr reg, ui= nt64_t value, =20 reg >>=3D REG_SHIFT; =20 + trace_swim_swimctrl_write(reg, swim_reg_names[reg], size, value); + switch (reg) { case SWIM_WRITE_PHASE: swimctrl->swim_phase =3D value; @@ -376,6 +389,7 @@ static uint64_t swimctrl_read(void *opaque, hwaddr reg,= unsigned size) break; } =20 + trace_swim_swimctrl_read(reg, swim_reg_names[reg], size, value); return value; } =20 diff --git a/hw/block/trace-events b/hw/block/trace-events index 34be8b9135..c041ec45e3 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -90,3 +90,10 @@ m25p80_read_data(void *s, uint32_t pos, uint8_t v) "[%p]= Read data 0x%"PRIx32"=3D0 m25p80_read_sfdp(void *s, uint32_t addr, uint8_t v) "[%p] Read SFDP 0x%"PR= Ix32"=3D0x%"PRIx8 m25p80_binding(void *s) "[%p] Binding to IF_MTD drive" m25p80_binding_no_bdrv(void *s) "[%p] No BDRV - binding to RAM" + +# swim.c +swim_swimctrl_read(int reg, const char *name, unsigned size, uint64_t valu= e) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 +swim_swimctrl_write(int reg, const char *name, unsigned size, uint64_t val= ue) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 +swim_iwmctrl_read(int reg, unsigned size, uint64_t value) "reg=3D%d size= =3D%u value=3D0x%"PRIx64 +swim_iwmctrl_write(int reg, unsigned size, uint64_t value) "reg=3D%d size= =3D%u value=3D0x%"PRIx64 +swim_iwm_switch(void) "switch from IWM to SWIM mode" --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313105439295.5888832536483; Sun, 2 Jul 2023 08:51:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKT-0004cO-9K; Sun, 02 Jul 2023 11:49:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKR-0004YX-NT for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:35 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKP-0007So-Mp for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:35 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKA-0001Ji-EE; Sun, 02 Jul 2023 16:49:22 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=zOhZLwEDp32Ne1rl6hj6hFHC8KllbzzMFDD8NAHcqpE=; b=h5iP0BGugBhV3C0ZNKjp6SrHa9 CSLxJ3TWZshDI5vmbNECHVVlaA7on0bFk9/wORkAYaKFg7qDFGboG1K1uzn+IMU+pojGiydjBj0Ju v2q1AAI1cO7QMIeVW2VTHHFbCzi610BnY7pgs4iEs8YVI3Wha8OGbbJQDPWXmUFvCuSldS42AWq7G ZfmZaa11Y8DVzrazVLXy4qNly1T6OLF6AUr5qtMi/I4ZvbCKwswjuNKbT2IMrrCbK+QT+k4ytxmVA 8CBch2KdLoW4l+O8360znjGT7ZUqR9z7AuNthWNSSSg6kXYYcNSwsinWfcEd/8FFXAF5JHu2EHb3Z 36RQVPQgBnr+lKPovGOEPyLxuGCScsDmnyDgc2yQ7ADReeXOszMVCT8y+pa4KPu8JhyfmiTHOItLQ j/iFlMrncBXzEqcJLpzxdq98aR91s1SappKvgpp+xknqjHEkY0GGy489JuFsYh4m3VhubwjMUdiTn nMclbUCzHGNbEbKzpa0MIPnLSLzNGiQbmiX1ppWGK4/1MX8ypFiDBc1fRKv+2h4iLKvltacqxPSht yD+kYcGXR1QPweKBYXeTbXdvw6eWF71KYoLTVaGTwmD/YmsbJW+DuXFeIs8hL4EIHaJNfuC/Qpk3F Tn9fUDEo8cVrMIWUCL1WxRliHMFMoJOS6EKWi20Is=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:29 +0100 Message-Id: <20230702154838.722809-13-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 12/21] swim: split into separate IWM and ISM register blocks X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313105693100003 Content-Type: text/plain; charset="utf-8" The swim chip provides an implementation of both Apple's IWM and ISM floppy= disk controllers. Split the existing implementation into separate register banks= for each controller, whilst also switching the IWM registers from 16-bit to 8-b= it as implemented in real hardware. Signed-off-by: Mark Cave-Ayland --- hw/block/swim.c | 85 ++++++++++++++++++++++++----------------- hw/block/trace-events | 4 +- include/hw/block/swim.h | 15 +++----- 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/hw/block/swim.c b/hw/block/swim.c index 7df36ea139..735b335883 100644 --- a/hw/block/swim.c +++ b/hw/block/swim.c @@ -126,7 +126,14 @@ #define SWIM_HEDSEL 0x20 #define SWIM_MOTON 0x80 =20 -static const char *swim_reg_names[] =3D { +static const char *iwm_reg_names[] =3D { + "PH0L", "PH0H", "PH1L", "PH1H", + "PH2L", "PH2H", "PH3L", "PH3H", + "MTROFF", "MTRON", "INTDRIVE", "EXTDRIVE", + "Q6L", "Q6H", "Q7L", "Q7H" +}; + +static const char *ism_reg_names[] =3D { "WRITE_DATA", "WRITE_MARK", "WRITE_CRC", "WRITE_PARAMETER", "WRITE_PHASE", "WRITE_SETUP", "WRITE_MODE0", "WRITE_MODE1", "READ_DATA", "READ_MARK", "READ_ERROR", "READ_PARAMETER", @@ -274,12 +281,11 @@ static void iwmctrl_write(void *opaque, hwaddr reg, u= int64_t value, =20 reg >>=3D REG_SHIFT; =20 - swimctrl->regs[reg >> 1] =3D reg & 1; - trace_swim_iwmctrl_write((reg >> 1), size, (reg & 1)); + swimctrl->iwmregs[reg] =3D value; + trace_swim_iwmctrl_write(reg, iwm_reg_names[reg], size, value); =20 - if (swimctrl->regs[IWM_Q6] && - swimctrl->regs[IWM_Q7]) { - if (swimctrl->regs[IWM_MTR]) { + if (swimctrl->iwmregs[IWM_Q7H]) { + if (swimctrl->iwmregs[IWM_MTRON]) { /* data register */ swimctrl->iwm_data =3D value; } else { @@ -307,6 +313,12 @@ static void iwmctrl_write(void *opaque, hwaddr reg, ui= nt64_t value, swimctrl->mode =3D SWIM_MODE_SWIM; swimctrl->iwm_switch =3D 0; trace_swim_iwm_switch(); + + /* Switch to ISM registers */ + memory_region_del_subregion(&swimctrl->swim, + &swimctrl->iwm); + memory_region_add_subregion(&swimctrl->swim, 0x0, + &swimctrl->ism); } break; } @@ -317,28 +329,30 @@ static void iwmctrl_write(void *opaque, hwaddr reg, u= int64_t value, static uint64_t iwmctrl_read(void *opaque, hwaddr reg, unsigned size) { SWIMCtrl *swimctrl =3D opaque; + uint16_t value; =20 reg >>=3D REG_SHIFT; =20 - swimctrl->regs[reg >> 1] =3D reg & 1; + value =3D swimctrl->iwmregs[reg]; + trace_swim_iwmctrl_read(reg, iwm_reg_names[reg], size, value); =20 - trace_swim_iwmctrl_read((reg >> 1), size, (reg & 1)); - return 0; + return value; } =20 -static void swimctrl_write(void *opaque, hwaddr reg, uint64_t value, - unsigned size) +static const MemoryRegionOps swimctrl_iwm_ops =3D { + .write =3D iwmctrl_write, + .read =3D iwmctrl_read, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + +static void ismctrl_write(void *opaque, hwaddr reg, uint64_t value, + unsigned size) { SWIMCtrl *swimctrl =3D opaque; =20 - if (swimctrl->mode =3D=3D SWIM_MODE_IWM) { - iwmctrl_write(opaque, reg, value, size); - return; - } - reg >>=3D REG_SHIFT; =20 - trace_swim_swimctrl_write(reg, swim_reg_names[reg], size, value); + trace_swim_swimctrl_write(reg, ism_reg_names[reg], size, value); =20 switch (reg) { case SWIM_WRITE_PHASE: @@ -359,15 +373,11 @@ static void swimctrl_write(void *opaque, hwaddr reg, = uint64_t value, } } =20 -static uint64_t swimctrl_read(void *opaque, hwaddr reg, unsigned size) +static uint64_t ismctrl_read(void *opaque, hwaddr reg, unsigned size) { SWIMCtrl *swimctrl =3D opaque; uint32_t value =3D 0; =20 - if (swimctrl->mode =3D=3D SWIM_MODE_IWM) { - return iwmctrl_read(opaque, reg, size); - } - reg >>=3D REG_SHIFT; =20 switch (reg) { @@ -389,14 +399,14 @@ static uint64_t swimctrl_read(void *opaque, hwaddr re= g, unsigned size) break; } =20 - trace_swim_swimctrl_read(reg, swim_reg_names[reg], size, value); + trace_swim_swimctrl_read(reg, ism_reg_names[reg], size, value); return value; } =20 -static const MemoryRegionOps swimctrl_mem_ops =3D { - .write =3D swimctrl_write, - .read =3D swimctrl_read, - .endianness =3D DEVICE_NATIVE_ENDIAN, +static const MemoryRegionOps swimctrl_ism_ops =3D { + .write =3D ismctrl_write, + .read =3D ismctrl_read, + .endianness =3D DEVICE_BIG_ENDIAN, }; =20 static void sysbus_swim_reset(DeviceState *d) @@ -407,13 +417,13 @@ static void sysbus_swim_reset(DeviceState *d) =20 ctrl->mode =3D 0; ctrl->iwm_switch =3D 0; - for (i =3D 0; i < 8; i++) { - ctrl->regs[i] =3D 0; - } ctrl->iwm_data =3D 0; ctrl->iwm_mode =3D 0; + memset(ctrl->iwmregs, 0, 16); + ctrl->swim_phase =3D 0; ctrl->swim_mode =3D 0; + memset(ctrl->ismregs, 0, 16); for (i =3D 0; i < SWIM_MAX_FD; i++) { fd_recalibrate(&ctrl->drives[i]); } @@ -425,9 +435,12 @@ static void sysbus_swim_init(Object *obj) Swim *sbs =3D SWIM(obj); SWIMCtrl *swimctrl =3D &sbs->ctrl; =20 - memory_region_init_io(&swimctrl->iomem, obj, &swimctrl_mem_ops, swimct= rl, - "swim", 0x2000); - sysbus_init_mmio(sbd, &swimctrl->iomem); + memory_region_init(&swimctrl->swim, obj, "swim", 0x2000); + memory_region_init_io(&swimctrl->iwm, obj, &swimctrl_iwm_ops, swimctrl, + "iwm", 0x2000); + memory_region_init_io(&swimctrl->ism, obj, &swimctrl_ism_ops, swimctrl, + "ism", 0x2000); + sysbus_init_mmio(sbd, &swimctrl->swim); } =20 static void sysbus_swim_realize(DeviceState *dev, Error **errp) @@ -437,6 +450,9 @@ static void sysbus_swim_realize(DeviceState *dev, Error= **errp) =20 qbus_init(&swimctrl->bus, sizeof(SWIMBus), TYPE_SWIM_BUS, dev, NULL); swimctrl->bus.ctrl =3D swimctrl; + + /* Default register set is IWM */ + memory_region_add_subregion(&swimctrl->swim, 0x0, &swimctrl->iwm); } =20 static const VMStateDescription vmstate_fdrive =3D { @@ -456,10 +472,11 @@ static const VMStateDescription vmstate_swim =3D { VMSTATE_INT32(mode, SWIMCtrl), /* IWM mode */ VMSTATE_INT32(iwm_switch, SWIMCtrl), - VMSTATE_UINT16_ARRAY(regs, SWIMCtrl, 8), + VMSTATE_UINT8_ARRAY(iwmregs, SWIMCtrl, 16), VMSTATE_UINT8(iwm_data, SWIMCtrl), VMSTATE_UINT8(iwm_mode, SWIMCtrl), /* SWIM mode */ + VMSTATE_UINT8_ARRAY(ismregs, SWIMCtrl, 16), VMSTATE_UINT8(swim_phase, SWIMCtrl), VMSTATE_UINT8(swim_mode, SWIMCtrl), /* Drives */ diff --git a/hw/block/trace-events b/hw/block/trace-events index c041ec45e3..ea84ad6c77 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -94,6 +94,6 @@ m25p80_binding_no_bdrv(void *s) "[%p] No BDRV - binding t= o RAM" # swim.c swim_swimctrl_read(int reg, const char *name, unsigned size, uint64_t valu= e) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 swim_swimctrl_write(int reg, const char *name, unsigned size, uint64_t val= ue) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 -swim_iwmctrl_read(int reg, unsigned size, uint64_t value) "reg=3D%d size= =3D%u value=3D0x%"PRIx64 -swim_iwmctrl_write(int reg, unsigned size, uint64_t value) "reg=3D%d size= =3D%u value=3D0x%"PRIx64 +swim_iwmctrl_read(int reg, const char *name, unsigned size, uint64_t value= ) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 +swim_iwmctrl_write(int reg, const char *name, unsigned size, uint64_t valu= e) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 swim_iwm_switch(void) "switch from IWM to SWIM mode" diff --git a/include/hw/block/swim.h b/include/hw/block/swim.h index 9b3dcb029d..1bc7635d02 100644 --- a/include/hw/block/swim.h +++ b/include/hw/block/swim.h @@ -43,23 +43,18 @@ typedef struct FDrive { } FDrive; =20 struct SWIMCtrl { - MemoryRegion iomem; + MemoryRegion swim; + MemoryRegion iwm; + MemoryRegion ism; FDrive drives[SWIM_MAX_FD]; int mode; /* IWM mode */ int iwm_switch; - uint16_t regs[8]; -#define IWM_PH0 0 -#define IWM_PH1 1 -#define IWM_PH2 2 -#define IWM_PH3 3 -#define IWM_MTR 4 -#define IWM_DRIVE 5 -#define IWM_Q6 6 -#define IWM_Q7 7 + uint8_t iwmregs[16]; uint8_t iwm_data; uint8_t iwm_mode; /* SWIM mode */ + uint8_t ismregs[16]; uint8_t swim_phase; uint8_t swim_mode; SWIMBus bus; --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 168831302348021.66941223488527; Sun, 2 Jul 2023 08:50:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKU-0004dE-Qb; Sun, 02 Jul 2023 11:49:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKT-0004cY-H6 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:37 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKQ-0007St-A5 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:37 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKE-0001Ji-Jg; Sun, 02 Jul 2023 16:49:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=LxPU5Duv7NJYWzvnoLQ2MvbWwxzTGsFNAOCjbXc14eI=; b=qvqUYYcHKPCSaECYQa412z/sUl Uk5BCJ4zFZyhN8PRDs0PDi9hz8Xug5WdqQozIC4LACah33DZc48NklKLzDw1GzWlJfav5A+WLNobN 89LVGcOlYimlAvpeQLqqx98buV13KZACpbHlA3Lu8gSA14Jlk+vzDvVgVc4dbAUT7OBeEVn3BuPls MnRd0vlB46FsKGHiZ5wt2wLaoiFaev6WlVM7f/GrKi8H7nSTBmiCr7sXm1sE/zTr+82/WuEtF7uPZ lY1qfhiNK7d6f7TYksGqMdpM33uz1Tk2Iwgj+pPnfsb0Bxe3MEICu8/9rPYf8APPHQ2kzcUFHvqXN 2lTJ9rJJv0Bs/KO1+5w3Vk06oCemyOxQyDGNirC4j5DZaRw5PnXrwtVvhDFEnNqx0cvYQ/tXzEOM1 8F0l03Bc1mIes8NnyKh5mu/UGsdMXircXXgDE2JC/EdQmoxljOzv+IO4hLP+hb7C6NgrAgxui/w1t qnt5kt6W2WVOxni0dS+lkfUb4YBCmcGHBmOV/7mwu8YO2kwt7TVDJMedtS13AOZPX+BoAaFmuo8oq A2ToveGh8IjtiBdyZGPAh2aDVY6+4EjXB/Xl508vK7Oa2uDkLx+0BprFoBf9yITqrDcyWLIyMv/sF gN7KY5irZ8fbRDve1g/AtKEhS4MclOdRpsgE8FOSs=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:30 +0100 Message-Id: <20230702154838.722809-14-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 13/21] swim: update IWM/ISM register block decoding X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313024969100003 Content-Type: text/plain; charset="utf-8" Update the IWM/ISM register block decoding to match the description given i= n the "SWIM Chip Users Reference". This allows us to validate the device response= to the guest OS which currently only does just enough to indicate that the flo= ppy drive is unavailable. Signed-off-by: Mark Cave-Ayland --- hw/block/swim.c | 212 +++++++++++++++++++++++++--------------- hw/block/trace-events | 7 +- include/hw/block/swim.h | 8 +- 3 files changed, 143 insertions(+), 84 deletions(-) diff --git a/hw/block/swim.c b/hw/block/swim.c index 735b335883..fd65c59f8a 100644 --- a/hw/block/swim.c +++ b/hw/block/swim.c @@ -21,24 +21,28 @@ #include "hw/qdev-properties.h" #include "trace.h" =20 + +/* IWM latch bits */ + +#define IWMLB_PHASE0 0 +#define IWMLB_PHASE1 1 +#define IWMLB_PHASE2 2 +#define IWMLB_PHASE3 3 +#define IWMLB_MOTORON 4 +#define IWMLB_DRIVESEL 5 +#define IWMLB_L6 6 +#define IWMLB_L7 7 + /* IWM registers */ =20 -#define IWM_PH0L 0 -#define IWM_PH0H 1 -#define IWM_PH1L 2 -#define IWM_PH1H 3 -#define IWM_PH2L 4 -#define IWM_PH2H 5 -#define IWM_PH3L 6 -#define IWM_PH3H 7 -#define IWM_MTROFF 8 -#define IWM_MTRON 9 -#define IWM_INTDRIVE 10 -#define IWM_EXTDRIVE 11 -#define IWM_Q6L 12 -#define IWM_Q6H 13 -#define IWM_Q7L 14 -#define IWM_Q7H 15 +#define IWM_READALLONES 0 +#define IWM_READDATA 1 +#define IWM_READSTATUS0 2 +#define IWM_READSTATUS1 3 +#define IWM_READWHANDSHAKE0 4 +#define IWM_READWHANDSHAKE1 5 +#define IWM_WRITESETMODE 6 +#define IWM_WRITEDATA 7 =20 /* SWIM registers */ =20 @@ -62,8 +66,9 @@ =20 #define REG_SHIFT 9 =20 -#define SWIM_MODE_IWM 0 -#define SWIM_MODE_SWIM 1 +#define SWIM_MODE_STATUS_BIT 6 +#define SWIM_MODE_IWM 0 +#define SWIM_MODE_ISM 1 =20 /* bits in phase register */ =20 @@ -127,10 +132,8 @@ #define SWIM_MOTON 0x80 =20 static const char *iwm_reg_names[] =3D { - "PH0L", "PH0H", "PH1L", "PH1H", - "PH2L", "PH2H", "PH3L", "PH3H", - "MTROFF", "MTRON", "INTDRIVE", "EXTDRIVE", - "Q6L", "Q6H", "Q7L", "Q7H" + "READALLONES", "READDATA", "READSTATUS0", "READSTATUS1", + "READWHANDSHAKE0", "READWHANDSHAKE1", "WRITESETMODE", "WRITEDATA" }; =20 static const char *ism_reg_names[] =3D { @@ -274,68 +277,99 @@ static const TypeInfo swim_bus_info =3D { .instance_size =3D sizeof(SWIMBus), }; =20 -static void iwmctrl_write(void *opaque, hwaddr reg, uint64_t value, +static void iwmctrl_write(void *opaque, hwaddr addr, uint64_t value, unsigned size) { SWIMCtrl *swimctrl =3D opaque; + uint8_t latch, reg, ism_bit; =20 - reg >>=3D REG_SHIFT; + addr >>=3D REG_SHIFT; + + /* A3-A1 select a latch, A0 specifies the value */ + latch =3D (addr >> 1) & 7; + if (addr & 1) { + swimctrl->iwm_latches |=3D (1 << latch); + } else { + swimctrl->iwm_latches &=3D ~(1 << latch); + } + + reg =3D (swimctrl->iwm_latches & 0xc0) >> 5 | + (swimctrl->iwm_latches & 0x10) >> 4; =20 swimctrl->iwmregs[reg] =3D value; trace_swim_iwmctrl_write(reg, iwm_reg_names[reg], size, value); =20 - if (swimctrl->iwmregs[IWM_Q7H]) { - if (swimctrl->iwmregs[IWM_MTRON]) { - /* data register */ - swimctrl->iwm_data =3D value; - } else { - /* mode register */ - swimctrl->iwm_mode =3D value; - /* detect sequence to switch from IWM mode to SWIM mode */ - switch (swimctrl->iwm_switch) { - case 0: - if (value =3D=3D 0x57) { - swimctrl->iwm_switch++; - } - break; - case 1: - if (value =3D=3D 0x17) { - swimctrl->iwm_switch++; - } - break; - case 2: - if (value =3D=3D 0x57) { - swimctrl->iwm_switch++; - } - break; - case 3: - if (value =3D=3D 0x57) { - swimctrl->mode =3D SWIM_MODE_SWIM; - swimctrl->iwm_switch =3D 0; - trace_swim_iwm_switch(); - - /* Switch to ISM registers */ - memory_region_del_subregion(&swimctrl->swim, - &swimctrl->iwm); - memory_region_add_subregion(&swimctrl->swim, 0x0, - &swimctrl->ism); - } - break; + switch (reg) { + case IWM_WRITESETMODE: + /* detect sequence to switch from IWM mode to SWIM mode */ + ism_bit =3D (value & (1 << SWIM_MODE_STATUS_BIT)); + + switch (swimctrl->iwm_switch) { + case 0: + if (ism_bit) { /* 1 */ + swimctrl->iwm_switch++; + } + break; + case 1: + if (!ism_bit) { /* 0 */ + swimctrl->iwm_switch++; + } + break; + case 2: + if (ism_bit) { /* 1 */ + swimctrl->iwm_switch++; } + break; + case 3: + if (ism_bit) { /* 1 */ + swimctrl->iwm_switch++; + + swimctrl->mode =3D SWIM_MODE_ISM; + swimctrl->swim_mode |=3D (1 << SWIM_MODE_STATUS_BIT); + swimctrl->iwm_switch =3D 0; + trace_swim_switch_to_ism(); + + /* Switch to ISM registers */ + memory_region_del_subregion(&swimctrl->swim, &swimctrl->iw= m); + memory_region_add_subregion(&swimctrl->swim, 0x0, + &swimctrl->ism); + } + break; } + break; + default: + break; } } =20 -static uint64_t iwmctrl_read(void *opaque, hwaddr reg, unsigned size) +static uint64_t iwmctrl_read(void *opaque, hwaddr addr, unsigned size) { SWIMCtrl *swimctrl =3D opaque; - uint16_t value; + uint8_t latch, reg, value; =20 - reg >>=3D REG_SHIFT; + addr >>=3D REG_SHIFT; =20 - value =3D swimctrl->iwmregs[reg]; - trace_swim_iwmctrl_read(reg, iwm_reg_names[reg], size, value); + /* A3-A1 select a latch, A0 specifies the value */ + latch =3D (addr >> 1) & 7; + if (addr & 1) { + swimctrl->iwm_latches |=3D (1 << latch); + } else { + swimctrl->iwm_latches &=3D ~(1 << latch); + } + + reg =3D (swimctrl->iwm_latches & 0xc0) >> 5 | + (swimctrl->iwm_latches & 0x10) >> 4; + + switch (reg) { + case IWM_READALLONES: + value =3D 0xff; + break; + default: + value =3D 0; + break; + } =20 + trace_swim_iwmctrl_read(reg, iwm_reg_names[reg], size, value); return value; } =20 @@ -352,7 +386,7 @@ static void ismctrl_write(void *opaque, hwaddr reg, uin= t64_t value, =20 reg >>=3D REG_SHIFT; =20 - trace_swim_swimctrl_write(reg, ism_reg_names[reg], size, value); + trace_swim_ismctrl_write(reg, ism_reg_names[reg], size, value); =20 switch (reg) { case SWIM_WRITE_PHASE: @@ -360,14 +394,31 @@ static void ismctrl_write(void *opaque, hwaddr reg, u= int64_t value, break; case SWIM_WRITE_MODE0: swimctrl->swim_mode &=3D ~value; + /* Any access to MODE0 register resets PRAM index */ + swimctrl->pram_idx =3D 0; + + if (!(swimctrl->swim_mode & (1 << SWIM_MODE_STATUS_BIT))) { + /* Clearing the mode bit switches to IWM mode */ + swimctrl->mode =3D SWIM_MODE_IWM; + swimctrl->iwm_latches =3D 0; + trace_swim_switch_to_iwm(); + + /* Switch to IWM registers */ + memory_region_del_subregion(&swimctrl->swim, &swimctrl->ism); + memory_region_add_subregion(&swimctrl->swim, 0x0, + &swimctrl->iwm); + } break; case SWIM_WRITE_MODE1: swimctrl->swim_mode |=3D value; break; + case SWIM_WRITE_PARAMETER: + swimctrl->pram[swimctrl->pram_idx++] =3D value; + swimctrl->pram_idx &=3D 0xf; + break; case SWIM_WRITE_DATA: case SWIM_WRITE_MARK: case SWIM_WRITE_CRC: - case SWIM_WRITE_PARAMETER: case SWIM_WRITE_SETUP: break; } @@ -390,16 +441,24 @@ static uint64_t ismctrl_read(void *opaque, hwaddr reg= , unsigned size) value =3D SWIM_SENSE; } break; + case SWIM_READ_PARAMETER: + value =3D swimctrl->pram[swimctrl->pram_idx++]; + swimctrl->pram_idx &=3D 0xf; + break; + case SWIM_READ_STATUS: + value =3D swimctrl->swim_status & ~(1 << SWIM_MODE_STATUS_BIT); + if (swimctrl->swim_mode =3D=3D SWIM_MODE_ISM) { + value |=3D (1 << SWIM_MODE_STATUS_BIT); + } + break; case SWIM_READ_DATA: case SWIM_READ_MARK: case SWIM_READ_ERROR: - case SWIM_READ_PARAMETER: case SWIM_READ_SETUP: - case SWIM_READ_STATUS: break; } =20 - trace_swim_swimctrl_read(reg, ism_reg_names[reg], size, value); + trace_swim_ismctrl_read(reg, ism_reg_names[reg], size, value); return value; } =20 @@ -417,13 +476,11 @@ static void sysbus_swim_reset(DeviceState *d) =20 ctrl->mode =3D 0; ctrl->iwm_switch =3D 0; - ctrl->iwm_data =3D 0; - ctrl->iwm_mode =3D 0; - memset(ctrl->iwmregs, 0, 16); + memset(ctrl->iwmregs, 0, sizeof(ctrl->iwmregs)); =20 ctrl->swim_phase =3D 0; ctrl->swim_mode =3D 0; - memset(ctrl->ismregs, 0, 16); + memset(ctrl->ismregs, 0, sizeof(ctrl->ismregs)); for (i =3D 0; i < SWIM_MAX_FD; i++) { fd_recalibrate(&ctrl->drives[i]); } @@ -472,9 +529,8 @@ static const VMStateDescription vmstate_swim =3D { VMSTATE_INT32(mode, SWIMCtrl), /* IWM mode */ VMSTATE_INT32(iwm_switch, SWIMCtrl), - VMSTATE_UINT8_ARRAY(iwmregs, SWIMCtrl, 16), - VMSTATE_UINT8(iwm_data, SWIMCtrl), - VMSTATE_UINT8(iwm_mode, SWIMCtrl), + VMSTATE_UINT8(iwm_latches, SWIMCtrl), + VMSTATE_UINT8_ARRAY(iwmregs, SWIMCtrl, 8), /* SWIM mode */ VMSTATE_UINT8_ARRAY(ismregs, SWIMCtrl, 16), VMSTATE_UINT8(swim_phase, SWIMCtrl), diff --git a/hw/block/trace-events b/hw/block/trace-events index ea84ad6c77..bab21d3a1c 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -92,8 +92,9 @@ m25p80_binding(void *s) "[%p] Binding to IF_MTD drive" m25p80_binding_no_bdrv(void *s) "[%p] No BDRV - binding to RAM" =20 # swim.c -swim_swimctrl_read(int reg, const char *name, unsigned size, uint64_t valu= e) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 -swim_swimctrl_write(int reg, const char *name, unsigned size, uint64_t val= ue) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 +swim_ismctrl_read(int reg, const char *name, unsigned size, uint64_t value= ) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 +swim_ismctrl_write(int reg, const char *name, unsigned size, uint64_t valu= e) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 swim_iwmctrl_read(int reg, const char *name, unsigned size, uint64_t value= ) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 swim_iwmctrl_write(int reg, const char *name, unsigned size, uint64_t valu= e) "reg=3D%d [%s] size=3D%u value=3D0x%"PRIx64 -swim_iwm_switch(void) "switch from IWM to SWIM mode" +swim_switch_to_ism(void) "switch from IWM to ISM mode" +swim_switch_to_iwm(void) "switch from ISM to IWM mode" diff --git a/include/hw/block/swim.h b/include/hw/block/swim.h index 1bc7635d02..5f567e8d59 100644 --- a/include/hw/block/swim.h +++ b/include/hw/block/swim.h @@ -50,13 +50,15 @@ struct SWIMCtrl { int mode; /* IWM mode */ int iwm_switch; - uint8_t iwmregs[16]; - uint8_t iwm_data; - uint8_t iwm_mode; + uint8_t iwm_latches; + uint8_t iwmregs[8]; /* SWIM mode */ uint8_t ismregs[16]; uint8_t swim_phase; uint8_t swim_mode; + uint8_t swim_status; + uint8_t pram[16]; + uint8_t pram_idx; SWIMBus bus; }; =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313080075668.113811449029; Sun, 2 Jul 2023 08:51:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKh-00054D-Dq; Sun, 02 Jul 2023 11:49:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKg-00053w-EH for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:50 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKe-0007Tb-K1 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:50 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKF-0001Ji-52; Sun, 02 Jul 2023 16:49:27 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=PlKnjG/sq/0Y+cOaeVs37p1Ogz4k5Y3BpiICVfJdR98=; b=FWb6sKJnH6CFUEvfSzjdeaiwQ0 dtR1xW7X4GShCpxVFfERtwNNmgghZWgWm1bGUKxE6GaHPqJj2g2IhVZsBTBLbnIOQMRlEuz/xT/HB ss8LU/KKdrs3UAw37LBsVt00OYcPRga6kY9hd+LWXB77AHWhfclGZ1HSf0jOz2AsSUAP0UgXkexSC GYnSHzTcijpe4PLc5gZDik7MiVuIt57ESWYEC3lgfUeHgH/X0cDKq2awT39Q8axxpEk+L9h2kHoyq oNnOAotEROui1WO3NPm0hDU4sN99UF5A6/Fs31xpjj7E9gDTLOzoYgrYVHeLKKaCYkff7GeDZ9Iwo a9sYNorNsp5krpONJ6b0QEg73wSoXMIpZaIPxnAKVDhQpZLZFXn3V/+bnxwgWeFphwmeuYpj80zuu 9LctmftCO+3fdyPLrzYHRIK4azBMqZYIL9visGCj+sRHQ0/SmEHkg3ngsCq+cVoJ8CKN0Or2p0fCm XruvOYgKvuv6arpx9tahSFwh1jlA1rsD7p0dz27zgVzGb5OBChit9JMSihlmcIj9lol0TQ968v5LZ uMtaE+4AtD9Mivr4ZJwe2KyqHRGkbOcX7ZxjYSZSh6jHt5Emr4m1dBVt9GFd4rdAhMzuJi4hDUPz2 zO3S4w1Bq0Pzkth5BPTij2Jvxi1SJwMvb2hBkIaM4=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:31 +0100 Message-Id: <20230702154838.722809-15-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 14/21] mac_via: work around underflow in TimeDBRA timing loop in SETUPTIMEK X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313081323100001 Content-Type: text/plain; charset="utf-8" The MacOS toolbox ROM calculates the number of branches that can be executed per millisecond as part of its timer calibration. Since modern hosts are considerably quicker than original hardware, the negative counter reaches z= ero before the calibration completes leading to division by zero later in CALCULATESLOD. Instead of trying to fudge the timing loop (which won't work for TimeDBRA/T= imeSCCDB anyhow), use the pattern of access to the VIA1 registers to detect when SET= UPTIMEK has finished executing and write some well-known good timer values to TimeD= BRA and TimeSCCDB taken from real hardware with a suitable scaling factor. Signed-off-by: Mark Cave-Ayland --- hw/misc/mac_via.c | 115 ++++++++++++++++++++++++++++++++++++++ hw/misc/trace-events | 1 + include/hw/misc/mac_via.h | 3 + 3 files changed, 119 insertions(+) diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index baeb73eeb3..766a32a95d 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -16,6 +16,7 @@ */ =20 #include "qemu/osdep.h" +#include "exec/address-spaces.h" #include "migration/vmstate.h" #include "hw/sysbus.h" #include "hw/irq.h" @@ -871,6 +872,112 @@ static void via1_auxmode_update(MOS6522Q800VIA1State = *v1s) } } =20 +/* + * Addresses and real values for TimeDBRA/TimeSCCB to allow timer calibrat= ion + * to succeed (NOTE: both values have been multiplied by 3 to cope with the + * speed of QEMU execution on a modern host + */ +#define MACOS_TIMEDBRA 0xd00 +#define MACOS_TIMESCCB 0xd02 + +#define MACOS_TIMEDBRA_VALUE (0x2a00 * 3) +#define MACOS_TIMESCCB_VALUE (0x079d * 3) + +static bool via1_is_toolbox_timer_calibrated(void) +{ + /* + * Indicate whether the MacOS toolbox has been calibrated by checking + * for the value of our magic constants + */ + uint16_t timedbra =3D lduw_be_phys(&address_space_memory, MACOS_TIMEDB= RA); + uint16_t timesccdb =3D lduw_be_phys(&address_space_memory, MACOS_TIMES= CCB); + + return (timedbra =3D=3D MACOS_TIMEDBRA_VALUE && + timesccdb =3D=3D MACOS_TIMESCCB_VALUE); +} + +static void via1_timer_calibration_hack(MOS6522Q800VIA1State *v1s, int add= r, + uint64_t val, int size) +{ + /* + * Work around timer calibration to ensure we that we have non-zero and + * known good values for TIMEDRBA and TIMESCCDB. + * + * This works by attempting to detect the reset and calibration sequen= ce + * of writes to VIA1 + */ + int old_timer_hack_state =3D v1s->timer_hack_state; + + switch (v1s->timer_hack_state) { + case 0: + if (addr =3D=3D VIA_REG_PCR && val =3D=3D 0x22) { + /* VIA_REG_PCR: configure VIA1 edge triggering */ + v1s->timer_hack_state =3D 1; + } + break; + case 1: + if (addr =3D=3D VIA_REG_T2CL && val =3D=3D 0xc) { + /* VIA_REG_T2CL: low byte of 1ms counter */ + if (!via1_is_toolbox_timer_calibrated()) { + v1s->timer_hack_state =3D 2; + } else { + v1s->timer_hack_state =3D 0; + } + } + break; + case 2: + if (addr =3D=3D VIA_REG_T2CH && val =3D=3D 0x3) { + /* + * VIA_REG_T2CH: high byte of 1ms counter (very likely at the + * start of SETUPTIMEK) + */ + if (!via1_is_toolbox_timer_calibrated()) { + v1s->timer_hack_state =3D 3; + } else { + v1s->timer_hack_state =3D 0; + } + } + break; + case 3: + if (addr =3D=3D VIA_REG_IER && val =3D=3D 0x20) { + /* + * VIA_REG_IER: update at end of SETUPTIMEK + * + * Timer calibration has finished: unfortunately the values in + * TIMEDBRA (0xd00) and TIMESCCDB (0xd02) are so far out they + * cause divide by zero errors. + * + * Update them with values obtained from a real Q800 but with + * a x3 scaling factor which seems to work well + */ + stw_be_phys(&address_space_memory, MACOS_TIMEDBRA, + MACOS_TIMEDBRA_VALUE); + stw_be_phys(&address_space_memory, MACOS_TIMESCCB, + MACOS_TIMESCCB_VALUE); + + v1s->timer_hack_state =3D 4; + } + break; + case 4: + /* + * This is the normal post-calibration timer state: we should + * generally remain here unless we detect the A/UX calibration + * loop, or a write to VIA_REG_PCR suggesting a reset + */ + if (addr =3D=3D VIA_REG_PCR && val =3D=3D 0x22) { + /* Looks like there has been a reset? */ + v1s->timer_hack_state =3D 1; + } + break; + default: + g_assert_not_reached(); + } + + if (old_timer_hack_state !=3D v1s->timer_hack_state) { + trace_via1_timer_hack_state(v1s->timer_hack_state); + } +} + static uint64_t mos6522_q800_via1_read(void *opaque, hwaddr addr, unsigned= size) { MOS6522Q800VIA1State *s =3D MOS6522_Q800_VIA1(opaque); @@ -896,6 +1003,9 @@ static void mos6522_q800_via1_write(void *opaque, hwad= dr addr, uint64_t val, MOS6522State *ms =3D MOS6522(v1s); =20 addr =3D (addr >> 9) & 0xf; + + via1_timer_calibration_hack(v1s, addr, val, size); + mos6522_write(ms, addr, val, size); =20 switch (addr) { @@ -1008,6 +1118,9 @@ static void mos6522_q800_via1_reset_hold(Object *obj) adb_set_autopoll_enabled(adb_bus, true); v1s->cmd =3D REG_EMPTY; v1s->alt =3D REG_EMPTY; + + /* Timer calibration hack */ + v1s->timer_hack_state =3D 0; } =20 static void mos6522_q800_via1_realize(DeviceState *dev, Error **errp) @@ -1100,6 +1213,8 @@ static const VMStateDescription vmstate_q800_via1 =3D= { VMSTATE_INT64(next_second, MOS6522Q800VIA1State), VMSTATE_TIMER_PTR(sixty_hz_timer, MOS6522Q800VIA1State), VMSTATE_INT64(next_sixty_hz, MOS6522Q800VIA1State), + /* Timer hack */ + VMSTATE_INT32(timer_hack_state, MOS6522Q800VIA1State), VMSTATE_END_OF_LIST() } }; diff --git a/hw/misc/trace-events b/hw/misc/trace-events index d5711dcff2..c717090659 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -268,6 +268,7 @@ via1_adb_send(const char *state, uint8_t data, const ch= ar *vadbint) "state %s da via1_adb_receive(const char *state, uint8_t data, const char *vadbint, int= status, int index, int size) "state %s data=3D0x%02x vADBInt=3D%s status= =3D0x%x index=3D%d size=3D%d" via1_adb_poll(uint8_t data, const char *vadbint, int status, int index, in= t size) "data=3D0x%02x vADBInt=3D%s status=3D0x%x index=3D%d size=3D%d" via1_auxmode(int mode) "setting auxmode to %d" +via1_timer_hack_state(int state) "setting timer_hack_state to %d" =20 # grlib_ahb_apb_pnp.c grlib_ahb_pnp_read(uint64_t addr, unsigned size, uint32_t value) "AHB PnP = read addr:0x%03"PRIx64" size:%u data:0x%08x" diff --git a/include/hw/misc/mac_via.h b/include/hw/misc/mac_via.h index 422da43bf9..63cdcf7c69 100644 --- a/include/hw/misc/mac_via.h +++ b/include/hw/misc/mac_via.h @@ -74,6 +74,9 @@ struct MOS6522Q800VIA1State { int64_t next_second; QEMUTimer *sixty_hz_timer; int64_t next_sixty_hz; + + /* SETUPTIMEK hack */ + int timer_hack_state; }; =20 =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313047692588.7463106156222; Sun, 2 Jul 2023 08:50:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKl-00057w-NG; Sun, 02 Jul 2023 11:49:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKk-00054l-8b for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:54 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKi-0007Tv-Ms for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:54 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKJ-0001Ji-AD; Sun, 02 Jul 2023 16:49:31 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=Z1ZAtYQYjdnyPY0aObLj8vzSpFTVdd2bEBkqMAC+vFU=; b=v+g042FivUPOS6Z0YZ4uX3TDSt bZ7V8mXtA6qjQQaKnELCE8LqkhK88ZiaaaLEy01hCo2zsbR0lMA2HKA+O1jhYKCgXWAYSFcu++Rwj QF5OPeH4Yoi0brVe2YKA7UFWKu6cb0GcVILtvX7iA+tcW116xN7UvlAMiWMzGggzumh2VZl7omp1B 75LZpStWhQH4YMP8L8iUABxUZbXeCNHjSDaKvjyi2vgocPSwc5W3S6uYRtRBZFO1MoVRumw6kLqQa /cI/j3re2vxdHAqj2FKFCqmBGrAMKPXUEl8f57MaQ6gVDEOKzbhFkH8bslt01PFPz8fNSP4sB2LCa hAZhcSy+Wm/i0Ky2F+IXy5Rh535GVxd2WGxlVwVQ64MRZ1nAITjTKonasyZRf1md0kaO8d2lm5uKf Xw1f+Nv8nMfNyXMbdJjZPgQ+GET5hCbJObU0pXyp1oi095o2b3DY8tMY0cEtblD3np5iWPURBvG7k DroBsW49X5V+x/jWf6FkkD3mY8mgaMIwIZynHZ9pvDjJDUorcqjbaDHJbh9skd5kzzSU5MKw15HO1 Q0rqCZXbtWns1Q6scee+f/iny4b4QuWO3tn2EDde1J5ltB525rwx193VzQQ/kTKS2LOgsPJGWXQ0z AnkPhsqxxStYmGe0WxZdH2qMCAeQ25sNMnI/cfJFs=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:32 +0100 Message-Id: <20230702154838.722809-16-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 15/21] mac_via: workaround NetBSD ADB bus enumeration issue X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313049322100009 Content-Type: text/plain; charset="utf-8" NetBSD assumes it can send its first ADB command after sending the ADB_BUSR= ESET command in ADB_STATE_NEW without changing the state back to ADB_STATE_IDLE first as detailed in the ADB protocol. Add a workaround to detect this condition at the start of ADB enumeration and send the next command written to SR after a ADB_BUSRESET onto the bus regardless, even if we don't detect a state transition to ADB_STATE_NEW. Signed-off-by: Mark Cave-Ayland --- hw/misc/mac_via.c | 34 ++++++++++++++++++++++++++++++++++ hw/misc/trace-events | 1 + 2 files changed, 35 insertions(+) diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index 766a32a95d..208216aed3 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -1001,6 +1001,8 @@ static void mos6522_q800_via1_write(void *opaque, hwa= ddr addr, uint64_t val, { MOS6522Q800VIA1State *v1s =3D MOS6522_Q800_VIA1(opaque); MOS6522State *ms =3D MOS6522(v1s); + int oldstate, state; + int oldsr =3D ms->sr; =20 addr =3D (addr >> 9) & 0xf; =20 @@ -1016,6 +1018,38 @@ static void mos6522_q800_via1_write(void *opaque, hw= addr addr, uint64_t val, =20 v1s->last_b =3D ms->b; break; + + case VIA_REG_SR: + { + /* + * NetBSD assumes it can send its first ADB command after send= ing + * the ADB_BUSRESET command in ADB_STATE_NEW without changing = the + * state back to ADB_STATE_IDLE first as detailed in the ADB + * protocol. + * + * Add a workaround to detect this condition at the start of A= DB + * enumeration and send the next command written to SR after a + * ADB_BUSRESET onto the bus regardless, even if we don't dete= ct a + * state transition to ADB_STATE_NEW. + * + * Note that in my tests the NetBSD state machine takes one ADB + * operation to recover which means the probe for an ADB devic= e at + * address 1 always fails. However since the first device is at + * address 2 then this will work fine, without having to come = up + * with a more complicated and invasive solution. + */ + oldstate =3D (v1s->last_b & VIA1B_vADB_StateMask) >> + VIA1B_vADB_StateShift; + state =3D (ms->b & VIA1B_vADB_StateMask) >> VIA1B_vADB_StateSh= ift; + + if (oldstate =3D=3D ADB_STATE_NEW && state =3D=3D ADB_STATE_NE= W && + (ms->acr & VIA1ACR_vShiftOut) && + oldsr =3D=3D 0 /* ADB_BUSRESET */) { + trace_via1_adb_netbsd_enum_hack(); + adb_via_send(v1s, state, ms->sr); + } + } + break; } } =20 diff --git a/hw/misc/trace-events b/hw/misc/trace-events index c717090659..3d14e1db09 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -267,6 +267,7 @@ via1_rtc_cmd_pram_sect_write(int sector, int offset, in= t addr, int value) "secto via1_adb_send(const char *state, uint8_t data, const char *vadbint) "state= %s data=3D0x%02x vADBInt=3D%s" via1_adb_receive(const char *state, uint8_t data, const char *vadbint, int= status, int index, int size) "state %s data=3D0x%02x vADBInt=3D%s status= =3D0x%x index=3D%d size=3D%d" via1_adb_poll(uint8_t data, const char *vadbint, int status, int index, in= t size) "data=3D0x%02x vADBInt=3D%s status=3D0x%x index=3D%d size=3D%d" +via1_adb_netbsd_enum_hack(void) "using NetBSD enum hack" via1_auxmode(int mode) "setting auxmode to %d" via1_timer_hack_state(int state) "setting timer_hack_state to %d" =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313130851305.425002217096; Sun, 2 Jul 2023 08:52:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKq-0005bx-EP; Sun, 02 Jul 2023 11:50:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKo-0005Lx-7T for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:58 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKm-0007U6-Ot for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:49:57 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKN-0001Ji-EY; Sun, 02 Jul 2023 16:49:35 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=fdL5y7RB1juEDsyzfx93vfg6FCD4GXZ1SZPEAovy87I=; b=yPWuFciR/W0OCzd+P31190OkYR QMBiYrXvEPO5x2utjju9xTqAkoDiIjwEOrpT8OSbiNjJaKHboER2leBeO7wQ+WzEOK2IoVNN81+Iy MNa9/Q8h4nDnbpumTs+Uzxjs8NwetG0WJjtYyAhmRaH5Y2Zxdz4ntKXYRVadcpxHHhulQYOygrkrf FKr8i09G2FIz77mHm94Jnzmm+XAx28uIqFJAeSSSRdzOaV9AxHW3s7g8cBUJDXq8h7P0I0Ue7pJqs e/zTZWUbvR9Ibt7cMrEMQTmegvFWKVrriCVwBpHXvtk+UxgdJSy4iFzCXaNZ2HZe9Qak1FWo2Uyy7 CYA+X3lshvGJZmToIHV7aqZ8OjQJ/Bu3LUKquCnoPkmdOo+Epd3BEXPIArX7tgbL7U0+2To6nIr+h DUvHcl9E6rKD+U2Q36GJ0MCDcGu2Zit6nELO7l0iOQml6gYNbDoQKoSBfRzQi6z+pX9xBoYMfhh5l G+XppnO5j5GGwAlRIbuXJQaRuTOy7/z+Nonp81uvlF63kPNnm0yc90EgvKrhHYzlw+AtHKx3JA72Y VEwsgOQJCGHUfQFG97R1P6/LAwe9exOYilO/q4ahH+qWNa5RSkNvQKJVq7+9eGyttWKltBjXQWNXA VhFieYV+pKtJFULdV/20OAPTC9uNYAY1WgPBDBP3A=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:33 +0100 Message-Id: <20230702154838.722809-17-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 16/21] mac_via: implement ADB_STATE_IDLE state if shift register in input mode X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313131459100002 Content-Type: text/plain; charset="utf-8" NetBSD switches directly to IDLE state without switching the shift register= to input mode. Duplicate the existing ADB_STATE_IDLE logic in input mode from = when the shift register is in output mode which allows the ADB autopoll handler = to handle the response. Signed-off-by: Mark Cave-Ayland --- hw/misc/mac_via.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index 208216aed3..398e8d1967 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -702,6 +702,12 @@ static void adb_via_send(MOS6522Q800VIA1State *v1s, in= t state, uint8_t data) break; =20 case ADB_STATE_IDLE: + ms->b |=3D VIA1B_vADBInt; + adb_autopoll_unblock(adb_bus); + + trace_via1_adb_send("IDLE", data, + (ms->b & VIA1B_vADBInt) ? "+" : "-"); + return; } =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313046955738.4576921184256; Sun, 2 Jul 2023 08:50:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzKw-0006CV-3i; Sun, 02 Jul 2023 11:50:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKt-0005yF-7r for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:03 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKq-0007UO-Tx for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:02 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKR-0001Ji-Jd; Sun, 02 Jul 2023 16:49:39 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=Z1MwgEclRZQzlxYjqy2P0QF4yLhomVsHfbat/Y44MjE=; b=q+syu6AwytVps80wAva5xKlzI5 j6rEi5EgzgOtXwzkK1lyctrhuNS7zDy7oq6X5sylbK6sFWH2T1Mg1ENEzR43j4XQg+tuaMMyp7gWm mDHmKVuNUSxfJjdkmHIbKGmcr1cFR4WkiHmgxJYRuiCYuP9BPIBrm6uZBwzWdmdcVyOiemj4Nt01s iAJIC1LlF/+EuTdslG9mHYjhQcUV7eYP4jbs/48AmKAk+kPP4xmHmAPjKipW3jdNhVe0noA3CXoNJ GsHfMqiUCHD5GIhbbniodMkiF1NdlNgLeGjRGnHeYISUlmE8Qftji1WE/SCQYwnYqxJ+cAZwg8V4p laYXa3svSCRgMoBXHe9W20xPaB5ffWWeRcFWPQDETcaZXaQQaAYMu1kiyP9OmcaIbRsTCXpQzGCFV 9UinQquUt5FZkd6/tVgeqtcXfYgNqHx7cMusOdDnIlnYbcIRfe3a7Z6qgl7JrJH1s31f5b1gTom0t S8s6ejaID786iusb7QRnmuNVt/7WvOlpWALxiPCuIc2in2gtaUisHUtirIE779PCXyBrEFoUhArqc Ji0/EHjhLY/k0vmhmPpvMIHdNkv4R88V8vabKRjbowK1grjY3zeLOllXfjiVbxJvVbhuJcnygOQGd VgncSpoRe+/aTPPLXS8PGK9DvxdLFDU4Jt24SGLZU=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:34 +0100 Message-Id: <20230702154838.722809-18-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 17/21] mac_via: always clear ADB interrupt when switching to A/UX mode X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313049047100004 Content-Type: text/plain; charset="utf-8" When the NetBSD kernel initialises it can leave the ADB interrupt asserted depending upon where in the ADB poll cycle the MacOS ADB interrupt handler is when the NetBSD kernel disables interrupts. The NetBSD ADB driver uses the ADB interrupt state to determine if the ADB is busy and refuses to send ADB commands unless it is clear. To ensure that this doesn't happen, always clear the ADB interrupt when switching to A/UX mode to ensure that the bus enumeration always occurs. Signed-off-by: Mark Cave-Ayland --- hw/misc/mac_via.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index 398e8d1967..5d1adf5863 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -875,6 +875,15 @@ static void via1_auxmode_update(MOS6522Q800VIA1State *= v1s) if (irq !=3D oldirq) { trace_via1_auxmode(irq); qemu_set_irq(v1s->auxmode_irq, irq); + + /* + * Clear the ADB interrupt. MacOS can leave VIA1B_vADBInt asserted + * (low) if a poll sequence doesn't complete before NetBSD disables + * interrupts upon boot. Fortunately NetBSD switches to the so-cal= led + * "A/UX" interrupt mode after it initialises, so we can use this = as + * a convenient place to clear the ADB interrupt for now. + */ + s->b |=3D VIA1B_vADBInt; } } =20 --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313105334907.3619736592585; Sun, 2 Jul 2023 08:51:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzL2-0006YW-7n; Sun, 02 Jul 2023 11:50:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKx-0006Mh-Ud for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:08 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKv-0007Uo-59 for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:07 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKV-0001Ji-Pq; Sun, 02 Jul 2023 16:49:43 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=MnrJjOSAMpRtEVTxfxfWu0FbVCn90teB3EdLJBeVP7A=; b=R+JZ5STuJkWUZSJRmb+5T9sSKz xiJEOOKjwVVhGA9B1b6hgPlYTZL90v+s3h7TunVC+vJTHmLV0Gw7J1tSPfZHOr/faktsCuiWbfUZD yMLU6mifQxT6lHw0AUzp3Il2V6m+MtDbZ++k6V3I4yJJZ7LJzzRtmGYUPj3Q+kO1w4PZR2t1emXTo eyscM2vXjtPwP8RINvW4b3OTBlilRzBqoMNjCXbBlN1/SDXtaaNue9wXj/ijx5wrv2rZP2zQki7Or zsNDdV9E3oV1W6v7pdsZ0W3F1wWhZJpwU2u0VjJKwV2wctHpV/GBTXAFPBAADmh6FHoJi4wKHYR0n /quDivE59gPeVSo3EjTKlTohBekpCZ/ZOHtSJiP1S2NxFBupiwlUeJtGqdCZPglOK00LaxGoXOXSZ w3JaiSpXOMRV/mKnnXemZRJi9ya+2uQNoOQM65mDm3kzzqpUqJxOTusKmeYpr7OV29K2Fg9cdNDUd 25fuIVksbf3/dVmSIbarw+ne8o7YiblHrOO/awX9LynzXGq0ojAHB0OvYnlA0VUL/p8GXdZaM8cJ+ x0k4vg4piRnRKiLWgyUfiqslK6zohtLNrctclpuYkoBcPRsl8ZBPQX8KTfATNOVPF8Bxjv7IYPbbR aeP4/WaCtqCg2nXiCl4lReMH/ApEt1PoctJRVhzkc=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:35 +0100 Message-Id: <20230702154838.722809-19-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 18/21] q800: add ESCC alias at 0xc000 X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313107378100007 Content-Type: text/plain; charset="utf-8" Tests on real Q800 hardware show that the ESCC is addressable at multiple l= ocations within the ESCC memory region - at least 0xc000, 0xc020 (as expected by the= MacOS toolbox ROM) and 0xc040. All released NetBSD kernels before 10 use the 0xc000 address which causes a= fatal error when running the MacOS booter. Add a single memory region alias at 0x= c000 to enable NetBSD kernels to start booting under QEMU. Signed-off-by: Mark Cave-Ayland --- hw/m68k/q800.c | 6 ++++++ include/hw/m68k/q800.h | 1 + 2 files changed, 7 insertions(+) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index 5ae7c37760..b5b2cabc33 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -451,6 +451,12 @@ static void q800_machine_init(MachineState *machine) memory_region_add_subregion(&m->macio, SCC_BASE - IO_BASE, sysbus_mmio_get_region(sysbus, 0)); =20 + /* Create alias for NetBSD */ + memory_region_init_alias(&m->escc_alias, OBJECT(machine), "escc-alias", + sysbus_mmio_get_region(sysbus, 0), 0, 0x8); + memory_region_add_subregion(&m->macio, SCC_BASE - IO_BASE - 0x20, + &m->escc_alias); + /* SCSI */ =20 object_initialize_child(OBJECT(machine), "esp", &m->esp, diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index fbaacd88bd..348eaf4703 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -67,6 +67,7 @@ struct Q800MachineState { MemoryRegion macio; MemoryRegion macio_alias; MemoryRegion machine_id; + MemoryRegion escc_alias; }; =20 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800") --=20 2.30.2 From nobody Tue May 14 22:12:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313061784648.9726584911064; Sun, 2 Jul 2023 08:51:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzL0-0006Qt-Lt; Sun, 02 Jul 2023 11:50:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKx-0006Jn-Cd for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:07 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKv-0007Us-BP for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:07 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKZ-0001Ji-UY; Sun, 02 Jul 2023 16:49:44 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=/xFQQDc81Gzoc4RIj9SAXglW16gUPsV4jREyKnd1gjU=; b=fAUmA9ULMo2L58EaSDcJQpMTfA acFNPwQ/AvOSuO0+aPvdb8kia3HTZRtAdooqvvUNYZ1z0THRl0K9JpQ0CwJpmX6z/qGLlUahz2khh ME4eoU/x16SgaV69dJZRxVaFZklJonan7q4QDkgh6wO9AWGnZfV1XdB6XXbyGHat/xw4Aa7+q7kkg IzWxpa8Qr0r4tk0tI8AXWCIvsEv/kVpXkjfqHbh1UzVHShl2sq0rv0KZm2uqRw+Mz8y0IUIXoGdtb atjjMMZUQK318ofFtQV7rigcvP6i6n10Wv9J0TbvBtLyCcB25p0T3b8H1UkNqOsRewwWKQa+UazNZ rJYDN/q52oIySVtDDGBo0kH12v8TY3eHz+mB+BgoraGlmKqlmLY0f68yC53b+13w8G/P54FSR4poe 44m5fZS1vquDHt+kiCN3VbHrNfJJ/KwZxMURZNFOx2b68yWg7HZxTDTbyWC5rH26QRDMQ+yMstoU2 jEU+rs/d3+0Q5LjLxbfbBWUTDuzBcbcH2mP3EASehfh0r4MNktVxljQzCzrMXns0VphCE6Gc8uHUF MCWtybVjpW4X5cOI8EcXa0XYMaH54CmdSR+A1k2nlyKV1xDdtHMI4ImvSFmxCsjw7ylDKulDe/yuW JLEYNFHG1SdKCT5tAIiEfFSucND3sC3qCLeEGIIuA=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:36 +0100 Message-Id: <20230702154838.722809-20-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 19/21] q800: add alias for MacOS toolbox ROM at 0x40000000 X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313063243100006 Content-Type: text/plain; charset="utf-8" According to the Apple Quadra 800 Developer Note document, the Quadra 800 R= OM consists of 2 ROM code sections based at offsets 0x0 and 0x800000. A/UX att= empts to access the toolbox ROM at the lower offset during startup, so provide a memory alias to allow the access to succeed. Signed-off-by: Mark Cave-Ayland --- hw/m68k/q800.c | 5 +++++ include/hw/m68k/q800.h | 1 + 2 files changed, 6 insertions(+) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index b5b2cabc33..87665c6407 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -657,6 +657,11 @@ static void q800_machine_init(MachineState *machine) filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->= rom); =20 + memory_region_init_alias(&m->rom_alias, NULL, "m68k_mac.rom-alias", + &m->rom, 0, MACROM_SIZE); + memory_region_add_subregion(get_system_memory(), 0x40000000, + &m->rom_alias); + /* Load MacROM binary */ if (filename) { bios_size =3D load_image_targphys(filename, MACROM_ADDR, MACRO= M_SIZE); diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h index 348eaf4703..a9661f65f6 100644 --- a/include/hw/m68k/q800.h +++ b/include/hw/m68k/q800.h @@ -50,6 +50,7 @@ struct Q800MachineState { bool easc; M68kCPU cpu; MemoryRegion rom; + MemoryRegion rom_alias; GLUEState glue; MOS6522Q800VIA1State via1; MOS6522Q800VIA2State via2; --=20 2.30.2 From nobody Tue May 14 22:12:51 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313060788919.4551548652582; Sun, 2 Jul 2023 08:51:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzL1-0006WW-LM; Sun, 02 Jul 2023 11:50:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKy-0006OA-NF for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:08 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKv-0007Ux-TH for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:08 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKa-0001Ji-6D; Sun, 02 Jul 2023 16:49:44 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=8d1kD424yCwgXkQ27ySzpfjrDG0peFKyKvz1UrENdxo=; b=L4AQ9q/i4BmaeuZp5I8pi/OFz7 mTDpz+rhzScTzwiZf1fHlN7BpRfpid+mkqgLseLIMwUjaL1RtGcXDrbXwNA5xr3UwsRpWXclHjyf1 uZA1IGNxmxa9RwJqxKk9+lnaRQu0W8ABx716sbN/8lRDz0uOdGIaTSyz1Jp5RAXuHIAZwKEA9hi7t syGDMisVttBKbf+tHAhKNtg+uBtVuftampU7hAu6YBLOzr5l4UnBfxR2p9fOIdlPRMHb+LsoQT1as sa7090qoffefqaDdhkT/jTKRp6cbg+d9c8dBgTz/TBZ454Pzu9oi05eN4DT3OWHQtYeSkbjoU7Gnf MCX+xD9KyoF7isz/hTRaN6SUcekwF6VdJta39ijhhDByeDgcqpyr9xQbcmBdfcqM8/0P8InvWeVYV ePMW2BgVfCbmbarrQrSBkOANdSjJXLIwx0vc3+asAetMD3GFlUImdjCvvygKS6lE1QeQsrdZjLxYD 8qJt5KzbMawworDZVT1jzG4rEP+qjTRnu+gMtH2AjanpgEAv3nwRhlP+G9djR9bowDeVz9N1LkI6G 3C3eLQa4nWgaw3f92UiSck5/P3WQXeFUo4Xs8raWonSatyHXrEvLn5Uof1TqXV2j9DkeSVybmoqgN 6ROXZ5O2RtKYeUFuBVCWEDBlokwNkm5iILlJGtPXg=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:37 +0100 Message-Id: <20230702154838.722809-21-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 20/21] mac_via: allow unaligned access to VIA1 registers X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313061108100001 Content-Type: text/plain; charset="utf-8" During the kernel timer calibration routine A/UX performs an unaligned acce= ss across the T2CL and T2CH registers to read the entire 16-bit value in a single memory access. Allow unaligned accesses to the VIA1 memory region such that the unaligned address and size are available within the MemoryRegionOps read and write functions. This gives two advantages: i) the unaligned accesses can be logged and ii) the original access information can be used subsequently to detect when the A/UX timer calibration is being executed. Signed-off-by: Mark Cave-Ayland --- hw/m68k/q800.c | 2 + hw/misc/mac_via.c | 127 ++++++++++++++++++++++++++----------------- hw/misc/trace-events | 2 + 3 files changed, 80 insertions(+), 51 deletions(-) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index 87665c6407..eb2f11234a 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -198,6 +198,8 @@ static const MemoryRegionOps macio_alias_ops =3D { .valid =3D { .min_access_size =3D 1, .max_access_size =3D 4, + /* VIA1 unaligned access for A/UX timer calibration */ + .unaligned =3D true, }, }; =20 diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index 5d1adf5863..94b4f5cebc 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -995,20 +995,33 @@ static void via1_timer_calibration_hack(MOS6522Q800VI= A1State *v1s, int addr, =20 static uint64_t mos6522_q800_via1_read(void *opaque, hwaddr addr, unsigned= size) { - MOS6522Q800VIA1State *s =3D MOS6522_Q800_VIA1(opaque); - MOS6522State *ms =3D MOS6522(s); - uint64_t ret; + MOS6522Q800VIA1State *v1s =3D MOS6522_Q800_VIA1(opaque); + MOS6522State *ms =3D MOS6522(v1s); + int64_t now; + uint8_t ret; + uint64_t val =3D 0; + int i; + hwaddr addr1; + + /* Handle unaligned read used by A/UX timer calibration code */ + addr1 =3D (addr >> 9) & 0xf; + for (i =3D 0; i < size; i++, addr1++) { + ret =3D mos6522_read(ms, addr1, size); + switch (addr1) { + case VIA_REG_A: + case VIA_REG_ANH: + /* Quadra 800 Id */ + ret =3D (ret & ~VIA1A_CPUID_MASK) | VIA1A_CPUID_Q800; + break; + } + val |=3D ret << ((size - i - 1) << 3); + } =20 - addr =3D (addr >> 9) & 0xf; - ret =3D mos6522_read(ms, addr, size); - switch (addr) { - case VIA_REG_A: - case VIA_REG_ANH: - /* Quadra 800 Id */ - ret =3D (ret & ~VIA1A_CPUID_MASK) | VIA1A_CPUID_Q800; - break; + if ((addr >> 9) !=3D ((addr + size) >> 9)) { + trace_via1_unaligned_read(addr, val, size); } - return ret; + + return val; } =20 static void mos6522_q800_via1_write(void *opaque, hwaddr addr, uint64_t va= l, @@ -1018,53 +1031,63 @@ static void mos6522_q800_via1_write(void *opaque, h= waddr addr, uint64_t val, MOS6522State *ms =3D MOS6522(v1s); int oldstate, state; int oldsr =3D ms->sr; + hwaddr addr1; + uint8_t v; + int i; =20 - addr =3D (addr >> 9) & 0xf; + if ((addr >> 9) !=3D ((addr + size) >> 9)) { + trace_via1_unaligned_write(addr, val, size); + } =20 - via1_timer_calibration_hack(v1s, addr, val, size); + addr1 =3D (addr >> 9) & 0xf; + via1_timer_calibration_hack(v1s, addr1, val, size); =20 - mos6522_write(ms, addr, val, size); + /* Handle unaligned write used by A/UX timer calibration code */ + for (i =3D 0; i < size; i++, addr1++) { + v =3D val >> ((size - i - 1) << 3); + mos6522_write(ms, addr1, v, size); =20 - switch (addr) { - case VIA_REG_B: - via1_rtc_update(v1s); - via1_adb_update(v1s); - via1_auxmode_update(v1s); + switch (addr1) { + case VIA_REG_B: + via1_rtc_update(v1s); + via1_adb_update(v1s); + via1_auxmode_update(v1s); =20 - v1s->last_b =3D ms->b; - break; + v1s->last_b =3D ms->b; + break; =20 - case VIA_REG_SR: - { - /* - * NetBSD assumes it can send its first ADB command after send= ing - * the ADB_BUSRESET command in ADB_STATE_NEW without changing = the - * state back to ADB_STATE_IDLE first as detailed in the ADB - * protocol. - * - * Add a workaround to detect this condition at the start of A= DB - * enumeration and send the next command written to SR after a - * ADB_BUSRESET onto the bus regardless, even if we don't dete= ct a - * state transition to ADB_STATE_NEW. - * - * Note that in my tests the NetBSD state machine takes one ADB - * operation to recover which means the probe for an ADB devic= e at - * address 1 always fails. However since the first device is at - * address 2 then this will work fine, without having to come = up - * with a more complicated and invasive solution. - */ - oldstate =3D (v1s->last_b & VIA1B_vADB_StateMask) >> - VIA1B_vADB_StateShift; - state =3D (ms->b & VIA1B_vADB_StateMask) >> VIA1B_vADB_StateSh= ift; - - if (oldstate =3D=3D ADB_STATE_NEW && state =3D=3D ADB_STATE_NE= W && - (ms->acr & VIA1ACR_vShiftOut) && - oldsr =3D=3D 0 /* ADB_BUSRESET */) { - trace_via1_adb_netbsd_enum_hack(); - adb_via_send(v1s, state, ms->sr); + case VIA_REG_SR: + { + /* + * NetBSD assumes it can send its first ADB command after + * sending the ADB_BUSRESET command in ADB_STATE_NEW witho= ut + * changing the state back to ADB_STATE_IDLE first as deta= iled + * in the ADB protocol. + * + * Add a workaround to detect this condition at the start = of + * ADB enumeration and send the next command written to SR + * after a ADB_BUSRESET onto the bus regardless, even if we + * don't detect a state transition to ADB_STATE_NEW. + * + * Note that in my tests the NetBSD state machine takes on= e ADB + * operation to recover which means the probe for an ADB d= evice + * at address 1 always fails. However since the first devi= ce is + * at address 2 then this will work fine, without having to + * come up with a more complicated and invasive solution. + */ + oldstate =3D (v1s->last_b & VIA1B_vADB_StateMask) >> + VIA1B_vADB_StateShift; + state =3D (ms->b & VIA1B_vADB_StateMask) >> VIA1B_vADB_Sta= teShift; + + if (oldstate =3D=3D ADB_STATE_NEW && state =3D=3D ADB_STAT= E_NEW && + (ms->acr & VIA1ACR_vShiftOut) && + oldsr =3D=3D 0 /* ADB_BUSRESET */) { + trace_via1_adb_netbsd_enum_hack(); + adb_via_send(v1s, state, ms->sr); + } } + break; } - break; } } =20 @@ -1075,6 +1098,8 @@ static const MemoryRegionOps mos6522_q800_via1_ops = =3D { .valid =3D { .min_access_size =3D 1, .max_access_size =3D 4, + /* VIA1 unaligned access for A/UX timer calibration */ + .unaligned =3D true, }, }; =20 diff --git a/hw/misc/trace-events b/hw/misc/trace-events index 3d14e1db09..81bb16cea2 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -270,6 +270,8 @@ via1_adb_poll(uint8_t data, const char *vadbint, int st= atus, int index, int size via1_adb_netbsd_enum_hack(void) "using NetBSD enum hack" via1_auxmode(int mode) "setting auxmode to %d" via1_timer_hack_state(int state) "setting timer_hack_state to %d" +via1_unaligned_read(uint64_t addr, uint64_t value, unsigned size) "addr=3D= 0x%"PRIx64" value=3D0x%"PRIx64" size=3D%u" +via1_unaligned_write(uint64_t addr, uint64_t value, unsigned size) "addr= =3D0x%"PRIx64" value=3D0x%"PRIx64" size=3D%u" =20 # grlib_ahb_apb_pnp.c grlib_ahb_pnp_read(uint64_t addr, unsigned size, uint32_t value) "AHB PnP = read addr:0x%03"PRIx64" size:%u data:0x%08x" --=20 2.30.2 From nobody Tue May 14 22:12:51 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=ilande.co.uk Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1688313071429234.72372769373794; Sun, 2 Jul 2023 08:51:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qFzL4-0006dx-5M; Sun, 02 Jul 2023 11:50:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKy-0006OG-NO for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:08 -0400 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qFzKw-0007V1-6T for qemu-devel@nongnu.org; Sun, 02 Jul 2023 11:50:07 -0400 Received: from [2a00:23c4:8bad:df00:f732:dd76:7417:d15b] (helo=kentang.home) by mail.ilande.co.uk with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qFzKa-0001Ji-L3; Sun, 02 Jul 2023 16:49:44 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ilande.co.uk; s=20220518; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=UEHg4P0OOBpd0e1wB2PrNZv1ZDTepBghvW1RkyLjlZw=; b=yqoRBGinRBHUTXK/Tt597nxlG4 BZiCAUT/lcRks50ugXaRLnxpXmOgvm4soNgF8YnbI75eyqHnbrvTUGnTDcQaBd4w8uIxZSeQ7dk6y h3w6uu9DVpWsaOJ7drf9XOmpuLmZ3x+dC0JhUEhQRGVqMbArrwGYLdkXqg94jUCkZKItkPCfxCnWo +Lpt0Owc6l1PVO/EkTki4f9Ugjuo1kJt2s/o1yG+8bLc2EKhBxyTlx88D1XRorcN7ckNfTViNOIT+ kAuRmItmOwXfvz7gQpuHM1yb7//9vVYtzvkzQH/KQRs1W5fB5EfsIllFC0qgIjBQM07HoXW4efH6/ 9RR6bmfZhCKLSpeUEKyGuPMCWwy7swOw8zs8S/kKINiD1qH7NaGo4O8YxhdqHEhOcPxLQWSfrc9Z1 +p9Kr9saTA6pzpPeuPMGqKkfaaS/q2zGLP6CfyOo+/3B+jyTQOpu608oNHXQ7mhmtA7PdId8MFQEr F4cXBJ+hu4Q5TEeRRNAmysO9hho01ESl5URG06V0QZp0vfEA1ObvaywXogrARP8RLzrXXqSr5BDnu UWKBQ6mKNAvWmeH9wfMWzrueQUFAc6J4ulFWRXZESHRjEdSq9LZjw6JmXRfisfGuawzHQg9/Y0WOq FD2KN5hPw5cjjHkl835UgY88zFw1DaBZkruwYkQLU=; From: Mark Cave-Ayland To: laurent@vivier.eu, qemu-devel@nongnu.org Date: Sun, 2 Jul 2023 16:48:38 +0100 Message-Id: <20230702154838.722809-22-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> References: <20230702154838.722809-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 2a00:23c4:8bad:df00:f732:dd76:7417:d15b X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 21/21] mac_via: extend timer calibration hack to work with A/UX X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.ilande.co.uk) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.ilande.co.uk 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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1688313073267100001 Content-Type: text/plain; charset="utf-8" The A/UX timer calibration loop runs continuously until 2 consecutive itera= tions differ by at least 0x492 timer ticks. Modern hosts execute the timer calibr= ation loop so fast that this situation never occurs causing a hang on boot. Use a similar method to Shoebill which is to randomly add 0x500 to the T2 counter value during calibration to enable it to eventually succeed. Signed-off-by: Mark Cave-Ayland --- hw/misc/mac_via.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index 94b4f5cebc..ea9d8b3aa9 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -983,6 +983,30 @@ static void via1_timer_calibration_hack(MOS6522Q800VIA= 1State *v1s, int addr, /* Looks like there has been a reset? */ v1s->timer_hack_state =3D 1; } + + if (addr =3D=3D VIA_REG_T2CL && val =3D=3D 0xf03c && size =3D=3D 2= ) { + /* VIA_REG_T2CH: high byte of counter (A/UX) */ + v1s->timer_hack_state =3D 5; + } + break; + case 5: + if ((addr =3D=3D VIA_REG_IER && val =3D=3D 0x20) || addr =3D=3D VI= A_REG_T2CH) { + /* End of A/UX timer calibration routine, or another write */ + v1s->timer_hack_state =3D 6; + } else { + v1s->timer_hack_state =3D 0; + } + break; + case 6: + /* + * This is the normal post-calibration timer state once both the + * MacOS toolbox and A/UX have been calibrated, until we see a wri= te + * to VIA_REG_PCR to suggest a reset + */ + if (addr =3D=3D VIA_REG_PCR && val =3D=3D 0x22) { + /* Looks like there has been a reset? */ + v1s->timer_hack_state =3D 1; + } break; default: g_assert_not_reached(); @@ -1013,6 +1037,23 @@ static uint64_t mos6522_q800_via1_read(void *opaque,= hwaddr addr, unsigned size) /* Quadra 800 Id */ ret =3D (ret & ~VIA1A_CPUID_MASK) | VIA1A_CPUID_Q800; break; + case VIA_REG_T2CH: + if (v1s->timer_hack_state =3D=3D 5) { + /* + * The A/UX timer calibration loop runs continuously until= 2 + * consecutive iterations differ by at least 0x492 timer t= icks. + * Modern hosts execute the timer calibration loop so fast= that + * this situation never occurs causing a hang on boot. Use= a + * similar method to Shoebill which is to randomly add 0x5= 00 to + * the T2 counter value during calibration to enable it to + * eventually succeed. + */ + now =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + if (now & 1) { + ret +=3D 0x5; + } + } + break; } val |=3D ret << ((size - i - 1) << 3); } --=20 2.30.2