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 radoslaw.kuj...@gmail.com . +.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_ */