Module Name:    src
Committed By:   rkujawa
Date:           Wed Jul 11 17:13:31 UTC 2012

Modified Files:
        src/sys/arch/amiga/conf: files.amiga
        src/sys/arch/amiga/include: pci_machdep.h
        src/sys/arch/amiga/pci: p5pb.c p5pbreg.h
        src/sys/arch/m68k/m68k: bus_dma.c

Log Message:
Add support for all 4 slots of G-REX 4000D and G-REX 1200. Also add
(untested yet) DMA support for G-REX bridges.


To generate a diff of this commit:
cvs rdiff -u -r1.159 -r1.160 src/sys/arch/amiga/conf/files.amiga
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amiga/include/pci_machdep.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/amiga/pci/p5pb.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amiga/pci/p5pbreg.h
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/m68k/m68k/bus_dma.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/files.amiga
diff -u src/sys/arch/amiga/conf/files.amiga:1.159 src/sys/arch/amiga/conf/files.amiga:1.160
--- src/sys/arch/amiga/conf/files.amiga:1.159	Thu Jun  7 23:30:52 2012
+++ src/sys/arch/amiga/conf/files.amiga	Wed Jul 11 17:13:31 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: files.amiga,v 1.159 2012/06/07 23:30:52 rkujawa Exp $
+#	$NetBSD: files.amiga,v 1.160 2012/07/11 17:13:31 rkujawa Exp $
 
 # maxpartitions must be first item in files.${ARCH}.newconf
 maxpartitions 16			# NOTE THAT AMIGA IS SPECIAL!
@@ -455,6 +455,7 @@ file	arch/m68k/m68k/pmap_motorola.c
 file	arch/m68k/m68k/procfs_machdep.c	procfs
 file	arch/m68k/m68k/sys_machdep.c
 file	arch/m68k/m68k/vm_machdep.c
+file	arch/m68k/m68k/bus_dma.c
 
 define	gayle
 file	arch/amiga/amiga/gayle.c		gayle

