Module Name: src Committed By: rkujawa Date: Mon Sep 19 19:15:29 UTC 2011
Modified Files: src/sys/arch/amiga/conf: DRACO GENERIC GENERIC.in INSTALL files.amiga src/sys/arch/amiga/include: pci_machdep.h src/sys/arch/amiga/pci: mppb.c p5pb.c p5pbreg.h Added Files: src/sys/arch/amiga/pci: pci_machdep.c Log Message: Minor changes to Amiga PCI MD code: - Add bus enumeration and resource assignment (PCI_NETBSD_CONFIGURE) to mppb(4) - no more need to run AmigaOS to configure the bus. - Add PCI configuration address register to p5pb(4). - Add PCI I/O space support to p5pb(4). - Move common code from p5pb(4) and mppb(4) to new pci_machdep.c file. - Fix style. To generate a diff of this commit: cvs rdiff -u -r1.141 -r1.142 src/sys/arch/amiga/conf/DRACO cvs rdiff -u -r1.271 -r1.272 src/sys/arch/amiga/conf/GENERIC cvs rdiff -u -r1.83 -r1.84 src/sys/arch/amiga/conf/GENERIC.in cvs rdiff -u -r1.93 -r1.94 src/sys/arch/amiga/conf/INSTALL cvs rdiff -u -r1.147 -r1.148 src/sys/arch/amiga/conf/files.amiga cvs rdiff -u -r1.2 -r1.3 src/sys/arch/amiga/include/pci_machdep.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/amiga/pci/mppb.c \ src/sys/arch/amiga/pci/p5pb.c src/sys/arch/amiga/pci/p5pbreg.h cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/pci/pci_machdep.c 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/conf/DRACO diff -u src/sys/arch/amiga/conf/DRACO:1.141 src/sys/arch/amiga/conf/DRACO:1.142 --- src/sys/arch/amiga/conf/DRACO:1.141 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/conf/DRACO Mon Sep 19 19:15:28 2011 @@ -1,9 +1,9 @@ -# $NetBSD: DRACO,v 1.141 2011/09/17 16:55:34 rkujawa Exp $ +# $NetBSD: DRACO,v 1.142 2011/09/19 19:15:28 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.82 2011/08/04 17:48:51 rkujawa Exp $ +# Created from: # NetBSD: GENERIC.in,v 1.83 2011/09/17 16:55:34 rkujawa Exp $ # ## # GENERIC machine description file @@ -29,7 +29,7 @@ options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.141 $" +#ident "GENERIC-$Revision: 1.142 $" maxusers 8 Index: src/sys/arch/amiga/conf/GENERIC diff -u src/sys/arch/amiga/conf/GENERIC:1.271 src/sys/arch/amiga/conf/GENERIC:1.272 --- src/sys/arch/amiga/conf/GENERIC:1.271 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/conf/GENERIC Mon Sep 19 19:15:28 2011 @@ -1,9 +1,9 @@ -# $NetBSD: GENERIC,v 1.271 2011/09/17 16:55:34 rkujawa Exp $ +# $NetBSD: GENERIC,v 1.272 2011/09/19 19:15:28 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.82 2011/08/04 17:48:51 rkujawa Exp $ +# Created from: # NetBSD: GENERIC.in,v 1.83 2011/09/17 16:55:34 rkujawa Exp $ # ## # GENERIC machine description file @@ -29,7 +29,7 @@ options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.271 $" +#ident "GENERIC-$Revision: 1.272 $" maxusers 8 @@ -466,6 +466,8 @@ # PCI bus support options PCIVERBOSE # verbose PCI device autoconfig messages #options PCI_CONFIG_DUMP +options PCI_NETBSD_CONFIGURE + p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC) pci* at p5pb0 mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge Index: src/sys/arch/amiga/conf/GENERIC.in diff -u src/sys/arch/amiga/conf/GENERIC.in:1.83 src/sys/arch/amiga/conf/GENERIC.in:1.84 --- src/sys/arch/amiga/conf/GENERIC.in:1.83 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/conf/GENERIC.in Mon Sep 19 19:15:29 2011 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC.in,v 1.83 2011/09/17 16:55:34 rkujawa Exp $ +# $NetBSD: GENERIC.in,v 1.84 2011/09/19 19:15:29 rkujawa Exp $ # ## # GENERIC machine description file @@ -57,7 +57,7 @@ options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.83 $" +#ident "GENERIC-$Revision: 1.84 $" m4_ifdef(`INSTALL_CONFIGURATION', `m4_dnl makeoptions COPTS="-Os" @@ -573,6 +573,8 @@ # PCI bus support options PCIVERBOSE # verbose PCI device autoconfig messages #options PCI_CONFIG_DUMP +options PCI_NETBSD_CONFIGURE + p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC) pci* at p5pb0 mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge Index: src/sys/arch/amiga/conf/INSTALL diff -u src/sys/arch/amiga/conf/INSTALL:1.93 src/sys/arch/amiga/conf/INSTALL:1.94 --- src/sys/arch/amiga/conf/INSTALL:1.93 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/conf/INSTALL Mon Sep 19 19:15:29 2011 @@ -1,9 +1,9 @@ -# $NetBSD: INSTALL,v 1.93 2011/09/17 16:55:34 rkujawa Exp $ +# $NetBSD: INSTALL,v 1.94 2011/09/19 19:15:29 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.82 2011/08/04 17:48:51 rkujawa Exp $ +# Created from: # NetBSD: GENERIC.in,v 1.83 2011/09/17 16:55:34 rkujawa Exp $ # ## # GENERIC machine description file @@ -29,7 +29,7 @@ options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.93 $" +#ident "GENERIC-$Revision: 1.94 $" makeoptions COPTS="-Os" @@ -410,6 +410,8 @@ # PCI bus support options PCIVERBOSE # verbose PCI device autoconfig messages #options PCI_CONFIG_DUMP +options PCI_NETBSD_CONFIGURE + p5pb0 at zbus0 # Phase5 PCI bridge (CVPPC/BVPPC) pci* at p5pb0 mppb* at zbus0 # Matay Prometheus Zorro-PCI bridge Index: src/sys/arch/amiga/conf/files.amiga diff -u src/sys/arch/amiga/conf/files.amiga:1.147 src/sys/arch/amiga/conf/files.amiga:1.148 --- src/sys/arch/amiga/conf/files.amiga:1.147 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/conf/files.amiga Mon Sep 19 19:15:29 2011 @@ -1,4 +1,4 @@ -# $NetBSD: files.amiga,v 1.147 2011/09/17 16:55:34 rkujawa Exp $ +# $NetBSD: files.amiga,v 1.148 2011/09/19 19:15:29 rkujawa Exp $ # maxpartitions must be first item in files.${ARCH}.newconf maxpartitions 16 # NOTE THAT AMIGA IS SPECIAL! @@ -496,6 +496,7 @@ # 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 Index: src/sys/arch/amiga/include/pci_machdep.h diff -u src/sys/arch/amiga/include/pci_machdep.h:1.2 src/sys/arch/amiga/include/pci_machdep.h:1.3 --- src/sys/arch/amiga/include/pci_machdep.h:1.2 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/include/pci_machdep.h Mon Sep 19 19:15:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.h,v 1.2 2011/09/17 16:55:34 rkujawa Exp $ */ +/* $NetBSD: pci_machdep.h,v 1.3 2011/09/19 19:15:29 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -79,8 +79,13 @@ void (*pc_conf_interrupt)(pci_chipset_tag_t, int, int, int, int, int *); - bus_space_tag_t pci_conf_iot; - bus_space_handle_t pci_conf_ioh; + /* PCI configuration address register */ + bus_space_tag_t pci_conf_addresst; + bus_space_handle_t pci_conf_addressh; + + /* PCI configuration data register */ + bus_space_tag_t pci_conf_datat; + bus_space_handle_t pci_conf_datah; }; @@ -109,5 +114,24 @@ (*(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)) +#define pci_conf_interrupt(c, b, d, f, s, i) \ + (*(c)->pc_conf_interrupt)((c), (b), (d), (f), (s), (i)) +#define pci_conf_hook(c, b, d, f, i) \ + (*(c)->pc_conf_hook)((c), (b), (d), (f), (i)) #endif + +pcitag_t amiga_pci_make_tag(pci_chipset_tag_t pc, int bus, int device, + int function); +void amiga_pci_decompose_tag(pci_chipset_tag_t pc, pcitag_t tag, + int *bp, int *dp, int *fp); +void * amiga_pci_intr_establish(pci_chipset_tag_t pc, pci_intr_handle_t + ih, int level, int (*ih_fun)(void *), void *ih_arg); +void amiga_pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie); +const char * amiga_pci_intr_string(pci_chipset_tag_t pc, + pci_intr_handle_t ih); +int amiga_pci_conf_hook(pci_chipset_tag_t pct, int bus, int dev, + int func, pcireg_t id); +void amiga_pci_conf_interrupt(pci_chipset_tag_t pc, int bus, + int dev, int func, int swiz, int *iline); + Index: src/sys/arch/amiga/pci/mppb.c diff -u src/sys/arch/amiga/pci/mppb.c:1.1 src/sys/arch/amiga/pci/mppb.c:1.2 --- src/sys/arch/amiga/pci/mppb.c:1.1 Sat Sep 17 16:55:34 2011 +++ src/sys/arch/amiga/pci/mppb.c Mon Sep 19 19:15:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mppb.c,v 1.1 2011/09/17 16:55:34 rkujawa Exp $ */ +/* $NetBSD: mppb.c,v 1.2 2011/09/19 19:15:29 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -73,22 +73,14 @@ pcireg_t mppb_pci_conf_read(pci_chipset_tag_t, pcitag_t, int); void mppb_pci_conf_write(pci_chipset_tag_t, pcitag_t, int, pcireg_t); int mppb_pci_bus_maxdevs(pci_chipset_tag_t pc, int busno); -int mppb_pci_conf_hook(pci_chipset_tag_t pct, int bus, int dev, - int func, pcireg_t id); void mppb_pci_attach_hook (struct device *parent, struct device *self, struct pcibus_attach_args *pba); pcitag_t mppb_pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function); void mppb_pci_decompose_tag(pci_chipset_tag_t pc, pcitag_t tag, int *bp, int *dp, int *fp); - -void * mppb_pci_intr_establish(pci_chipset_tag_t pc, pci_intr_handle_t - ih, int level, int (*ih_fun)(void *), void *ih_arg); -void mppb_pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie); int mppb_pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ihp); -const char * mppb_pci_intr_string(pci_chipset_tag_t pc, - pci_intr_handle_t ih); const struct evcnt * mppb_pci_intr_evcnt(pci_chipset_tag_t pc, pci_intr_handle_t ih); @@ -124,6 +116,7 @@ struct pcibus_attach_args pba; struct zbus_args *zap; pci_chipset_tag_t pc; + struct extent *ioext, *memext; zap = aux; sc = device_private(self); @@ -150,28 +143,40 @@ (zap->pa) + MPPB_IO_BASE, sc->pci_io_area.base); #endif - sc->apc.pci_conf_iot = &(sc->pci_conf_area); + sc->apc.pci_conf_datat = &(sc->pci_conf_area); - if (bus_space_map(sc->apc.pci_conf_iot, 0, MPPB_CONF_SIZE, 0, - &sc->apc.pci_conf_ioh)) + if (bus_space_map(sc->apc.pci_conf_datat, 0, MPPB_CONF_SIZE, 0, + &sc->apc.pci_conf_datah)) 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 = mppb_pci_bus_maxdevs; - sc->apc.pc_make_tag = mppb_pci_make_tag; - sc->apc.pc_decompose_tag = mppb_pci_decompose_tag; + sc->apc.pc_make_tag = amiga_pci_make_tag; + sc->apc.pc_decompose_tag = amiga_pci_decompose_tag; sc->apc.pc_conf_read = mppb_pci_conf_read; sc->apc.pc_conf_write = mppb_pci_conf_write; sc->apc.pc_attach_hook = mppb_pci_attach_hook; sc->apc.pc_intr_map = mppb_pci_intr_map; - sc->apc.pc_intr_string = mppb_pci_intr_string; - sc->apc.pc_intr_establish = mppb_pci_intr_establish; - sc->apc.pc_intr_disestablish = mppb_pci_intr_disestablish; - /* XXX: pc_conf_interrupt */ - + sc->apc.pc_intr_string = amiga_pci_intr_string; + sc->apc.pc_intr_establish = amiga_pci_intr_establish; + sc->apc.pc_intr_disestablish = amiga_pci_intr_disestablish; + + sc->apc.pc_conf_hook = amiga_pci_conf_hook; + sc->apc.pc_conf_interrupt = amiga_pci_conf_interrupt; + + ioext = extent_create("mppbio", MPPB_IO_BASE, + MPPB_IO_BASE + MPPB_IO_SIZE, M_DEVBUF, NULL, 0, EX_NOWAIT); + memext = extent_create("mppbmem", MPPB_MEM_BASE, + MPPB_MEM_BASE + MPPB_MEM_SIZE, M_DEVBUF, NULL, 0, EX_NOWAIT); + + pci_configure_bus(pc, ioext, memext, NULL, 0, CACHELINE_SIZE); + + extent_destroy(ioext); + extent_destroy(memext); + pba.pba_iot = &(sc->pci_io_area); pba.pba_memt = &(sc->pci_mem_area); pba.pba_dmat = NULL; @@ -192,12 +197,12 @@ pci_decompose_tag(pc, tag, &bus, &dev, &func); - data = bus_space_read_4(pc->pci_conf_iot, pc->pci_conf_ioh, + data = bus_space_read_4(pc->pci_conf_datat, pc->pci_conf_datah, (MPPB_CONF_STRIDE*dev) + reg); #ifdef MPPB_DEBUG aprint_normal("mppb 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); + pc->pci_conf_datah, bus, dev, func, reg, data); #endif return data; } @@ -209,12 +214,12 @@ pci_decompose_tag(pc, tag, &bus, &dev, &func); - bus_space_write_4(pc->pci_conf_iot, pc->pci_conf_ioh, + bus_space_write_4(pc->pci_conf_datat, pc->pci_conf_datah, (MPPB_CONF_STRIDE*dev) + reg, val); #ifdef MPPB_DEBUG aprint_normal("mppb 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); + pc->pci_conf_datah, bus, dev, func, reg, val); #endif } @@ -225,53 +230,12 @@ return 4; /* Prometheus has 4 slots */ } -pcitag_t -mppb_pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function) -{ - return (bus << 16) | (device << 11) | (function << 8); -} - -void -mppb_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 mppb_pci_attach_hook(struct device *parent, struct device *self, struct pcibus_attach_args *pba) { } -void * -mppb_pci_intr_establish(pci_chipset_tag_t pc, pci_intr_handle_t ih, int level, - int (*ih_fun)(void *), void *ih_arg) -{ - struct isr* pci_isr; - pci_isr = kmem_zalloc(sizeof(struct isr), KM_SLEEP); - - /* TODO: check for bogus handle */ - - pci_isr->isr_intr = ih_fun; - pci_isr->isr_arg = ih_arg; - pci_isr->isr_ipl = MPPB_INT; - add_isr(pci_isr); - return pci_isr; -} - -void -mppb_pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie) -{ - remove_isr(cookie); - kmem_free(cookie, sizeof(struct isr)); -} - int mppb_pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ihp) { @@ -281,15 +245,6 @@ return 0; } -const char * -mppb_pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih) -{ - static char str[10]; - - sprintf(str, "INT%d", (int) ih); - return str; -} - const struct evcnt * mppb_pci_intr_evcnt(pci_chipset_tag_t pc, pci_intr_handle_t ih) { Index: src/sys/arch/amiga/pci/p5pb.c diff -u src/sys/arch/amiga/pci/p5pb.c:1.1 src/sys/arch/amiga/pci/p5pb.c:1.2 --- src/sys/arch/amiga/pci/p5pb.c:1.1 Thu Aug 4 17:48:51 2011 +++ src/sys/arch/amiga/pci/p5pb.c Mon Sep 19 19:15:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: p5pb.c,v 1.1 2011/08/04 17:48:51 rkujawa Exp $ */ +/* $NetBSD: p5pb.c,v 1.2 2011/09/19 19:15:29 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -67,6 +67,7 @@ device_t sc_dev; 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; }; @@ -76,15 +77,20 @@ 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); +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); +int p5pb_pci_intr_map(const struct pci_attach_args *pa, + pci_intr_handle_t *ihp); CFATTACH_DECL_NEW(p5pb, sizeof(struct p5pb_softc), p5pb_match, p5pb_attach, NULL, NULL); - static int p5pb_present = 0; static int @@ -142,38 +148,54 @@ (void *) P5BUS_PCI_CONF_BASE, P5BUS_PCI_CONF_SIZE); sc->pci_conf_area.absm = &amiga_bus_stride_1; + sc->pci_io_area.base = (bus_addr_t) zbusmap( + (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; #ifdef P5PB_DEBUG - aprint_normal("p5pb mapped %x -> %x, %x -> %x\n", + 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_MEM_BASE, sc->pci_mem_area.base ); #endif - sc->apc.pci_conf_iot = &(sc->pci_conf_area); + 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_iot, OFF_PCI_CONF_DATA, - 256, 0, &sc->apc.pci_conf_ioh)) + if (bus_space_map(sc->apc.pci_conf_addresst, OFF_PCI_CONF_ADDR, + 256, 0, &sc->apc.pci_conf_addressh)) aprint_error_dev(self, - "couldn't map PCI configuration data space\n"); - + "couldn't map PCI configuration address register\n"); + + if (bus_space_map(sc->apc.pci_conf_datat, OFF_PCI_CONF_DATA, + 256, 0, &sc->apc.pci_conf_datah)) + aprint_error_dev(self, + "couldn't map PCI configuration data register\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_make_tag = amiga_pci_make_tag; + sc->apc.pc_decompose_tag = amiga_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; + + sc->apc.pc_intr_map = p5pb_pci_intr_map; + sc->apc.pc_intr_string = amiga_pci_intr_string; + sc->apc.pc_intr_establish = amiga_pci_intr_establish; + sc->apc.pc_intr_disestablish = amiga_pci_intr_disestablish; + + pba.pba_iot = &(sc->pci_io_area); 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_flags = PCI_FLAGS_MEM_OKAY | PCI_FLAGS_IO_OKAY; pba.pba_bus = 0; pba.pba_bridgetag = NULL; @@ -217,13 +239,13 @@ 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, + + data = bus_space_read_4(pc->pci_conf_datat, pc->pci_conf_datah, (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); + pc->pci_conf_datah, bus, dev, func, reg, data); #endif return data; } @@ -235,12 +257,12 @@ pci_decompose_tag(pc, tag, &bus, &dev, &func); - bus_space_write_4(pc->pci_conf_iot, pc->pci_conf_ioh, + bus_space_write_4(pc->pci_conf_datat, pc->pci_conf_datah, (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); + pc->pci_conf_datah, bus, dev, func, reg, val); #endif } @@ -248,8 +270,7 @@ int p5pb_pci_bus_maxdevs(pci_chipset_tag_t pc, int busno) { - - /* Allow only one device. Obvious in case of CVPPC/BVPPC. */ + /* G-Rex has max 5 slots. CVPPC/BVPPC has only 1. */ return 1; } @@ -279,3 +300,12 @@ { } +int +p5pb_pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ihp) +{ + /* TODO: add sanity checking */ + + *ihp = 2; + return 0; +} + Index: src/sys/arch/amiga/pci/p5pbreg.h diff -u src/sys/arch/amiga/pci/p5pbreg.h:1.1 src/sys/arch/amiga/pci/p5pbreg.h:1.2 --- src/sys/arch/amiga/pci/p5pbreg.h:1.1 Thu Aug 4 17:48:51 2011 +++ src/sys/arch/amiga/pci/p5pbreg.h Mon Sep 19 19:15:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: p5pbreg.h,v 1.1 2011/08/04 17:48:51 rkujawa Exp $ */ +/* $NetBSD: p5pbreg.h,v 1.2 2011/09/19 19:15:29 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -32,9 +32,9 @@ /* * Reverse engineered Phase5 PCI bridge memory map (firmware 44.71): * - * 0xFFFA0000 - (unknown) + * 0xFFFA0000 - PCI register space, 64KB * 0xFFFC0000 - PCI configuration mechanism #1 data, 128KB - * 0xFFFE0000 - PCI configuration mechanism #1 address, 4KB + * 0xFFFE0000 - (unknown, maybe PCI configuration mechanism #1 address, 4KB) * * 0xE0000000 - Permedia RAM on CVPPC/BVPPC (1st aperture), 8MB * 0xE0800000 - Permedia RAM on CVPPC/BVPPC (2nd aperture), 8MB @@ -44,18 +44,22 @@ * * 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. + * the Permedia 2 chip on CVPPC/BVPPC cards. */ #ifndef _AMIGA_P5PBREG_H_ -#define P5BUS_PCI_CONF_BASE 0xFFFA0000 -#define P5BUS_PCI_CONF_SIZE 0x00041000 +#define P5BUS_PCI_CONF_BASE 0xFFFC0000 +#define P5BUS_PCI_CONF_SIZE 0x00021000 +/* XXX: This is OK for CVPPC/BVPPC only! */ #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_PCI_IO_BASE 0xFFFA0000 +#define P5BUS_PCI_IO_SIZE 0x0000FFFF + +#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_BIG 0x02 /* to switch into BE mode */ Added files: Index: src/sys/arch/amiga/pci/pci_machdep.c diff -u /dev/null src/sys/arch/amiga/pci/pci_machdep.c:1.1 --- /dev/null Mon Sep 19 19:15:30 2011 +++ src/sys/arch/amiga/pci/pci_machdep.c Mon Sep 19 19:15:29 2011 @@ -0,0 +1,120 @@ +/* $NetBSD: pci_machdep.c,v 1.1 2011/09/19 19:15:29 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. + */ + +/* Amiga-specific PCI MD stuff. */ + +#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 <sys/kmem.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/mppbreg.h> + +#include <dev/pci/pcivar.h> +#include <dev/pci/pcireg.h> +#include <dev/pci/pcidevs.h> +#include <dev/pci/pciconf.h> + +pcitag_t +amiga_pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function) +{ + return (bus << 16) | (device << 11) | (function << 8); +} + +void +amiga_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 * +amiga_pci_intr_establish(pci_chipset_tag_t pc, pci_intr_handle_t ih, int level, + int (*ih_fun)(void *), void *ih_arg) +{ + struct isr* pci_isr; + pci_isr = kmem_zalloc(sizeof(struct isr), KM_SLEEP); + + /* TODO: check for bogus handle */ + + pci_isr->isr_intr = ih_fun; + pci_isr->isr_arg = ih_arg; + pci_isr->isr_ipl = 2; /* XXX: true for all current drivers */ + add_isr(pci_isr); + return pci_isr; +} + +void +amiga_pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie) +{ + remove_isr(cookie); + kmem_free(cookie, sizeof(struct isr)); +} + +const char * +amiga_pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih) +{ + static char str[10]; + + sprintf(str, "INT%d", (int) ih); + return str; +} + +int +amiga_pci_conf_hook(pci_chipset_tag_t pct, int bus, int dev, int func, + pcireg_t id) +{ + return PCI_CONF_DEFAULT; +} + +void +amiga_pci_conf_interrupt(pci_chipset_tag_t pc, int bus, int dev, int func, + int swiz, int *iline) +{ +} +