Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Preliminary support for LUNA's HD647180X I/O processor (a.k....



details:   https://anonhg.NetBSD.org/src/rev/ab9f8411d43d
branches:  trunk
changeset: 819421:ab9f8411d43d
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sat Dec 03 17:38:02 2016 +0000

description:
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

diffstat:

 distrib/sets/lists/comp/md.luna68k   |    3 +-
 etc/etc.luna68k/MAKEDEV.conf         |    3 +-
 sys/arch/luna68k/conf/GENERIC        |    7 +-
 sys/arch/luna68k/conf/files.luna68k  |    7 +-
 sys/arch/luna68k/conf/majors.luna68k |    3 +-
 sys/arch/luna68k/dev/xp.c            |  285 +++++++++++++++++++++++++++++++++++
 sys/arch/luna68k/include/Makefile    |    5 +-
 sys/arch/luna68k/include/xpio.h      |   43 +++++
 sys/arch/luna68k/luna68k/mainbus.c   |    6 +-
 9 files changed, 352 insertions(+), 10 deletions(-)

diffs (truncated from 484 to 300 lines):

diff -r 057210bd1bd0 -r ab9f8411d43d distrib/sets/lists/comp/md.luna68k
--- a/distrib/sets/lists/comp/md.luna68k        Sat Dec 03 16:41:34 2016 +0000
+++ b/distrib/sets/lists/comp/md.luna68k        Sat Dec 03 17:38:02 2016 +0000
@@ -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
diff -r 057210bd1bd0 -r ab9f8411d43d etc/etc.luna68k/MAKEDEV.conf
--- a/etc/etc.luna68k/MAKEDEV.conf      Sat Dec 03 16:41:34 2016 +0000
+++ b/etc/etc.luna68k/MAKEDEV.conf      Sat Dec 03 17:38:02 2016 +0000
@@ -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])
diff -r 057210bd1bd0 -r ab9f8411d43d sys/arch/luna68k/conf/GENERIC
--- a/sys/arch/luna68k/conf/GENERIC     Sat Dec 03 16:41:34 2016 +0000
+++ b/sys/arch/luna68k/conf/GENERIC     Sat Dec 03 17:38:02 2016 +0000
@@ -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 @@
 
 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 @@
 # 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
diff -r 057210bd1bd0 -r ab9f8411d43d sys/arch/luna68k/conf/files.luna68k
--- a/sys/arch/luna68k/conf/files.luna68k       Sat Dec 03 16:41:34 2016 +0000
+++ b/sys/arch/luna68k/conf/files.luna68k       Sat Dec 03 17:38:02 2016 +0000
@@ -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 @@
 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
diff -r 057210bd1bd0 -r ab9f8411d43d sys/arch/luna68k/conf/majors.luna68k
--- a/sys/arch/luna68k/conf/majors.luna68k      Sat Dec 03 16:41:34 2016 +0000
+++ b/sys/arch/luna68k/conf/majors.luna68k      Sat Dec 03 17:38:02 2016 +0000
@@ -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   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
 
diff -r 057210bd1bd0 -r ab9f8411d43d sys/arch/luna68k/dev/xp.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/luna68k/dev/xp.c Sat Dec 03 17:38:02 2016 +0000
@@ -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;



Home | Main Index | Thread Index | Old Index