--- sys/arch/dreamcast.orig/conf/files.dreamcast	Tue Apr 24 20:18:54 2001
+++ sys/arch/dreamcast/conf/files.dreamcast	Fri Aug  3 00:16:08 2001
@@ -20,7 +20,7 @@
 file	arch/dreamcast/dreamcast/autoconf.c
 file	arch/dreamcast/dreamcast/procfs_machdep.c	procfs
 file	arch/dreamcast/dreamcast/clock.c
-file	arch/sh3/sh3/disksubr.c				disk
+file	arch/dreamcast/dreamcast/disksubr.c		disk
 
 defopt	opt_memsize.h	IOM_ROM_BEGIN IOM_ROM_SIZE IOM_RAM_BEGIN IOM_RAM_SIZE
 defopt  opt_led_addr.h	LED_ADDR
@@ -90,3 +90,14 @@
 file	arch/dreamcast/dev/g2/gapspci.c			gapspci
 file	arch/dreamcast/dev/g2/gapspci_dma.c		gapspci
 file	arch/dreamcast/dev/g2/gapspci_pci.c		gapspci
+
+device	dppbus { }
+attach	dppbus at shb
+file	arch/dreamcast/dev/dpp/dppbus.c			dppbus
+file	arch/dreamcast/dev/dpp/dppbus_bus_mem.c		dppbus
+
+attach	wdc at dppbus with wdc_dppbus
+file	arch/dreamcast/dev/dpp/wdc_dppbus.c		wdc_dppbus
+
+#attach	ne at dppbus with ne_dppbus: rtl80x9
+#file	arch/dreamcast/dev/dpp/if_ne_dppbus.c		ne_dppbus
--- sys/arch/dreamcast.orig/conf/shl.x	Mon Mar  5 20:50:58 2001
+++ sys/arch/dreamcast/conf/shl.x	Fri May 18 01:07:46 2001
@@ -1,4 +1,5 @@
-OUTPUT_FORMAT("elf32-shl-unx")
+/*OUTPUT_FORMAT("elf32-shl-unx")*/
+OUTPUT_FORMAT("coff-shl")
 OUTPUT_ARCH(sh)
 MEMORY
 {
--- /dev/null	Fri Aug  3 00:29:59 2001
+++ sys/arch/dreamcast/dreamcast/disksubr.c	Fri Aug  3 00:14:42 2001
@@ -0,0 +1,515 @@
+/*	$NetBSD: disksubr.c,v 1.43 2000/11/20 08:24:15 chs Exp $	*/
+
+/*
+ * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
+ *
+ *	@(#)ufs_disksubr.c	7.16 (Berkeley) 5/4/91
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/buf.h>
+#include <sys/disklabel.h>
+#include <sys/disk.h>
+#include <sys/syslog.h>
+
+#include "opt_mbr.h"
+
+int fat_types[] = { MBR_PTYPE_FAT12, MBR_PTYPE_FAT16S,
+		    MBR_PTYPE_FAT16B, MBR_PTYPE_FAT32,
+		    MBR_PTYPE_FAT32L, MBR_PTYPE_FAT16L,
+		    -1 };
+
+#define NO_MBR_SIGNATURE ((struct mbr_partition *) -1)
+
+static struct mbr_partition *
+mbr_findslice __P((struct mbr_partition* dp, struct buf *bp));
+
+/* 
+ * Scan MBR for  NetBSD partittion.  Return NO_MBR_SIGNATURE if no MBR found
+ * Otherwise, copy valid MBR partition-table into dp, and if a NetBSD
+ * partition is found, return a pointer to it; else return  NULL.
+ */
+static
+struct mbr_partition *
+mbr_findslice(dp, bp)
+	struct mbr_partition *dp;
+	struct buf *bp;
+{
+	struct mbr_partition *ourdp = NULL;
+	u_int16_t *mbrmagicp;
+	int i;
+
+	/* Note: Magic number is little-endian. */
+	mbrmagicp = (u_int16_t *)(bp->b_data + MBR_MAGICOFF);
+	if (*mbrmagicp != MBR_MAGIC)
+		return (NO_MBR_SIGNATURE);
+
+	/* XXX how do we check veracity/bounds of this? */
+	memcpy(dp, bp->b_data + MBR_PARTOFF, NMBRPART * sizeof(*dp));
+
+	/* look for NetBSD partition */
+	for (i = 0; i < NMBRPART; i++) {
+		if (dp[i].mbrp_typ == MBR_PTYPE_NETBSD) {
+			ourdp = &dp[i];
+			break;
+		}
+	}
+
+#ifdef COMPAT_386BSD_MBRPART
+	/* didn't find it -- look for 386BSD partition */
+	if (!ourdp) {
+		for (i = 0; i < NMBRPART; i++) {
+			if (dp[i].mbrp_typ == MBR_PTYPE_386BSD) {
+				printf("WARNING: old BSD partition ID!\n");
+				ourdp = &dp[i];
+ 				/*
+				 * If more than one matches, take last,
+				 * as NetBSD install tool does.
+				 */
+#if 0
+				break;
+#endif
+			}
+		}
+	}
+#endif	/* COMPAT_386BSD_MBRPART */
+
+		return (ourdp);
+}
+
+
+/*
+ * Attempt to read a disk label from a device
+ * using the indicated stategy routine.
+ * The label must be partly set up before this:
+ * secpercyl, secsize and anything required for a block i/o read
+ * operation in the driver's strategy/start routines
+ * must be filled in before calling us.
+ *
+ * If dos partition table requested, attempt to load it and
+ * find disklabel inside a DOS partition. Also, if bad block
+ * table needed, attempt to extract it as well. Return buffer
+ * for use in signalling errors if requested.
+ *
+ * Returns null on success and an error string on failure.
+ */
+char *
+readdisklabel(dev, strat, lp, osdep)
+	dev_t dev;
+	void (*strat) __P((struct buf *));
+	struct disklabel *lp;
+	struct cpu_disklabel *osdep;
+{
+	struct mbr_partition *dp;
+	struct partition *pp;
+	struct dkbad *bdp;
+	struct buf *bp;
+	struct disklabel *dlp;
+	char *msg = NULL;
+	int dospartoff, cyl, i, *ip;
+
+	/* minimal requirements for archtypal disk label */
+	if (lp->d_secsize == 0)
+		lp->d_secsize = DEV_BSIZE;
+	if (lp->d_secperunit == 0)
+		lp->d_secperunit = 0x1fffffff;
+#if 0
+	if (lp->d_ncylinders == 16383) {
+		printf("disklabel: Disk > 8G ... readjusting chs %d/%d/%d to ",
+			lp->d_ncylinders, lp->d_ntracks, lp->d_nsectors);
+		lp->d_ncylinders = lp->d_secperunit /  lp->d_ntracks / lp->d_nsectors;
+		printf("%d/%d/%d\n",
+			lp->d_ncylinders, lp->d_ntracks, lp->d_nsectors);
+	}
+#endif
+	lp->d_npartitions = RAW_PART + 1;
+	for (i = 0; i < RAW_PART; i++) {
+		lp->d_partitions[i].p_size = 0;
+		lp->d_partitions[i].p_offset = 0;
+	}
+	if (lp->d_partitions[i].p_size == 0)
+		lp->d_partitions[i].p_size = 0x1fffffff;
+	lp->d_partitions[i].p_offset = 0;
+
+	/* get a buffer and initialize it */
+	bp = geteblk((int)lp->d_secsize);
+	bp->b_dev = dev;
+
+	/* do dos partitions in the process of getting disklabel? */
+	dospartoff = 0;
+	cyl = LABELSECTOR / lp->d_secpercyl;
+	if (!osdep)
+		goto nombrpart;
+	dp = osdep->dosparts;
+
+	/* read master boot record */
+	bp->b_blkno = MBR_BBSECTOR;
+	bp->b_bcount = lp->d_secsize;
+	bp->b_flags |= B_READ;
+	bp->b_cylinder = MBR_BBSECTOR / lp->d_secpercyl;
+	(*strat)(bp);
+
+	/* if successful, wander through dos partition table */
+	if (biowait(bp)) {
+		msg = "dos partition I/O error";
+		goto done;
+	} else {
+		struct mbr_partition *ourdp = NULL;
+
+		ourdp = mbr_findslice(dp, bp);
+		if (ourdp ==  NO_MBR_SIGNATURE)
+			goto nombrpart;
+
+		for (i = 0; i < NMBRPART; i++, dp++) {
+			/* Install in partition e, f, g, or h. */
+			pp = &lp->d_partitions[RAW_PART + 1 + i];
+			pp->p_offset = dp->mbrp_start;
+			pp->p_size = dp->mbrp_size;
+			for (ip = fat_types; *ip != -1; ip++) {
+				if (dp->mbrp_typ == *ip)
+					pp->p_fstype = FS_MSDOS;
+			}
+			if (dp->mbrp_typ == MBR_PTYPE_LNXEXT2)
+				pp->p_fstype = FS_EX2FS;
+
+			if (dp->mbrp_typ == MBR_PTYPE_NTFS)
+				pp->p_fstype = FS_NTFS;
+
+			/* is this ours? */
+			if (dp == ourdp) {
+				/* need sector address for SCSI/IDE,
+				 cylinder for ESDI/ST506/RLL */
+				dospartoff = dp->mbrp_start;
+				cyl = MBR_PCYL(dp->mbrp_scyl, dp->mbrp_ssect);
+
+				/* update disklabel with details */
+				lp->d_partitions[2].p_size =
+				    dp->mbrp_size;
+				lp->d_partitions[2].p_offset = 
+				    dp->mbrp_start;
+#if 0
+				if (lp->d_ntracks != dp->mbrp_ehd + 1 ||
+				    lp->d_nsectors != DPSECT(dp->mbrp_esect)) {
+					printf("disklabel: BIOS sees chs %d/%d/%d as ",
+						lp->d_ncylinders, lp->d_ntracks,
+						lp->d_nsectors);
+					lp->d_ntracks = dp->mbrp_ehd + 1;
+					lp->d_nsectors = DPSECT(dp->mbrp_esect);
+					lp->d_secpercyl = lp->d_ntracks * lp->d_nsectors;
+					lp->d_ncylinders = lp->d_secperunit / lp->d_secpercyl;
+					if (! lp->d_ncylinders)
+						lp->d_ncylinders = 1;
+					printf("%d/%d/%d\n",
+						lp->d_ncylinders, lp->d_ntracks,
+						lp->d_nsectors);
+				    }
+#endif
+			}
+		}
+		lp->d_npartitions = RAW_PART + 1 + i;
+	}
+
+nombrpart:
+	/* next, dig out disk label */
+	bp->b_blkno = dospartoff + LABELSECTOR;
+	bp->b_cylinder = cyl;
+	bp->b_bcount = lp->d_secsize;
+	bp->b_flags &= ~(B_DONE);
+	bp->b_flags |= B_READ;
+	(*strat)(bp);
+
+	/* if successful, locate disk label within block and validate */
+	if (biowait(bp)) {
+		msg = "disk label I/O error";
+		goto done;
+	}
+	for (dlp = (struct disklabel *)bp->b_data;
+	    dlp <= (struct disklabel *)(bp->b_data + lp->d_secsize - sizeof(*dlp));
+	    dlp = (struct disklabel *)((char *)dlp + sizeof(long))) {
+		if (dlp->d_magic != DISKMAGIC || dlp->d_magic2 != DISKMAGIC) {
+			if (msg == NULL)
+				msg = "no disk label";
+		} else if (dlp->d_npartitions > MAXPARTITIONS ||
+			   dkcksum(dlp) != 0)
+			msg = "disk label corrupted";
+		else {
+			*lp = *dlp;
+			msg = NULL;
+			break;
+		}
+	}
+
+	if (msg)
+		goto done;
+
+	/* obtain bad sector table if requested and present */
+	if (osdep && (lp->d_flags & D_BADSECT)) {
+		struct dkbad *db;
+
+		bdp = &osdep->bad;
+		i = 0;
+		do {
+			/* read a bad sector table */
+			bp->b_flags &= ~(B_DONE);
+			bp->b_flags |= B_READ;
+			bp->b_blkno = lp->d_secperunit - lp->d_nsectors + i;
+			if (lp->d_secsize > DEV_BSIZE)
+				bp->b_blkno *= lp->d_secsize / DEV_BSIZE;
+			else
+				bp->b_blkno /= DEV_BSIZE / lp->d_secsize;
+			bp->b_bcount = lp->d_secsize;
+			bp->b_cylinder = lp->d_ncylinders - 1;
+			(*strat)(bp);
+
+			/* if successful, validate, otherwise try another */
+			if (biowait(bp)) {
+				msg = "bad sector table I/O error";
+			} else {
+				db = (struct dkbad *)(bp->b_data);
+#define DKBAD_MAGIC 0x4321
+				if (db->bt_mbz == 0
+					&& db->bt_flag == DKBAD_MAGIC) {
+					msg = NULL;
+					*bdp = *db;
+					break;
+				} else
+					msg = "bad sector table corrupted";
+			}
+		} while ((bp->b_flags & B_ERROR) && (i += 2) < 10 &&
+			i < lp->d_nsectors);
+	}
+
+done:
+	brelse(bp);
+	return (msg);
+}
+
+/*
+ * Check new disk label for sensibility
+ * before setting it.
+ */
+int
+setdisklabel(olp, nlp, openmask, osdep)
+	struct disklabel *olp, *nlp;
+	u_long openmask;
+	struct cpu_disklabel *osdep;
+{
+	int i;
+	struct partition *opp, *npp;
+
+	/* sanity clause */
+	if (nlp->d_secpercyl == 0 || nlp->d_secsize == 0
+		|| (nlp->d_secsize % DEV_BSIZE) != 0)
+			return(EINVAL);
+
+	/* special case to allow disklabel to be invalidated */
+	if (nlp->d_magic == 0xffffffff) {
+		*olp = *nlp;
+		return (0);
+	}
+
+	if (nlp->d_magic != DISKMAGIC || nlp->d_magic2 != DISKMAGIC ||
+	    dkcksum(nlp) != 0)
+		return (EINVAL);
+
+	/* XXX missing check if other dos partitions will be overwritten */
+
+	while (openmask != 0) {
+		i = ffs(openmask) - 1;
+		openmask &= ~(1 << i);
+		if (nlp->d_npartitions <= i)
+			return (EBUSY);
+		opp = &olp->d_partitions[i];
+		npp = &nlp->d_partitions[i];
+		if (npp->p_offset != opp->p_offset || npp->p_size < opp->p_size)
+			return (EBUSY);
+		/*
+		 * Copy internally-set partition information
+		 * if new label doesn't include it.		XXX
+		 */
+		if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) {
+			npp->p_fstype = opp->p_fstype;
+			npp->p_fsize = opp->p_fsize;
+			npp->p_frag = opp->p_frag;
+			npp->p_cpg = opp->p_cpg;
+		}
+	}
+ 	nlp->d_checksum = 0;
+ 	nlp->d_checksum = dkcksum(nlp);
+	*olp = *nlp;
+	return (0);
+}
+
+
+/*
+ * Write disk label back to device after modification.
+ */
+int
+writedisklabel(dev, strat, lp, osdep)
+	dev_t dev;
+	void (*strat) __P((struct buf *));
+	struct disklabel *lp;
+	struct cpu_disklabel *osdep;
+{
+	struct mbr_partition *dp;
+	struct buf *bp;
+	struct disklabel *dlp;
+	int error, dospartoff, cyl;
+
+	/* get a buffer and initialize it */
+	bp = geteblk((int)lp->d_secsize);
+	bp->b_dev = dev;
+
+	/* do dos partitions in the process of getting disklabel? */
+	dospartoff = 0;
+	cyl = LABELSECTOR / lp->d_secpercyl;
+	if (!osdep)
+		goto nombrpart;
+	dp = osdep->dosparts;
+
+	/* read master boot record */
+	bp->b_blkno = MBR_BBSECTOR;
+	bp->b_bcount = lp->d_secsize;
+	bp->b_flags |= B_READ;
+	bp->b_cylinder = MBR_BBSECTOR / lp->d_secpercyl;
+	(*strat)(bp);
+
+	if ((error = biowait(bp)) == 0) {
+		struct mbr_partition *ourdp = NULL;
+
+		ourdp = mbr_findslice(dp, bp);
+		if (ourdp ==  NO_MBR_SIGNATURE)
+			goto nombrpart;
+
+		if (ourdp) {
+			/* need sector address for SCSI/IDE,
+			 cylinder for ESDI/ST506/RLL */
+			dospartoff = ourdp->mbrp_start;
+			cyl = MBR_PCYL(ourdp->mbrp_scyl, ourdp->mbrp_ssect);
+		}
+	}
+
+nombrpart:
+#ifdef maybe
+	/* disklabel in appropriate location? */
+	if (lp->d_partitions[2].p_offset != 0
+		&& lp->d_partitions[2].p_offset != dospartoff) {
+		error = EXDEV;		
+		goto done;
+	}
+#endif
+
+	/* next, dig out disk label */
+	bp->b_blkno = dospartoff + LABELSECTOR;
+	bp->b_cylinder = cyl;
+	bp->b_bcount = lp->d_secsize;
+	bp->b_flags &= ~(B_DONE);
+	bp->b_flags |= B_READ;
+	(*strat)(bp);
+
+	/* if successful, locate disk label within block and validate */
+	if ((error = biowait(bp)) != 0)
+		goto done;
+	for (dlp = (struct disklabel *)bp->b_data;
+	    dlp <= (struct disklabel *)(bp->b_data + lp->d_secsize - sizeof(*dlp));
+	    dlp = (struct disklabel *)((char *)dlp + sizeof(long))) {
+		if (dlp->d_magic == DISKMAGIC && dlp->d_magic2 == DISKMAGIC &&
+		    dkcksum(dlp) == 0) {
+			*dlp = *lp;
+			bp->b_flags &= ~(B_READ|B_DONE);
+			bp->b_flags |= B_WRITE;
+			(*strat)(bp);
+			error = biowait(bp);
+			goto done;
+		}
+	}
+	error = ESRCH;
+
+done:
+	brelse(bp);
+	return (error);
+}
+
+/*
+ * Determine the size of the transfer, and make sure it is
+ * within the boundaries of the partition. Adjust transfer
+ * if needed, and signal errors or early completion.
+ */
+int
+bounds_check_with_label(bp, lp, wlabel)
+	struct buf *bp;
+	struct disklabel *lp;
+	int wlabel;
+{
+	struct partition *p = lp->d_partitions + DISKPART(bp->b_dev);
+	int labelsector = lp->d_partitions[2].p_offset + LABELSECTOR;
+	int sz;
+
+	sz = howmany(bp->b_bcount, lp->d_secsize);
+
+	if (bp->b_blkno + sz > p->p_size) {
+		sz = p->p_size - bp->b_blkno;
+		if (sz == 0) {
+			/* If exactly at end of disk, return EOF. */
+			bp->b_resid = bp->b_bcount;
+			goto done;
+		}
+		if (sz < 0) {
+			/* If past end of disk, return EINVAL. */
+			bp->b_error = EINVAL;
+			goto bad;
+		}
+		/* Otherwise, truncate request. */
+		bp->b_bcount = sz << DEV_BSHIFT;
+	}
+
+	/* Overwriting disk label? */
+	if (bp->b_blkno + p->p_offset <= labelsector &&
+#if LABELSECTOR != 0
+	    bp->b_blkno + p->p_offset + sz > labelsector &&
+#endif
+	    (bp->b_flags & B_READ) == 0 && !wlabel) {
+		bp->b_error = EROFS;
+		goto bad;
+	}
+
+	/* calculate cylinder for disksort to order transfers with */
+	bp->b_cylinder = (bp->b_blkno + p->p_offset) /
+	    (lp->d_secsize / DEV_BSIZE) / lp->d_secpercyl;
+	return (1);
+
+bad:
+	bp->b_flags |= B_ERROR;
+done:
+	return (0);
+}
--- /dev/null	Fri Aug  3 00:29:59 2001
+++ sys/arch/dreamcast/conf/WDC	Mon Jul 30 03:10:04 2001
@@ -0,0 +1,175 @@
+#	$NetBSD: GENERIC,v 1.9 2001/02/14 04:57:44 itojun Exp $
+#
+#	GENERIC -- everything that's currently supported
+#
+
+include "arch/dreamcast/conf/std.dreamcast"
+
+# Enable the hooks used for initializing the root memory-disk.
+#options 	MEMORY_DISK_HOOKS
+#options 	MEMORY_DISK_IS_ROOT	# force root on memory disk
+#options 	MEMORY_DISK_SERVER=0	# no userspace memory disk support
+#options 	MINIROOTSIZE=2880	# size of memory disk, in blocks
+#options	MINIROOTSIZE=6000
+
+options 	DONT_INIT_BSC
+
+# wscons options
+options 	WSEMUL_VT100		# VT100 / VT220 emulation
+options 	FONT_BOLD8x16
+
+maxusers	16		# estimated number of users
+
+# CPU support
+options 	SH7750
+options		SH4
+options		DREAMCAST
+# options		SH4_PCMCIA
+options 	EVBSH4
+#options 	MMEYE
+options		PCLOCK=50000000		# 50MHz
+options		IOM_ROM_BEGIN=0x00000000
+options		IOM_ROM_SIZE=0x00100000	#  1MB
+options		IOM_RAM_BEGIN=0x8c000000
+options		IOM_RAM_SIZE=0x01000000	# 16MB
+#options		INITTODR_ALWAYS_USE_RTC
+#options		BRAINS
+#options		USE_RTCCLK
+#options		SYNC_CLOCK_TO_RTC
+
+#options		LED_ADDR=0xa8000000
+
+# Standard system options
+#options 	UCONSOLE	# users can use TIOCCONS (for xconsole)
+#options 	INSECURE	# disable kernel security levels
+
+#options		RTC_OFFSET=-540
+options 	HZ=100		# clock interrupt generates every 1/HZ sec
+#options 	NTP		# NTP phase/frequency locked loop
+
+#options 	KTRACE		# system call tracing via ktrace(1)
+
+#options 	SYSVMSG		# System V-like message queues
+#options 	SYSVSEM		# System V-like semaphores
+#options 	SYSVSHM		# System V-like memory sharing
+#options 	SHMMAXPGS=1024	# 1024 pages is the default
+
+# Diagnostic/debugging support options
+#options 	DIAGNOSTIC	# cheap kernel consistency checks
+#options 	DEBUG		# expensive debugging checks/support
+#options 	DDB		# in-kernel debugger
+#makeoptions	DEBUG="-g"	# compile full symbol table
+#options 	SYSCALL_DEBUG
+#options 	UVMHIST
+#options	UVMHIST_PRINT
+
+# Compatibility options
+#options 	COMPAT_13	# NetBSD 1.3
+#options 	COMPAT_14	# NetBSD 1.4,
+#options 	COMPAT_43	# and 4.3BSD
+
+# Executable format options
+options 	EXEC_COFF	# COFF executables
+options 	EXEC_ELF32	# 32-bit ELF executables
+
+# File systems
+file-system 	FFS		# UFS
+file-system 	MFS		# memory file system
+file-system 	NFS		# Network File System client
+file-system 	PROCFS		# /proc
+file-system 	KERNFS		# /kern
+file-system 	NULLFS		# loopback file system
+file-system 	UMAPFS		# NULLFS + uid and gid remapping
+file-system	CD9660		# CD-ROM file system
+
+# File system options
+options 	QUOTA		# UFS quotas
+options 	NFSSERVER	# Network File System server
+
+# Networking options
+options 	INET		# IP + ICMP + TCP + UDP
+options 	NFS_BOOT_DHCP	# Support DHCP NFS root
+
+#options 	PCIVERBOSE	# verbose PCI device autoconfig messages
+#options 	PCI_CONFIG_DUMP	# verbosely dump PCI config space
+#options 	PCMCIAVERBOSE	# verbose PCMCIA configuration messages
+
+# Kernel root file system and dump configuration.
+#config		netbsd	root on ? type nfs
+#config		netbsd	root on wd0a type ffs
+config		netbsd	root on ? type ?
+
+#
+# Device configuration
+#
+
+mainbus0 at root
+
+shb*	at mainbus?
+
+# Serial Devices
+options	SCIFCN_SPEED=57600
+scif0 at shb? port 0xffe80000 irq 12
+
+pvr0		at shb?
+wsdisplay*      at pvr? console ?
+
+maple0		at shb?
+mkbd*		at maple? port ? subunit ?
+wskbd*		at mkbd? console ?
+
+gdrom0		at shb?
+
+#g2bus0		at shb?
+#gapspci*	at g2bus?			# GAPS PCI bridge
+#pci*		at gapspci?
+#rtk*		at pci? dev ? function ?	# SEGA Broadband Adapter
+#ukphy*		at mii? phy ?
+
+# DC-PP bus
+dppbus0		at shb?
+wdc*		at dppbus?
+wd*		at wdc? drive?
+#ne0		at dppbus?
+
+# ATAPI bus support
+atapibus* at wdc? channel ?
+
+# ATAPI devices
+# flags have the same meaning as for IDE drives.
+cd*     at atapibus? drive ? flags 0x0000       # ATAPI CD-ROM drives
+sd*     at atapibus? drive ? flags 0x0000       # ATAPI disk drives
+uk*     at atapibus? drive ? flags 0x0000       # ATAPI unknown
+
+# SH PCMCIA controllers
+#shpcic0	at shb? port 0xb000000a iomem 0xb8000000 iosiz 0x1000000
+#shpcic1	at shb? port 0xb000000c iomem 0xb9000000 iosiz 0x1000000
+
+# PCMCIA bus support
+#pcmcia*	at shpcic? controller ? socket ?
+
+#com*	at pcmcia? function ?		# Modems and serial cards
+#wdc*	at pcmcia? function ?
+#wd*	at wdc? drive ?			# the drives themselves
+
+#ep*	at pcmcia? function ?		# 3Com 3c589 and 3c562 Ethernet
+#mbe*	at pcmcia? function ?		# MB8696x based Ethernet
+#ne*	at pcmcia? function ?		# NE2000-compatible Ethernet
+#sm*	at pcmcia? function ?		# Megahertz Ethernet
+
+#pseudo-device	vnd		4	# disk-like interface to files
+#pseudo-device	bpfilter	8	# Berkeley packet filter
+#pseudo-device	ipfilter		# IP filter (firewall) and NAT
+pseudo-device	loop			# network loopback
+pseudo-device	pty			# pseudo-terminals
+#pseudo-device	ppp		2	# Point-to-Point Protocol
+#pseudo-device	tun		2	# network tunneling over tty
+pseudo-device	rnd			# /dev/random and in-kernel generator
+
+# Enable the hooks used for initializing the root memory-disk.
+#options 	MEMORY_DISK_HOOKS
+#options 	MEMORY_DISK_IS_ROOT	# force root on memory disk
+#options 	MEMORY_DISK_SERVER=0	# no userspace memory disk support
+#options 	MINIROOTSIZE=3074	# size of memory disk, in blocks
+
+#pseudo-device	md		1	# memory disk device (ramdisk)
--- /dev/null	Fri Aug  3 00:29:59 2001
+++ sys/arch/dreamcast/dev/dpp/wdc_dppbus.c	Wed Aug  1 22:23:26 2001
@@ -0,0 +1,173 @@
+/*	$NetBSD: wdc_isa.c,v 1.19 2000/04/02 02:07:52 itojun Exp $ */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charles M. Hannum and by Onno van der Linden.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+#include <sys/callout.h>
+
+#include <machine/bus.h>
+#include <machine/intr.h>
+#include <sh3/bscreg.h>
+#include <machine/shbvar.h>
+#include <machine/sysasicvar.h>
+
+#include <arch/dreamcast/dev/dpp/dppbusvar.h>
+
+#include <dev/ata/atavar.h>
+#include <dev/ic/wdcvar.h>
+
+#define	WDC_DPPBUS_REG			0xb4000020
+#define	WDC_DPPBUS_REG_NPORTS		8
+#define	WDC_DPPBUS_AUXREG_OFFSET	0x38
+#define	WDC_DPPBUS_AUXREG_NPORTS	1
+#define	WDC_DPPBUS_IRQADDR		0xb4000080
+#define	WDC_DPPBUS_IRQBIT		0x0001
+
+struct wdc_dppbus_softc {
+	struct	wdc_softc sc_wdcdev;
+	struct	channel_softc *wdc_chanptr;
+	struct	channel_softc wdc_channel;
+	struct	callout sc_intremu;
+	int	sc_drq;
+        void	*sc_ih;
+};
+
+int	wdc_dppbus_match	__P((struct device *, struct cfdata *, void *));
+void	wdc_dppbus_attach __P((struct device *, struct device *, void *));
+void	wdc_dppbus_intr	__P((void *));
+
+struct cfattach wdc_dppbus_ca = {
+	sizeof(struct wdc_dppbus_softc), wdc_dppbus_match, wdc_dppbus_attach
+};
+
+void
+wdc_dppbus_intr(v)
+	void *v;
+{
+  struct wdc_dppbus_softc *sc = v;  
+  int s;
+  u_int16_t irqs;
+
+  irqs = (*(__volatile u_int16_t *)WDC_DPPBUS_IRQADDR);
+  if((irqs & WDC_DPPBUS_IRQBIT) == WDC_DPPBUS_IRQBIT) {
+    s = splbio();
+    wdcintr(&sc->wdc_channel);
+    splx(s);
+  }
+
+  callout_reset(&sc->sc_intremu, 1, wdc_dppbus_intr, sc);
+}
+
+int
+wdc_dppbus_match(parent, match, aux)
+	struct device *parent;
+	struct cfdata *match;
+	void *aux;
+{
+	struct channel_softc ch;
+	struct dppbus_attach_args *da = aux;
+	int result = 0;
+
+	memset(&ch, 0, sizeof(ch));
+
+	ch.cmd_iot = da->da_memt;
+	if (bus_space_map(ch.cmd_iot, WDC_DPPBUS_REG, WDC_DPPBUS_REG_NPORTS, 0,
+	    &ch.cmd_ioh))
+		goto out;
+
+	ch.ctl_iot = da->da_memt;
+	if (bus_space_map(ch.ctl_iot, WDC_DPPBUS_REG + WDC_DPPBUS_AUXREG_OFFSET,
+	    WDC_DPPBUS_AUXREG_NPORTS, 0, &ch.ctl_ioh))
+		goto outunmap;
+
+	result = wdcprobe(&ch);
+
+	bus_space_unmap(ch.ctl_iot, ch.ctl_ioh, WDC_DPPBUS_AUXREG_NPORTS);
+outunmap:
+	bus_space_unmap(ch.cmd_iot, ch.cmd_ioh, WDC_DPPBUS_REG_NPORTS);
+out:
+	return (result);
+}
+
+void
+wdc_dppbus_attach(parent, self, aux)
+	struct device *parent, *self;
+	void *aux;
+{
+	struct wdc_dppbus_softc *sc = (void *)self;
+	struct dppbus_attach_args *da = aux;
+
+	printf("\n");
+
+	sc->wdc_channel.cmd_iot = da->da_memt;
+	sc->wdc_channel.ctl_iot = da->da_memt;
+	if (bus_space_map(sc->wdc_channel.cmd_iot, WDC_DPPBUS_REG,
+	    WDC_DPPBUS_REG_NPORTS, 0, &sc->wdc_channel.cmd_ioh) ||
+	    bus_space_map(sc->wdc_channel.ctl_iot,
+	      WDC_DPPBUS_REG+WDC_DPPBUS_AUXREG_OFFSET, WDC_DPPBUS_AUXREG_NPORTS,
+	      0, &sc->wdc_channel.ctl_ioh)) {
+		printf("%s: couldn't map registers\n",
+		    sc->sc_wdcdev.sc_dev.dv_xname);
+	}
+	sc->wdc_channel.data32iot = sc->wdc_channel.cmd_iot;
+	sc->wdc_channel.data32ioh = sc->wdc_channel.cmd_ioh;
+
+	callout_init(&sc->sc_intremu);
+	callout_reset(&sc->sc_intremu, 1, 
+		      wdc_dppbus_intr, sc);
+
+	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_PREATA;
+	sc->sc_wdcdev.PIO_cap = 0;
+	sc->wdc_chanptr = &sc->wdc_channel;
+	sc->sc_wdcdev.channels = &sc->wdc_chanptr;
+	sc->sc_wdcdev.nchannels = 1;
+	sc->wdc_channel.channel = 0;
+	sc->wdc_channel.wdc = &sc->sc_wdcdev;
+	sc->wdc_channel.ch_queue = malloc(sizeof(struct channel_queue),
+	    M_DEVBUF, M_NOWAIT);
+	if (sc->wdc_channel.ch_queue == NULL) {
+		printf("%s: can't allocate memory for command queue",
+		sc->sc_wdcdev.sc_dev.dv_xname);
+		return;
+	}
+	wdcattach(&sc->wdc_channel);
+}
+
--- /dev/null	Fri Aug  3 00:29:59 2001
+++ sys/arch/dreamcast/dev/dpp/dppbus_bus_mem.c	Wed Aug  1 21:28:38 2001
@@ -0,0 +1,325 @@
+/*	$NetBSD: g2bus_bus_mem.c,v 1.3 2001/02/01 01:01:50 thorpej Exp $	*/
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the NetBSD
+ *	Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+/*
+ * Bus space implementation for the SEGA G2 bus.
+ *
+ * NOTE: We only implement a small subset of what the bus_space(9)
+ * API specifies.  Right now, the GAPS PCI bridge is only used for
+ * the Dreamcast Broadband Adatper, so we only provide what the
+ * pci(4) and rtk(4) drivers need.
+ */
+
+#include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
+
+#include <sys/param.h>
+#include <sys/systm.h> 
+#include <sys/device.h>
+
+#include <machine/cpu.h> 
+#include <machine/bus.h>
+#include <machine/cpufunc.h>
+
+#include <dreamcast/dev/dpp/dppbusvar.h>
+
+#define  DPPBUS_STRIDE 2
+
+int	dppbus_bus_mem_map(void *, bus_addr_t, bus_size_t, int,
+	    bus_space_handle_t *);
+void	dppbus_bus_mem_unmap(void *, bus_space_handle_t, bus_size_t);
+
+u_int8_t dppbus_bus_mem_read_1(void *, bus_space_handle_t, bus_size_t);
+u_int16_t dppbus_bus_mem_read_2(void *, bus_space_handle_t, bus_size_t);
+u_int32_t dppbus_bus_mem_read_4(void *, bus_space_handle_t, bus_size_t);
+
+void	dppbus_bus_mem_write_1(void *, bus_space_handle_t, bus_size_t,
+	    u_int8_t);
+void	dppbus_bus_mem_write_2(void *, bus_space_handle_t, bus_size_t,
+	    u_int16_t);
+void	dppbus_bus_mem_write_4(void *, bus_space_handle_t, bus_size_t,
+	    u_int32_t);
+
+void	dppbus_bus_mem_read_region_1(void *, bus_space_handle_t, bus_size_t,
+	    u_int8_t *, bus_size_t);
+
+void	dppbus_bus_mem_read_multi_1(void *, bus_space_handle_t, bus_size_t,
+	    u_int8_t *, bus_size_t);
+
+void	dppbus_bus_mem_read_multi_2(void *, bus_space_handle_t, bus_size_t,
+	    u_int16_t *, bus_size_t);
+
+void	dppbus_bus_mem_write_region_1(void *, bus_space_handle_t, bus_size_t,
+	    const u_int8_t *, bus_size_t);
+
+void	dppbus_bus_mem_write_multi_1(void *, bus_space_handle_t, bus_size_t,
+	    const u_int8_t *, bus_size_t);
+
+void	dppbus_bus_mem_write_multi_2(void *, bus_space_handle_t, bus_size_t,
+	    const u_int16_t *, bus_size_t);
+
+int	dppbus_space_subregion(void *, bus_space_handle_t, bus_size_t,
+            bus_size_t, bus_space_handle_t *);
+
+
+void
+dppbus_bus_mem_init(struct dppbus_softc *sc)
+{
+	bus_space_tag_t t = &sc->sc_memt;
+
+	memset(t, 0, sizeof(*t));
+
+	t->dbs_map = dppbus_bus_mem_map;
+	t->dbs_unmap = dppbus_bus_mem_unmap;
+
+	t->dbs_r_1 = dppbus_bus_mem_read_1;
+	t->dbs_r_2 = dppbus_bus_mem_read_2;
+//	t->dbs_r_4 = dppbus_bus_mem_read_4;
+
+	t->dbs_w_1 = dppbus_bus_mem_write_1;
+	t->dbs_w_2 = dppbus_bus_mem_write_2;
+//	t->dbs_w_4 = dppbus_bus_mem_write_4;
+
+	t->dbs_rr_1 = dppbus_bus_mem_read_region_1;
+
+	t->dbs_wr_1 = dppbus_bus_mem_write_region_1;
+
+	t->dbs_rm_1 = dppbus_bus_mem_read_multi_1;
+	t->dbs_rm_2 = dppbus_bus_mem_read_multi_2;
+
+	t->dbs_wm_1 = dppbus_bus_mem_write_multi_1;
+	t->dbs_wm_2 = dppbus_bus_mem_write_multi_2;
+
+	t->dbs_subregion = dppbus_space_subregion;
+}
+
+int
+dppbus_bus_mem_map(void *v, bus_addr_t addr, bus_size_t size, int flags,
+    bus_space_handle_t *shp)
+{
+
+	//KASSERT((addr & SH3_PHYS_MASK) == addr);
+	*shp = SH3_PHYS_TO_P2SEG(addr);
+
+	return (0);
+}
+
+void
+dppbus_bus_mem_unmap(void *v, bus_space_handle_t sh, bus_size_t size)
+{
+
+	//KASSERT(sh >= SH3_P2SEG_BASE && sh <= SH3_P2SEG_END);
+	/* Nothing to do. */
+}
+
+int
+dppbus_space_subregion(void *v, bus_space_handle_t handle,
+    bus_size_t offset, bus_size_t size, bus_space_handle_t *nhandlep)
+{
+	*nhandlep = handle + (offset<<DPPBUS_STRIDE);
+        return (0);
+}
+
+#define DPP_DELAY 
+#define DPP_DELAY_ENTER DPP_DELAY
+#define DPP_DELAY_EXIT 
+#define DPP_DELAY_WRITE_ENTER DPP_DELAY
+#define DPP_DELAY_WRITE_EXIT
+
+u_int8_t
+dppbus_bus_mem_read_1(void *v, bus_space_handle_t sh, bus_size_t off)
+{
+	u_int8_t rv;
+
+	DPP_DELAY_ENTER;
+
+	rv = (*(__volatile u_int16_t *)(sh + (off<<DPPBUS_STRIDE))) & 0xff;
+
+	DPP_DELAY_EXIT;
+
+	return (rv);
+}
+
+u_int16_t
+dppbus_bus_mem_read_2(void *v, bus_space_handle_t sh, bus_size_t off)
+{
+	u_int16_t rv;
+
+	DPP_DELAY_ENTER;
+
+	rv = *(__volatile u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+	DPP_DELAY_EXIT;
+
+	return (rv);
+}
+
+u_int32_t
+dppbus_bus_mem_read_4(void *v, bus_space_handle_t sh, bus_size_t off)
+{
+	u_int32_t rv;
+
+	DPP_DELAY_ENTER;
+
+	rv = *(__volatile u_int32_t *)(sh + (off<<DPPBUS_STRIDE));
+
+	DPP_DELAY_EXIT;
+
+	return (rv);
+}
+
+void
+dppbus_bus_mem_write_1(void *v, bus_space_handle_t sh, bus_size_t off,
+    u_int8_t val)
+{
+
+	DPP_DELAY_WRITE_ENTER;
+
+	*(__volatile u_int16_t *)(sh + (off<<DPPBUS_STRIDE)) = val & 0xff;
+
+	DPP_DELAY_WRITE_EXIT;
+}
+
+void
+dppbus_bus_mem_write_2(void *v, bus_space_handle_t sh, bus_size_t off,
+    u_int16_t val)
+{
+
+	DPP_DELAY_WRITE_ENTER;
+
+	*(__volatile u_int16_t *)(sh + (off<<DPPBUS_STRIDE)) = val;
+
+	DPP_DELAY_WRITE_EXIT;
+}
+
+void
+dppbus_bus_mem_write_4(void *v, bus_space_handle_t sh, bus_size_t off,
+    u_int32_t val)
+{
+
+	DPP_DELAY_WRITE_ENTER;
+
+	*(__volatile u_int16_t *)(sh + (off<<DPPBUS_STRIDE)) = val;
+
+	DPP_DELAY_WRITE_EXIT;
+}
+
+void
+dppbus_bus_mem_read_region_1(void *v, bus_space_handle_t sh, bus_size_t off,
+    u_int8_t *addr, bus_size_t len)
+{
+	__volatile const u_int16_t *baddr = (u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+
+	while (len--) {
+		DPP_DELAY_ENTER;
+		*addr++ = *baddr++;
+		baddr++;
+		DPP_DELAY_EXIT;
+	}
+
+}
+
+void
+dppbus_bus_mem_read_multi_1(void *v, bus_space_handle_t sh, bus_size_t off,
+    u_int8_t *addr, bus_size_t len)
+{
+	__volatile const u_int16_t *baddr = (u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+	while (len--) {
+		DPP_DELAY_ENTER;
+		*addr++ = (*baddr) & 0xff;
+		DPP_DELAY_EXIT;
+	}
+
+}
+
+void
+dppbus_bus_mem_read_multi_2(void *v, bus_space_handle_t sh, bus_size_t off,
+    u_int16_t *addr, bus_size_t len)
+{
+	__volatile const u_int16_t *baddr = (u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+	while (len--) {
+		DPP_DELAY_ENTER;
+		*addr++ = *baddr;
+		DPP_DELAY_EXIT;
+	}
+}
+
+void
+dppbus_bus_mem_write_region_1(void *v, bus_space_handle_t sh, bus_size_t off,
+    const u_int8_t *addr, bus_size_t len)
+{
+	__volatile u_int16_t *baddr = (u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+	while (len--) {
+		DPP_DELAY_WRITE_ENTER;
+		*baddr++ = *addr++;
+		baddr++;
+		DPP_DELAY_WRITE_EXIT;
+	}
+}
+
+void
+dppbus_bus_mem_write_multi_1(void *v, bus_space_handle_t sh, bus_size_t off,
+    const u_int8_t *addr, bus_size_t len)
+{
+	__volatile u_int16_t *baddr = (u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+
+	while (len--) {
+		DPP_DELAY_WRITE_ENTER;
+		*baddr = (*addr++) & 0xff;
+		DPP_DELAY_WRITE_EXIT;
+	}
+}
+
+void
+dppbus_bus_mem_write_multi_2(void *v, bus_space_handle_t sh, bus_size_t off,
+    const u_int16_t *addr, bus_size_t len)
+{
+	__volatile u_int16_t *baddr = (u_int16_t *)(sh + (off<<DPPBUS_STRIDE));
+
+	while (len--) {
+		DPP_DELAY_WRITE_ENTER;
+		*baddr = *addr++;
+		DPP_DELAY_WRITE_EXIT;
+	}
+}
+
+
--- /dev/null	Fri Aug  3 00:29:59 2001
+++ sys/arch/dreamcast/dev/dpp/dppbus.c	Wed Aug  1 21:12:09 2001
@@ -0,0 +1,100 @@
+/*	$NetBSD: g2bus.c,v 1.1 2001/01/31 18:33:24 thorpej Exp $	*/
+
+/*-
+ * Copyright (c) 2001 Marcus Comstedt
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by Marcus Comstedt.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/conf.h>
+#include <sys/malloc.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+
+#include <dreamcast/dev/dpp/dppbusvar.h>
+
+int	dppbusmatch(struct device *, struct cfdata *, void *);
+void	dppbusattach(struct device *, struct device *, void *);
+int	dppbusprint(void *, const char *);
+
+struct cfattach dppbus_ca = {
+	sizeof(struct dppbus_softc), dppbusmatch, dppbusattach
+};
+
+int	dppbussearch(struct device *, struct cfdata *, void *);
+
+int
+dppbusmatch(struct device *parent, struct cfdata *cf, void *aux)
+{
+  	struct shb_attach_args *sa = aux;
+
+	if (strcmp("dppbus", cf->cf_driver->cd_name))
+		return (0);
+
+	sa->ia_iosize = 0 /* */;
+        return (1);
+}
+
+void
+dppbusattach(struct device *parent, struct device *self, void *aux)
+{
+	struct dppbus_softc *sc = (void *) self;
+	struct dppbus_attach_args da;
+
+	printf("\n");
+
+	TAILQ_INIT(&sc->sc_subdevs);
+
+	dppbus_bus_mem_init(sc);
+
+	da.da_memt = &sc->sc_memt;
+
+	config_search(dppbussearch, self, &da);
+}
+
+int
+dppbusprint(void *aux, const char *pnp)
+{
+
+	return (UNCONF);
+}
+
+int
+dppbussearch(struct device *parent, struct cfdata *cf, void *aux)
+{
+
+	if ((*cf->cf_attach->ca_match)(parent, cf, aux) > 0)
+		config_attach(parent, cf, aux, dppbusprint);
+
+	return (0);
+}
+
--- /dev/null	Fri Aug  3 00:29:59 2001
+++ sys/arch/dreamcast/dev/dpp/dppbusvar.h	Wed Aug  1 21:37:13 2001
@@ -0,0 +1,70 @@
+/*	$NetBSD: g2busvar.h,v 1.1 2001/01/31 18:33:24 thorpej Exp $	*/
+
+/*-
+ * Copyright (c) 2001 Marcus Comstedt
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by Marcus Comstedt.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#ifndef _DREAMCAST_DPPBUSVAR_H_
+#define _DREAMCAST_DPPBUSVAR_H_
+
+#include <sh3/shbvar.h>
+
+/*
+ * DC-PP driver attach arguments
+ */
+struct dppbus_attach_args {
+	bus_space_tag_t da_memt;
+};
+
+/*
+ * Per-device DC-PP variables
+ */
+struct dppbusdev {
+	struct  device *dd_dev;		/* back pointer to generic */
+	TAILQ_ENTRY(dppbusdev)
+		dd_bchain;		/* bus chain */
+};
+
+/*
+ * master bus
+ */
+struct dppbus_softc {
+	struct	device sc_dev;		/* base device */
+	struct  dreamcast_bus_space sc_memt;
+	TAILQ_HEAD(, dppbusdev)
+		sc_subdevs;		/* list of all children */
+};
+
+void	dppbus_bus_mem_init(struct dppbus_softc *);
+
+#endif /* _DREAMCAST_DPPBUSVAR_H_ */
+
+

This page is the sole property of Kiyoshi Ikehara and merely mirrored by FuzzyMuzzle.com. Please direct all questions regarding this mirror's content to Kiyoshi Ikehera himself.