Module Name: src
Committed By: tsutsui
Date: Sat Dec 3 17:38:02 UTC 2016
Modified Files:
src/distrib/sets/lists/comp: md.luna68k
src/etc/etc.luna68k: MAKEDEV.conf
src/sys/arch/luna68k/conf: GENERIC files.luna68k majors.luna68k
src/sys/arch/luna68k/include: Makefile
src/sys/arch/luna68k/luna68k: mainbus.c
Added Files:
src/sys/arch/luna68k/dev: xp.c
src/sys/arch/luna68k/include: xpio.h
Log Message:
Preliminary support for LUNA's HD647180X I/O processor (a.k.a. XP).
Demonstrated as "PSG tunes / PCM wav player on LUNA"
(using Z80 PSG/PCM drivers ported from NEC PC-6001)
at OSC2016 Kyoto and OSC2016 Hiroshima:
http://mail-index.netbsd.org/netbsd-advocacy/2016/08/01/msg000712.html
http://mail-index.netbsd.org/netbsd-advocacy/2016/11/29/msg000724.html
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/distrib/sets/lists/comp/md.luna68k
cvs rdiff -u -r1.8 -r1.9 src/etc/etc.luna68k/MAKEDEV.conf
cvs rdiff -u -r1.119 -r1.120 src/sys/arch/luna68k/conf/GENERIC
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/luna68k/conf/files.luna68k
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/luna68k/conf/majors.luna68k
cvs rdiff -u -r0 -r1.1 src/sys/arch/luna68k/dev/xp.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/luna68k/include/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/arch/luna68k/include/xpio.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/luna68k/luna68k/mainbus.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/comp/md.luna68k
diff -u src/distrib/sets/lists/comp/md.luna68k:1.20 src/distrib/sets/lists/comp/md.luna68k:1.21
--- src/distrib/sets/lists/comp/md.luna68k:1.20 Thu Dec 24 14:16:46 2015
+++ src/distrib/sets/lists/comp/md.luna68k Sat Dec 3 17:38:02 2016
@@ -1,4 +1,4 @@
-# $NetBSD: md.luna68k,v 1.20 2015/12/24 14:16:46 christos Exp $
+# $NetBSD: md.luna68k,v 1.21 2016/12/03 17:38:02 tsutsui Exp $
./usr/include/ieeefp.h comp-c-include
./usr/include/luna68k comp-c-include
./usr/include/luna68k/_G_config.h comp-obsolete obsolete
@@ -52,3 +52,4 @@
./usr/include/luna68k/varargs.h comp-obsolete obsolete
./usr/include/luna68k/vmparam.h comp-c-include
./usr/include/luna68k/wchar_limits.h comp-c-include
+./usr/include/luna68k/xpio.h comp-c-include
Index: src/etc/etc.luna68k/MAKEDEV.conf
diff -u src/etc/etc.luna68k/MAKEDEV.conf:1.8 src/etc/etc.luna68k/MAKEDEV.conf:1.9
--- src/etc/etc.luna68k/MAKEDEV.conf:1.8 Mon Jan 14 09:15:57 2013
+++ src/etc/etc.luna68k/MAKEDEV.conf Sat Dec 3 17:38:02 2016
@@ -1,9 +1,10 @@
-# $NetBSD: MAKEDEV.conf,v 1.8 2013/01/14 09:15:57 tsutsui Exp $
+# $NetBSD: MAKEDEV.conf,v 1.9 2016/12/03 17:38:02 tsutsui Exp $
all_md)
makedev ttya sd0 sd1 sd2 sd3 cd0 cd1 st0 st1
makedev wscons
makedev scsibus0 scsibus1
+ makedev xp
;;
tty[ab])
Index: src/sys/arch/luna68k/conf/GENERIC
diff -u src/sys/arch/luna68k/conf/GENERIC:1.119 src/sys/arch/luna68k/conf/GENERIC:1.120
--- src/sys/arch/luna68k/conf/GENERIC:1.119 Sun Nov 16 16:01:41 2014
+++ src/sys/arch/luna68k/conf/GENERIC Sat Dec 3 17:38:02 2016
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.119 2014/11/16 16:01:41 manu Exp $
+# $NetBSD: GENERIC,v 1.120 2016/12/03 17:38:02 tsutsui Exp $
#
# GENERIC machine description file
#
@@ -22,7 +22,7 @@ include "arch/luna68k/conf/std.luna68k"
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.119 $"
+#ident "GENERIC-$Revision: 1.120 $"
makeoptions COPTS="-O2 -fno-reorder-blocks" # see share/mk/sys.mk
@@ -163,6 +163,9 @@ spc1 at mainbus0 # 2nd SCSI on LUNA-II
# framebuffer
fb0 at mainbus0 # 16 or 256 pseudo color
+# HD647180X I/O processor
+xp0 at mainbus0
+
# Workstation Console attachments
wsdisplay* at fb?
wskbd* at ws? console ? mux 1
Index: src/sys/arch/luna68k/conf/files.luna68k
diff -u src/sys/arch/luna68k/conf/files.luna68k:1.24 src/sys/arch/luna68k/conf/files.luna68k:1.25
--- src/sys/arch/luna68k/conf/files.luna68k:1.24 Sun Jul 20 11:14:56 2014
+++ src/sys/arch/luna68k/conf/files.luna68k Sat Dec 3 17:38:02 2016
@@ -1,5 +1,5 @@
#
-# $NetBSD: files.luna68k,v 1.24 2014/07/20 11:14:56 tsutsui Exp $
+# $NetBSD: files.luna68k,v 1.25 2016/12/03 17:38:02 tsutsui Exp $
#
maxpartitions 8
maxusers 2 8 64
@@ -43,6 +43,11 @@ device siotty: tty
attach siotty at sio
file arch/luna68k/dev/siotty.c siotty needs-flag
+# HD647180X I/O processor
+device xp
+attach xp at mainbus
+file arch/luna68k/dev/xp.c xp
+
device ws: wskbddev,wsmousedev
attach ws at sio
file arch/luna68k/dev/lunaws.c ws
Index: src/sys/arch/luna68k/conf/majors.luna68k
diff -u src/sys/arch/luna68k/conf/majors.luna68k:1.20 src/sys/arch/luna68k/conf/majors.luna68k:1.21
--- src/sys/arch/luna68k/conf/majors.luna68k:1.20 Thu Jun 30 20:09:32 2011
+++ src/sys/arch/luna68k/conf/majors.luna68k Sat Dec 3 17:38:02 2016
@@ -1,4 +1,4 @@
-# $NetBSD: majors.luna68k,v 1.20 2011/06/30 20:09:32 wiz Exp $
+# $NetBSD: majors.luna68k,v 1.21 2016/12/03 17:38:02 tsutsui Exp $
#
# Device majors for luna68k
#
@@ -36,6 +36,7 @@ device-major clockctl char 35 clockctl
device-major cgd char 37 block 15 cgd
device-major ksyms char 38 ksyms
device-major wsfont char 39 wsfont
+device-major xp char 40 xp
device-major nsmb char 98 nsmb
Index: src/sys/arch/luna68k/include/Makefile
diff -u src/sys/arch/luna68k/include/Makefile:1.18 src/sys/arch/luna68k/include/Makefile:1.19
--- src/sys/arch/luna68k/include/Makefile:1.18 Thu Dec 24 14:13:35 2015
+++ src/sys/arch/luna68k/include/Makefile Sat Dec 3 17:38:02 2016
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.18 2015/12/24 14:13:35 christos Exp $
+# $NetBSD: Makefile,v 1.19 2016/12/03 17:38:02 tsutsui Exp $
INCSDIR= /usr/include/luna68k
@@ -18,6 +18,7 @@ INCS= ansi.h aout_machdep.h asm.h autoco
rwlock.h setjmp.h signal.h \
trap.h types.h \
vmparam.h \
- wchar_limits.h
+ wchar_limits.h \
+ xpio.h
.include <bsd.kinc.mk>
Index: src/sys/arch/luna68k/luna68k/mainbus.c
diff -u src/sys/arch/luna68k/luna68k/mainbus.c:1.13 src/sys/arch/luna68k/luna68k/mainbus.c:1.14
--- src/sys/arch/luna68k/luna68k/mainbus.c:1.13 Sat Jan 11 01:43:22 2014
+++ src/sys/arch/luna68k/luna68k/mainbus.c Sat Dec 3 17:38:02 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.13 2014/01/11 01:43:22 tsutsui Exp $ */
+/* $NetBSD: mainbus.c,v 1.14 2016/12/03 17:38:02 tsutsui Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.13 2014/01/11 01:43:22 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.14 2016/12/03 17:38:02 tsutsui Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -44,6 +44,7 @@ static const struct mainbus_attach_args
{ "clock", 0x45000000, -1 }, /* Mostek TimeKeeper */
{ "le", 0xf1000000, 3 }, /* Am7990 */
{ "sio", 0x51000000, 6 }, /* uPD7201A */
+ { "xp", 0x71000000, 1 }, /* HD647180XP */
{ "fb", 0xc1100000, -1 }, /* BrookTree RAMDAC */
{ "spc", 0xe1000000, 2 }, /* MB89352 */
};
@@ -52,6 +53,7 @@ static const struct mainbus_attach_args
{ "clock", 0x45000000, -1 }, /* Dallas TimeKeeper */
{ "le", 0xf1000000, 3 }, /* Am7990 */
{ "sio", 0x51000000, 6 }, /* uPD7201A */
+ { "xp", 0x71000000, 1 }, /* HD647180XP */
{ "fb", 0xc1100000, -1 }, /* BrookTree RAMDAC */
{ "spc", 0xe1000000, 2 }, /* internal MB89352 */
{ "spc", 0xe1000040, 2 }, /* external MB89352 */
Added files:
Index: src/sys/arch/luna68k/dev/xp.c
diff -u /dev/null src/sys/arch/luna68k/dev/xp.c:1.1
--- /dev/null Sat Dec 3 17:38:02 2016
+++ src/sys/arch/luna68k/dev/xp.c Sat Dec 3 17:38:02 2016
@@ -0,0 +1,285 @@
+/* $NetBSD: xp.c,v 1.1 2016/12/03 17:38:02 tsutsui Exp $ */
+
+/*-
+ * Copyright (c) 2016 Izumi Tsutsui. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * LUNA's Hitachi HD647180 "XP" I/O processor driver
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: xp.c,v 1.1 2016/12/03 17:38:02 tsutsui Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+#include <sys/ioctl.h>
+#include <sys/kmem.h>
+#include <sys/errno.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/autoconf.h>
+#include <machine/xpio.h>
+
+#include "ioconf.h"
+
+#define XP_SHM_BASE 0x71000000
+#define XP_SHM_SIZE 0x00010000 /* 64KB for XP; rest 64KB for lance */
+#define XP_TAS_ADDR 0x61000000
+
+struct xp_softc {
+ device_t sc_dev;
+
+ vaddr_t sc_shm_base;
+ vsize_t sc_shm_size;
+ vaddr_t sc_tas;
+
+ bool sc_isopen;
+};
+
+static int xp_match(device_t, cfdata_t, void *);
+static void xp_attach(device_t, device_t, void *);
+
+dev_type_open(xp_open);
+dev_type_close(xp_close);
+dev_type_read(xp_read);
+dev_type_write(xp_write);
+dev_type_ioctl(xp_ioctl);
+dev_type_mmap(xp_mmap);
+
+const struct cdevsw xp_cdevsw = {
+ .d_open = xp_open,
+ .d_close = xp_close,
+ .d_read = xp_read,
+ .d_write = xp_write,
+ .d_ioctl = xp_ioctl,
+ .d_stop = nostop,
+ .d_tty = notty,
+ .d_poll = nopoll,
+ .d_mmap = xp_mmap,
+ .d_kqfilter = nokqfilter,
+ .d_discard = nodiscard,
+ .d_flag = 0
+};
+
+CFATTACH_DECL_NEW(xp, sizeof(struct xp_softc),
+ xp_match, xp_attach, NULL, NULL);
+
+/* #define XP_DEBUG */
+
+#ifdef XP_DEBUG
+#define XP_DEBUG_ALL 0xff
+uint32_t xp_debug = 0;
+#define DPRINTF(x, y) if (xp_debug & (x)) printf y
+#else
+#define DPRINTF(x, y) /* nothing */
+#endif
+
+static bool xp_matched;
+
+/*
+ * PIO 0 port C is connected to XP's reset line
+ *
+ * XXX: PIO port functions should be shared with machdep.c for DIP SWs
+ */
+#define PIO_ADDR 0x49000000
+#define PORT_A 0
+#define PORT_B 1
+#define PORT_C 2
+#define CTRL 3
+
+/* PIO0 Port C bit definition */
+#define XP_INT1_REQ 0 /* INTR B */
+ /* unused */ /* IBF B */
+#define XP_INT1_ENA 2 /* INTE B */
+#define XP_INT5_REQ 3 /* INTR A */
+#define XP_INT5_ENA 4 /* INTE A */
+ /* unused */ /* IBF A */
+#define PARITY 6 /* PC6 output to enable parity error */
+#define XP_RESET 7 /* PC7 output to reset HD647180 XP */
+
+/* Port control for PC6 and PC7 */
+#define ON 1
+#define OFF 0
+
+static uint8_t put_pio0c(uint8_t bit, uint8_t set)
+{
+ volatile uint8_t * const pio0 = (uint8_t *)PIO_ADDR;
+
+ pio0[CTRL] = (bit << 1) | (set & 0x01);
+
+ return pio0[PORT_C];
+}
+
+static int
+xp_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct mainbus_attach_args *maa = aux;
+
+ /* only one XP processor */
+ if (xp_matched)
+ return 0;
+
+ if (strcmp(maa->ma_name, xp_cd.cd_name))
+ return 0;
+
+ if (maa->ma_addr != XP_SHM_BASE)
+ return 0;
+
+ xp_matched = true;
+ return 1;
+}
+
+static void
+xp_attach(device_t parent, device_t self, void *aux)
+{
+ struct xp_softc *sc = device_private(self);
+
+ sc->sc_dev = self;
+
+ aprint_normal(": HD647180X I/O processor\n");
+
+ sc->sc_shm_base = XP_SHM_BASE;
+ sc->sc_shm_size = XP_SHM_SIZE;
+ sc->sc_tas = XP_TAS_ADDR;
+}
+
+int
+xp_open(dev_t dev, int flags, int devtype, struct lwp *l)
+{
+ struct xp_softc *sc;
+ int unit;
+
+ DPRINTF(XP_DEBUG_ALL, ("%s\n", __func__));
+
+ unit = minor(dev);
+ sc = device_lookup_private(&xp_cd, unit);
+ if (sc == NULL)
+ return ENXIO;
+ if (sc->sc_isopen)
+ return EBUSY;
+
+ sc->sc_isopen = true;
+
+ return 0;
+}
+
+int
+xp_close(dev_t dev, int flags, int mode, struct lwp *l)
+{
+ struct xp_softc *sc;
+ int unit;
+
+ DPRINTF(XP_DEBUG_ALL, ("%s\n", __func__));
+
+ unit = minor(dev);
+ sc = device_lookup_private(&xp_cd, unit);
+ sc->sc_isopen = false;
+
+ return 0;
+}
+
+int
+xp_ioctl(dev_t dev, u_long cmd, void *addr, int flags, struct lwp *l)
+{
+ struct xp_softc *sc;
+ int unit, error;
+ struct xp_download *downld;
+ uint8_t *loadbuf;
+ size_t loadsize;
+
+ DPRINTF(XP_DEBUG_ALL, ("%s\n", __func__));
+
+ unit = minor(dev);
+ sc = device_lookup_private(&xp_cd, unit);
+
+ switch (cmd) {
+ case XPIOCDOWNLD:
+ downld = addr;
+ loadsize = downld->size;
+ if (loadsize == 0 || loadsize >= XP_SHM_SIZE) {
+ return EINVAL;
+ }
+
+ loadbuf = kmem_alloc(loadsize, KM_SLEEP);
+ if (loadbuf == NULL) {
+ return ENOMEM;
+ }
+ error = copyin(downld->data, loadbuf, loadsize);
+ if (error == 0) {
+ put_pio0c(XP_RESET, ON);
+ delay(100);
+ memcpy((void *)sc->sc_shm_base, loadbuf, loadsize);
+ delay(100);
+ put_pio0c(XP_RESET, OFF);
+ } else {
+ DPRINTF(XP_DEBUG_ALL, ("%s: ioctl failed (err = %d)\n",
+ __func__, error));
+ }
+
+ kmem_free(loadbuf, loadsize);
+ return error;
+
+ default:
+ return ENOTTY;
+ }
+
+ panic("%s: cmd (%ld) is not handled", device_xname(sc->sc_dev), cmd);
+}
+
+paddr_t
+xp_mmap(dev_t dev, off_t offset, int prot)
+{
+ struct xp_softc *sc;
+ int unit;
+ paddr_t pa;
+
+ pa = -1;
+
+ unit = minor(dev);
+ sc = device_lookup_private(&xp_cd, unit);
+
+ if (offset >= 0 &&
+ offset < sc->sc_shm_size) {
+ pa = m68k_btop(m68k_trunc_page(sc->sc_shm_base) + offset);
+ }
+
+ return pa;
+}
+
+int
+xp_read(dev_t dev, struct uio *uio, int flags)
+{
+
+ return ENODEV;
+}
+
+int
+xp_write(dev_t dev, struct uio *uio, int flags)
+{
+
+ return ENODEV;
+}
Index: src/sys/arch/luna68k/include/xpio.h
diff -u /dev/null src/sys/arch/luna68k/include/xpio.h:1.1
--- /dev/null Sat Dec 3 17:38:02 2016
+++ src/sys/arch/luna68k/include/xpio.h Sat Dec 3 17:38:02 2016
@@ -0,0 +1,43 @@
+/* $NetBSD: xpio.h,v 1.1 2016/12/03 17:38:02 tsutsui Exp $ */
+
+/*-
+ * Copyright (c) 2016 Izumi Tsutsui. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * ioctl for LUNA's Hitachi HD647180 "XP" I/O processor driver
+ */
+
+#ifndef _LUNA68K_XPIO_H_
+#define _LUNA68K_XPIO_H_
+
+#include <sys/ioctl.h>
+#include <sys/ioccom.h>
+
+struct xp_download {
+ u_int size; /* size to be downloaded to XP shared mem */
+ uint8_t *data; /* pointer to code to be downloaded */
+};
+#define XPIOCDOWNLD _IOW('x', 1, struct xp_download)
+
+#endif /* _LUNA68K_XPIO_H_ */