Module Name: src
Committed By: rkujawa
Date: Thu Aug 4 17:48:51 UTC 2011
Modified Files:
src/share/man/man4/man4.amiga: Makefile
src/sys/arch/amiga/amiga: amiga_bus_simple_1word.c autoconf.c
simple_busfuncs.c
src/sys/arch/amiga/conf: DRACO GENERIC GENERIC.in INSTALL files.amiga
src/sys/arch/amiga/dev: zbus.c
src/sys/arch/amiga/include: bus.h
Added Files:
src/share/man/man4/man4.amiga: p5pb.4
src/sys/arch/amiga/amiga: bus.c
src/sys/arch/amiga/include: pci_machdep.h
src/sys/arch/amiga/pci: p5pb.c p5pbreg.h
Log Message:
Add basic PCI support for amiga port.
Add missing bus_space(9) methods needed for MI PCI.
Add p5pb(4) - Phase5 PCI bridge driver (and the man page).
Add quirks table to zbus(4) - needed for p5pb.
Change approved by phx.
To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/share/man/man4/man4.amiga/Makefile
cvs rdiff -u -r0 -r1.1 src/share/man/man4/man4.amiga/p5pb.4
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/amiga/amiga/amiga_bus_simple_1word.c
cvs rdiff -u -r1.107 -r1.108 src/sys/arch/amiga/amiga/autoconf.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/amiga/bus.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/amiga/amiga/simple_busfuncs.c
cvs rdiff -u -r1.139 -r1.140 src/sys/arch/amiga/conf/DRACO
cvs rdiff -u -r1.269 -r1.270 src/sys/arch/amiga/conf/GENERIC
cvs rdiff -u -r1.81 -r1.82 src/sys/arch/amiga/conf/GENERIC.in
cvs rdiff -u -r1.91 -r1.92 src/sys/arch/amiga/conf/INSTALL
cvs rdiff -u -r1.145 -r1.146 src/sys/arch/amiga/conf/files.amiga
cvs rdiff -u -r1.63 -r1.64 src/sys/arch/amiga/dev/zbus.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/amiga/include/bus.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/include/pci_machdep.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/pci/p5pb.c \
src/sys/arch/amiga/pci/p5pbreg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man4/man4.amiga/Makefile
diff -u src/share/man/man4/man4.amiga/Makefile:1.17 src/share/man/man4/man4.amiga/Makefile:1.18
--- src/share/man/man4/man4.amiga/Makefile:1.17 Fri Jan 14 10:25:14 2011
+++ src/share/man/man4/man4.amiga/Makefile Thu Aug 4 17:48:50 2011
@@ -1,11 +1,11 @@
# from: @(#)Makefile 8.2 (Berkeley) 2/16/94
-# $NetBSD: Makefile,v 1.17 2011/01/14 10:25:14 phx Exp $
+# $NetBSD: Makefile,v 1.18 2011/08/04 17:48:50 rkujawa Exp $
MAN= afsc.4 ahsc.4 amidisplaycc.4 atzsc.4 autoconf.4 console.4 bah.4 \
bppcsc.4 ed.4 es.4 fdc.4 grf.4 \
grfcl.4 grfcv.4 grfcv3d.4 grfet.4 grfrh.4 grfrt.4 grful.4 \
- gtsc.4 intro.4 ite.4 mem.4 mfcs.4 mgnsc.4 qn.4 ser.4 \
- wesc.4 zssc.4
+ gtsc.4 intro.4 ite.4 mem.4 mfcs.4 mgnsc.4 p5pb.4 \
+ qn.4 ser.4 wesc.4 zssc.4
MLINKS= mem.4 kmem.4
MANSUBDIR=/amiga
Index: src/sys/arch/amiga/amiga/amiga_bus_simple_1word.c
diff -u src/sys/arch/amiga/amiga/amiga_bus_simple_1word.c:1.3 src/sys/arch/amiga/amiga/amiga_bus_simple_1word.c:1.4
--- src/sys/arch/amiga/amiga/amiga_bus_simple_1word.c:1.3 Mon Apr 28 20:23:12 2008
+++ src/sys/arch/amiga/amiga/amiga_bus_simple_1word.c Thu Aug 4 17:48:50 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: amiga_bus_simple_1word.c,v 1.3 2008/04/28 20:23:12 martin Exp $ */
+/* $NetBSD: amiga_bus_simple_1word.c,v 1.4 2011/08/04 17:48:50 rkujawa Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -28,11 +28,202 @@
* 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/device.h>
+#include <sys/systm.h>
+
+#include <machine/cpu.h>
+#include <machine/pte.h>
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_1word.c,v 1.3 2008/04/28 20:23:12 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_1word.c,v 1.4 2011/08/04 17:48:50 rkujawa Exp $");
-#define AMIGA_SIMPLE_BUS_STRIDE 1 /* 1 byte per word */
+#define AMIGA_SIMPLE_BUS_STRIDE 1 /* 1 byte per byte */
#define AMIGA_SIMPLE_BUS_WORD_METHODS
+#define AMIGA_SIMPLE_BUS_LONGWORD_METHODS
#include "simple_busfuncs.c"
+
+bsr(oabs(bsr4_swap_), u_int32_t);
+bsw(oabs(bsw4_swap_), u_int32_t);
+
+bsrm(oabs(bsrm2_swap_), u_int16_t);
+bswm(oabs(bswm2_swap_), u_int16_t);
+
+int oabs(bsm_absolute_)(bus_space_tag_t, bus_addr_t, bus_size_t, int,
+ bus_space_handle_t *);
+
+/* ARGSUSED */
+int
+oabs(bsm_absolute_)(tag, address, size, flags, handlep)
+ bus_space_tag_t tag;
+ bus_addr_t address;
+ bus_size_t size;
+ int flags;
+ bus_space_handle_t *handlep;
+{
+ uint32_t pa = kvtop((void*) tag->base);
+ *handlep = tag->base + (address - pa) * AMIGA_SIMPLE_BUS_STRIDE;
+ return 0;
+}
+
+/* ARGSUSED */
+u_int32_t
+oabs(bsr4_swap_)(handle, offset)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+{
+ volatile u_int32_t *p;
+ u_int32_t x;
+
+ p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+ x = *p;
+ amiga_bus_reorder_protect();
+ return bswap32(x);
+}
+
+/* ARGSUSED */
+void
+oabs(bsw4_swap_)(handle, offset, value)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ unsigned value;
+{
+ volatile u_int32_t *p;
+
+ p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+ *p = bswap32( (u_int32_t)value );
+ amiga_bus_reorder_protect();
+}
+
+/* ARGSUSED */
+void
+oabs(bsrm2_swap_)(bus_space_handle_t handle, bus_size_t offset,
+ u_int16_t *pointer, bus_size_t count)
+{
+ volatile u_int16_t *p;
+
+ p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *pointer++ = bswap16(*p);
+ amiga_bus_reorder_protect();
+ --count;
+ }
+}
+
+/* ARGSUSED */
+void
+oabs(bswm2_swap_)(bus_space_handle_t handle, bus_size_t offset,
+ const u_int16_t *pointer, bus_size_t count)
+{
+ volatile u_int16_t *p;
+
+ p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *p = bswap16(*pointer);
+ amiga_bus_reorder_protect();
+ ++pointer;
+ --count;
+ }
+}
+
+const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs = {
+
+ oabs(bsm_absolute_),
+ oabs(bsms_),
+ oabs(bsu_),
+ 0,
+ 0,
+
+ oabs(bsr1_),
+ oabs(bsw1_),
+ oabs(bsrm1_),
+ oabs(bswm1_),
+ oabs(bsrr1_),
+ oabs(bswr1_),
+ oabs(bssr1_),
+ oabs(bscr1_),
+
+ oabs(bsr2_), /* XXX swap? */
+ oabs(bsw2_), /* XXX swap? */
+ oabs(bsr2_),
+ oabs(bsw2_),
+ oabs(bsrm2_swap_),
+ oabs(bswm2_swap_),
+ oabs(bsrm2_),
+ oabs(bswm2_),
+ oabs(bsrr2_), /* XXX swap? */
+ oabs(bswr2_), /* XXX swap? */
+ oabs(bsrr2_),
+ oabs(bswr2_),
+ oabs(bssr2_), /* XXX swap? */
+ oabs(bscr2_), /* XXX swap? */
+
+ oabs(bsr4_swap_),
+ oabs(bsw4_swap_),
+ oabs(bsr4_),
+ oabs(bsw4_),
+ oabs(bsrm4_), /* XXX swap? */
+ oabs(bswm4_), /* XXX swap? */
+ oabs(bsrm4_),
+ oabs(bswm4_),
+ oabs(bsrr4_), /* XXX swap? */
+ oabs(bswr4_), /* XXX swap? */
+ oabs(bsrr4_),
+ oabs(bswr4_),
+ oabs(bssr4_), /* XXX swap? */
+ oabs(bscr4_) /* XXX swap? */
+
+};
+
+const struct amiga_bus_space_methods amiga_bus_stride_1swap = {
+
+ oabs(bsm_),
+ oabs(bsms_),
+ oabs(bsu_),
+ 0,
+ 0,
+
+ oabs(bsr1_),
+ oabs(bsw1_),
+ oabs(bsrm1_),
+ oabs(bswm1_),
+ oabs(bsrr1_),
+ oabs(bswr1_),
+ oabs(bssr1_),
+ oabs(bscr1_),
+
+ oabs(bsr2_), /* XXX swap? */
+ oabs(bsw2_), /* XXX swap? */
+ oabs(bsr2_),
+ oabs(bsw2_),
+ oabs(bsrm2_swap_),
+ oabs(bswm2_swap_),
+ oabs(bsrm2_),
+ oabs(bswm2_),
+ oabs(bsrr2_), /* XXX swap? */
+ oabs(bswr2_), /* XXX swap? */
+ oabs(bsrr2_),
+ oabs(bswr2_),
+ oabs(bssr2_), /* XXX swap? */
+ oabs(bscr2_), /* XXX swap? */
+
+ oabs(bsr4_swap_),
+ oabs(bsw4_swap_),
+ oabs(bsr4_),
+ oabs(bsw4_),
+ oabs(bsrm4_), /* XXX swap? */
+ oabs(bswm4_), /* XXX swap? */
+ oabs(bsrm4_),
+ oabs(bswm4_),
+ oabs(bsrr4_), /* XXX swap? */
+ oabs(bswr4_), /* XXX swap? */
+ oabs(bsrr4_),
+ oabs(bswr4_),
+ oabs(bssr4_), /* XXX swap? */
+ oabs(bscr4_) /* XXX swap? */
+
+};
+
Index: src/sys/arch/amiga/amiga/autoconf.c
diff -u src/sys/arch/amiga/amiga/autoconf.c:1.107 src/sys/arch/amiga/amiga/autoconf.c:1.108
--- src/sys/arch/amiga/amiga/autoconf.c:1.107 Fri Jun 3 00:52:22 2011
+++ src/sys/arch/amiga/amiga/autoconf.c Thu Aug 4 17:48:50 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.107 2011/06/03 00:52:22 matt Exp $ */
+/* $NetBSD: autoconf.c,v 1.108 2011/08/04 17:48:50 rkujawa Exp $ */
/*
* Copyright (c) 1994 Christian E. Hopps
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.107 2011/06/03 00:52:22 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.108 2011/08/04 17:48:50 rkujawa Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -49,6 +49,9 @@
#ifdef DRACO
#include <amiga/amiga/drcustom.h>
#endif
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcidevs.h>
static void findroot(void);
void mbattach(device_t, device_t, void *);
@@ -579,3 +582,56 @@
return (1); /* It's an A600 */
return (0); /* Machine type not set */
}
+
+
+void
+device_register(device_t dev, void *aux)
+{
+ prop_dictionary_t dict, parent_dict;
+ struct pci_attach_args *pa = aux;
+
+ if (device_parent(dev) && device_is_a(device_parent(dev), "pci")) {
+
+ dict = device_properties(dev);
+
+ if (PCI_CLASS(pa->pa_class) == PCI_CLASS_DISPLAY) {
+
+ /* Handle CVPPC/BVPPC card. */
+ if ((PCI_VENDOR(pa->pa_id) == PCI_VENDOR_TI)
+ && (PCI_PRODUCT(pa->pa_id) ==
+ PCI_PRODUCT_TI_TVP4020) ) {
+
+ /*
+ * PCI bridge knows the properties,
+ * PCI device doesn't - let's copy
+ * them.
+ */
+ parent_dict = device_properties(
+ device_parent(device_parent(dev)));
+
+ prop_dictionary_set(dict, "width",
+ prop_dictionary_get(parent_dict, "width"));
+
+ prop_dictionary_set(dict, "height",
+ prop_dictionary_get(parent_dict, "height"));
+
+ prop_dictionary_set(dict, "depth",
+ prop_dictionary_get(parent_dict, "depth"));
+
+ prop_dictionary_set(dict, "linebytes",
+ prop_dictionary_get(parent_dict,
+ "linebytes"));
+
+ prop_dictionary_set(dict, "address",
+ prop_dictionary_get(parent_dict,
+ "address"));
+#if (NGENFB > 0)
+ prop_dictionary_set(dict, "virtual_address",
+ prop_dictionary_get(parent_dict,
+ "virtual_address"));
+#endif
+ }
+ }
+ }
+}
+
Index: src/sys/arch/amiga/amiga/simple_busfuncs.c
diff -u src/sys/arch/amiga/amiga/simple_busfuncs.c:1.7 src/sys/arch/amiga/amiga/simple_busfuncs.c:1.8
--- src/sys/arch/amiga/amiga/simple_busfuncs.c:1.7 Tue Jul 19 15:55:26 2011
+++ src/sys/arch/amiga/amiga/simple_busfuncs.c Thu Aug 4 17:48:50 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: simple_busfuncs.c,v 1.7 2011/07/19 15:55:26 dyoung Exp $ */
+/* $NetBSD: simple_busfuncs.c,v 1.8 2011/08/04 17:48:50 rkujawa Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: simple_busfuncs.c,v 1.7 2011/07/19 15:55:26 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: simple_busfuncs.c,v 1.8 2011/08/04 17:48:50 rkujawa Exp $");
/*
* Do NOT use this standalone.
@@ -399,6 +399,160 @@
}
#endif /* AMIGA_SIMPLE_BUS_WORD_METHODS */
+#ifdef AMIGA_SIMPLE_BUS_LONGWORD_METHODS
+
+/* longword methods */
+
+bsr (oabs(bsr4_), u_int32_t);
+bsw (oabs(bsw4_), u_int32_t);
+bsrm(oabs(bsrm4_), u_int32_t);
+bswm(oabs(bswm4_), u_int32_t);
+bsrm(oabs(bsrr4_), u_int32_t);
+bswm(oabs(bswr4_), u_int32_t);
+bssr(oabs(bssr4_), u_int32_t);
+bscr(oabs(bscr4_), u_int32_t);
+
+u_int32_t
+oabs(bsr4_)(handle, offset)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+{
+ u_int32_t *p;
+ u_int32_t x;
+
+ p = (u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+ x = *p;
+ amiga_bus_reorder_protect();
+ return x;
+}
+
+void
+oabs(bsw4_)(handle, offset, value)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ unsigned value;
+{
+ u_int32_t *p;
+
+ p = (u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+ *p = (u_int32_t)value;
+ amiga_bus_reorder_protect();
+}
+
+
+void
+oabs(bsrm4_)(handle, offset, pointer, count)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ u_int32_t *pointer;
+ bus_size_t count;
+{
+ volatile u_int32_t *p;
+
+ p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *pointer++ = *p;
+ amiga_bus_reorder_protect();
+ --count;
+ }
+}
+
+void
+oabs(bswm4_)(handle, offset, pointer, count)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ const u_int32_t *pointer;
+ bus_size_t count;
+{
+ volatile u_int32_t *p;
+
+ p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *p = *pointer++;
+ amiga_bus_reorder_protect();
+ --count;
+ }
+}
+
+void
+oabs(bsrr4_)(handle, offset, pointer, count)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ u_int32_t *pointer;
+ bus_size_t count;
+{
+ volatile u_int8_t *p;
+
+ p = (volatile u_int8_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *pointer++ = *(volatile u_int32_t *)p;
+ amiga_bus_reorder_protect();
+ p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int32_t);
+ --count;
+ }
+}
+
+void
+oabs(bswr4_)(handle, offset, pointer, count)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ const u_int32_t *pointer;
+ bus_size_t count;
+{
+ volatile u_int8_t *p;
+
+ p = (volatile u_int8_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *(volatile u_int32_t *)p = *pointer++;
+ amiga_bus_reorder_protect();
+ p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int32_t);
+ --count;
+ }
+}
+
+void
+oabs(bssr4_)(handle, offset, value, count)
+ bus_space_handle_t handle;
+ bus_size_t offset;
+ unsigned value;
+ bus_size_t count;
+{
+ volatile u_int8_t *p;
+
+ p = (volatile u_int8_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *(volatile u_int32_t *)p = (unsigned)value;
+ amiga_bus_reorder_protect();
+ p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int32_t);
+ --count;
+ }
+}
+
+void
+oabs(bscr4_)(handlefrom, from, handleto, to, count)
+ bus_space_handle_t handlefrom, handleto;
+ bus_size_t from, to;
+ bus_size_t count;
+{
+ volatile u_int8_t *p, *q;
+
+ p = (volatile u_int8_t *)(handlefrom + from * AMIGA_SIMPLE_BUS_STRIDE);
+ q = (volatile u_int8_t *)(handleto + to * AMIGA_SIMPLE_BUS_STRIDE);
+
+ while (count > 0) {
+ *(volatile u_int32_t *)q = *(volatile u_int32_t *)p;
+ amiga_bus_reorder_protect();
+ p += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int32_t);
+ q += AMIGA_SIMPLE_BUS_STRIDE * sizeof(u_int32_t);
+ --count;
+ }
+}
+#endif /* AMIGA_SIMPLE_BUS_LONGWORD_METHODS */
#ifndef AMIGA_SIMPLE_BUS_NO_ARRAY
/* method array */
@@ -421,22 +575,42 @@
oabs(bscr1_),
#ifdef AMIGA_SIMPLE_BUS_WORD_METHODS
- oabs(bsr2_),
- oabs(bsw2_),
- oabs(bsr2_),
- oabs(bsw2_),
- oabs(bsrm2_),
- oabs(bswm2_),
- oabs(bsrm2_),
- oabs(bswm2_),
- oabs(bsrr2_),
- oabs(bswr2_),
- oabs(bsrr2_),
- oabs(bswr2_),
- oabs(bssr2_),
- oabs(bscr2_)
+ oabs(bsr2_),
+ oabs(bsw2_),
+ oabs(bsr2_),
+ oabs(bsw2_),
+ oabs(bsrm2_),
+ oabs(bswm2_),
+ oabs(bsrm2_),
+ oabs(bswm2_),
+ oabs(bsrr2_),
+ oabs(bswr2_),
+ oabs(bsrr2_),
+ oabs(bswr2_),
+ oabs(bssr2_),
+ oabs(bscr2_),
#else /* AMIGA_SIMPLE_BUS_WORD_METHODS */
- 0
+ 0,
#endif /* AMIGA_SIMPLE_BUS_WORD_METHODS */
+
+#ifdef AMIGA_SIMPLE_BUS_LONGWORD_METHODS
+ oabs(bsr4_),
+ oabs(bsw4_),
+ oabs(bsr4_),
+ oabs(bsw4_),
+ oabs(bsrm4_),
+ oabs(bswm4_),
+ oabs(bsrm4_),
+ oabs(bswm4_),
+ oabs(bsrr4_),
+ oabs(bswr4_),
+ oabs(bsrr4_),
+ oabs(bswr4_),
+ oabs(bssr4_),
+ oabs(bscr4_)
+#else /* AMIGA_SIMPLE_BUS_LONGWORD_METHODS */
+ 0
+#endif /* AMIGA_SIMPLE_BUS_LONGWORD_METHODS */
+
};
#endif
Index: src/sys/arch/amiga/conf/DRACO
diff -u src/sys/arch/amiga/conf/DRACO:1.139 src/sys/arch/amiga/conf/DRACO:1.140
--- src/sys/arch/amiga/conf/DRACO:1.139 Fri Jul 1 15:46:30 2011
+++ src/sys/arch/amiga/conf/DRACO Thu Aug 4 17:48:50 2011
@@ -1,9 +1,9 @@
-# $NetBSD: DRACO,v 1.139 2011/07/01 15:46:30 rkujawa Exp $
+# $NetBSD: DRACO,v 1.140 2011/08/04 17:48:50 rkujawa Exp $
#
# This file was automatically created.
# Changes will be lost when make is run in this directory.
#
-# Created from: # NetBSD: GENERIC.in,v 1.80 2011/07/01 13:30:18 rkujawa Exp $
+# Created from: # NetBSD: GENERIC.in,v 1.81 2011/07/01 15:46:30 rkujawa Exp $
#
##
# GENERIC machine description file
@@ -29,7 +29,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.139 $"
+#ident "GENERIC-$Revision: 1.140 $"
maxusers 8
Index: src/sys/arch/amiga/conf/GENERIC
diff -u src/sys/arch/amiga/conf/GENERIC:1.269 src/sys/arch/amiga/conf/GENERIC:1.270
--- src/sys/arch/amiga/conf/GENERIC:1.269 Fri Jul 1 15:46:30 2011
+++ src/sys/arch/amiga/conf/GENERIC Thu Aug 4 17:48:51 2011
@@ -1,9 +1,9 @@
-# $NetBSD: GENERIC,v 1.269 2011/07/01 15:46:30 rkujawa Exp $
+# $NetBSD: GENERIC,v 1.270 2011/08/04 17:48:51 rkujawa Exp $
#
# This file was automatically created.
# Changes will be lost when make is run in this directory.
#
-# Created from: # NetBSD: GENERIC.in,v 1.80 2011/07/01 13:30:18 rkujawa Exp $
+# Created from: # NetBSD: GENERIC.in,v 1.81 2011/07/01 15:46:30 rkujawa Exp $
#
##
# GENERIC machine description file
@@ -29,7 +29,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.269 $"
+#ident "GENERIC-$Revision: 1.270 $"
maxusers 8
@@ -463,6 +463,12 @@
ss* at scsibus? target ? lun ? # scsi scanner
uk* at scsibus? target ? lun ? # scsi unknown
+# PCI bus support
+options PCIVERBOSE # verbose PCI device autoconfig messages
+#options PCI_CONFIG_DUMP
+p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC)
+pci* at p5pb0
+
# Bluetooth Controller and Device support
# tested only with btuart on an A1200
Index: src/sys/arch/amiga/conf/GENERIC.in
diff -u src/sys/arch/amiga/conf/GENERIC.in:1.81 src/sys/arch/amiga/conf/GENERIC.in:1.82
--- src/sys/arch/amiga/conf/GENERIC.in:1.81 Fri Jul 1 15:46:30 2011
+++ src/sys/arch/amiga/conf/GENERIC.in Thu Aug 4 17:48:51 2011
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC.in,v 1.81 2011/07/01 15:46:30 rkujawa Exp $
+# $NetBSD: GENERIC.in,v 1.82 2011/08/04 17:48:51 rkujawa Exp $
#
##
# GENERIC machine description file
@@ -57,7 +57,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.81 $"
+#ident "GENERIC-$Revision: 1.82 $"
m4_ifdef(`INSTALL_CONFIGURATION', `m4_dnl
makeoptions COPTS="-Os"
@@ -570,6 +570,12 @@
')m4_dnl
m4_ifdef(`AMIGA_CONFIGURATION', `m4_dnl
+# PCI bus support
+options PCIVERBOSE # verbose PCI device autoconfig messages
+#options PCI_CONFIG_DUMP
+p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC)
+pci* at p5pb0
+
# Bluetooth Controller and Device support
# tested only with btuart on an A1200
Index: src/sys/arch/amiga/conf/INSTALL
diff -u src/sys/arch/amiga/conf/INSTALL:1.91 src/sys/arch/amiga/conf/INSTALL:1.92
--- src/sys/arch/amiga/conf/INSTALL:1.91 Fri Jul 1 15:46:30 2011
+++ src/sys/arch/amiga/conf/INSTALL Thu Aug 4 17:48:51 2011
@@ -1,9 +1,9 @@
-# $NetBSD: INSTALL,v 1.91 2011/07/01 15:46:30 rkujawa Exp $
+# $NetBSD: INSTALL,v 1.92 2011/08/04 17:48:51 rkujawa Exp $
#
# This file was automatically created.
# Changes will be lost when make is run in this directory.
#
-# Created from: # NetBSD: GENERIC.in,v 1.80 2011/07/01 13:30:18 rkujawa Exp $
+# Created from: # NetBSD: GENERIC.in,v 1.81 2011/07/01 15:46:30 rkujawa Exp $
#
##
# GENERIC machine description file
@@ -29,7 +29,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.91 $"
+#ident "GENERIC-$Revision: 1.92 $"
makeoptions COPTS="-Os"
@@ -407,6 +407,12 @@
cd* at scsibus? target ? lun ? # scsi cds
ch* at scsibus? target ? lun ? # scsi autochangers
+# PCI bus support
+options PCIVERBOSE # verbose PCI device autoconfig messages
+#options PCI_CONFIG_DUMP
+p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC)
+pci* at p5pb0
+
# Bluetooth Controller and Device support
# tested only with btuart on an A1200
Index: src/sys/arch/amiga/conf/files.amiga
diff -u src/sys/arch/amiga/conf/files.amiga:1.145 src/sys/arch/amiga/conf/files.amiga:1.146
--- src/sys/arch/amiga/conf/files.amiga:1.145 Fri Jul 1 13:30:18 2011
+++ src/sys/arch/amiga/conf/files.amiga Thu Aug 4 17:48:51 2011
@@ -1,4 +1,4 @@
-# $NetBSD: files.amiga,v 1.145 2011/07/01 13:30:18 rkujawa Exp $
+# $NetBSD: files.amiga,v 1.146 2011/08/04 17:48:51 rkujawa Exp $
# maxpartitions must be first item in files.${ARCH}.newconf
maxpartitions 16 # NOTE THAT AMIGA IS SPECIAL!
@@ -42,7 +42,6 @@
attach cpu at mainbus
# for bus_space
-
define amibus_bl
file arch/amiga/amiga/amiga_bus_simple_4.c
@@ -58,6 +57,8 @@
define amibus_b800
file arch/amiga/amiga/amiga_bus_simple_0x800.c amibus_b800
+file arch/amiga/amiga/bus.c
+
# zorro expansion bus.
device zbus {}
attach zbus at mainbus
@@ -492,4 +493,15 @@
# Bluetooth stack
include "dev/bluetooth/files.bluetooth"
-include "arch/amiga/conf/majors.amiga"
+# PCI bus
+file arch/amiga/pci/p5pb.c pci
+
+device p5pb: pcibus
+attach p5pb at zbus
+
+include "dev/i2o/files.i2o"
+include "dev/pci/files.pci"
+#include "dev/wsfb/files.wsfb"
+
+include "arch/amiga/conf/majors.amiga"
+
Index: src/sys/arch/amiga/dev/zbus.c
diff -u src/sys/arch/amiga/dev/zbus.c:1.63 src/sys/arch/amiga/dev/zbus.c:1.64
--- src/sys/arch/amiga/dev/zbus.c:1.63 Fri Jun 3 00:52:22 2011
+++ src/sys/arch/amiga/dev/zbus.c Thu Aug 4 17:48:51 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: zbus.c,v 1.63 2011/06/03 00:52:22 matt Exp $ */
+/* $NetBSD: zbus.c,v 1.64 2011/08/04 17:48:51 rkujawa Exp $ */
/*
* Copyright (c) 1994 Christian E. Hopps
@@ -31,11 +31,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zbus.c,v 1.63 2011/06/03 00:52:22 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zbus.c,v 1.64 2011/08/04 17:48:51 rkujawa Exp $");
#include <sys/param.h>
#include <sys/device.h>
#include <sys/systm.h>
+#include <sys/bus.h>
#include <machine/cpu.h>
#include <machine/pte.h>
@@ -55,6 +56,12 @@
void *vaddr;
};
+struct quirksdata {
+ int manid;
+ int prodid;
+ uint8_t quirks;
+};
+
vaddr_t ZTWOROMADDR;
vaddr_t ZTWOMEMADDR;
u_int NZTWOMEMPG;
@@ -148,6 +155,8 @@
{ "grfcv", 8512, 34}, /* CyberVison 64 */
{ "grfcv3d", 8512, 67}, /* CyberVison 64/3D */
{ "cbiiisc", 8512, 100}, /* Cyberstorm Mk III SCSI */
+ { "p5pb", 8512, 101}, /* CyberVisionPPC / BlizzardVisionPPC */
+ { "bppcsc", 8512, 110}, /* Blizzard 603e+ SCSI */
/* Hacker Inc. */
{ "mlhsc", 2011, 1 },
/* Resource Management Force */
@@ -217,14 +226,37 @@
};
static int npreconfent = sizeof(preconftab) / sizeof(struct preconfdata);
+/*
+ * Quirks table.
+ */
+#define ZORRO_QUIRK_NO_ZBUSMAP 1 /* Don't map VA=PA in zbusattach. */
+static struct quirksdata quirkstab[] = {
+ {8512, 101, ZORRO_QUIRK_NO_ZBUSMAP}
+};
+static int nquirksent = sizeof(quirkstab) / sizeof(struct quirksdata);
void zbusattach(device_t, device_t, void *);
int zbusprint(void *, const char *);
int zbusmatch(device_t, cfdata_t, void *);
-void *zbusmap(void *, u_int);
static const char *aconflookup(int, int);
/*
+ * given a manufacturer id and product id, find quirks
+ * for this board.
+ */
+static uint8_t
+quirkslookup(int mid, int pid)
+{
+ const struct quirksdata *qdp, *eqdp;
+
+ eqdp = &quirkstab[nquirksent];
+ for (qdp = quirkstab; qdp < eqdp; qdp++)
+ if (qdp->manid == mid && qdp->prodid == pid)
+ return(qdp->quirks);
+ return(0);
+}
+
+/*
* given a manufacturer id and product id, find the name
* that describes this board.
*/
@@ -306,10 +338,11 @@
if (amiga_realconfig && pcp < epcp && pcp->vaddr)
za.va = pcp->vaddr;
else {
- za.va = (void *) (isztwopa(za.pa) ?
- __UNVOLATILE(ztwomap(za.pa)) :
- zbusmap(za.pa, za.size));
-/* ??????? */
+ if(quirkslookup(za.manid, za.prodid) !=
+ ZORRO_QUIRK_NO_ZBUSMAP)
+ za.va = (void *) (isztwopa(za.pa) ?
+ __UNVOLATILE(ztwomap(za.pa)) :
+ zbusmap(za.pa, za.size));
/*
* save value if early console init
*/
Index: src/sys/arch/amiga/include/bus.h
diff -u src/sys/arch/amiga/include/bus.h:1.23 src/sys/arch/amiga/include/bus.h:1.24
--- src/sys/arch/amiga/include/bus.h:1.23 Wed Feb 3 13:56:53 2010
+++ src/sys/arch/amiga/include/bus.h Thu Aug 4 17:48:51 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: bus.h,v 1.23 2010/02/03 13:56:53 phx Exp $ */
+/* $NetBSD: bus.h,v 1.24 2011/08/04 17:48:51 rkujawa Exp $ */
/*
* Copyright (c) 1996 Leo Weppelman. All rights reserved.
@@ -125,7 +125,23 @@
bssr(*bssr2, u_int16_t);
bscr(*bscr2, u_int16_t);
- /* add 32bit methods here */
+ /* 32bit methods */
+
+ bsr(*bsr4, u_int32_t);
+ bsw(*bsw4, u_int32_t);
+ bsr(*bsrs4, u_int32_t);
+ bsw(*bsws4, u_int32_t);
+ bsrm(*bsrm4, u_int32_t);
+ bswm(*bswm4, u_int32_t);
+ bsrm(*bsrms4, u_int32_t);
+ bswm(*bswms4, u_int32_t);
+ bsrm(*bsrr4, u_int32_t);
+ bswm(*bswr4, u_int32_t);
+ bsrm(*bsrrs4, u_int32_t);
+ bswm(*bswrs4, u_int32_t);
+ bssr(*bssr4, u_int32_t);
+ bscr(*bscr4, u_int32_t);
+
};
/*
@@ -196,37 +212,33 @@
#define bus_space_set_region_2(t, h, o, v, c) dbss(bssr2, t, h, o, v, c)
#define bus_space_copy_region_2(t, h, o, g, q, c) dbss(bscr2, t, h, o, g, q, c)
-/* 4: Fake 32-bit macros */
-
-#define bus_space_read_4(t, h, o) \
- (panic("bus_space_read_4 not implemented"), 0)
-
-#define bus_space_write_4(t, h, o, v) \
- panic("bus_space_write_4 not implemented")
+/* 4: long-wide "functions" */
-#define bus_space_read_stream_4(t, h, o) \
- (panic("bus_space_read_stream_4 not implemented"), 0)
+#define bus_space_read_4(t, h, o) dbsdr(bsr4, t, h, o)
+#define bus_space_write_4(t, h, o, v) dbsdw(bsw4, t, h, o, v)
+#define bus_space_read_stream_4(t, h, o) dbsdr(bsrs4, t, h, o)
+#define bus_space_write_stream_4(t, h, o, v) dbsdw(bsws4, t, h, o, v)
-#define bus_space_write_stream_4(t, h, o, v) \
- panic("bus_space_read_stream_4 not implemented")
-
-#define bus_space_read_multi_4(t, h, o, p, c) \
- panic("bus_space_read_multi_4 not implemented")
-
-#define bus_space_write_multi_4(t, h, o, p, c) \
- panic("bus_space_write_multi_4 not implemented")
+#define bus_space_read_multi_4(t, h, o, p, c) dbsm(bsrm4, t, h, o, p, c)
+#define bus_space_write_multi_4(t, h, o, p, c) dbsm(bswm4, t, h, o, p, c)
#define bus_space_read_multi_stream_4(t, h, o, p, c) \
- panic("bus_space_read_multi_stream_4 not implemented")
+ dbsm(bsrms4, t, h, o, p, c)
#define bus_space_write_multi_stream_4(t, h, o, p, c) \
- panic("bus_space_write_multi_stream_4 not implemented")
+ dbsm(bswms4, t, h, o, p, c)
+
+#define bus_space_read_region_4(t, h, o, p, c) dbsm(bsrr4, t, h, o, p, c)
+#define bus_space_write_region_4(t, h, o, p, c) dbsm(bswr4, t, h, o, p, c)
#define bus_space_read_region_stream_4(t, h, o, p, c) \
- panic("bus_space_read_region_stream_4 not implemented")
+ dbsm(bsrrs4, t, h, o, p, c)
#define bus_space_write_region_stream_4(t, h, o, p, c) \
- panic("bus_space_write_region_stream_4 not implemented")
+ dbsm(bswrs4, t, h, o, p, c)
+
+#define bus_space_set_region_4(t, h, o, v, c) dbss(bssr4, t, h, o, v, c)
+#define bus_space_copy_region_4(t, h, o, g, q, c) dbss(bscr4, t, h, o, g, q, c)
/*
* Bus read/write barrier methods.
@@ -238,8 +250,9 @@
* Note: the 680x0 does not currently require barriers, but we must
* provide the flags to MI code.
*/
-#define bus_space_barrier(t, h, o, l, f) \
- ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
+void bus_space_barrier(bus_space_tag_t space, bus_space_handle_t handle,
+ bus_size_t offset, bus_size_t length, int flags);
+
#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
@@ -247,13 +260,27 @@
#define __BUS_SPACE_HAS_STREAM_METHODS
+paddr_t bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot,
+ int flags);
+
+#define BUS_SPACE_MAP_CACHEABLE 0x01
+#define BUS_SPACE_MAP_LINEAR 0x02
+#define BUS_SPACE_MAP_PREFETCHABLE 0x04
+
/* Instruction for enforcing reorder protection. Nothing for 68k. */
#define amiga_bus_reorder_protect()
+void * bus_space_vaddr(bus_space_tag_t space, bus_space_handle_t handle);
+
extern const struct amiga_bus_space_methods amiga_bus_stride_1;
+extern const struct amiga_bus_space_methods amiga_bus_stride_1swap;
+extern const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs;
extern const struct amiga_bus_space_methods amiga_bus_stride_2;
extern const struct amiga_bus_space_methods amiga_bus_stride_4;
extern const struct amiga_bus_space_methods amiga_bus_stride_4swap;
extern const struct amiga_bus_space_methods amiga_bus_stride_16;
+void *zbusmap(void *pa, u_int size);
+
#endif /* _AMIGA_BUS_H_ */
+
Added files:
Index: src/share/man/man4/man4.amiga/p5pb.4
diff -u /dev/null src/share/man/man4/man4.amiga/p5pb.4:1.1
--- /dev/null Thu Aug 4 17:48:52 2011
+++ src/share/man/man4/man4.amiga/p5pb.4 Thu Aug 4 17:48:50 2011
@@ -0,0 +1,80 @@
+.\" $NetBSD: p5pb.4,v 1.1 2011/08/04 17:48:50 rkujawa Exp $
+.\"
+.\" Copyright (c) 2011 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Radoslaw Kujawa.
+.\"
+.\" 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 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.
+.\"
+.Dd July 26, 2011
+.Dt P5PB 4 amiga
+.Os
+.Sh NAME
+.Nm p5pb
+.Nd Phase5 PCI bridge driver
+.Sh SYNOPSIS
+.Cd "p5pb0 at zbus0"
+.Cd "pci* at p5pb?"
+.Cd "genfb* at pci?"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for the PCI bus present on BlizzardVisionPPC and
+CyberVisionPPC graphics cards.
+.Sh HARDWARE
+The
+.Nm
+driver supports the following hardware:
+.Bl -tag -width "BLIZZARDVISIONPPC" -offset indent
+.It Em BLIZZARDVISIONPPC
+Phase5 BlizzardVisionPPC graphics card.
+.El
+.Bl -tag -width "BLIZZARDVISIONPPC" -offset indent
+.It Em CYBERVISIONPPC
+Phase5 CyberVisionPPC graphics card.
+.El
+.Sh SEE ALSO
+.Xr pm2fb 4 ,
+.Xr genfb 4 ,
+.Xr pci 4
+.Sh HISTORY
+The
+.Nm
+device first appeared in
+.Nx 6.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver was written by
+.An Radoslaw Kujawa Aq [email protected] .
+.Sh BUGS
+Current version of this driver depends on PCI bus setup and enumeration
+done by the firmware.
+.Pp
+The driver will not attach at all, if there is no AutoConfig entry
+for CVPPC/BVPPC card (Zorro product ID 110). Some firmware revisions
+are known not to create this entry.
+.Pp
+It is not (yet) possible to use the CVPPC/BVPPC as a console.
Index: src/sys/arch/amiga/amiga/bus.c
diff -u /dev/null src/sys/arch/amiga/amiga/bus.c:1.1
--- /dev/null Thu Aug 4 17:48:52 2011
+++ src/sys/arch/amiga/amiga/bus.c Thu Aug 4 17:48:50 2011
@@ -0,0 +1,66 @@
+/* $NetBSD: bus.c,v 1.1 2011/08/04 17:48:50 rkujawa Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Radoslaw Kujawa.
+ *
+ * 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 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.
+ */
+
+/* See simple_busfuncs.c for implementation of bus_space_read/write. */
+
+#include <sys/param.h>
+#include <sys/bus.h>
+
+void
+bus_space_barrier(bus_space_tag_t space, bus_space_handle_t handle,
+ bus_size_t offset, bus_size_t length, int flags)
+{
+/* Only amigappc needs barrier. */
+#if defined(__powerpc__)
+ asm volatile("eieio");
+#endif
+}
+
+paddr_t
+bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot,
+ int flags)
+{
+#if defined(__m68k__)
+ return m68k_btop(addr + off);
+#else
+ return -1; /* FIXME */
+#endif
+}
+
+void *
+bus_space_vaddr(bus_space_tag_t space, bus_space_handle_t handle)
+{
+ void* va;
+ va = (void*) handle;
+
+ return va;
+}
+
Index: src/sys/arch/amiga/include/pci_machdep.h
diff -u /dev/null src/sys/arch/amiga/include/pci_machdep.h:1.1
--- /dev/null Thu Aug 4 17:48:52 2011
+++ src/sys/arch/amiga/include/pci_machdep.h Thu Aug 4 17:48:51 2011
@@ -0,0 +1,112 @@
+/* $NetBSD: pci_machdep.h,v 1.1 2011/08/04 17:48:51 rkujawa Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Radoslaw Kujawa.
+ *
+ * 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 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 _AMIGA_PCI_MACHDEP_H_
+#define _AMIGA_PCI_MACHDEP_H_
+
+#include <sys/bus.h>
+
+#include <machine/intr.h>
+
+#include <m68k/bus_dma.h>
+
+/*
+ * Forward declarations.
+ */
+struct pci_attach_args;
+
+/*
+ * Types provided to machine-independent PCI code
+ */
+typedef struct amiga_pci_chipset *pci_chipset_tag_t;
+typedef u_long pcitag_t;
+typedef u_long pci_intr_handle_t;
+
+/*
+ * amiga-specific PCI structure and type definitions.
+ * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE.
+ */
+struct amiga_pci_chipset {
+ void *pc_conf_v;
+ void (*pc_attach_hook)(device_t, device_t,
+ struct pcibus_attach_args *);
+ int (*pc_bus_maxdevs)(pci_chipset_tag_t, int);
+ pcitag_t (*pc_make_tag)(pci_chipset_tag_t, int, int, int);
+ void (*pc_decompose_tag)(pci_chipset_tag_t, pcitag_t, int *,
+ int *, int *);
+ pcireg_t(*pc_conf_read)(pci_chipset_tag_t, pcitag_t,
+ int);
+ void (*pc_conf_write)(pci_chipset_tag_t, pcitag_t, int,
+ pcireg_t);
+ int (*pc_intr_map)(const struct pci_attach_args *,
+ pci_intr_handle_t *);
+ const char *(*pc_intr_string)(pci_chipset_tag_t,
+ pci_intr_handle_t);
+ void *(*pc_intr_establish)(pci_chipset_tag_t,
+ pci_intr_handle_t, int, int (*) (void *), void *);
+ void (*pc_intr_disestablish)(pci_chipset_tag_t, void *);
+ void (*pc_conf_interrupt)(pci_chipset_tag_t, int, int, int,
+ int, int *);
+ int (*pc_conf_hook)(pci_chipset_tag_t, int, int, int,
+ pcireg_t);
+
+ bus_space_tag_t pci_conf_iot;
+ bus_space_handle_t pci_conf_ioh;
+};
+
+
+/*
+ * Functions provided to machine-independent PCI code.
+ */
+#define pci_attach_hook(p, s, pba) \
+ (*(pba)->pba_pc->pc_attach_hook)((p), (s), (pba))
+#define pci_bus_maxdevs(c, b) \
+ (*(c)->pc_bus_maxdevs)((c)->pc_conf_v, (b))
+#define pci_make_tag(c, b, d, f) \
+ (*(c)->pc_make_tag)((c)->pc_conf_v, (b), (d), (f))
+#define pci_decompose_tag(c, t, bp, dp, fp) \
+ (*(c)->pc_decompose_tag)((c)->pc_conf_v, (t), (bp), (dp), (fp))
+#define pci_conf_read(c, t, r) \
+ (*(c)->pc_conf_read)((c)->pc_conf_v, (t), (r))
+#define pci_conf_write(c, t, r, v) \
+ (*(c)->pc_conf_write)((c)->pc_conf_v, (t), (r), (v))
+#define pci_intr_map(pa, ihp) \
+ (*(pa)->pa_pc->pc_intr_map)((pa), (ihp))
+#define pci_intr_string(c, ih) \
+ (*(c)->pc_intr_string)((c)->pc_intr_v, (ih))
+#define pci_intr_evcnt(c, ih) \
+ (*(c)->pc_intr_evcnt)((c)->pc_intr_v, (ih))
+#define pci_intr_establish(c, ih, l, h, a) \
+ (*(c)->pc_intr_establish)((c)->pc_intr_v, (ih), (l), (h), (a))
+#define pci_intr_disestablish(c, iv) \
+ (*(c)->pc_intr_disestablish)((c)->pc_intr_v, (iv))
+
+#endif
Index: src/sys/arch/amiga/pci/p5pb.c
diff -u /dev/null src/sys/arch/amiga/pci/p5pb.c:1.1
--- /dev/null Thu Aug 4 17:48:52 2011
+++ src/sys/arch/amiga/pci/p5pb.c Thu Aug 4 17:48:51 2011
@@ -0,0 +1,281 @@
+/* $NetBSD: p5pb.c,v 1.1 2011/08/04 17:48:51 rkujawa Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Radoslaw Kujawa.
+ *
+ * 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 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/time.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+#include <sys/extent.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/bus.h>
+#include <machine/cpu.h>
+
+#include <m68k/bus_dma.h>
+#include <amiga/dev/zbusvar.h>
+#include <amiga/pci/p5pbreg.h>
+
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcidevs.h>
+#include <dev/pci/pciconf.h>
+
+/* Zorro IDs */
+#define ZORRO_MANID_P5 8512
+#define ZORRO_PRODID_BPPC 110 /* BlizzardPPC */
+#define ZORRO_PRODID_CSPPC 100 /* CyberStormPPC */
+#define ZORRO_PRODID_P5PB 101 /* CVPPC/BVPPC (/G-REX?) */
+/* Initial resolution as configured by the firmware */
+#define P5GFX_WIDTH 640
+#define P5GFX_HEIGHT 480
+#define P5GFX_DEPTH 8
+#define P5GFX_LINEBYTES 640
+
+struct p5pb_softc {
+ device_t sc_dev;
+ struct bus_space_tag pci_conf_area;
+ struct bus_space_tag pci_mem_area;
+ struct amiga_pci_chipset apc;
+};
+
+static int p5pb_match(struct device *, struct cfdata *, void *);
+static void p5pb_attach(struct device *, struct device *, void *);
+void p5pb_set_props(struct p5pb_softc *sc);
+pcireg_t p5pb_pci_conf_read(pci_chipset_tag_t, pcitag_t, int);
+void p5pb_pci_conf_write(pci_chipset_tag_t, pcitag_t, int, pcireg_t);
+int p5pb_pci_bus_maxdevs(pci_chipset_tag_t pc, int busno);
+int p5pb_pci_conf_hook(pci_chipset_tag_t pct, int bus, int dev, int func, pcireg_t id);
+void p5pb_pci_attach_hook (struct device *parent, struct device *self, struct pcibus_attach_args *pba);
+pcitag_t p5pb_pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function);
+void p5pb_pci_decompose_tag(pci_chipset_tag_t pc, pcitag_t tag, int *bp, int *dp, int *fp);
+
+CFATTACH_DECL_NEW(p5pb, sizeof(struct p5pb_softc),
+ p5pb_match, p5pb_attach, NULL, NULL);
+
+
+static int p5pb_present = 0;
+
+static int
+p5pb_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct zbus_args *zap;
+
+ zap = aux;
+
+ if (zap->manid != ZORRO_MANID_P5)
+ return 0;
+
+ if (zap->prodid != ZORRO_PRODID_P5PB)
+ return 0;
+
+#ifdef P5PB_DEBUG
+ aprint_normal("p5pb matched by Zorro ID %d, %d\n", zap->manid,
+ zap->prodid);
+#endif
+
+ if (p5pb_present)
+ return 0; /* Allow only one. */
+
+
+#ifdef I_HAVE_P5PB_REALLY
+ /*
+ * At least some firmware versions do not create AutoConfig entries for
+ * CyberVisionPPC/BlizzardVisionPPC (product ID 0101). There's no "nice"
+ * way to detect the PCI bus in this case. At least check for CSPPC/BPPC.
+ */
+ if (zap->prodid = !(ZORRO_PRODID_BPPC || ZORRO_PRODID_CSPPC)) {
+ if (!p5pb_present) {
+ p5pb_present = 1;
+ return 100; /* XXX: This will break SCSI! */
+ }
+ }
+#endif
+ p5pb_present = 1;
+ return 1;
+}
+
+
+static void
+p5pb_attach(device_t parent, device_t self, void *aux)
+{
+ struct p5pb_softc *sc = device_private(self);
+ struct pcibus_attach_args pba;
+
+ pci_chipset_tag_t pc = &sc->apc;
+ sc->sc_dev = self;
+ aprint_normal(": Phase5 CVPPC/BVPPC PCI bridge\n");
+
+ /* Setup bus space mappings. */
+ sc->pci_conf_area.base = (bus_addr_t) zbusmap(
+ (void *) P5BUS_PCI_CONF_BASE, P5BUS_PCI_CONF_SIZE);
+ sc->pci_conf_area.absm = &amiga_bus_stride_1;
+
+ sc->pci_mem_area.base = (bus_addr_t) zbusmap(
+ (void *) P5BUS_PCI_MEM_BASE, P5BUS_PCI_MEM_SIZE);
+ sc->pci_mem_area.absm = &amiga_bus_stride_1swap_abs;
+
+#ifdef P5PB_DEBUG
+ aprint_normal("p5pb mapped %x -> %x, %x -> %x\n",
+ P5BUS_PCI_CONF_BASE, sc->pci_conf_area.base,
+ P5BUS_PCI_MEM_BASE, sc->pci_mem_area.base );
+#endif
+
+ sc->apc.pci_conf_iot = &(sc->pci_conf_area);
+
+ if (bus_space_map(sc->apc.pci_conf_iot, OFF_PCI_CONF_DATA,
+ 256, 0, &sc->apc.pci_conf_ioh))
+ aprint_error_dev(self,
+ "couldn't map PCI configuration data space\n");
+
+ /* Initialize the PCI chipset tag. */
+ sc->apc.pc_conf_v = (void*) pc;
+ sc->apc.pc_bus_maxdevs = p5pb_pci_bus_maxdevs;
+ sc->apc.pc_make_tag = p5pb_pci_make_tag;
+ sc->apc.pc_decompose_tag = p5pb_pci_decompose_tag;
+ sc->apc.pc_conf_read = p5pb_pci_conf_read;
+ sc->apc.pc_conf_write = p5pb_pci_conf_write;
+ sc->apc.pc_attach_hook = p5pb_pci_attach_hook;
+
+ pba.pba_iot = NULL;
+ pba.pba_memt = &(sc->pci_mem_area);
+ pba.pba_dmat = NULL;
+ pba.pba_dmat64 = NULL;
+ pba.pba_pc = pc;
+ pba.pba_flags = PCI_FLAGS_MEM_OKAY;
+ pba.pba_bus = 0;
+ pba.pba_bridgetag = NULL;
+
+ p5pb_set_props(sc);
+
+ config_found_ia(self, "pcibus", &pba, pcibusprint);
+}
+
+/*
+ * Set properties needed to support fb driver. These are read later during
+ * autoconfg in device_register().
+ */
+void
+p5pb_set_props(struct p5pb_softc *sc)
+{
+ prop_dictionary_t dict;
+ device_t dev;
+
+ dev = sc->sc_dev;
+ dict = device_properties(dev);
+
+ prop_dictionary_set_uint32(dict, "width", P5GFX_WIDTH);
+ prop_dictionary_set_uint32(dict, "height", P5GFX_HEIGHT);
+ prop_dictionary_set_uint8(dict, "depth", P5GFX_DEPTH);
+ prop_dictionary_set_uint16(dict, "linebytes", P5GFX_LINEBYTES);
+ prop_dictionary_set_uint64(dict, "address", P5BUS_PCI_MEM_BASE);
+#if (NGENFB > 0)
+ /*
+ * Framebuffer starts at P5BUS_PCI_MEM_BASE, but genfb needs virtual
+ * address.
+ */
+ prop_dictionary_set_uint64(dict, "virtual_address",
+ sc->pci_mem_area.base);
+#endif
+}
+
+pcireg_t
+p5pb_pci_conf_read(pci_chipset_tag_t pc, pcitag_t tag, int reg)
+{
+ uint32_t data;
+ uint32_t bus, dev, func;
+
+ pci_decompose_tag(pc, tag, &bus, &dev, &func);
+
+ data = bus_space_read_4(pc->pci_conf_iot, pc->pci_conf_ioh,
+ (func<<5) + reg);
+#ifdef P5PB_DEBUG
+ aprint_normal("p5pb conf read va: %lx, bus: %d, dev: %d, "
+ "func: %d, reg: %d -r-> data %x\n",
+ pc->pci_conf_ioh, bus, dev, func, reg, data);
+#endif
+ return data;
+}
+
+void
+p5pb_pci_conf_write(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t val)
+{
+ uint32_t bus, dev, func;
+
+ pci_decompose_tag(pc, tag, &bus, &dev, &func);
+
+ bus_space_write_4(pc->pci_conf_iot, pc->pci_conf_ioh,
+ (func << 5) + reg, val);
+#ifdef P5PB_DEBUG
+ aprint_normal("p5pb conf write va: %lx, bus: %d, dev: %d, "
+ "func: %d, reg: %d -w-> data %x\n",
+ pc->pci_conf_ioh, bus, dev, func, reg, val);
+#endif
+
+}
+
+int
+p5pb_pci_bus_maxdevs(pci_chipset_tag_t pc, int busno)
+{
+
+ /* Allow only one device. Obvious in case of CVPPC/BVPPC. */
+ return 1;
+}
+
+pcitag_t
+p5pb_pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function)
+{
+
+ return (bus << 16) | (device << 11) | (function << 8);
+}
+
+void
+p5pb_pci_decompose_tag(pci_chipset_tag_t pc, pcitag_t tag, int *bp,
+ int *dp, int *fp)
+{
+
+ if (bp != NULL)
+ *bp = (tag >> 16) & 0xff;
+ if (dp != NULL)
+ *dp = (tag >> 11) & 0x1f;
+ if (fp != NULL)
+ *fp = (tag >> 8) & 0x07;
+}
+
+void
+p5pb_pci_attach_hook(struct device *parent, struct device *self,
+ struct pcibus_attach_args *pba)
+{
+}
+
Index: src/sys/arch/amiga/pci/p5pbreg.h
diff -u /dev/null src/sys/arch/amiga/pci/p5pbreg.h:1.1
--- /dev/null Thu Aug 4 17:48:52 2011
+++ src/sys/arch/amiga/pci/p5pbreg.h Thu Aug 4 17:48:51 2011
@@ -0,0 +1,71 @@
+/* $NetBSD: p5pbreg.h,v 1.1 2011/08/04 17:48:51 rkujawa Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Radoslaw Kujawa.
+ *
+ * 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 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.
+ */
+
+/*
+ * Reverse engineered Phase5 PCI bridge memory map (firmware 44.71):
+ *
+ * 0xFFFA0000 - (unknown)
+ * 0xFFFC0000 - PCI configuration mechanism #1 data, 128KB
+ * 0xFFFE0000 - PCI configuration mechanism #1 address, 4KB
+ *
+ * 0xE0000000 - Permedia RAM on CVPPC/BVPPC (1st aperture), 8MB
+ * 0xE0800000 - Permedia RAM on CVPPC/BVPPC (2nd aperture), 8MB
+ * 0xE1000000 - Permedia registers, 128KB
+ *
+ * Note: this map may not look the same for every firmware revision.
+ *
+ * The bridge is probably capable of DMA and interrupts, but this would
+ * need further reverse engineering, and is not really needed to drive
+ * the Permedia 2 chip.
+ */
+#ifndef _AMIGA_P5PBREG_H_
+
+#define P5BUS_PCI_CONF_BASE 0xFFFA0000
+#define P5BUS_PCI_CONF_SIZE 0x00041000
+
+#define P5BUS_PCI_MEM_BASE 0xE0000000
+#define P5BUS_PCI_MEM_SIZE 0x01010000 /* actually 0x01020000 */
+
+#define OFF_PCI_CONF_DATA 0x00020000
+#define OFF_PCI_CONF_ADDR 0x00040000
+
+#define P5BUS_CONF_ENDIAN 0x0000 /* PCI_CONF_ADDR + offset */
+#define P5BUS_CONF_ENDIAN_BIG 0x02 /* to switch into BE mode */
+#define P5BUS_CONF_INTR 0x0010 /* ? XXX interrupt enable? */
+#define P5BUS_CONF_INTR_INT2 0x01 /* ? XXX INT2? */
+
+/* typical configuration of Permedia 2 on CVPPC/BVPPC */
+#define OFF_P2_APERTURE_1 0x0
+#define OFF_P2_APERTURE_2 0x00800000
+#define OFF_P2_REGS 0x01000000
+/* #define OFF_P2_REGS 0x0F000000 */ /* ? alt. Permedia regs */
+
+#endif /* _AMIGA_P5PBREG_H_ */