Index: src/sys/arch/amiga/include/pci_machdep.h
diff -u src/sys/arch/amiga/include/pci_machdep.h:1.6 src/sys/arch/amiga/include/pci_machdep.h:1.7
--- src/sys/arch/amiga/include/pci_machdep.h:1.6	Fri Jun  1 09:41:35 2012
+++ src/sys/arch/amiga/include/pci_machdep.h	Wed Jul 11 17:13:31 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pci_machdep.h,v 1.6 2012/06/01 09:41:35 rkujawa Exp $ */
+/*	$NetBSD: pci_machdep.h,v 1.7 2012/07/11 17:13:31 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 
 #include <machine/intr.h>
 
-/* #define __HAVE_PCI_CONF_HOOK */
+#define __HAVE_PCI_CONF_HOOK 
 
 /*
  * Forward declarations.
@@ -50,6 +50,8 @@ typedef struct	amiga_pci_chipset *pci_ch
 typedef u_long	pcitag_t;
 typedef u_long	pci_intr_handle_t;
 
+extern struct m68k_bus_dma_tag pci_bus_dma_tag;
+
 /*
  * amiga-specific PCI structure and type definitions.
  * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE.

Index: src/sys/arch/amiga/pci/p5pb.c
diff -u src/sys/arch/amiga/pci/p5pb.c:1.8 src/sys/arch/amiga/pci/p5pb.c:1.9
--- src/sys/arch/amiga/pci/p5pb.c:1.8	Sun Jan 29 15:32:52 2012
+++ src/sys/arch/amiga/pci/p5pb.c	Wed Jul 11 17:13:31 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: p5pb.c,v 1.8 2012/01/29 15:32:52 para Exp $ */
+/*	$NetBSD: p5pb.c,v 1.9 2012/07/11 17:13:31 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2011, 2012 The NetBSD Foundation, Inc.
@@ -41,6 +41,7 @@
 
 #include <uvm/uvm_extern.h>
 
+#define _M68K_BUS_DMA_PRIVATE
 #include <machine/bus.h>
 #include <machine/cpu.h>
 
@@ -67,6 +68,19 @@
 #define P5GFX_DEPTH		8
 #define P5GFX_LINEBYTES		640
 
+struct m68k_bus_dma_tag p5pb_bus_dma_tag = {
+	0,
+	0, 
+	_bus_dmamap_create,
+	_bus_dmamap_destroy,
+	_bus_dmamap_load_direct,
+	_bus_dmamap_load_mbuf_direct,
+	_bus_dmamap_load_uio_direct,
+	_bus_dmamap_load_raw_direct,
+	_bus_dmamap_unload,
+	_bus_dmamap_sync
+};
+
 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);
@@ -193,7 +207,7 @@ p5pb_attach(device_t parent, device_t se
  
 	pba.pba_iot = &(sc->pci_io_area);
 	pba.pba_memt = &(sc->pci_mem_area);
-	pba.pba_dmat = NULL; 
+	pba.pba_dmat = &p5pb_bus_dma_tag; 
 	pba.pba_dmat64 = NULL;
 	pba.pba_pc = pc;
 	pba.pba_flags = PCI_FLAGS_MEM_OKAY | PCI_FLAGS_IO_OKAY; 
@@ -337,11 +351,26 @@ p5pb_pci_conf_read(pci_chipset_tag_t pc,
 {
 	uint32_t data;
 	uint32_t bus, dev, func;
-	
+	uint32_t offset;
+
 	pci_decompose_tag(pc, tag, &bus, &dev, &func);
 
+	offset = (OFF_PCI_DEVICE << dev) + reg;
+
+	if(func == 0)	/* ugly, ugly hack */
+		offset += 0;
+	else if(func == 1)
+		offset += OFF_PCI_FUNCTION;
+	else
+		return 0xFFFFFFFF;	
+
+	if(badaddr((void *)__UNVOLATILE(((uint32_t)
+	    bus_space_vaddr(pc->pci_conf_datat, pc->pci_conf_datah) 
+	    + offset)))) 
+		return 0xFFFFFFFF;	
+
 	data = bus_space_read_4(pc->pci_conf_datat, pc->pci_conf_datah,
-	    + reg + (dev * OFF_PCI_DEVICE));
+	    offset);
 #ifdef P5PB_DEBUG_CONF
 	aprint_normal("p5pb conf read va: %lx, bus: %d, dev: %d, "
 	    "func: %d, reg: %d -r-> data %x\n",
@@ -354,11 +383,26 @@ void
 p5pb_pci_conf_write(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t val)
 {
 	uint32_t bus, dev, func;
-	
+	uint32_t offset;
+
 	pci_decompose_tag(pc, tag, &bus, &dev, &func);
-	
+
+	offset = (OFF_PCI_DEVICE << dev) + reg;
+
+	if(func == 0)	/* ugly, ugly hack */
+		offset += 0;
+	else if(func == 1)
+		offset += OFF_PCI_FUNCTION;
+	else
+		return;	
+
+	if(badaddr((void *)__UNVOLATILE(((uint32_t)
+	    bus_space_vaddr(pc->pci_conf_datat, pc->pci_conf_datah) 
+	    + offset)))) 
+		return;	
+
 	bus_space_write_4(pc->pci_conf_datat, pc->pci_conf_datah,
-	    + reg + (dev * OFF_PCI_DEVICE), val);
+	    offset, val);
 #ifdef P5PB_DEBUG_CONF
 	aprint_normal("p5pb conf write va: %lx, bus: %d, dev: %d, "
 	    "func: %d, reg: %d -w-> data %x\n",
@@ -378,14 +422,14 @@ int
 p5pb_pci_bus_maxdevs_grex4000(pci_chipset_tag_t pc, int busno) 
 {
 	/* G-REX 4000 has 4, G-REX 4000T has 3 slots? */
-	return 1; /* XXX: 4 not yet! */
+	return 4;
 }
 
 int
 p5pb_pci_bus_maxdevs_grex1200(pci_chipset_tag_t pc, int busno) 
 {
 	/* G-REX 1200 has 5 slots. */
-	return 1; /* XXX: 5 not yet! */
+	return 4; /* XXX: 5 not yet! */
 }
 
 void
@@ -456,7 +500,7 @@ p5pb_bus_reconfigure(struct p5pb_softc *
 	    EX_NOWAIT);
 
 	memext = extent_create("p5pbmem", sc->pci_mem_lowest, 
-	     sc->pci_mem_highest, NULL, 0, EX_NOWAIT);
+	     sc->pci_mem_highest - 1, NULL, 0, EX_NOWAIT);
 	
 	if ( (!ioext) || (!memext) ) 
 		return false;
@@ -515,7 +559,7 @@ p5pb_bus_map_conf(struct p5pb_softc *sc)
 	sc->apc.pci_conf_datat = &(sc->pci_conf_area);
 
 	if (bus_space_map(sc->apc.pci_conf_datat, OFF_PCI_CONF_DATA, 
-	    256, 0, &sc->apc.pci_conf_datah)) 
+	    P5BUS_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.6 src/sys/arch/amiga/pci/p5pbreg.h:1.7
--- src/sys/arch/amiga/pci/p5pbreg.h:1.6	Thu Jan 19 00:14:08 2012
+++ src/sys/arch/amiga/pci/p5pbreg.h	Wed Jul 11 17:13:31 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: p5pbreg.h,v 1.6 2012/01/19 00:14:08 rkujawa Exp $ */
+/*	$NetBSD: p5pbreg.h,v 1.7 2012/07/11 17:13:31 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2011, 2012 The NetBSD Foundation, Inc.
@@ -52,8 +52,8 @@
 #define P5BUS_PCI_CONF_BASE	0xFFFC0000
 #define P5BUS_PCI_CONF_SIZE	0x00020000	/* up to 128kB */
 
-#define OFF_PCI_CONF_DATA	0x00001000	/* also 0 on CVPPC */
-#define OFF_PCI_DEVICE		0x00002000
+#define OFF_PCI_CONF_DATA	0x00000000	/* also 0 on CVPPC */
+#define OFF_PCI_DEVICE		0x00001000
 #define OFF_PCI_FUNCTION	0x00000100
 
 #define P5BUS_PCI_IO_BASE	0xFFFA0000

Index: src/sys/arch/m68k/m68k/bus_dma.c
diff -u src/sys/arch/m68k/m68k/bus_dma.c:1.32 src/sys/arch/m68k/m68k/bus_dma.c:1.33
--- src/sys/arch/m68k/m68k/bus_dma.c:1.32	Mon Sep 19 19:17:05 2011
+++ src/sys/arch/m68k/m68k/bus_dma.c	Wed Jul 11 17:13:30 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.32 2011/09/19 19:17:05 rkujawa Exp $ */
+/* $NetBSD: bus_dma.c,v 1.33 2012/07/11 17:13:30 rkujawa Exp $ */
 
 /*
  * This file was taken from from alpha/common/bus_dma.c
@@ -41,7 +41,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.32 2011/09/19 19:17:05 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.33 2012/07/11 17:13:30 rkujawa Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -152,7 +152,7 @@ _bus_dmamap_load_buffer_direct_common(bu
 		/*
 		 * Get the physical address for this segment.
 		 */
-		rv = pmap_extract(pmap, vaddr, &curaddr);
+		rv = pmap_extract(pmap, vaddr, (paddr_t *) &curaddr);
 		KASSERT(rv);
 
 		cacheable = _pmap_page_is_cacheable(pmap, vaddr);

Reply via email to