Module Name: src Committed By: rkujawa Date: Tue Jan 10 20:29:50 UTC 2012
Modified Files: src/sys/arch/amiga/amiga: amiga_init.c src/sys/arch/amiga/conf: DRACO GENERIC GENERIC.in INSTALL files.amiga src/sys/arch/amiga/dev: bppcsc.c cbiiisc.c src/sys/arch/amiga/pci: p5pb.c p5pbreg.h p5pbvar.h Added Files: src/sys/arch/amiga/dev: p5bus.c p5busvar.h src/sys/arch/amiga/pci: p5membar.c p5membarvar.h Log Message: Changes to Phase5 hardware support: - Rework p5pb driver - simplify, cleanup, make more flexible. - Add p5membar driver, which handles PCI resources autoconfigured by the firmware. - Introduce intermediate p5bus layer, between zbus and CSPPC/BPPC on-board devices (p5pb, cbiiisc, bppcsc). - Add experimental G-REX support to p5pb (first slot support only). - Split CV64/3D PCI bridge support into separate cv3dpb driver (to be committed later). Approved by phx. To generate a diff of this commit: cvs rdiff -u -r1.124 -r1.125 src/sys/arch/amiga/amiga/amiga_init.c cvs rdiff -u -r1.148 -r1.149 src/sys/arch/amiga/conf/DRACO cvs rdiff -u -r1.278 -r1.279 src/sys/arch/amiga/conf/GENERIC cvs rdiff -u -r1.90 -r1.91 src/sys/arch/amiga/conf/GENERIC.in cvs rdiff -u -r1.100 -r1.101 src/sys/arch/amiga/conf/INSTALL cvs rdiff -u -r1.150 -r1.151 src/sys/arch/amiga/conf/files.amiga cvs rdiff -u -r1.1 -r1.2 src/sys/arch/amiga/dev/bppcsc.c cvs rdiff -u -r1.19 -r1.20 src/sys/arch/amiga/dev/cbiiisc.c cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/dev/p5bus.c \ src/sys/arch/amiga/dev/p5busvar.h cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/pci/p5membar.c \ src/sys/arch/amiga/pci/p5membarvar.h cvs rdiff -u -r1.4 -r1.5 src/sys/arch/amiga/pci/p5pb.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/amiga/pci/p5pbreg.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/amiga/pci/p5pbvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amiga/amiga/amiga_init.c diff -u src/sys/arch/amiga/amiga/amiga_init.c:1.124 src/sys/arch/amiga/amiga/amiga_init.c:1.125 --- src/sys/arch/amiga/amiga/amiga_init.c:1.124 Sun Jul 10 21:02:37 2011 +++ src/sys/arch/amiga/amiga/amiga_init.c Tue Jan 10 20:29:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: amiga_init.c,v 1.124 2011/07/10 21:02:37 mhitch Exp $ */ +/* $NetBSD: amiga_init.c,v 1.125 2012/01/10 20:29:49 rkujawa Exp $ */ /* * Copyright (c) 1994 Michael L. Hitch @@ -38,7 +38,7 @@ #include "ser.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amiga_init.c,v 1.124 2011/07/10 21:02:37 mhitch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amiga_init.c,v 1.125 2012/01/10 20:29:49 rkujawa Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -331,6 +331,16 @@ start_c(id, fphystart, fphysize, cphysiz ncd = RELOC(ncfdev, int); ncd > 0; ncd--, cd++) { int bd_type = cd->rom.type & (ERT_TYPEMASK | ERTF_MEMLIST); + /* + * Hack to support p5bus and p5pb on CyberStorm Mk-III / PPC + * and Blizzard PPC. XXX: this hack should only be active if + * non-autoconfiguring CyberVision PPC or BlizzardVision PPC + * was found. + */ + if (cd->rom.manid == 8512 && + (cd->rom.prodid == 100 || cd->rom.prodid == 110)) + RELOC(ZBUSAVAIL, u_int) += m68k_round_page(0x1400000); + if (bd_type != ERT_ZORROIII && (bd_type != ERT_ZORROII || isztwopa(cd->addr))) continue; /* It's not Z2 or Z3 I/O board */ @@ -345,6 +355,7 @@ start_c(id, fphystart, fphysize, cphysiz (cd->rom.flags & ERT_Z3_SSMASK) == 0) cd->size = 0x10000 << ((cd->rom.type - 1) & ERT_MEMMASK); + RELOC(ZBUSAVAIL, u_int) += m68k_round_page(cd->size); } Index: src/sys/arch/amiga/conf/DRACO diff -u src/sys/arch/amiga/conf/DRACO:1.148 src/sys/arch/amiga/conf/DRACO:1.149 --- src/sys/arch/amiga/conf/DRACO:1.148 Mon Dec 26 13:09:03 2011 +++ src/sys/arch/amiga/conf/DRACO Tue Jan 10 20:29:49 2012 @@ -1,4 +1,4 @@ -# $NetBSD: DRACO,v 1.148 2011/12/26 13:09:03 mlelstv Exp $ +# $NetBSD: DRACO,v 1.149 2012/01/10 20:29:49 rkujawa Exp $ # # This file was automatically created. # Changes will be lost when make is run in this directory. @@ -29,7 +29,7 @@ include "arch/amiga/conf/std.amiga" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.148 $" +#ident "GENERIC-$Revision: 1.149 $" maxusers 8 Index: src/sys/arch/amiga/conf/GENERIC diff -u src/sys/arch/amiga/conf/GENERIC:1.278 src/sys/arch/amiga/conf/GENERIC:1.279 --- src/sys/arch/amiga/conf/GENERIC:1.278 Mon Dec 26 13:09:03 2011 +++ src/sys/arch/amiga/conf/GENERIC Tue Jan 10 20:29:49 2012 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.278 2011/12/26 13:09:03 mlelstv Exp $ +# $NetBSD: GENERIC,v 1.279 2012/01/10 20:29:49 rkujawa Exp $ # # This file was automatically created. # Changes will be lost when make is run in this directory. @@ -29,7 +29,7 @@ include "arch/amiga/conf/std.amiga" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.278 $" +#ident "GENERIC-$Revision: 1.279 $" maxusers 8 @@ -271,6 +271,8 @@ options KFONT_CONS_ISO8859_1 #options FONT_VT220L8x10 #options FONT_VT220ISO8x16 +p5bus0 at zbus0 # Phase5 CSPPC/BPPC internal bus + grfcc0 at mainbus0 # custom chips grfrt0 at zbus0 # retina II grfrh0 at zbus0 # retina III @@ -402,7 +404,7 @@ mgnsc0 at zbus0 # Magnum scsi scsibus* at mgnsc0 wesc0 at zbus0 # Warp Engine scsi scsibus* at wesc0 -bppcsc0 at zbus0 # BlizzardPPC 603e+ scsi +bppcsc0 at p5bus0 # BlizzardPPC 603e+ scsi scsibus* at bppcsc0 afsc0 at zbus0 # A4091 scsi scsibus* at afsc0 @@ -420,7 +422,7 @@ cbsc0 at zbus0 # CyberSCSI I scsibus* at cbsc0 cbiisc0 at zbus0 # CyberSCSI II scsibus* at cbiisc0 -cbiiisc0 at zbus0 # Cyberstorm mk.III/Cyberstorm PPC SCSI +cbiiisc0 at p5bus0 # Cyberstorm mk.III/Cyberstorm PPC SCSI scsibus* at cbiiisc0 empsc0 at zbus0 # Emplant scsi scsibus* at empsc0 @@ -468,14 +470,20 @@ uk* at scsibus? target ? lun ? # scsi un # PCI bus support options PCIVERBOSE # verbose PCI device autoconfig messages #options PCI_CONFIG_DUMP -options PCI_NETBSD_CONFIGURE +options PCI_NETBSD_CONFIGURE # used only by mppb(4) -p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC) +p5pb0 at p5bus0 # Phase5 PCI bridge (CVPPC/BVPPC/G-REX) +p5membar* at zbus0 # Phase5 PCI bridge autoconfiguring BARs +#options P5PB_OLD_FIRMWARE # enable support for p5pb with old fw +#options P5PB_GENFB # enable genfb support for CVPPC/BVPPC +#options P5PB_DEBUG # enable excessive debug for p5pb pci* at p5pb0 -mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge + +mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge pci* at mppb? -ne* at pci? # NE2000 Ethernet +#genfb* at pci? # generic fb, CVPPC/BVPPC only +ne* at pci? # NE2000 Ethernet # 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.90 src/sys/arch/amiga/conf/GENERIC.in:1.91 --- src/sys/arch/amiga/conf/GENERIC.in:1.90 Mon Dec 26 13:07:24 2011 +++ src/sys/arch/amiga/conf/GENERIC.in Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC.in,v 1.90 2011/12/26 13:07:24 mlelstv Exp $ +# $NetBSD: GENERIC.in,v 1.91 2012/01/10 20:29:50 rkujawa Exp $ # ## # GENERIC machine description file @@ -52,7 +52,7 @@ include "arch/amiga/conf/std.amiga" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.90 $" +#ident "GENERIC-$Revision: 1.91 $" m4_ifdef(`INSTALL_CONFIGURATION', `m4_dnl makeoptions COPTS="-Os" @@ -329,6 +329,8 @@ m4_ifdef(`AMIGA_CONFIGURATION', `m4_dnl ')m4_dnl m4_ifdef(`AMIGA_CONFIGURATION', `m4_dnl +p5bus0 at zbus0 # Phase5 CSPPC/BPPC internal bus + grfcc0 at mainbus0 # custom chips grfrt0 at zbus0 # retina II ')m4_dnl @@ -483,7 +485,7 @@ mgnsc0 at zbus0 # Magnum scsi scsibus* at mgnsc0 wesc0 at zbus0 # Warp Engine scsi scsibus* at wesc0 -bppcsc0 at zbus0 # BlizzardPPC 603e+ scsi +bppcsc0 at p5bus0 # BlizzardPPC 603e+ scsi scsibus* at bppcsc0 afsc0 at zbus0 # A4091 scsi scsibus* at afsc0 @@ -501,7 +503,7 @@ cbsc0 at zbus0 # CyberSCSI I scsibus* at cbsc0 cbiisc0 at zbus0 # CyberSCSI II scsibus* at cbiisc0 -cbiiisc0 at zbus0 # Cyberstorm mk.III/Cyberstorm PPC SCSI +cbiiisc0 at p5bus0 # Cyberstorm mk.III/Cyberstorm PPC SCSI scsibus* at cbiiisc0 empsc0 at zbus0 # Emplant scsi scsibus* at empsc0 @@ -555,14 +557,20 @@ m4_ifdef(`AMIGA_CONFIGURATION', `m4_dnl # PCI bus support options PCIVERBOSE # verbose PCI device autoconfig messages #options PCI_CONFIG_DUMP -options PCI_NETBSD_CONFIGURE +options PCI_NETBSD_CONFIGURE # used only by mppb(4) -p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC) +p5pb0 at p5bus0 # Phase5 PCI bridge (CVPPC/BVPPC/G-REX) +p5membar* at zbus0 # Phase5 PCI bridge autoconfiguring BARs +#options P5PB_OLD_FIRMWARE # enable support for p5pb with old fw +#options P5PB_GENFB # enable genfb support for CVPPC/BVPPC +#options P5PB_DEBUG # enable excessive debug for p5pb pci* at p5pb0 -mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge + +mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge pci* at mppb? -ne* at pci? # NE2000 Ethernet +#genfb* at pci? # generic fb, CVPPC/BVPPC only +ne* at pci? # NE2000 Ethernet # 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.100 src/sys/arch/amiga/conf/INSTALL:1.101 --- src/sys/arch/amiga/conf/INSTALL:1.100 Mon Dec 26 13:09:03 2011 +++ src/sys/arch/amiga/conf/INSTALL Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -# $NetBSD: INSTALL,v 1.100 2011/12/26 13:09:03 mlelstv Exp $ +# $NetBSD: INSTALL,v 1.101 2012/01/10 20:29:50 rkujawa Exp $ # # This file was automatically created. # Changes will be lost when make is run in this directory. @@ -29,7 +29,7 @@ include "arch/amiga/conf/std.amiga" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.100 $" +#ident "GENERIC-$Revision: 1.101 $" makeoptions COPTS="-Os" @@ -225,6 +225,8 @@ options KFONT_CONS_ISO8859_1 #options FONT_VT220L8x10 #options FONT_VT220ISO8x16 +p5bus0 at zbus0 # Phase5 CSPPC/BPPC internal bus + grfcc0 at mainbus0 # custom chips grfrt0 at zbus0 # retina II grfrh0 at zbus0 # retina III @@ -348,7 +350,7 @@ mgnsc0 at zbus0 # Magnum scsi scsibus* at mgnsc0 wesc0 at zbus0 # Warp Engine scsi scsibus* at wesc0 -bppcsc0 at zbus0 # BlizzardPPC 603e+ scsi +bppcsc0 at p5bus0 # BlizzardPPC 603e+ scsi scsibus* at bppcsc0 afsc0 at zbus0 # A4091 scsi scsibus* at afsc0 @@ -366,7 +368,7 @@ cbsc0 at zbus0 # CyberSCSI I scsibus* at cbsc0 cbiisc0 at zbus0 # CyberSCSI II scsibus* at cbiisc0 -cbiiisc0 at zbus0 # Cyberstorm mk.III/Cyberstorm PPC SCSI +cbiiisc0 at p5bus0 # Cyberstorm mk.III/Cyberstorm PPC SCSI scsibus* at cbiiisc0 empsc0 at zbus0 # Emplant scsi scsibus* at empsc0 @@ -412,14 +414,20 @@ ch* at scsibus? target ? lun ? # scsi au # PCI bus support options PCIVERBOSE # verbose PCI device autoconfig messages #options PCI_CONFIG_DUMP -options PCI_NETBSD_CONFIGURE +options PCI_NETBSD_CONFIGURE # used only by mppb(4) -p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC) +p5pb0 at p5bus0 # Phase5 PCI bridge (CVPPC/BVPPC/G-REX) +p5membar* at zbus0 # Phase5 PCI bridge autoconfiguring BARs +#options P5PB_OLD_FIRMWARE # enable support for p5pb with old fw +#options P5PB_GENFB # enable genfb support for CVPPC/BVPPC +#options P5PB_DEBUG # enable excessive debug for p5pb pci* at p5pb0 -mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge + +mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge pci* at mppb? -ne* at pci? # NE2000 Ethernet +#genfb* at pci? # generic fb, CVPPC/BVPPC only +ne* at pci? # NE2000 Ethernet # 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.150 src/sys/arch/amiga/conf/files.amiga:1.151 --- src/sys/arch/amiga/conf/files.amiga:1.150 Thu Dec 15 14:25:12 2011 +++ src/sys/arch/amiga/conf/files.amiga Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -# $NetBSD: files.amiga,v 1.150 2011/12/15 14:25:12 phx Exp $ +# $NetBSD: files.amiga,v 1.151 2012/01/10 20:29:50 rkujawa Exp $ # maxpartitions must be first item in files.${ARCH}.newconf maxpartitions 16 # NOTE THAT AMIGA IS SPECIAL! @@ -33,6 +33,10 @@ defflag P5PPC68KBOARD defflag LEV6_DEFER defflag DEVRELOAD +defflag opt_p5pb.h P5PB_GENFB +defflag opt_p5pb.h P5PB_OLD_FIRMWARE +defflag opt_p5pb.h P5PB_DEBUG + defparam IOBZCLOCK device mainbus {} @@ -355,11 +359,6 @@ device wesc: scsi, asiop attach wesc at zbus file arch/amiga/dev/wesc.c wesc needs-flag -# Phase5 Blizzard 603e+ SCSI -device bppcsc: scsi, asiop -attach bppcsc at zbus -file arch/amiga/dev/bppcsc.c bppcsc needs-flag - # C= A4091 & A4000T device afsc: scsi, asiop attach afsc at zbus @@ -371,11 +370,6 @@ file arch/amiga/dev/afsc.c afsc | aftsc define siopng file arch/amiga/dev/siop2.c siopng -# CyberStorm MKIII scsi -device cbiiisc: scsi, siopng -attach cbiiisc at zbus -file arch/amiga/dev/cbiiisc.c cbiiisc needs-flag - # Emulex ESP216 & FAS216 controllers # FastlaneZ3 @@ -498,13 +492,32 @@ include "compat/ossaudio/files.ossaudio" # Bluetooth stack include "dev/bluetooth/files.bluetooth" +# Phase5 BPPC/CSPPC internal bus +device p5bus {} +attach p5bus at zbus +file arch/amiga/dev/p5bus.c p5bus + +device p5membar {} +attach p5membar at zbus +file arch/amiga/pci/p5membar.c p5membar + +# CyberStorm MKIII scsi +device cbiiisc: scsi, siopng +attach cbiiisc at p5bus +file arch/amiga/dev/cbiiisc.c cbiiisc needs-flag + +# Phase5 Blizzard 603e+ SCSI +device bppcsc: scsi, asiop +attach bppcsc at p5bus +file arch/amiga/dev/bppcsc.c bppcsc needs-flag + # PCI bus file arch/amiga/pci/p5pb.c pci file arch/amiga/pci/mppb.c pci file arch/amiga/pci/pci_machdep.c pci device p5pb: pcibus -attach p5pb at zbus +attach p5pb at p5bus device mppb: pcibus attach mppb at zbus Index: src/sys/arch/amiga/dev/bppcsc.c diff -u src/sys/arch/amiga/dev/bppcsc.c:1.1 src/sys/arch/amiga/dev/bppcsc.c:1.2 --- src/sys/arch/amiga/dev/bppcsc.c:1.1 Fri Jan 14 10:01:12 2011 +++ src/sys/arch/amiga/dev/bppcsc.c Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: bppcsc.c,v 1.1 2011/01/14 10:01:12 phx Exp $ */ +/* $NetBSD: bppcsc.c,v 1.2 2012/01/10 20:29:50 rkujawa Exp $ */ /* * Copyright (c) 1982, 1990 The Regents of the University of California. @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bppcsc.c,v 1.1 2011/01/14 10:01:12 phx Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bppcsc.c,v 1.2 2012/01/10 20:29:50 rkujawa Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -79,6 +79,7 @@ __KERNEL_RCSID(0, "$NetBSD: bppcsc.c,v 1 #include <amiga/dev/siopreg.h> #include <amiga/dev/siopvar.h> #include <amiga/dev/zbusvar.h> +#include <amiga/dev/p5busvar.h> #define BPPC_SCSI_OFF 0xf40000 #define BPPC_PUPROM_OFF 0xf00010 @@ -99,15 +100,13 @@ CFATTACH_DECL(bppcsc, sizeof(struct siop int bppcscmatch(struct device *pdp, struct cfdata *cfp, void *auxp) { - struct zbus_args *zap; - char *p5type; + struct p5bus_attach_args *p5baa; + + p5baa = (struct p5bus_attach_args *) auxp; + + if (strcmp(p5baa->p5baa_name, "bppcsc") == 0) + return 1; - zap = auxp; - if (zap->manid == 8512 && zap->prodid == 110) { - p5type = (char *)__UNVOLATILE(ztwomap(BPPC_PUPROM_OFF)); - if (p5type[0] == 'I') /* only "+" model has SCSI */ - return 1; - } return 0 ; } Index: src/sys/arch/amiga/dev/cbiiisc.c diff -u src/sys/arch/amiga/dev/cbiiisc.c:1.19 src/sys/arch/amiga/dev/cbiiisc.c:1.20 --- src/sys/arch/amiga/dev/cbiiisc.c:1.19 Mon Dec 20 00:25:25 2010 +++ src/sys/arch/amiga/dev/cbiiisc.c Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: cbiiisc.c,v 1.19 2010/12/20 00:25:25 matt Exp $ */ +/* $NetBSD: cbiiisc.c,v 1.20 2012/01/10 20:29:50 rkujawa Exp $ */ /* * Copyright (c) 1982, 1990 The Regents of the University of California. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v 1.19 2010/12/20 00:25:25 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v 1.20 2012/01/10 20:29:50 rkujawa Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -79,6 +79,7 @@ __KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v #include <amiga/dev/siopreg.h> #include <amiga/dev/siopvar.h> #include <amiga/dev/zbusvar.h> +#include <amiga/dev/p5busvar.h> void cbiiiscattach(struct device *, struct device *, void *); int cbiiiscmatch(struct device *, struct cfdata *, void *); @@ -99,26 +100,25 @@ CFATTACH_DECL(cbiiisc, sizeof(struct sio int cbiiiscmatch(struct device *pdp, struct cfdata *cfp, void *auxp) { - struct zbus_args *zap; + struct p5bus_attach_args *p5baa; - zap = auxp; - if (zap->manid == 8512 && zap->prodid == 100) - return(1); - return(0); + p5baa = (struct p5bus_attach_args *) auxp; + + if (strcmp(p5baa->p5baa_name, "cbiiisc") == 0) + return 1; + + return 0; } void cbiiiscattach(struct device *pdp, struct device *dp, void *auxp) { struct siop_softc *sc = (struct siop_softc *)dp; - struct zbus_args *zap; siop_regmap_p rp; struct scsipi_adapter *adapt = &sc->sc_adapter; struct scsipi_channel *chan = &sc->sc_channel; - printf("\n"); - - zap = auxp; + aprint_normal(": CyberStorm PPC/Mk-III SCSI host adapter\n"); sc->sc_siopp = rp = ztwomap(0xf40000); /* siopng_dump_registers(sc); */ Index: src/sys/arch/amiga/pci/p5pb.c diff -u src/sys/arch/amiga/pci/p5pb.c:1.4 src/sys/arch/amiga/pci/p5pb.c:1.5 --- src/sys/arch/amiga/pci/p5pb.c:1.4 Fri Oct 7 23:08:33 2011 +++ src/sys/arch/amiga/pci/p5pb.c Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: p5pb.c,v 1.4 2011/10/07 23:08:33 rkujawa Exp $ */ +/* $NetBSD: p5pb.c,v 1.5 2012/01/10 20:29:50 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -37,6 +37,7 @@ #include <sys/device.h> #include <sys/malloc.h> #include <sys/extent.h> +#include <sys/kmem.h> #include <uvm/uvm_extern.h> @@ -45,52 +46,22 @@ #include <m68k/bus_dma.h> #include <amiga/dev/zbusvar.h> +#include <amiga/dev/p5busvar.h> #include <amiga/pci/p5pbreg.h> #include <amiga/pci/p5pbvar.h> +#include <amiga/pci/p5membarvar.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 */ -#define ZORRO_PRODID_CV643D_Z3 67 /* CV64/3D */ - /* Initial CVPPC/BVPPC resolution as configured by the firmware */ #define P5GFX_WIDTH 640 #define P5GFX_HEIGHT 480 #define P5GFX_DEPTH 8 #define P5GFX_LINEBYTES 640 -/* #define P5PB_MATCH_CV643D 1 */ -/* #define P5PB_DEBUG 1 */ - -static struct p5pb_bridge_type p5pb_bridge_cvppc = { - "Phase5 CVPPC/BVPPC PCI bridge", - false, - true, - 1, -}; - -static struct p5pb_bridge_type p5pb_bridge_cv643d = { - "Phase5 CyberVision 64/3D PCI bridge", - false, - false, - 1, -}; - -/* const struct p5pb_bridge_type p5pb_bridge_grex { - "DCE Computer G-REX PCI bridge", - true, - false, - 5 -} -*/ - 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); @@ -107,63 +78,25 @@ void p5pb_pci_decompose_tag(pci_chipset int *bp, int *dp, int *fp); int p5pb_pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ihp); -bool p5pb_bus_map_cv643d(struct p5pb_softc *sc); -static bool p5pb_bus_map_cvppc(struct p5pb_softc *sc); +bool p5pb_bus_map_cvppc(struct p5pb_softc *sc); +bool p5pb_bus_map_grex(struct p5pb_softc *sc); +bool p5pb_bus_map_common(struct p5pb_softc *sc); +uint8_t p5pb_find_resources(struct p5pb_softc *sc); 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; - -#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) && - (zap->prodid != ZORRO_PRODID_CSPPC)) { - if (!p5pb_present) { - p5pb_present = 1; - return 100; /* XXX: This will break SCSI! */ - } - } -#endif + struct p5bus_attach_args *p5baa; - if ((zap->prodid != ZORRO_PRODID_P5PB) -#ifdef P5PB_MATCH_CV643D - /* - * This should not be used now, because CV64/3D grf driver does - * attach directly to Zorro bus. Might get useful if we ever get - * virgefb.. - */ - && (zap->prodid != ZORRO_PRODID_CV643D_Z3) - -#endif - ) - return 0; - -#ifdef P5PB_DEBUG - aprint_normal("p5pb matched by Zorro ID %d, %d\n", zap->manid, - zap->prodid); -#endif + p5baa = (struct p5bus_attach_args *) aux; - if (p5pb_present) - return 0; /* Allow only one. */ + if (strcmp(p5baa->p5baa_name, "p5pb") == 0) + return 1; - - p5pb_present = 1; - return 10; + return 0; } @@ -172,35 +105,40 @@ p5pb_attach(device_t parent, device_t se { struct p5pb_softc *sc; struct pcibus_attach_args pba; - struct p5pb_bridge_type *bt; - struct zbus_args *zap; sc = device_private(self); pci_chipset_tag_t pc = &sc->apc; sc->sc_dev = self; - zap = aux; - - if(zap->prodid == ZORRO_PRODID_CV643D_Z3) { - bt = &p5pb_bridge_cv643d; - sc->p5pb_bus_map = &p5pb_bus_map_cv643d; - sc->ba = zap->va; + + if (p5pb_find_resources(sc) > 0) { + sc->p5pb_bus_map = &p5pb_bus_map_grex; } else { - bt = &p5pb_bridge_cvppc; - sc->p5pb_bus_map = p5pb_bus_map_cvppc; +#ifdef P5PB_OLD_FIRMWARE + sc->p5pb_bus_map = &p5pb_bus_map_cvppc; +#else + aprint_normal(": no PCI bridges detected\n"); + return; +#endif /* P5PB_OLD_FIRMWARE */ } - if(!(sc->p5pb_bus_map(sc))) { + aprint_normal(": Phase5 CVPPC/BVPPC/G-REX PCI bridge\n"); + + if(!p5pb_bus_map_common(sc)) { aprint_error_dev(self, - "couldn't map PCI configuration registers\n"); + "couldn't map PCI configuration and I/O spaces\n"); return; } - aprint_normal(": %s\n", bt->name); + if(!(sc->p5pb_bus_map(sc))) { + aprint_error_dev(self, + "couldn't map PCI memory space\n"); + return; + } #ifdef P5PB_DEBUG aprint_normal("p5pb: mapped %x -> %x, %x -> %x\n, %x -> %x\n", P5BUS_PCI_CONF_BASE, sc->pci_conf_area.base, - P5BUS_PCI_IO_BASE, sc->pci_conf_area.base, + P5BUS_PCI_IO_BASE, sc->pci_io_area.base, P5BUS_PCI_MEM_BASE, sc->pci_mem_area.base ); #endif @@ -227,11 +165,54 @@ p5pb_attach(device_t parent, device_t se pba.pba_bus = 0; pba.pba_bridgetag = NULL; +#ifdef P5PB_GENFB p5pb_set_props(sc); +#endif /* P5PB_GENFB */ config_found_ia(self, "pcibus", &pba, pcibusprint); } +/* + * Find autoconfigured resuorces (for boards running G-REX firmware). Return the + * total number of found resources. + */ +uint8_t +p5pb_find_resources(struct p5pb_softc *sc) +{ + uint8_t i, rv; + struct p5pb_autoconf_entry *auto_entry; + struct p5membar_softc *membar_sc; + device_t p5membar_dev; + + rv = 0; + + TAILQ_INIT(&sc->auto_bars); + + /* 255 should be enough for everybody */ + for(i = 0; i < 255; i++) { + + if ((p5membar_dev = + device_find_by_driver_unit("p5membar", i)) != NULL) { + + rv++; + + membar_sc = device_private(p5membar_dev); + if (membar_sc->sc_type == P5MEMBAR_TYPE_INTERNAL) + continue; + + auto_entry = + kmem_alloc(sizeof(struct p5pb_autoconf_entry), + KM_SLEEP); + + auto_entry->base = membar_sc->sc_base; + auto_entry->size = membar_sc->sc_size; + + TAILQ_INSERT_TAIL(&sc->auto_bars, auto_entry, entries); + } + } + return rv; +} + /* * Set properties needed to support fb driver. These are read later during * autoconfg in device_register(). @@ -298,7 +279,7 @@ p5pb_pci_conf_write(pci_chipset_tag_t pc int p5pb_pci_bus_maxdevs(pci_chipset_tag_t pc, int busno) { - /* G-Rex has max 5 slots. CVPPC/BVPPC has only 1. */ + /* G-REX has max 5 slots. CVPPC/BVPPC has only 1. */ return 1; } @@ -317,13 +298,48 @@ p5pb_pci_intr_map(const struct pci_attac return 0; } -static bool -p5pb_bus_map_cvppc(struct p5pb_softc *sc) +/* PCI memory mapping done G-REX-style. */ +bool +p5pb_bus_map_grex(struct p5pb_softc *sc) { + struct p5pb_autoconf_entry *membar_entry; + bus_addr_t bar_address; + bus_addr_t pci_mem_highest; + + pci_mem_highest = P5BUS_PCI_MEM_BASE; + #ifdef P5PB_DEBUG - aprint_normal("p5pb: p5pb_bus_map_cvppc called\n"); + aprint_normal("p5pb: p5pb_bus_map_grex called\n"); +#endif /* P5PB_DEBUG */ + + /* Determine the highest address used by any PCI card. */ + TAILQ_FOREACH(membar_entry, &sc->auto_bars, entries) { + + bar_address = (bus_addr_t) membar_entry->base; + if ((bar_address + membar_entry->size) > pci_mem_highest) + pci_mem_highest = bar_address + membar_entry->size; + +#ifdef P5PB_DEBUG + aprint_normal("p5pb: memory BAR at %p, highest address %x\n", + membar_entry->base, pci_mem_highest); +#endif /* P5PB_DEBUG */ + } + + sc->pci_mem_area.base = (bus_addr_t) zbusmap( + (void *) P5BUS_PCI_MEM_BASE, pci_mem_highest - P5BUS_PCI_MEM_BASE); + sc->pci_mem_area.absm = &amiga_bus_stride_1swap_abs; + + return true; +} + +/* Map things common for all supported bridges. */ +bool +p5pb_bus_map_common(struct p5pb_softc *sc) +{ +#ifdef P5PB_DEBUG + aprint_normal("p5pb: p5pb_bus_map_common called\n"); #endif /* P5PB_DEBUG */ - /* 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; @@ -332,47 +348,32 @@ p5pb_bus_map_cvppc(struct p5pb_softc *sc (void *) P5BUS_PCI_IO_BASE, P5BUS_PCI_IO_SIZE); sc->pci_io_area.absm = &amiga_bus_stride_1swap_abs; - 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; - sc->apc.pci_conf_datat = &(sc->pci_conf_area); sc->apc.pci_conf_addresst = &(sc->pci_conf_area); - if (bus_space_map(sc->apc.pci_conf_addresst, OFF_PCI_CONF_ADDR, - 256, 0, &sc->apc.pci_conf_addressh)) - return false; - if (bus_space_map(sc->apc.pci_conf_datat, OFF_PCI_CONF_DATA, 256, 0, &sc->apc.pci_conf_datah)) return false; + /* XXX */ + /* if (bus_space_map(sc->apc.pci_conf_addresst, OFF_PCI_CONF_ADDR, + 256, 0, &sc->apc.pci_conf_addressh)) + return false; */ + return true; } +/* Hard-coded memory mapping for CVPPC/BVPPC (without G-REX firmware). */ bool -p5pb_bus_map_cv643d(struct p5pb_softc *sc) { +p5pb_bus_map_cvppc(struct p5pb_softc *sc) +{ #ifdef P5PB_DEBUG - aprint_normal("p5pb: p5pb_bus_map_cv643d called, ba = %x\n", - (bus_addr_t) sc->ba); + aprint_normal("p5pb: p5pb_bus_map_cvppc called\n"); #endif /* P5PB_DEBUG */ + 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; - sc->pci_conf_area.base = (bus_addr_t) sc->ba + CV643D_PCI_CONF_BASE; - sc->pci_conf_area.absm = &amiga_bus_stride_1; - - sc->pci_mem_area.base = (bus_addr_t) sc->ba + CV643D_PCI_MEM_BASE; - sc->pci_mem_area.absm = &amiga_bus_stride_1; - - sc->pci_io_area.base = (bus_addr_t) sc->ba + CV643D_PCI_IO_BASE; - sc->pci_io_area.absm = &amiga_bus_stride_1; - - sc->apc.pci_conf_datat = &(sc->pci_conf_area); - - if (bus_space_map(sc->apc.pci_conf_datat, 0, - CV643D_PCI_CONF_SIZE, 0, &sc->apc.pci_conf_datah)) - return false; - - return true; } Index: src/sys/arch/amiga/pci/p5pbreg.h diff -u src/sys/arch/amiga/pci/p5pbreg.h:1.3 src/sys/arch/amiga/pci/p5pbreg.h:1.4 --- src/sys/arch/amiga/pci/p5pbreg.h:1.3 Fri Oct 7 08:44:21 2011 +++ src/sys/arch/amiga/pci/p5pbreg.h Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: p5pbreg.h,v 1.3 2011/10/07 08:44:21 rkujawa Exp $ */ +/* $NetBSD: p5pbreg.h,v 1.4 2012/01/10 20:29:50 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -58,10 +58,13 @@ #define P5BUS_PCI_IO_BASE 0xFFFA0000 #define P5BUS_PCI_IO_SIZE 0x0000FFFF +#define P5BUS_PCI_BRIDGE_BASE 0xFFFE0000 +#define P5BUS_PCI_BRIDGE_SIZE 0x0000FFFF /* 4kB on some fw revs */ + #define OFF_PCI_CONF_DATA 0x00000000 #define OFF_PCI_CONF_ADDR 0x00020000 -#define P5BUS_CONF_ENDIAN 0x0000 /* PCI_CONF_ADDR + offset */ +#define P5BUS_CONF_ENDIAN 0x0000 /* PCI_BRIDGE_BASE + 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? */ Index: src/sys/arch/amiga/pci/p5pbvar.h diff -u src/sys/arch/amiga/pci/p5pbvar.h:1.1 src/sys/arch/amiga/pci/p5pbvar.h:1.2 --- src/sys/arch/amiga/pci/p5pbvar.h:1.1 Fri Oct 7 08:44:21 2011 +++ src/sys/arch/amiga/pci/p5pbvar.h Tue Jan 10 20:29:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: p5pbvar.h,v 1.1 2011/10/07 08:44:21 rkujawa Exp $ */ +/* $NetBSD: p5pbvar.h,v 1.2 2012/01/10 20:29:50 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -36,23 +36,26 @@ #include <dev/pci/pciconf.h> #include <machine/pci_machdep.h> -struct p5pb_bridge_type { - const char *name; /* descriptive name */ - bool configure_bus; /* should we configure the bus? */ - bool set_genfb_props;/* should we set props for genfb(4)? */ - int maxdevs; /* max number of devices on the bus */ +struct p5pb_autoconf_entry { + volatile char *base; + uint32_t size; + TAILQ_ENTRY(p5pb_autoconf_entry) entries; }; struct p5pb_softc { - device_t sc_dev; - volatile char *ba; - struct bus_space_tag pci_conf_area; - struct bus_space_tag pci_mem_area; - struct bus_space_tag pci_io_area; - struct amiga_pci_chipset apc; - struct p5pb_bridge_type bridge_type; - bool (*p5pb_bus_map)(struct p5pb_softc *); -}; + device_t sc_dev; + + volatile char *ba; + struct bus_space_tag pci_conf_area; + struct bus_space_tag pci_mem_area; + struct bus_space_tag pci_io_area; + struct amiga_pci_chipset apc; + + /* list of preconfigured BARs */ + TAILQ_HEAD(, p5pb_autoconf_entry) auto_bars; + bool(*p5pb_bus_map)(struct p5pb_softc *); + +}; #endif /* _AMIGA_P5PBVAR_H_ */ Added files: Index: src/sys/arch/amiga/dev/p5bus.c diff -u /dev/null src/sys/arch/amiga/dev/p5bus.c:1.1 --- /dev/null Tue Jan 10 20:29:50 2012 +++ src/sys/arch/amiga/dev/p5bus.c Tue Jan 10 20:29:50 2012 @@ -0,0 +1,209 @@ +/* $NetBSD: p5bus.c,v 1.1 2012/01/10 20:29:50 rkujawa Exp $ */ + +/*- + * Copyright (c) 2011, 2012 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. + */ + +/* Driver for internal BlizzardPPC, CyberStorm Mk-III/PPC bus. */ + +#include <sys/cdefs.h> + +#include <sys/systm.h> +#include <sys/types.h> +#include <sys/device.h> +#include <sys/kmem.h> + +#include <amiga/dev/zbusvar.h> +#include <amiga/dev/p5busvar.h> + +#define ZORRO_MANID_P5 8512 +#define ZORRO_PRODID_CSPPC 100 +#define ZORRO_PRODID_BPPC 110 + +#define P5_ROM_OFF 0xF00010 +#define P5_SN_LEN 7 + +static int p5bus_match(struct device *pdp, struct cfdata *cfp, void *auxp); +static void p5bus_attach(device_t parent, device_t self, void *aux); +static char* p5bus_cardsn(void); +static int p5bus_print(void *aux, const char *str); +static void p5bus_callback(device_t self); + +struct p5bus_softc { + device_t sc_dev; + uint8_t sc_cardtype; + uint8_t sc_has_scsi; +#define P5BUS_SCSI_NONE 0 +#define P5BUS_SCSI_710 1 /* NCR 53C710 */ +#define P5BUS_SCSI_770 2 /* NCR 53C770 */ + uint8_t sc_has_ppc; +#define P5BUS_PPC_NONE 0 /* CS Mk-III only */ +#define P5BUS_PPC_OK 1 /* has working PPC CPU */ + uint8_t sc_has_pci; +#define P5BUS_PCI_NONE 0 +#define P5BUS_PCI_CVPPC 1 /* CyberVisionPPC / BlizzardVisionPPC */ +#define P5BUS_PCI_GREX 2 /* G-REX (not yet) */ +}; + +CFATTACH_DECL_NEW(p5bus, sizeof(struct p5bus_softc), + p5bus_match, p5bus_attach, NULL, NULL); + +static int +p5bus_match(struct device *pdp, struct cfdata *cfp, void *auxp) +{ + struct zbus_args *zap; + + zap = auxp; + + if (zap->manid != ZORRO_MANID_P5) + return 0; + + + if ((zap->prodid != ZORRO_PRODID_BPPC) && + (zap->prodid != ZORRO_PRODID_CSPPC)) + return 0; + + return 1; +} + +static void +p5bus_attach(device_t parent, device_t self, void *aux) +{ + struct p5bus_softc *sc; + struct zbus_args *zap; + struct p5bus_attach_args p5baa; + char *sn; + + zap = aux; + sc = device_private(self); + sc->sc_dev = self; + + sn = p5bus_cardsn(); + + aprint_normal(": Phase5 PowerUP on-board bus\n"); + + /* "Detect" what devices are present and attach the right drivers. */ + + if (zap->prodid == ZORRO_PRODID_CSPPC) { + + if (sn[0] == 'F') { + aprint_normal_dev(sc->sc_dev, + "CyberStorm Mk-III (sn %s)\n", sn); + sc->sc_has_ppc = P5BUS_PPC_NONE; + } else { + aprint_normal_dev(sc->sc_dev, + "CyberStorm PPC 604e (sn %s)\n", sn); + sc->sc_has_ppc = P5BUS_PPC_OK; + } + + sc->sc_cardtype = P5_CARDTYPE_CS; + sc->sc_has_scsi = P5BUS_SCSI_770; + + } else if (zap->prodid == ZORRO_PRODID_BPPC) { + + if (sn[0] == 'I') { /* only "+" model has SCSI */ + aprint_normal_dev(sc->sc_dev, + "BlizzardPPC 603e (sn %s)\n", sn); + sc->sc_has_scsi = P5BUS_SCSI_NONE; + } else { + aprint_normal_dev(sc->sc_dev, + "BlizzardPPC 603e+ (sn %s)\n", sn); + sc->sc_has_scsi = P5BUS_SCSI_710; + } + + sc->sc_cardtype = P5_CARDTYPE_BPPC; + sc->sc_has_ppc = P5BUS_PPC_OK; + + } + + sc->sc_has_pci = P5BUS_PCI_CVPPC; /* XXX: insert probe here? */ + + p5baa.p5baa_cardtype = sc->sc_cardtype; + + /* Attach the SCSI host adapters. */ + switch (sc->sc_has_scsi) { + case P5BUS_SCSI_710: + strcpy(p5baa.p5baa_name, "bppcsc"); + config_found_ia(sc->sc_dev, "p5bus", &p5baa, p5bus_print); + break; + case P5BUS_SCSI_770: + strcpy(p5baa.p5baa_name, "cbiiisc"); + config_found_ia(sc->sc_dev, "p5bus", &p5baa, p5bus_print); + break; + default: + break; + } + + /* + * We need to wait for possible p5membar attachments. Defer the rest + * until parent (zbus) is completely configured. + */ + config_defer(self, p5bus_callback); + +} + +/* Continue the attachment. */ +static void +p5bus_callback(device_t self) { + + struct p5bus_attach_args p5baa; + struct p5bus_softc *sc; + + sc = device_private(self); + p5baa.p5baa_cardtype = sc->sc_cardtype; + + if (sc->sc_has_pci) { + strcpy(p5baa.p5baa_name, "p5pb"); + config_found_ia(sc->sc_dev, "p5bus", &p5baa, p5bus_print); + } +} + +/* Get serial number of the card. */ +static char * +p5bus_cardsn() +{ + char *snr, *sn; + + sn = kmem_zalloc(P5_SN_LEN + 1, KM_SLEEP); + snr = (char *)__UNVOLATILE(ztwomap(P5_ROM_OFF)); + + memcpy(sn, snr, P5_SN_LEN); + return sn; +} + +static int +p5bus_print(void *aux, const char *str) +{ + if (str == NULL) + return 0; + + printf("%s ", str); + + return 0; +} + Index: src/sys/arch/amiga/dev/p5busvar.h diff -u /dev/null src/sys/arch/amiga/dev/p5busvar.h:1.1 --- /dev/null Tue Jan 10 20:29:50 2012 +++ src/sys/arch/amiga/dev/p5busvar.h Tue Jan 10 20:29:50 2012 @@ -0,0 +1,41 @@ +/* $NetBSD: p5busvar.h,v 1.1 2012/01/10 20:29: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. + */ + +#include <sys/types.h> + +#define P5_CARDTYPE_CS 1 /* CyberStorm PPC/Mk-III */ +#define P5_CARDTYPE_BPPC 2 /* BlizzardPPC */ + +struct p5bus_attach_args { + char p5baa_name[32]; + uint8_t p5baa_cardtype; +}; + Index: src/sys/arch/amiga/pci/p5membar.c diff -u /dev/null src/sys/arch/amiga/pci/p5membar.c:1.1 --- /dev/null Tue Jan 10 20:29:50 2012 +++ src/sys/arch/amiga/pci/p5membar.c Tue Jan 10 20:29:50 2012 @@ -0,0 +1,120 @@ +/* $NetBSD: p5membar.c,v 1.1 2012/01/10 20:29:50 rkujawa Exp $ */ + +/*- + * Copyright (c) 2012 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. + */ + +/* + * Handle autoconfigured PCI resources on some revisions of CyberVision PPC, + * BlizzardVision PPC graphics cards and all G-REX PCI busboards. + */ + +#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 <amiga/pci/p5pbvar.h> +#include <amiga/pci/p5membarvar.h> + +/* Zorro IDs */ +#define ZORRO_MANID_P5 8512 +#define ZORRO_PRODID_P5PB 101 /* CVPPC/BVPPC/G-REX */ + +static int p5membar_match(struct device *, struct cfdata *, void *); +static void p5membar_attach(struct device *, struct device *, void *); + +CFATTACH_DECL_NEW(p5membar, sizeof(struct p5membar_softc), + p5membar_match, p5membar_attach, NULL, NULL); + +static int +p5membar_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; + + return 1; +} + +static void +p5membar_attach(device_t parent, device_t self, void *aux) +{ + struct zbus_args *zap; + struct p5membar_softc *sc; + + sc = device_private(self); + zap = aux; + + sc->sc_dev = self; + sc->sc_base = zap->pa; + sc->sc_size = zap->size; + + if ((bus_addr_t) zap->pa == P5BUS_PCI_CONF_BASE) { + aprint_normal(": PCI config area, %d kB\n", + zap->size / 1024); + sc->sc_type = P5MEMBAR_TYPE_INTERNAL; + } else if ((bus_addr_t) zap->pa == P5BUS_PCI_IO_BASE) { + aprint_normal(": PCI I/O area, %d kB\n", + zap->size / 1024); + sc->sc_type = P5MEMBAR_TYPE_INTERNAL; + } else if ((bus_addr_t) zap->pa == P5BUS_PCI_BRIDGE_BASE) { + aprint_normal(": PCI bridge, %d kB\n", + zap->size / 1024); + sc->sc_type = P5MEMBAR_TYPE_INTERNAL; + } else { + aprint_normal(": PCI memory BAR, %d kB\n", + zap->size / 1024); + sc->sc_type = P5MEMBAR_TYPE_MEMORY; + } + + /* + * Do nothing here, p5pb should find the p5membar devices + * and do the right(tm) thing. + */ + +} + Index: src/sys/arch/amiga/pci/p5membarvar.h diff -u /dev/null src/sys/arch/amiga/pci/p5membarvar.h:1.1 --- /dev/null Tue Jan 10 20:29:50 2012 +++ src/sys/arch/amiga/pci/p5membarvar.h Tue Jan 10 20:29:50 2012 @@ -0,0 +1,45 @@ +/* $NetBSD: p5membarvar.h,v 1.1 2012/01/10 20:29:50 rkujawa Exp $ */ + +/*- + * Copyright (c) 2012 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/device.h> + +struct p5membar_softc { + device_t sc_dev; + + uint8_t sc_type; +#define P5MEMBAR_TYPE_INTERNAL 1 /* internal stuff, don't touch */ +#define P5MEMBAR_TYPE_MEMORY 2 /* PCI memory BAR */ + + volatile char *sc_base; /* base PA */ + uint32_t sc_size; +}; +