From nobody Tue Feb 10 16:44:11 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.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; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1568562051; cv=none; d=zoho.com; s=zohoarc; b=TXoirbU4lxQhe3AyGpMLth8Iqdspufofq8F1+s53nQtmiLg2qv0a69s/oE6Bpivayo0ub2IL9FTJTHqBosjjJdbj5dyl0rmrrb5/o99RmvWtfx1/r13edNgZmmfRJTr4vhPQlVmS/BwHETaFcr2nkYmJZe/ZbLQAPVwrn1TcuHs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568562051; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=kndH3oyVtVYIuClLXDY6XnGOP2tAELt65P36bhFIj9U=; b=MYY4/YBtLZ6vsFlOo6zwduVw0zGWLxxlrTacspxvAIYx/xDF5KUdzNgNF8B545xW0Eq1CEADU7srpuaHOV8/gSOZWsaIvsKybzKSSDyHbb5CgMbP8jMli8wfiFR+kph4ASdqmNWWqbzeMkFJYl/MmIGhjrOu1QyUisW8rbuWiz4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568562051531996.6671410797038; Sun, 15 Sep 2019 08:40:51 -0700 (PDT) Received: from localhost ([::1]:55654 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i9Wds-00054f-8x for importer@patchew.org; Sun, 15 Sep 2019 11:40:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48194) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i9Wbo-0003Zl-2G for qemu-devel@nongnu.org; Sun, 15 Sep 2019 11:38:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i9Wbm-0003Pp-Ar for qemu-devel@nongnu.org; Sun, 15 Sep 2019 11:38:39 -0400 Received: from mout.kundenserver.de ([212.227.17.10]:46271) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i9Wbi-0003MY-Sq; Sun, 15 Sep 2019 11:38:35 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MF45G-1hu8OO1A4W-00FT7k; Sun, 15 Sep 2019 17:38:08 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Sun, 15 Sep 2019 17:37:46 +0200 Message-Id: <20190915153751.11333-5-laurent@vivier.eu> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190915153751.11333-1-laurent@vivier.eu> References: <20190915153751.11333-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:yXEtwueIn99LNauapnt7nS4r5frDzcrnQbXjhqgFh7SBKXXPkye BPgkn7cCAvDV/cx5yu/honZACIuMBjt7nl8z4efBVEVXmejuhTlTfZ5EDA+Jy2MZ3dWThKo icBzqUoN6zAajQegRovboMS95zA+yVxnx8EJZLEho14u1TomjZVhfjFc0dEGDWNJPyWreU+ mPe41I4Yn3WL+19mAPUDQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:W1AadD1J6Kg=:gBUSllm+Zf6U9Z/M3/5cAe 8RQdbFyGUVXBOuwwbmzmPwmAF7rn/zYSYhVZ7u0TXhtIQpVxYo/yQppwRKfU7v+M6UIEupikP pv0gznH2Vz+uXXn4/A3W9NysAreF/aVi2asP2fkXSB0szHqEv8VE2ixbAjMwlngPMDv4uNoDr ZCiqDwtfKyB3rYWVkQCDnSGSLMeTGa8SZ/VsrQlLmzvaF2PUiompPylI5vQpfslOb1VKlKMA/ e8LSILsDcKQ43vNXkJU7BIgP54ObFjDNRv99HOF3kgQbvUavjfXyJxhAsRmzlQg/DBfmALZGN Y8DkAGJkhiTr/9H84LMd59P+zwClmEhX3PKNz/aB1gz5ESMtDhBgWft5Sw+QYJKe7n0cxz9V4 OpAYxOD2YygNqr6KXD5IfVCkkMHODanp2zdujzIDqAzJGC9Wyez+Rh0ssOc7Pc8lzUyNB6uXM 3LGpyT0xksl2+qbAal3jOG0BoY1JE4+ou6d6cx1Je5kKX2fsLdRMaLmoMFHyrEHLmOEQ8GUb1 g1SNdmDLtqt6h8nnoSL+xohY7WRndQGdDzKBye/eUOHm9jd/gNxOM57qld7QJyrWpFGt95aV+ umu+v4wGY9cjE2YqPEyyhj5tEq1AwIVnTs1PDFfS81Rg8pT031CNXNLM6N+JAXAq2mMXSn1rx 4NNYBBweoBMVOKKltbW+BivZkfkS/zxjhV+DEAtAkvgqFGJ/EbtqacB5mxGOKJU03CLb2d24/ 9OiuKTbqRzSfgORdy59WPx5l7DLopKdB78eJ2/X2USm3NjaBJ7NRXBbSZi05fMpXwHzDoKJVR NwrOEElPeRkKXbKOnEzYkGywHgRTf5+vzmj10gHDlZrqL+B4IBg8LzvqRKJcIylACaY+lGTPp 15LZO+q3YXRcq9JQGkLhgEnTI4nb6mxTHX3ewupcg= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.17.10 Subject: [Qemu-devel] [PATCH v12 4/9] hw/m68k: implement ADB bus support for via X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Thomas Huth , Jason Wang , Mark Cave-Ayland , Laurent Vivier , Max Reitz , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , "Dr . David Alan Gilbert" , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini , Aurelien Jarno , Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" VIA needs to be able to poll the ADB interface and to read/write data from/to the bus. This patch adds functions allowing that. Co-developed-by: Mark Cave-Ayland Signed-off-by: Mark Cave-Ayland Signed-off-by: Laurent Vivier Reviewed-by: Herv=C3=A9 Poussineau Reviewed-by: Thomas Huth --- hw/misc/Kconfig | 1 + hw/misc/mac_via.c | 198 +++++++++++++++++++++++++++++++++++++- include/hw/misc/mac_via.h | 7 ++ 3 files changed, 205 insertions(+), 1 deletion(-) diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index 18a5dc9c09..2164646553 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -123,5 +123,6 @@ config UNIMP config MAC_VIA bool select MOS6522 + select ADB =20 source macio/Kconfig diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c index a052259613..2f54db9e1e 100644 --- a/hw/misc/mac_via.c +++ b/hw/misc/mac_via.c @@ -264,10 +264,16 @@ * Table 19-10 ADB transaction states */ =20 +#define ADB_STATE_NEW 0 +#define ADB_STATE_EVEN 1 +#define ADB_STATE_ODD 2 +#define ADB_STATE_IDLE 3 + #define VIA1B_vADB_StateMask (VIA1B_vADBS1 | VIA1B_vADBS2) #define VIA1B_vADB_StateShift 4 =20 #define VIA_TIMER_FREQ (783360) +#define VIA_ADB_POLL_FREQ 50 /* XXX: not real */ =20 /* VIA returns time offset from Jan 1, 1904, not 1970 */ #define RTC_OFFSET 2082844800 @@ -449,6 +455,181 @@ static void via1_rtc_update(MacVIAState *m) } } =20 +static int adb_via_poll(MacVIAState *s, int state, uint8_t *data) +{ + if (state !=3D ADB_STATE_IDLE) { + return 0; + } + + if (s->adb_data_in_size < s->adb_data_in_index) { + return 0; + } + + if (s->adb_data_out_index !=3D 0) { + return 0; + } + + s->adb_data_in_index =3D 0; + s->adb_data_out_index =3D 0; + s->adb_data_in_size =3D adb_poll(&s->adb_bus, s->adb_data_in, 0xffff); + + if (s->adb_data_in_size) { + *data =3D s->adb_data_in[s->adb_data_in_index++]; + qemu_irq_raise(s->adb_data_ready); + } + + return s->adb_data_in_size; +} + +static int adb_via_send(MacVIAState *s, int state, uint8_t data) +{ + switch (state) { + case ADB_STATE_NEW: + s->adb_data_out_index =3D 0; + break; + case ADB_STATE_EVEN: + if ((s->adb_data_out_index & 1) =3D=3D 0) { + return 0; + } + break; + case ADB_STATE_ODD: + if (s->adb_data_out_index & 1) { + return 0; + } + break; + case ADB_STATE_IDLE: + return 0; + } + + assert(s->adb_data_out_index < sizeof(s->adb_data_out) - 1); + + s->adb_data_out[s->adb_data_out_index++] =3D data; + qemu_irq_raise(s->adb_data_ready); + return 1; +} + +static int adb_via_receive(MacVIAState *s, int state, uint8_t *data) +{ + switch (state) { + case ADB_STATE_NEW: + return 0; + + case ADB_STATE_EVEN: + if (s->adb_data_in_size <=3D 0) { + qemu_irq_raise(s->adb_data_ready); + return 0; + } + + if (s->adb_data_in_index >=3D s->adb_data_in_size) { + *data =3D 0; + qemu_irq_raise(s->adb_data_ready); + return 1; + } + + if ((s->adb_data_in_index & 1) =3D=3D 0) { + return 0; + } + + break; + + case ADB_STATE_ODD: + if (s->adb_data_in_size <=3D 0) { + qemu_irq_raise(s->adb_data_ready); + return 0; + } + + if (s->adb_data_in_index >=3D s->adb_data_in_size) { + *data =3D 0; + qemu_irq_raise(s->adb_data_ready); + return 1; + } + + if (s->adb_data_in_index & 1) { + return 0; + } + + break; + + case ADB_STATE_IDLE: + if (s->adb_data_out_index =3D=3D 0) { + return 0; + } + + s->adb_data_in_size =3D adb_request(&s->adb_bus, s->adb_data_in, + s->adb_data_out, + s->adb_data_out_index); + s->adb_data_out_index =3D 0; + s->adb_data_in_index =3D 0; + if (s->adb_data_in_size < 0) { + *data =3D 0xff; + qemu_irq_raise(s->adb_data_ready); + return -1; + } + + if (s->adb_data_in_size =3D=3D 0) { + return 0; + } + + break; + } + + assert(s->adb_data_in_index < sizeof(s->adb_data_in) - 1); + + *data =3D s->adb_data_in[s->adb_data_in_index++]; + qemu_irq_raise(s->adb_data_ready); + if (*data =3D=3D 0xff || *data =3D=3D 0) { + return 0; + } + return 1; +} + +static void via1_adb_update(MacVIAState *m) +{ + MOS6522Q800VIA1State *v1s =3D MOS6522_Q800_VIA1(&m->mos6522_via1); + MOS6522State *s =3D MOS6522(v1s); + int state; + int ret; + + state =3D (s->b & VIA1B_vADB_StateMask) >> VIA1B_vADB_StateShift; + + if (s->acr & VIA1ACR_vShiftOut) { + /* output mode */ + ret =3D adb_via_send(m, state, s->sr); + if (ret > 0) { + s->b &=3D ~VIA1B_vADBInt; + } else { + s->b |=3D VIA1B_vADBInt; + } + } else { + /* input mode */ + ret =3D adb_via_receive(m, state, &s->sr); + if (ret > 0 && s->sr !=3D 0xff) { + s->b &=3D ~VIA1B_vADBInt; + } else { + s->b |=3D VIA1B_vADBInt; + } + } +} + +static void via_adb_poll(void *opaque) +{ + MacVIAState *m =3D opaque; + MOS6522Q800VIA1State *v1s =3D MOS6522_Q800_VIA1(&m->mos6522_via1); + MOS6522State *s =3D MOS6522(v1s); + int state; + + if (s->b & VIA1B_vADBInt) { + state =3D (s->b & VIA1B_vADB_StateMask) >> VIA1B_vADB_StateShift; + if (adb_via_poll(m, state, &s->sr)) { + s->b &=3D ~VIA1B_vADBInt; + } + } + + timer_mod(m->adb_poll_timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + + (NANOSECONDS_PER_SECOND / VIA_ADB_POLL_FREQ)); +} + static uint64_t mos6522_q800_via1_read(void *opaque, hwaddr addr, unsigned= size) { MOS6522Q800VIA1State *s =3D MOS6522_Q800_VIA1(opaque); @@ -511,6 +692,10 @@ static void mac_via_reset(DeviceState *dev) { MacVIAState *m =3D MAC_VIA(dev); =20 + timer_mod(m->adb_poll_timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + + (NANOSECONDS_PER_SECOND / VIA_ADB_POLL_FREQ)); + timer_mod(m->VBL_timer, (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 16630) / 16630 * 16630); =20 @@ -549,6 +734,10 @@ static void mac_via_realize(DeviceState *dev, Error **= errp) =20 qemu_get_timedate(&tm, 0); m->tick_offset =3D (uint32_t)mktimegm(&tm) + RTC_OFFSET; + + m->adb_poll_timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, via_adb_poll, m= ); + m->adb_data_ready =3D qdev_get_gpio_in_named(dev, "via1-irq", + VIA1_IRQ_ADB_READY_BIT); } =20 static void mac_via_init(Object *obj) @@ -594,7 +783,13 @@ static const VMStateDescription vmstate_mac_via =3D { VMSTATE_UINT8(cmd, MacVIAState), VMSTATE_INT32(wprotect, MacVIAState), VMSTATE_INT32(alt, MacVIAState), - /* external timers */ + /* ADB */ + VMSTATE_TIMER_PTR(adb_poll_timer, MacVIAState), + VMSTATE_INT32(adb_data_in_size, MacVIAState), + VMSTATE_INT32(adb_data_in_index, MacVIAState), + VMSTATE_INT32(adb_data_out_index, MacVIAState), + VMSTATE_BUFFER(adb_data_in, MacVIAState), + VMSTATE_BUFFER(adb_data_out, MacVIAState), VMSTATE_TIMER_PTR(one_second_timer, MacVIAState), VMSTATE_TIMER_PTR(VBL_timer, MacVIAState), VMSTATE_END_OF_LIST() @@ -626,6 +821,7 @@ static void mos6522_q800_via1_portB_write(MOS6522State = *s) MacVIAState *m =3D container_of(v1s, MacVIAState, mos6522_via1); =20 via1_rtc_update(m); + via1_adb_update(m); =20 v1s->last_b =3D s->b; } diff --git a/include/hw/misc/mac_via.h b/include/hw/misc/mac_via.h index 69bdecabb0..2181140293 100644 --- a/include/hw/misc/mac_via.h +++ b/include/hw/misc/mac_via.h @@ -97,6 +97,13 @@ typedef struct MacVIAState { =20 /* ADB */ ADBBusState adb_bus; + QEMUTimer *adb_poll_timer; + qemu_irq adb_data_ready; + int adb_data_in_size; + int adb_data_in_index; + int adb_data_out_index; + uint8_t adb_data_in[128]; + uint8_t adb_data_out[16]; =20 /* external timers */ QEMUTimer *one_second_timer; --=20 2.21.0