Module Name: src
Committed By: macallan
Date: Wed Feb 18 16:47:59 UTC 2015
Modified Files:
src/sys/arch/sgimips/conf: files.sgimips
src/sys/arch/sgimips/dev: crime.c crmfb.c ctl.c dpclock.c dsclock.c
imc.c int.c pic.c zs.c
src/sys/arch/sgimips/gio: gio.c pci_gio.c
src/sys/arch/sgimips/hpc: hpc.c if_sq.c panel.c pckbc_hpc.c wdsc.c
src/sys/arch/sgimips/include: bus_defs.h bus_funcs.h pci_machdep.h
src/sys/arch/sgimips/ioc: ioc.c oioc.c
src/sys/arch/sgimips/mace: com_mace.c mace.c mcclock_mace.c pci_mace.c
pcireg_mace.h
src/sys/arch/sgimips/pci: pci_machdep.c
src/sys/arch/sgimips/sgimips: bus.c console.c
Log Message:
switch sgimips to common bus_dma and bus_space in arch/mips/
Tested on O2 and Indy.
Things that are compile-tested only for lack of hardware:
- GIO ethernet cards with PCI bridges
- IP2x hardware not found on Indy
- IP1x
To generate a diff of this commit:
cvs rdiff -u -r1.52 -r1.53 src/sys/arch/sgimips/conf/files.sgimips
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/sgimips/dev/crime.c
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/sgimips/dev/crmfb.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sgimips/dev/ctl.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/sgimips/dev/dpclock.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sgimips/dev/dsclock.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/sgimips/dev/imc.c
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/sgimips/dev/int.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/sgimips/dev/pic.c
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/sgimips/dev/zs.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/sgimips/gio/gio.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/sgimips/gio/pci_gio.c
cvs rdiff -u -r1.67 -r1.68 src/sys/arch/sgimips/hpc/hpc.c
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/sgimips/hpc/if_sq.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/sgimips/hpc/panel.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/sgimips/hpc/pckbc_hpc.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/sgimips/hpc/wdsc.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/sgimips/include/bus_defs.h \
src/sys/arch/sgimips/include/bus_funcs.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/sgimips/include/pci_machdep.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/sgimips/ioc/ioc.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sgimips/ioc/oioc.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/sgimips/mace/com_mace.c
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/sgimips/mace/mace.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/sgimips/mace/mcclock_mace.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/sgimips/mace/pci_mace.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/sgimips/mace/pcireg_mace.h
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/sgimips/pci/pci_machdep.c
cvs rdiff -u -r1.65 -r1.66 src/sys/arch/sgimips/sgimips/bus.c
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/sgimips/sgimips/console.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/sgimips/conf/files.sgimips
diff -u src/sys/arch/sgimips/conf/files.sgimips:1.52 src/sys/arch/sgimips/conf/files.sgimips:1.53
--- src/sys/arch/sgimips/conf/files.sgimips:1.52 Sun Jul 20 10:22:55 2014
+++ src/sys/arch/sgimips/conf/files.sgimips Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-# $NetBSD: files.sgimips,v 1.52 2014/07/20 10:22:55 alnsn Exp $
+# $NetBSD: files.sgimips,v 1.53 2015/02/18 16:47:58 macallan Exp $
maxpartitions 16
@@ -26,8 +26,7 @@ file arch/sgimips/sgimips/console.c
file arch/sgimips/sgimips/disksubr.c
file arch/sgimips/sgimips/machdep.c
-file dev/bus_dma/bus_dmamem_common.c
-
+file arch/mips/mips/bus_dma.c
file arch/mips/mips/mips3_clock.c mips3
file arch/mips/mips/mips3_clockintr.c mips3
Index: src/sys/arch/sgimips/dev/crime.c
diff -u src/sys/arch/sgimips/dev/crime.c:1.37 src/sys/arch/sgimips/dev/crime.c:1.38
--- src/sys/arch/sgimips/dev/crime.c:1.37 Sat May 17 20:44:08 2014
+++ src/sys/arch/sgimips/dev/crime.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: crime.c,v 1.37 2014/05/17 20:44:08 mrg Exp $ */
+/* $NetBSD: crime.c,v 1.38 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2004 Christopher SEKIYA
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.37 2014/05/17 20:44:08 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.38 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -108,9 +108,9 @@ crime_attach(device_t parent, device_t s
uint32_t startctr, endctr, cps;
sc->sc_dev = self;
- crm_iot = SGIMIPS_BUS_SPACE_CRIME;
+ crm_iot = normal_memt;
- if (bus_space_map(crm_iot, ma->ma_addr, 0 /* XXX */,
+ if (bus_space_map(crm_iot, ma->ma_addr, 0x1000,
BUS_SPACE_MAP_LINEAR, &crm_ioh))
panic("%s: can't map I/O space", __func__);
Index: src/sys/arch/sgimips/dev/crmfb.c
diff -u src/sys/arch/sgimips/dev/crmfb.c:1.39 src/sys/arch/sgimips/dev/crmfb.c:1.40
--- src/sys/arch/sgimips/dev/crmfb.c:1.39 Tue Jan 20 12:13:04 2015
+++ src/sys/arch/sgimips/dev/crmfb.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: crmfb.c,v 1.39 2015/01/20 12:13:04 macallan Exp $ */
+/* $NetBSD: crmfb.c,v 1.40 2015/02/18 16:47:58 macallan Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -32,14 +32,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crmfb.c,v 1.39 2015/01/20 12:13:04 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crmfb.c,v 1.40 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/malloc.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
#include <machine/autoconf.h>
#include <sys/bus.h>
#include <machine/machtype.h>
@@ -262,7 +261,7 @@ crmfb_attach(device_t parent, device_t s
ma = (struct mainbus_attach_args *)opaque;
- sc->sc_iot = SGIMIPS_BUS_SPACE_CRIME;
+ sc->sc_iot = normal_memt;
sc->sc_dmat = &sgimips_default_bus_dma_tag;
sc->sc_wsmode = WSDISPLAYIO_MODE_EMUL;
@@ -571,7 +570,7 @@ crmfb_mmap(void *v, void *vs, off_t offs
if (offset >= 0 && offset < (0x100000 * sc->sc_tiles_x)) {
pa = bus_dmamem_mmap(sc->sc_dmat, sc->sc_dma.segs,
sc->sc_dma.nsegs, offset, prot,
- BUS_DMA_WAITOK | BUS_DMA_COHERENT);
+ BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_PREFETCHABLE);
return pa;
}
#endif
@@ -588,8 +587,8 @@ crmfb_mmap(void *v, void *vs, off_t offs
if ((offset >= 0x15010000) && (offset < 0x15030000))
return bus_dmamem_mmap(sc->sc_dmat, sc->sc_dma.segs,
sc->sc_dma.nsegs,
- offset + (0x100000 * sc->sc_tiles_x) - 0x15010000,
- prot, BUS_DMA_WAITOK | BUS_DMA_COHERENT);
+ offset + (0x100000 * sc->sc_tiles_x) - 0x15010000, prot,
+ BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_PREFETCHABLE);
return -1;
}
Index: src/sys/arch/sgimips/dev/ctl.c
diff -u src/sys/arch/sgimips/dev/ctl.c:1.3 src/sys/arch/sgimips/dev/ctl.c:1.4
--- src/sys/arch/sgimips/dev/ctl.c:1.3 Fri Jul 1 18:53:46 2011
+++ src/sys/arch/sgimips/dev/ctl.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ctl.c,v 1.3 2011/07/01 18:53:46 dyoung Exp $ */
+/* $NetBSD: ctl.c,v 1.4 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2009 Stephen M. Rumble
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ctl.c,v 1.3 2011/07/01 18:53:46 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ctl.c,v 1.4 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -98,8 +98,8 @@ ctl_attach(device_t parent, device_t sel
sc->sc_dev = self;
csc = sc;
- sc->iot = SGIMIPS_BUS_SPACE_NORMAL;
- if (bus_space_map(sc->iot, ma->ma_addr, 0,
+ sc->iot = normal_memt;
+ if (bus_space_map(sc->iot, ma->ma_addr, 0x10000 /* XXX */,
BUS_SPACE_MAP_LINEAR, &sc->ioh))
panic("ctl_attach: could not allocate memory\n");
Index: src/sys/arch/sgimips/dev/dpclock.c
diff -u src/sys/arch/sgimips/dev/dpclock.c:1.5 src/sys/arch/sgimips/dev/dpclock.c:1.6
--- src/sys/arch/sgimips/dev/dpclock.c:1.5 Thu Nov 20 16:34:26 2014
+++ src/sys/arch/sgimips/dev/dpclock.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dpclock.c,v 1.5 2014/11/20 16:34:26 christos Exp $ */
+/* $NetBSD: dpclock.c,v 1.6 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2001 Erik Reid
@@ -55,6 +55,7 @@ struct dpclock_softc {
/* RTC registers */
bus_space_tag_t sc_rtct;
bus_space_handle_t sc_rtch;
+ int sc_offset;
};
static int dpclock_match(device_t, cfdata_t, void *);
@@ -87,6 +88,20 @@ dpclock_match(device_t parent, cfdata_t
}
static void
+writereg(struct dpclock_softc *sc, uint32_t reg, uint8_t val)
+{
+ bus_space_write_1(sc->sc_rtct, sc->sc_rtch,
+ (reg << 2) + sc->sc_offset, val);
+}
+
+static uint8_t
+readreg(struct dpclock_softc *sc, uint32_t reg)
+{
+ return bus_space_read_1(sc->sc_rtct, sc->sc_rtch,
+ (reg << 2) + sc->sc_offset);
+}
+
+static void
dpclock_attach(device_t parent, device_t self, void *aux)
{
struct dpclock_softc *sc = device_private(self);
@@ -95,14 +110,15 @@ dpclock_attach(device_t parent, device_t
printf("\n");
+ sc->sc_rtct = normal_memt;
/*
* All machines have one byte register per word. IP6/IP10 use
* the MSB, others the LSB.
*/
if (mach_type == MACH_SGI_IP12 || mach_type == MACH_SGI_IP20)
- sc->sc_rtct = SGIMIPS_BUS_SPACE_HPC;
+ sc->sc_offset = 3;
else
- sc->sc_rtct = SGIMIPS_BUS_SPACE_IP6_DPCLOCK;
+ sc->sc_offset = 0;
if ((err = bus_space_map(sc->sc_rtct, ma->ma_addr, 0x1ffff,
BUS_SPACE_MAP_LINEAR, &sc->sc_rtch)) != 0) {
@@ -131,14 +147,14 @@ dpclock_gettime(struct todr_chip_handle
u_int8_t regs[32];
s = splhigh();
- i = bus_space_read_1(sc->sc_rtct, sc->sc_rtch, DP8573A_TIMESAVE_CTL);
+ i = readreg(sc, DP8573A_TIMESAVE_CTL);
j = i | DP8573A_TIMESAVE_CTL_EN;
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_TIMESAVE_CTL, j);
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_TIMESAVE_CTL, i);
+ writereg(sc, DP8573A_TIMESAVE_CTL, j);
+ writereg(sc, DP8573A_TIMESAVE_CTL, i);
splx(s);
for (i = 0; i < 32; i++)
- regs[i] = bus_space_read_1(sc->sc_rtct, sc->sc_rtch, i);
+ regs[i] = readreg(sc, i);
dt.dt_sec = bcdtobin(regs[DP8573A_SAVE_SEC]);
dt.dt_min = bcdtobin(regs[DP8573A_SAVE_MIN]);
@@ -194,14 +210,14 @@ dpclock_settime(struct todr_chip_handle
clock_secs_to_ymdhms((time_t)(tv->tv_sec + (tv->tv_usec > 500000)),&dt);
s = splhigh();
- i = bus_space_read_1(sc->sc_rtct, sc->sc_rtch, DP8573A_TIMESAVE_CTL);
+ i = readreg(sc, DP8573A_TIMESAVE_CTL);
j = i | DP8573A_TIMESAVE_CTL_EN;
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_TIMESAVE_CTL, j);
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_TIMESAVE_CTL, i);
+ writereg(sc, DP8573A_TIMESAVE_CTL, j);
+ writereg(sc, DP8573A_TIMESAVE_CTL, i);
splx(s);
for (i = 0; i < 32; i++)
- regs[i] = bus_space_read_1(sc->sc_rtct, sc->sc_rtch, i);
+ regs[i] = readreg(sc, i);
regs[DP8573A_SUBSECOND] = 0;
regs[DP8573A_SECOND] = bintobcd(dt.dt_sec);
@@ -213,15 +229,14 @@ dpclock_settime(struct todr_chip_handle
regs[DP8573A_YEAR] = bintobcd(TO_IRIX_YEAR(dt.dt_year));
s = splhigh();
- i = bus_space_read_1(sc->sc_rtct, sc->sc_rtch, DP8573A_RT_MODE);
+ i = readreg(sc, DP8573A_RT_MODE);
j = i & ~DP8573A_RT_MODE_CLKSS;
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_RT_MODE, j);
+ writereg(sc, DP8573A_RT_MODE, j);
for (i = 0; i < 10; i++)
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_COUNTERS +i,
- regs[DP8573A_COUNTERS + i]);
+ writereg(sc, DP8573A_COUNTERS +i, regs[DP8573A_COUNTERS + i]);
- bus_space_write_1(sc->sc_rtct, sc->sc_rtch, DP8573A_RT_MODE, i);
+ writereg(sc, DP8573A_RT_MODE, i);
splx(s);
return (0);
Index: src/sys/arch/sgimips/dev/dsclock.c
diff -u src/sys/arch/sgimips/dev/dsclock.c:1.6 src/sys/arch/sgimips/dev/dsclock.c:1.7
--- src/sys/arch/sgimips/dev/dsclock.c:1.6 Thu Nov 20 16:34:26 2014
+++ src/sys/arch/sgimips/dev/dsclock.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dsclock.c,v 1.6 2014/11/20 16:34:26 christos Exp $ */
+/* $NetBSD: dsclock.c,v 1.7 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2001 Rafal K. Boni
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dsclock.c,v 1.6 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dsclock.c,v 1.7 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -72,9 +72,9 @@ CFATTACH_DECL_NEW(dsclock, sizeof(struct
dsclock_match, dsclock_attach, NULL, NULL);
#define ds1286_write(sc, reg, datum) \
- bus_space_write_1((sc)->sc_rtct, (sc)->sc_rtch, (reg), (datum))
+ bus_space_write_1((sc)->sc_rtct, (sc)->sc_rtch, (reg << 2) + 3, (datum))
#define ds1286_read(sc, reg) \
- bus_space_read_1((sc)->sc_rtct, (sc)->sc_rtch, (reg))
+ bus_space_read_1((sc)->sc_rtct, (sc)->sc_rtch, (reg << 2) + 3)
static int
dsclock_match(device_t parent, cfdata_t cf, void *aux)
@@ -96,7 +96,7 @@ dsclock_attach(device_t parent, device_t
aprint_normal("\n");
- sc->sc_rtct = SGIMIPS_BUS_SPACE_HPC;
+ sc->sc_rtct = normal_memt;
if ((err = bus_space_map(sc->sc_rtct, ma->ma_addr, 0x1ffff,
BUS_SPACE_MAP_LINEAR, &sc->sc_rtch)) != 0) {
aprint_error_dev(self,
Index: src/sys/arch/sgimips/dev/imc.c
diff -u src/sys/arch/sgimips/dev/imc.c:1.33 src/sys/arch/sgimips/dev/imc.c:1.34
--- src/sys/arch/sgimips/dev/imc.c:1.33 Sat Oct 27 17:18:09 2012
+++ src/sys/arch/sgimips/dev/imc.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: imc.c,v 1.33 2012/10/27 17:18:09 chs Exp $ */
+/* $NetBSD: imc.c,v 1.34 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2001 Rafal K. Boni
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imc.c,v 1.33 2012/10/27 17:18:09 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imc.c,v 1.34 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -103,8 +103,8 @@ imc_attach(device_t parent, device_t sel
struct mainbus_attach_args *ma = aux;
uint32_t sysid;
- isc.iot = SGIMIPS_BUS_SPACE_HPC;
- if (bus_space_map(isc.iot, ma->ma_addr, 0,
+ isc.iot = normal_memt;
+ if (bus_space_map(isc.iot, ma->ma_addr, 0x100,
BUS_SPACE_MAP_LINEAR, &isc.ioh))
panic("imc_attach: could not allocate memory\n");
Index: src/sys/arch/sgimips/dev/int.c
diff -u src/sys/arch/sgimips/dev/int.c:1.27 src/sys/arch/sgimips/dev/int.c:1.28
--- src/sys/arch/sgimips/dev/int.c:1.27 Tue Jun 3 12:15:00 2014
+++ src/sys/arch/sgimips/dev/int.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: int.c,v 1.27 2014/06/03 12:15:00 macallan Exp $ */
+/* $NetBSD: int.c,v 1.28 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2009 Stephen M. Rumble
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: int.c,v 1.27 2014/06/03 12:15:00 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: int.c,v 1.28 2015/02/18 16:47:58 macallan Exp $");
#define __INTR_PRIVATE
#include "opt_cputype.h"
@@ -141,8 +141,12 @@ int_attach(device_t parent, device_t sel
printf(" addr 0x%x\n", address);
- bus_space_map(iot, address, 0, 0, &ioh);
- iot = SGIMIPS_BUS_SPACE_NORMAL;
+ iot = normal_memt;
+ /*
+ * XXX INT1 registers are spread *way* out, but for now this should
+ * work
+ */
+ bus_space_map(iot, address, 0x100, 0, &ioh);
switch (mach_type) {
case MACH_SGI_IP6 | MACH_SGI_IP10:
Index: src/sys/arch/sgimips/dev/pic.c
diff -u src/sys/arch/sgimips/dev/pic.c:1.16 src/sys/arch/sgimips/dev/pic.c:1.17
--- src/sys/arch/sgimips/dev/pic.c:1.16 Sat Oct 27 17:18:09 2012
+++ src/sys/arch/sgimips/dev/pic.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pic.c,v 1.16 2012/10/27 17:18:09 chs Exp $ */
+/* $NetBSD: pic.c,v 1.17 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2002 Steve Rumble
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.16 2012/10/27 17:18:09 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.17 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -95,8 +95,8 @@ pic_attach(device_t parent, device_t sel
struct pic_attach_args iaa;
struct mainbus_attach_args *ma = aux;
- psc.iot = SGIMIPS_BUS_SPACE_HPC;
- if (bus_space_map(psc.iot, ma->ma_addr, 0,
+ psc.iot = normal_memt;
+ if (bus_space_map(psc.iot, ma->ma_addr, 0x20010,
BUS_SPACE_MAP_LINEAR, &psc.ioh))
panic("pic_attach: could not allocate memory\n");
Index: src/sys/arch/sgimips/dev/zs.c
diff -u src/sys/arch/sgimips/dev/zs.c:1.38 src/sys/arch/sgimips/dev/zs.c:1.39
--- src/sys/arch/sgimips/dev/zs.c:1.38 Mon Mar 24 19:10:34 2014
+++ src/sys/arch/sgimips/dev/zs.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: zs.c,v 1.38 2014/03/24 19:10:34 christos Exp $ */
+/* $NetBSD: zs.c,v 1.39 2015/02/18 16:47:58 macallan Exp $ */
/*-
* Copyright (c) 1996, 2000 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.38 2014/03/24 19:10:34 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.39 2015/02/18 16:47:58 macallan Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -530,9 +530,11 @@ zs_read_reg(struct zs_chanstate *cs, uin
uint8_t val;
struct zs_channel *zsc = (struct zs_channel *)cs;
- bus_space_write_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_CSR, reg);
+ bus_space_write_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_CSR << 2) + 3, reg);
ZS_DELAY();
- val = bus_space_read_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_CSR);
+ val = bus_space_read_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_CSR << 2) + 3);
ZS_DELAY();
return val;
}
@@ -542,9 +544,11 @@ zs_write_reg(struct zs_chanstate *cs, ui
{
struct zs_channel *zsc = (struct zs_channel *)cs;
- bus_space_write_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_CSR, reg);
+ bus_space_write_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_CSR << 2) + 3, reg);
ZS_DELAY();
- bus_space_write_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_CSR, val);
+ bus_space_write_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_CSR << 2) + 3, val);
ZS_DELAY();
}
@@ -554,7 +558,8 @@ zs_read_csr(struct zs_chanstate *cs)
struct zs_channel *zsc = (struct zs_channel *)cs;
uint8_t val;
- val = bus_space_read_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_CSR);
+ val = bus_space_read_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_CSR << 2) + 3);
ZS_DELAY();
return val;
}
@@ -564,7 +569,8 @@ zs_write_csr(struct zs_chanstate *cs, ui
{
struct zs_channel *zsc = (struct zs_channel *)cs;
- bus_space_write_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_CSR, val);
+ bus_space_write_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_CSR << 2) + 3, val);
ZS_DELAY();
}
@@ -574,7 +580,8 @@ zs_read_data(struct zs_chanstate *cs)
struct zs_channel *zsc = (struct zs_channel *)cs;
uint8_t val;
- val = bus_space_read_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_DATA);
+ val = bus_space_read_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_DATA << 2) + 3);
ZS_DELAY();
return val;
}
@@ -584,7 +591,8 @@ zs_write_data(struct zs_chanstate *cs, u
{
struct zs_channel *zsc = (struct zs_channel *)cs;
- bus_space_write_1(zsc->cs_bustag, zsc->cs_regs, ZS_REG_DATA, val);
+ bus_space_write_1(zsc->cs_bustag, zsc->cs_regs,
+ (ZS_REG_DATA << 2) + 3, val);
ZS_DELAY();
}
Index: src/sys/arch/sgimips/gio/gio.c
diff -u src/sys/arch/sgimips/gio/gio.c:1.33 src/sys/arch/sgimips/gio/gio.c:1.34
--- src/sys/arch/sgimips/gio/gio.c:1.33 Sat Oct 27 17:18:09 2012
+++ src/sys/arch/sgimips/gio/gio.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: gio.c,v 1.33 2012/10/27 17:18:09 chs Exp $ */
+/* $NetBSD: gio.c,v 1.34 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gio.c,v 1.33 2012/10/27 17:18:09 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gio.c,v 1.34 2015/02/18 16:47:58 macallan Exp $");
#include "opt_ddb.h"
@@ -41,7 +41,6 @@ __KERNEL_RCSID(0, "$NetBSD: gio.c,v 1.33
#include <sys/systm.h>
#include <sys/device.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
#include <sys/bus.h>
#include <machine/machtype.h>
#include <machine/sysconf.h>
@@ -208,7 +207,8 @@ gio_attach(device_t parent, device_t sel
ga.ga_slot = -1;
ga.ga_addr = gfx_bases[i].base;
- ga.ga_iot = SGIMIPS_BUS_SPACE_NORMAL;
+ ga.ga_iot = normal_memt;
+ /* XXX bus_space_map() */
ga.ga_ioh = MIPS_PHYS_TO_KSEG1(ga.ga_addr);
ga.ga_dmat = &sgimips_default_bus_dma_tag;
ga.ga_product = -1;
@@ -252,7 +252,7 @@ gio_attach(device_t parent, device_t sel
ga.ga_slot = slot_bases[i].slot;
ga.ga_addr = slot_bases[i].base;
- ga.ga_iot = SGIMIPS_BUS_SPACE_NORMAL;
+ ga.ga_iot = normal_memt;
ga.ga_ioh = MIPS_PHYS_TO_KSEG1(ga.ga_addr);
ga.ga_dmat = &sgimips_default_bus_dma_tag;
@@ -366,7 +366,7 @@ gio_cnattach(void)
ga.ga_slot = -1;
ga.ga_addr = gfx_bases[i].base;
- ga.ga_iot = SGIMIPS_BUS_SPACE_NORMAL;
+ ga.ga_iot = normal_memt;
ga.ga_ioh = MIPS_PHYS_TO_KSEG1(ga.ga_addr);
ga.ga_dmat = &sgimips_default_bus_dma_tag;
ga.ga_product = -1;
Index: src/sys/arch/sgimips/gio/pci_gio.c
diff -u src/sys/arch/sgimips/gio/pci_gio.c:1.13 src/sys/arch/sgimips/gio/pci_gio.c:1.14
--- src/sys/arch/sgimips/gio/pci_gio.c:1.13 Wed Apr 2 00:46:11 2014
+++ src/sys/arch/sgimips/gio/pci_gio.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_gio.c,v 1.13 2014/04/02 00:46:11 ozaki-r Exp $ */
+/* $NetBSD: pci_gio.c,v 1.14 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2006 Stephen M. Rumble
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_gio.c,v 1.13 2014/04/02 00:46:11 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_gio.c,v 1.14 2015/02/18 16:47:58 macallan Exp $");
/*
* Glue for PCI devices that are connected to the GIO bus by various little
@@ -102,6 +102,10 @@ static void giopci_intr_disestablish(voi
CFATTACH_DECL_NEW(giopci, sizeof(struct giopci_softc),
giopci_match, giopci_attach, NULL, NULL);
+static void pcimem_bus_mem_init(bus_space_tag_t, void *);
+static struct mips_bus_space pcimem_mbst;
+bus_space_tag_t gio_pci_memt = NULL;
+
static int
giopci_match(device_t parent, cfdata_t match, void *aux)
{
@@ -145,6 +149,9 @@ giopci_attach(device_t parent, device_t
sc->sc_slot = ga->ga_slot;
sc->sc_gprid = GIO_PRODUCT_PRODUCTID(ga->ga_product);
+ pcimem_bus_mem_init(&pcimem_mbst, NULL);
+ gio_pci_memt = &pcimem_mbst;
+
if (mach_type == MACH_SGI_IP22 &&
mach_subtype == MACH_SGI_IP22_FULLHOUSE)
arb = GIO_ARB_RT | GIO_ARB_MST | GIO_ARB_PIPE;
@@ -220,7 +227,7 @@ giopci_attach(device_t parent, device_t
#endif
memset(&pba, 0, sizeof(pba));
- pba.pba_memt = SGIMIPS_BUS_SPACE_MEM;
+ pba.pba_memt = gio_pci_memt;
pba.pba_dmat = ga->ga_dmat;
pba.pba_pc = pc;
pba.pba_flags = PCI_FLAGS_MEM_OKAY;
@@ -322,3 +329,14 @@ giopci_intr_disestablish(void *cookie)
panic("giopci_intr_disestablish: impossible.");
}
+
+#define CHIP pcimem
+#define CHIP_MEM /* defined */
+#define CHIP_WRONG_ENDIAN
+
+#define CHIP_W1_BUS_START(v) 0x00000000UL
+#define CHIP_W1_BUS_END(v) 0xffffffffUL
+#define CHIP_W1_SYS_START(v) 0x00000000UL
+#define CHIP_W1_SYS_END(v) 0xffffffffUL
+
+#include <mips/mips/bus_space_alignstride_chipdep.c>
Index: src/sys/arch/sgimips/hpc/hpc.c
diff -u src/sys/arch/sgimips/hpc/hpc.c:1.67 src/sys/arch/sgimips/hpc/hpc.c:1.68
--- src/sys/arch/sgimips/hpc/hpc.c:1.67 Sat Oct 27 17:18:09 2012
+++ src/sys/arch/sgimips/hpc/hpc.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: hpc.c,v 1.67 2012/10/27 17:18:09 chs Exp $ */
+/* $NetBSD: hpc.c,v 1.68 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hpc.c,v 1.67 2012/10/27 17:18:09 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hpc.c,v 1.68 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -44,7 +44,6 @@ __KERNEL_RCSID(0, "$NetBSD: hpc.c,v 1.67
#include <sys/reboot.h>
#include <sys/callout.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
#include <sys/bus.h>
#include <machine/machtype.h>
#include <machine/sysconf.h>
@@ -372,6 +371,12 @@ static int hpc_read_eeprom(int, bus_spac
CFATTACH_DECL_NEW(hpc, sizeof(struct hpc_softc),
hpc_match, hpc_attach, NULL, NULL);
+static void hpc_bus_mem_init(bus_space_tag_t, void *);
+
+static struct mips_bus_space hpc_mbst;
+bus_space_tag_t hpc_memt = NULL;
+
+
static int
hpc_match(device_t parent, cfdata_t cf, void *aux)
{
@@ -498,12 +503,15 @@ hpc_attach(device_t parent, device_t sel
}
}
- sc->sc_ct = SGIMIPS_BUS_SPACE_HPC;
+ hpc_bus_mem_init(&hpc_mbst, NULL);
+ hpc_memt = &hpc_mbst;
+
+ sc->sc_ct = normal_memt;
sc->sc_ch = ga->ga_ioh;
sc->sc_base = ga->ga_addr;
- hpc_read_eeprom(hpctype, SGIMIPS_BUS_SPACE_HPC,
+ hpc_read_eeprom(hpctype, normal_memt,
MIPS_PHYS_TO_KSEG1(sc->sc_base), ha.hpc_eeprom,
sizeof(ha.hpc_eeprom));
@@ -518,7 +526,7 @@ hpc_attach(device_t parent, device_t sel
ha.ha_irq = hd->hd_irq;
/* XXX This is disgusting. */
- ha.ha_st = SGIMIPS_BUS_SPACE_HPC;
+ ha.ha_st = normal_memt;
ha.ha_sh = MIPS_PHYS_TO_KSEG1(sc->sc_base);
ha.ha_dmat = &sgimips_default_bus_dma_tag;
if (hpctype == 3)
@@ -730,7 +738,7 @@ hpc_read_eeprom(int hpctype, bus_space_t
offset = (hpctype == 3) ? HPC3_EEPROM_DATA : HPC1_AUX_REGS;
- tag = SGIMIPS_BUS_SPACE_NORMAL;
+ tag = normal_memt;
if (bus_space_subregion(t, h, offset, 1, &bsh) != 0)
return (1);
@@ -755,3 +763,14 @@ hpc_read_eeprom(int hpctype, bus_space_t
return (0);
}
+
+#define CHIP hpc
+#define CHIP_MEM /* defined */
+#define CHIP_ALIGN_STRIDE 2
+#define CHIP_ACCESS_SIZE 4
+#define CHIP_W1_BUS_START(v) 0x00000000UL
+#define CHIP_W1_BUS_END(v) 0xffffffffUL
+#define CHIP_W1_SYS_START(v) 0x00000000UL
+#define CHIP_W1_SYS_END(v) 0xffffffffUL
+
+#include <mips/mips/bus_space_alignstride_chipdep.c>
Index: src/sys/arch/sgimips/hpc/if_sq.c
diff -u src/sys/arch/sgimips/hpc/if_sq.c:1.43 src/sys/arch/sgimips/hpc/if_sq.c:1.44
--- src/sys/arch/sgimips/hpc/if_sq.c:1.43 Thu Feb 2 19:43:00 2012
+++ src/sys/arch/sgimips/hpc/if_sq.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: if_sq.c,v 1.43 2012/02/02 19:43:00 tls Exp $ */
+/* $NetBSD: if_sq.c,v 1.44 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2001 Rafal K. Boni
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_sq.c,v 1.43 2012/02/02 19:43:00 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_sq.c,v 1.44 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
@@ -124,9 +124,9 @@ CFATTACH_DECL_NEW(sq, sizeof(struct sq_s
#define ETHER_PAD_LEN (ETHER_MIN_LEN - ETHER_CRC_LEN)
#define sq_seeq_read(sc, off) \
- bus_space_read_1(sc->sc_regt, sc->sc_regh, off)
+ bus_space_read_1(sc->sc_regt, sc->sc_regh, (off << 2) + 3)
#define sq_seeq_write(sc, off, val) \
- bus_space_write_1(sc->sc_regt, sc->sc_regh, off, val)
+ bus_space_write_1(sc->sc_regt, sc->sc_regh, (off << 2) + 3, val)
#define sq_hpc_read(sc, off) \
bus_space_read_4(sc->sc_hpct, sc->sc_hpch, off)
Index: src/sys/arch/sgimips/hpc/panel.c
diff -u src/sys/arch/sgimips/hpc/panel.c:1.2 src/sys/arch/sgimips/hpc/panel.c:1.3
--- src/sys/arch/sgimips/hpc/panel.c:1.2 Wed Feb 16 23:44:19 2011
+++ src/sys/arch/sgimips/hpc/panel.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: panel.c,v 1.2 2011/02/16 23:44:19 jmcneill Exp $ */
+/* $NetBSD: panel.c,v 1.3 2015/02/18 16:47:58 macallan Exp $ */
/*-
* Copyright (c) 2009 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: panel.c,v 1.2 2011/02/16 23:44:19 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: panel.c,v 1.3 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -96,7 +96,7 @@ panel_attach(device_t parent, device_t s
aprint_normal("\n");
if (bus_space_subregion(haa->ha_st, haa->ha_sh, haa->ha_devoff,
- 0x1, /* just a single register */
+ 0x4, /* just a single register */
&sc->sc_hreg)) {
aprint_error(": unable to map panel register\n");
return;
@@ -126,8 +126,8 @@ panel_intr(void *cookie)
struct panel_softc *sc = cookie;
uint8_t reg;
- reg = bus_space_read_1(sc->sc_tag, sc->sc_hreg, 0);
- bus_space_write_1(sc->sc_tag, sc->sc_hreg, 0,
+ reg = bus_space_read_4(sc->sc_tag, sc->sc_hreg, 0);
+ bus_space_write_4(sc->sc_tag, sc->sc_hreg, 0,
IOC_PANEL_VDOWN_IRQ | IOC_PANEL_VUP_IRQ | IOC_PANEL_POWER_IRQ);
if ((reg & IOC_PANEL_POWER_IRQ) == 0) {
if (!sc->sc_fired)
Index: src/sys/arch/sgimips/hpc/pckbc_hpc.c
diff -u src/sys/arch/sgimips/hpc/pckbc_hpc.c:1.9 src/sys/arch/sgimips/hpc/pckbc_hpc.c:1.10
--- src/sys/arch/sgimips/hpc/pckbc_hpc.c:1.9 Sat Mar 15 13:23:24 2008
+++ src/sys/arch/sgimips/hpc/pckbc_hpc.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pckbc_hpc.c,v 1.9 2008/03/15 13:23:24 cube Exp $ */
+/* $NetBSD: pckbc_hpc.c,v 1.10 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2003 Christopher SEKIYA
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pckbc_hpc.c,v 1.9 2008/03/15 13:23:24 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pckbc_hpc.c,v 1.10 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -111,7 +111,7 @@ pckbc_hpc_attach(device_t parent, device
t = malloc(sizeof(struct pckbc_internal), M_DEVBUF,
M_WAITOK | M_ZERO);
- t->t_iot = haa->ha_st;
+ t->t_iot = hpc_memt;
t->t_ioh_d = ioh_d;
t->t_ioh_c = ioh_c;
t->t_addr = haa->ha_sh;
Index: src/sys/arch/sgimips/hpc/wdsc.c
diff -u src/sys/arch/sgimips/hpc/wdsc.c:1.33 src/sys/arch/sgimips/hpc/wdsc.c:1.34
--- src/sys/arch/sgimips/hpc/wdsc.c:1.33 Sat Oct 27 17:18:09 2012
+++ src/sys/arch/sgimips/hpc/wdsc.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: wdsc.c,v 1.33 2012/10/27 17:18:09 chs Exp $ */
+/* $NetBSD: wdsc.c,v 1.34 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2001 Wayne Knowles
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdsc.c,v 1.33 2012/10/27 17:18:09 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdsc.c,v 1.34 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -105,9 +105,6 @@ wdsc_match(device_t parent, cfdata_t cf,
haa->hpc_regs->scsi0_ctl);
asr = MIPS_PHYS_TO_KSEG1(haa->ha_sh + haa->ha_devoff);
- /* XXX: hpc1 offset due to SGIMIPS_BUS_SPACE_HPC brain damage */
- asr = (asr + 3) & ~0x3;
-
if (platform.badaddr((void *)reset, sizeof(reset)))
return 0;
@@ -149,14 +146,14 @@ wdsc_attach(device_t parent, device_t se
wsc->sc_hpcdma.hpc = haa->hpc_regs;
if ((err = bus_space_subregion(haa->ha_st, haa->ha_sh,
- haa->ha_devoff + 0, 4, &sc->sc_asr_regh)) != 0) {
+ haa->ha_devoff + 0 + 3, 1, &sc->sc_asr_regh)) != 0) {
printf(": unable to map asr reg, err=%d\n", err);
return;
}
if ((err = bus_space_subregion(haa->ha_st, haa->ha_sh,
- haa->ha_devoff + 4, 4, &sc->sc_data_regh)) != 0) {
- printf(": unable to map asr reg, err=%d\n", err);
+ haa->ha_devoff + 4 + 3, 1, &sc->sc_data_regh)) != 0) {
+ printf(": unable to map data reg, err=%d\n", err);
return;
}
Index: src/sys/arch/sgimips/include/bus_defs.h
diff -u src/sys/arch/sgimips/include/bus_defs.h:1.1 src/sys/arch/sgimips/include/bus_defs.h:1.2
--- src/sys/arch/sgimips/include/bus_defs.h:1.1 Fri Jul 1 17:10:01 2011
+++ src/sys/arch/sgimips/include/bus_defs.h Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_defs.h,v 1.1 2011/07/01 17:10:01 dyoung Exp $ */
+/* $NetBSD: bus_defs.h,v 1.2 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -35,173 +35,22 @@
#include <mips/locore.h>
-#define __BUS_SPACE_HAS_STREAM_METHODS
-
-/*
- * Utility macros; do not use outside this file.
- */
-#define __PB_TYPENAME_PREFIX(BITS) ___CONCAT(u_int,BITS)
-#define __PB_TYPENAME(BITS) ___CONCAT(__PB_TYPENAME_PREFIX(BITS),_t)
-
-/*
- * Bus address and size types
- */
-typedef uint64_t bus_addr_t;
-typedef uint64_t bus_size_t;
-
-/*
- * Access methods for bus resources and address space.
- */
-typedef int bus_space_tag_t;
-typedef u_long bus_space_handle_t;
-
/*
* Values for sgimips bus space tag, not to be used directly by MI code.
+ * XXX these need spacial handling
*/
-#define SGIMIPS_BUS_SPACE_NORMAL 0
-#define SGIMIPS_BUS_SPACE_IP6_DPCLOCK 1
-#define SGIMIPS_BUS_SPACE_HPC 2
-#define SGIMIPS_BUS_SPACE_MEM 3
-#define SGIMIPS_BUS_SPACE_MACE 4
-#define SGIMIPS_BUS_SPACE_IO 5
-#define SGIMIPS_BUS_SPACE_CRIME 6
-
-/*
- * int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
- * bus_size_t size, int flags, bus_space_handle_t *bshp);
- *
- * Map a region of bus space.
- */
-
-#define BUS_SPACE_MAP_CACHEABLE 0x01
-#define BUS_SPACE_MAP_LINEAR 0x02
-#define BUS_SPACE_MAP_PREFETCHABLE 0x04
-
-#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
-#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
-
-#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
-
-/*
- * Flags used in various bus DMA methods.
- */
-#define BUS_DMA_WAITOK 0x000 /* safe to sleep (pseudo-flag) */
-#define BUS_DMA_NOWAIT 0x001 /* not safe to sleep */
-#define BUS_DMA_ALLOCNOW 0x002 /* perform resource allocation now */
-#define BUS_DMA_COHERENT 0x004 /* hint: map memory DMA coherent */
-#define BUS_DMA_STREAMING 0x008 /* hint: sequential, unidirectional */
-#define BUS_DMA_BUS1 0x010 /* placeholders for bus functions... */
-#define BUS_DMA_BUS2 0x020
-#define BUS_DMA_BUS3 0x040
-#define BUS_DMA_BUS4 0x080
-#define BUS_DMA_READ 0x100 /* mapping is device -> memory only */
-#define BUS_DMA_WRITE 0x200 /* mapping is memory -> device only */
-#define BUS_DMA_NOCACHE 0x400 /* hint: map non-cached memory */
-
-#define SGIMIPS_DMAMAP_COHERENT 0x10000 /* no cache flush necessary on sync */
-
-/* Forwards needed by prototypes below. */
-struct mbuf;
-struct uio;
-/*
- * Operations performed by bus_dmamap_sync().
- */
-#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
-#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
-#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
-#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
+#include <mips/bus_space_defs.h>
-typedef struct sgimips_bus_dma_tag *bus_dma_tag_t;
-typedef struct sgimips_bus_dmamap *bus_dmamap_t;
+extern bus_space_tag_t normal_memt; /* normal, non-spaced */
+extern bus_space_tag_t mace_isa_memt; /* spaced, for MACE 'ISA' */
+extern bus_space_tag_t mace_pci_memt; /* address-twiddled to look little */
+extern bus_space_tag_t mace_pci_iot; /* endian with <32bit accesses */
+extern bus_space_tag_t gio_pci_memt; /* same, without windows */
+extern bus_space_tag_t hpc_memt; /* 8bit regs at 32bit spacing */
-#define BUS_DMA_TAG_VALID(t) ((t) != (bus_dma_tag_t)0)
-
-/*
- * bus_dma_segment_t
- *
- * Describes a single contiguous DMA transaction. Values
- * are suitable for programming into DMA registers.
- */
-struct sgimips_bus_dma_segment {
- bus_addr_t ds_addr; /* DMA address */
- bus_size_t ds_len; /* length of transfer */
- vaddr_t _ds_vaddr; /* virtual address, 0 if invalid */
-};
-typedef struct sgimips_bus_dma_segment bus_dma_segment_t;
+#include <mips/bus_dma_defs.h>
+#define SGIMIPS_DMAMAP_COHERENT _BUS_DMAMAP_COHERENT
-/*
- * bus_dma_tag_t
- *
- * A machine-dependent opaque type describing the implementation of
- * DMA for a given bus.
- */
-
-struct sgimips_bus_dma_tag {
- /*
- * XXX soren O2: 0x40000000
- * ikke endnu (bus.c)
- */
-#if 0
- bus_addr_t _wbase; /* DMA window base */
- bus_addr_t _wbase_swap; /* DMA window base (byteswapped) */
-#endif
-
- /*
- * DMA mapping methods.
- */
- int (*_dmamap_create)(bus_dma_tag_t, bus_size_t, int,
- bus_size_t, bus_size_t, int, bus_dmamap_t *);
- void (*_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t);
- int (*_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *,
- bus_size_t, struct proc *, int);
- int (*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
- struct mbuf *, int);
- int (*_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t,
- struct uio *, int);
- int (*_dmamap_load_raw)(bus_dma_tag_t, bus_dmamap_t,
- bus_dma_segment_t *, int, bus_size_t, int);
- void (*_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
- void (*_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t,
- bus_addr_t, bus_size_t, int);
-
- /*
- * DMA memory utility functions.
- */
- int (*_dmamem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t,
- bus_size_t, bus_dma_segment_t *, int, int *, int);
- void (*_dmamem_free)(bus_dma_tag_t,
- bus_dma_segment_t *, int);
- int (*_dmamem_map)(bus_dma_tag_t, bus_dma_segment_t *,
- int, size_t, void **, int);
- void (*_dmamem_unmap)(bus_dma_tag_t, void *, size_t);
- paddr_t (*_dmamem_mmap)(bus_dma_tag_t, bus_dma_segment_t *,
- int, off_t, int, int);
-};
-
-/*
- * bus_dmamap_t
- *
- * Describes a DMA mapping.
- */
-struct sgimips_bus_dmamap {
- /*
- * PRIVATE MEMBERS: not for use my machine-independent code.
- */
- bus_size_t _dm_size; /* largest DMA transfer mappable */
- int _dm_segcnt; /* number of segs this map can map */
- bus_size_t _dm_maxmaxsegsz; /* fixed largest possible segment */
- bus_size_t _dm_boundary; /* don't cross this */
- int _dm_flags; /* misc. flags */
- struct vmspace *_dm_vmspace; /* vmspace that owns the mapping */
-
- /*
- * PUBLIC MEMBERS: these are used by machine-independent code.
- */
- bus_size_t dm_maxsegsz; /* largest possible segment */
- bus_size_t dm_mapsize; /* size of the mapping */
- int dm_nsegs; /* # valid segments in mapping */
- bus_dma_segment_t dm_segs[1]; /* segments; variable length */
-};
#endif /* _SGIMIPS_BUS_DEFS_H_ */
Index: src/sys/arch/sgimips/include/bus_funcs.h
diff -u src/sys/arch/sgimips/include/bus_funcs.h:1.1 src/sys/arch/sgimips/include/bus_funcs.h:1.2
--- src/sys/arch/sgimips/include/bus_funcs.h:1.1 Fri Jul 1 17:10:01 2011
+++ src/sys/arch/sgimips/include/bus_funcs.h Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_funcs.h,v 1.1 2011/07/01 17:10:01 dyoung Exp $ */
+/* $NetBSD: bus_funcs.h,v 1.2 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -35,100 +35,15 @@
/* Initialization for bus_dmamap_sync, which differs from MIPS1 to MIPS3 */
+void mace_init_bus(void);
void sgimips_bus_dma_init(void);
-#define bus_space_read_stream_1 bus_space_read_1
-#define bus_space_write_stream_1 bus_space_write_1
-#define bus_space_read_region_stream_1 bus_space_read_reigion_1
-#define bus_space_read_multi_stream_1 bus_space_read_multi_1
-#define bus_space_write_multi_stream_1 bus_space_write_multi_1
-#define bus_space_write_region_stream_1 bus_space_write_region_1
+#include <mips/bus_space_funcs.h>
+
+#include <mips/bus_dma_funcs.h>
+extern struct mips_bus_dma_tag sgimips_default_bus_dma_tag;
-/*
- * Bus read/write barrier methods.
- *
- * void bus_space_barrier(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * bus_size_t len, int flags);
- *
- * On the MIPS, we just flush the write buffer.
- */
-#define bus_space_barrier(t, h, o, l, f) \
- ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f), \
- wbflush()))
-
-/* Forwards needed by prototypes below. */
-struct mbuf;
-struct uio;
-
-#define bus_dmamap_create(t, s, n, m, b, f, p) \
- (*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
-#define bus_dmamap_destroy(t, p) \
- (*(t)->_dmamap_destroy)((t), (p))
-#define bus_dmamap_load(t, m, b, s, p, f) \
- (*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
-#define bus_dmamap_load_mbuf(t, m, b, f) \
- (*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
-#define bus_dmamap_load_uio(t, m, u, f) \
- (*(t)->_dmamap_load_uio)((t), (m), (u), (f))
-#define bus_dmamap_load_raw(t, m, sg, n, s, f) \
- (*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
-#define bus_dmamap_unload(t, p) \
- (*(t)->_dmamap_unload)((t), (p))
-#define bus_dmamap_sync(t, p, o, l, ops) \
- (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops))
-
-#define bus_dmamem_alloc(t, s, a, b, sg, n, r, f) \
- (*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
-#define bus_dmamem_free(t, sg, n) \
- (*(t)->_dmamem_free)((t), (sg), (n))
-#define bus_dmamem_map(t, sg, n, s, k, f) \
- (*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
-#define bus_dmamem_unmap(t, k, s) \
- (*(t)->_dmamem_unmap)((t), (k), (s))
-#define bus_dmamem_mmap(t, sg, n, o, p, f) \
- (*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
-
-#define bus_dmatag_subregion(t, mna, mxa, nt, f) EOPNOTSUPP
-#define bus_dmatag_destroy(t)
-
-#ifdef _SGIMIPS_BUS_DMA_PRIVATE
-
-int _bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t,
- bus_size_t, int, bus_dmamap_t *);
-void _bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t);
-int _bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *,
- bus_size_t, struct proc *, int);
-int _bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t,
- struct mbuf *, int);
-int _bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t,
- struct uio *, int);
-int _bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t,
- bus_dma_segment_t *, int, bus_size_t, int);
-void _bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);
void _bus_dmamap_sync_mips1(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
bus_size_t, int);
-void _bus_dmamap_sync_mips3(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
- bus_size_t, int);
-
-int _bus_dmamem_alloc(bus_dma_tag_t tag, bus_size_t size,
- bus_size_t alignment, bus_size_t boundary,
- bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
-void _bus_dmamem_free(bus_dma_tag_t tag, bus_dma_segment_t *segs,
- int nsegs);
-int _bus_dmamem_map(bus_dma_tag_t tag, bus_dma_segment_t *segs,
- int nsegs, size_t size, void **kvap, int flags);
-void _bus_dmamem_unmap(bus_dma_tag_t tag, void *kva,
- size_t size);
-paddr_t _bus_dmamem_mmap(bus_dma_tag_t tag, bus_dma_segment_t *segs,
- int nsegs, off_t off, int prot, int flags);
-
-int _bus_dmamem_alloc_range(bus_dma_tag_t tag, bus_size_t size,
- bus_size_t alignment, bus_size_t boundary,
- bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,
- vaddr_t low, vaddr_t high);
-
-extern struct sgimips_bus_dma_tag sgimips_default_bus_dma_tag;
-#endif /* _SGIMIPS_BUS_DMA_PRIVATE */
#endif /* _SGIMIPS_BUS_FUNCS_H_ */
Index: src/sys/arch/sgimips/include/pci_machdep.h
diff -u src/sys/arch/sgimips/include/pci_machdep.h:1.13 src/sys/arch/sgimips/include/pci_machdep.h:1.14
--- src/sys/arch/sgimips/include/pci_machdep.h:1.13 Tue Apr 1 12:57:46 2014
+++ src/sys/arch/sgimips/include/pci_machdep.h Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_machdep.h,v 1.13 2014/04/01 12:57:46 ozaki-r Exp $ */
+/* $NetBSD: pci_machdep.h,v 1.14 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
@@ -76,7 +76,7 @@ struct sgimips_pci_chipset {
struct extent *pc_ioext; /* PCI I/O space extent */
};
-extern struct sgimips_bus_dma_tag pci_bus_dma_tag;
+extern struct mips_bus_dma_tag pci_bus_dma_tag;
/*
* Functions provided to machine-independent PCI code.
Index: src/sys/arch/sgimips/ioc/ioc.c
diff -u src/sys/arch/sgimips/ioc/ioc.c:1.10 src/sys/arch/sgimips/ioc/ioc.c:1.11
--- src/sys/arch/sgimips/ioc/ioc.c:1.10 Sat Oct 27 17:18:10 2012
+++ src/sys/arch/sgimips/ioc/ioc.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ioc.c,v 1.10 2012/10/27 17:18:10 chs Exp $ */
+/* $NetBSD: ioc.c,v 1.11 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2003 Christopher Sekiya
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ioc.c,v 1.10 2012/10/27 17:18:10 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioc.c,v 1.11 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -103,9 +103,9 @@ ioc_attach(device_t parent, device_t sel
callout_init(&ioc_blink_ch, 0);
#endif
- sc->sc_iot = SGIMIPS_BUS_SPACE_HPC;
+ sc->sc_iot = normal_memt;
- if (bus_space_map(sc->sc_iot, maa->ma_addr, 0,
+ if (bus_space_map(sc->sc_iot, maa->ma_addr, 0x100,
BUS_SPACE_MAP_LINEAR, &sc->sc_ioh))
panic("ioc_attach: could not allocate memory\n");
@@ -188,7 +188,7 @@ ioc_search(device_t parent, cfdata_t cf,
do {
iaa.iaa_offset = cf->cf_loc[IOCCF_OFFSET];
iaa.iaa_intr = cf->cf_loc[IOCCF_INTR];
- iaa.iaa_st = SGIMIPS_BUS_SPACE_HPC;
+ iaa.iaa_st = normal_memt;
iaa.iaa_sh = sc->sc_ioh; /* XXX */
tryagain = 0;
Index: src/sys/arch/sgimips/ioc/oioc.c
diff -u src/sys/arch/sgimips/ioc/oioc.c:1.3 src/sys/arch/sgimips/ioc/oioc.c:1.4
--- src/sys/arch/sgimips/ioc/oioc.c:1.3 Sat Oct 27 17:18:10 2012
+++ src/sys/arch/sgimips/ioc/oioc.c Wed Feb 18 16:47:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: oioc.c,v 1.3 2012/10/27 17:18:10 chs Exp $ */
+/* $NetBSD: oioc.c,v 1.4 2015/02/18 16:47:58 macallan Exp $ */
/*
* Copyright (c) 2009 Stephen M. Rumble
@@ -37,12 +37,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: oioc.c,v 1.3 2012/10/27 17:18:10 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: oioc.c,v 1.4 2015/02/18 16:47:58 macallan Exp $");
#include <sys/param.h>
#include <sys/device.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
#include <machine/cpu.h>
#include <machine/locore.h>
#include <machine/autoconf.h>
@@ -99,8 +98,8 @@ oioc_attach(device_t parent, device_t se
uint32_t reg1, reg2;
int oiocrev, i;
- sc->sc_iot = SGIMIPS_BUS_SPACE_NORMAL;
- if (bus_space_map(sc->sc_iot, ma->ma_addr, 0,
+ sc->sc_iot = normal_memt;
+ if (bus_space_map(sc->sc_iot, ma->ma_addr, OIOC_SCSI_REGS_SIZE,
BUS_SPACE_MAP_LINEAR, &sc->sc_ioh))
panic("oioc_attach: could not allocate memory\n");
@@ -146,7 +145,7 @@ oioc_attach(device_t parent, device_t se
oa.oa_name = oioc_devices[i].od_name;
oa.oa_irq = oioc_devices[i].od_irq;
oa.oa_burst_dma = sc->sc_burst_dma;
- oa.oa_st = SGIMIPS_BUS_SPACE_NORMAL;
+ oa.oa_st = normal_memt;
oa.oa_sh = sc->sc_ioh;
oa.oa_dmat = &sgimips_default_bus_dma_tag;
config_found_ia(self, "oioc", &oa, oioc_print);
Index: src/sys/arch/sgimips/mace/com_mace.c
diff -u src/sys/arch/sgimips/mace/com_mace.c:1.9 src/sys/arch/sgimips/mace/com_mace.c:1.10
--- src/sys/arch/sgimips/mace/com_mace.c:1.9 Fri Jul 1 18:53:47 2011
+++ src/sys/arch/sgimips/mace/com_mace.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: com_mace.c,v 1.9 2011/07/01 18:53:47 dyoung Exp $ */
+/* $NetBSD: com_mace.c,v 1.10 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: com_mace.c,v 1.9 2011/07/01 18:53:47 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: com_mace.c,v 1.10 2015/02/18 16:47:59 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -96,7 +96,7 @@ com_mace_attach(device_t parent, device_
*/
ioh = maa->maa_sh + maa->maa_offset;
/* note that ioh on mac is *also* the iobase address */
- COM_INIT_REGS(sc->sc_regs, maa->maa_st, ioh, ioh);
+ COM_INIT_REGS(sc->sc_regs, mace_isa_memt, ioh, 0);
sc->sc_frequency = COM_FREQ;
Index: src/sys/arch/sgimips/mace/mace.c
diff -u src/sys/arch/sgimips/mace/mace.c:1.20 src/sys/arch/sgimips/mace/mace.c:1.21
--- src/sys/arch/sgimips/mace/mace.c:1.20 Mon Dec 16 15:45:29 2013
+++ src/sys/arch/sgimips/mace/mace.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: mace.c,v 1.20 2013/12/16 15:45:29 mrg Exp $ */
+/* $NetBSD: mace.c,v 1.21 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 2003 Christopher Sekiya
@@ -45,7 +45,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mace.c,v 1.20 2013/12/16 15:45:29 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mace.c,v 1.21 2015/02/18 16:47:59 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -61,7 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: mace.c,v 1.2
#include <uvm/uvm_extern.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
#include <sys/bus.h>
#include <machine/cpu.h>
#include <machine/locore.h>
@@ -107,6 +106,12 @@ static int mace_search(device_t, cfdata_
CFATTACH_DECL_NEW(mace, sizeof(struct mace_softc),
mace_match, mace_attach, NULL, NULL);
+static void mace_isa_bus_mem_init(bus_space_tag_t, void *);
+
+static struct mips_bus_space mace_isa_mbst;
+bus_space_tag_t mace_isa_memt = NULL;
+static int mace_isa_init = 0;
+
#if defined(BLINK)
static callout_t mace_blink_ch;
static void mace_blink(void *);
@@ -125,6 +130,16 @@ mace_match(device_t parent, struct cfdat
return 0;
}
+void
+mace_init_bus(void)
+{
+ if (mace_isa_init == 1)
+ return;
+ mace_isa_init = 1;
+ mace_isa_bus_mem_init(&mace_isa_mbst, NULL);
+ mace_isa_memt = &mace_isa_mbst;
+}
+
static void
mace_attach(device_t parent, device_t self, void *aux)
{
@@ -137,7 +152,7 @@ mace_attach(device_t parent, device_t se
callout_init(&mace_blink_ch, 0);
#endif
- sc->iot = SGIMIPS_BUS_SPACE_MACE;
+ sc->iot = normal_memt; /* for mace registers */
sc->dmat = &sgimips_default_bus_dma_tag;
if (bus_space_map(sc->iot, ma->ma_addr, 0,
@@ -151,6 +166,8 @@ mace_attach(device_t parent, device_t se
aprint_debug("%s: isa msk %#"PRIx64"\n", device_xname(self),
bus_space_read_8(sc->iot, sc->ioh, MACE_ISA_INT_MASK));
+ mace_init_bus();
+
/*
* Turn on most ISA interrupts. These are actually masked and
* registered via the CRIME, as the MACE ISA interrupt mask is
@@ -212,7 +229,7 @@ mace_search(device_t parent, struct cfda
maa.maa_offset = cf->cf_loc[MACECF_OFFSET];
maa.maa_intr = cf->cf_loc[MACECF_INTR];
maa.maa_intrmask = cf->cf_loc[MACECF_INTRMASK];
- maa.maa_st = SGIMIPS_BUS_SPACE_MACE;
+ maa.maa_st = normal_memt;
maa.maa_sh = sc->ioh; /* XXX */
maa.maa_dmat = &sgimips_default_bus_dma_tag;
maa.isa_ringbuffer = sc->isa_ringbuffer;
@@ -344,3 +361,14 @@ mace_blink(void *self)
}
#endif
+
+#define CHIP mace_isa
+#define CHIP_MEM /* defined */
+#define CHIP_ALIGN_STRIDE 8
+#define CHIP_ACCESS_SIZE 8
+#define CHIP_W1_BUS_START(v) 0x00000000UL
+#define CHIP_W1_BUS_END(v) 0xffffffffUL
+#define CHIP_W1_SYS_START(v) 0x00000000UL
+#define CHIP_W1_SYS_END(v) 0xffffffffUL
+
+#include <mips/mips/bus_space_alignstride_chipdep.c>
Index: src/sys/arch/sgimips/mace/mcclock_mace.c
diff -u src/sys/arch/sgimips/mace/mcclock_mace.c:1.16 src/sys/arch/sgimips/mace/mcclock_mace.c:1.17
--- src/sys/arch/sgimips/mace/mcclock_mace.c:1.16 Thu Nov 20 16:34:26 2014
+++ src/sys/arch/sgimips/mace/mcclock_mace.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: mcclock_mace.c,v 1.16 2014/11/20 16:34:26 christos Exp $ */
+/* $NetBSD: mcclock_mace.c,v 1.17 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 2001 Antti Kantee. All Rights Reserved.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mcclock_mace.c,v 1.16 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mcclock_mace.c,v 1.17 2015/02/18 16:47:59 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -165,7 +165,7 @@ ds1687_read(void *arg, unsigned int addr
{
struct mcclock_mace_softc *sc = arg;
- return bus_space_read_1(sc->sc_st, sc->sc_sh, addr);
+ return bus_space_read_1(sc->sc_st, sc->sc_sh, (addr << 8) + 7);
}
void
@@ -173,7 +173,7 @@ ds1687_write(void *arg, unsigned int add
{
struct mcclock_mace_softc *sc = arg;
- bus_space_write_1(sc->sc_st, sc->sc_sh, addr, data);
+ bus_space_write_1(sc->sc_st, sc->sc_sh, (addr << 8) + 7, data);
}
static int
Index: src/sys/arch/sgimips/mace/pci_mace.c
diff -u src/sys/arch/sgimips/mace/pci_mace.c:1.17 src/sys/arch/sgimips/mace/pci_mace.c:1.18
--- src/sys/arch/sgimips/mace/pci_mace.c:1.17 Sat Mar 29 19:28:30 2014
+++ src/sys/arch/sgimips/mace/pci_mace.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_mace.c,v 1.17 2014/03/29 19:28:30 christos Exp $ */
+/* $NetBSD: pci_mace.c,v 1.18 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 2001,2003 Christopher Sekiya
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_mace.c,v 1.17 2014/03/29 19:28:30 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_mace.c,v 1.18 2015/02/18 16:47:59 macallan Exp $");
#include "opt_pci.h"
#include "pci.h"
@@ -84,6 +84,13 @@ static int macepci_intr(void *);
CFATTACH_DECL_NEW(macepci, sizeof(struct macepci_softc),
macepci_match, macepci_attach, NULL, NULL);
+static void pcimem_bus_mem_init(bus_space_tag_t, void *);
+static void pciio_bus_mem_init(bus_space_tag_t, void *);
+static struct mips_bus_space pcimem_mbst;
+static struct mips_bus_space pciio_mbst;
+bus_space_tag_t mace_pci_memt = NULL;
+bus_space_tag_t mace_pci_iot = NULL;
+
static int
macepci_match(device_t parent, cfdata_t match, void *aux)
{
@@ -110,6 +117,11 @@ macepci_attach(device_t parent, device_t
rev = bus_space_read_4(pc->iot, pc->ioh, MACEPCI_REVISION);
printf(": rev %d\n", rev);
+ pcimem_bus_mem_init(&pcimem_mbst, NULL);
+ mace_pci_memt = &pcimem_mbst;
+ pciio_bus_mem_init(&pciio_mbst, NULL);
+ mace_pci_iot = &pciio_mbst;
+
pc->pc_bus_maxdevs = macepci_bus_maxdevs;
pc->pc_conf_read = macepci_conf_read;
pc->pc_conf_write = macepci_conf_write;
@@ -151,8 +163,8 @@ macepci_attach(device_t parent, device_t
pci_configure_bus(pc, pc->pc_ioext, pc->pc_memext, NULL, 0,
mips_cache_info.mci_dcache_align);
memset(&pba, 0, sizeof pba);
-/*XXX*/ pba.pba_iot = SGIMIPS_BUS_SPACE_IO;
-/*XXX*/ pba.pba_memt = SGIMIPS_BUS_SPACE_MEM;
+/*XXX*/ pba.pba_iot = mace_pci_iot;
+/*XXX*/ pba.pba_memt = mace_pci_memt;
pba.pba_dmat = &pci_bus_dma_tag;
pba.pba_dmat64 = NULL;
pba.pba_bus = 0;
@@ -347,3 +359,55 @@ macepci_intr(void *arg)
}
return 0;
}
+
+/*
+ * use the 32MB windows to access PCI space when running a 32bit kernel,
+ * use full views at >4GB in LP64
+ * XXX access to PCI space is endian-twiddled which can't be turned off so we
+ * need to instruct bus_space to un-twiddle them for us so 8bit and 16bit
+ * accesses look little-endian
+ */
+#define CHIP pcimem
+#define CHIP_MEM /* defined */
+#define CHIP_WRONG_ENDIAN
+
+/*
+ * the lower 2GB of PCI space are two views of system memory, with and without
+ * endianness twiddling
+ */
+#define CHIP_W1_BUS_START(v) 0x80000000UL
+#define CHIP_W1_BUS_END(v) 0xffffffffUL
+#ifdef _LP64
+#define CHIP_W1_SYS_START(v) MACE_PCI_HI_MEMORY
+#define CHIP_W1_SYS_END(v) MACE_PCI_HI_MEMORY + 0x7fffffffUL
+#else
+#define CHIP_W1_SYS_START(v) MACE_PCI_LOW_MEMORY
+#define CHIP_W1_SYS_END(v) MACE_PCI_LOW_MEMORY + 0x01ffffffUL
+#endif
+
+#include <mips/mips/bus_space_alignstride_chipdep.c>
+
+#undef CHIP
+#undef CHIP_W1_BUS_START
+#undef CHIP_W1_BUS_END
+#undef CHIP_W1_SYS_START
+#undef CHIP_W1_SYS_END
+
+#define CHIP pciio
+/*
+ * Even though it's PCI IO space, it's memory mapped so there is no reason not
+ * to allow linear mappings or mmapings into userland. In fact we may need to
+ * do just that in order to use things like PCI graphics cards in X.
+ */
+#define CHIP_MEM /* defined */
+#define CHIP_W1_BUS_START(v) 0x00000000UL
+#define CHIP_W1_BUS_END(v) 0xffffffffUL
+#ifdef _LP64
+#define CHIP_W1_SYS_START(v) MACE_PCI_HI_IO
+#define CHIP_W1_SYS_END(v) MACE_PCI_HI_IO + 0xffffffffUL
+#else
+#define CHIP_W1_SYS_START(v) MACE_PCI_LOW_IO
+#define CHIP_W1_SYS_END(v) MACE_PCI_LOW_IO + 0x01ffffffUL
+#endif
+
+#include <mips/mips/bus_space_alignstride_chipdep.c>
Index: src/sys/arch/sgimips/mace/pcireg_mace.h
diff -u src/sys/arch/sgimips/mace/pcireg_mace.h:1.2 src/sys/arch/sgimips/mace/pcireg_mace.h:1.3
--- src/sys/arch/sgimips/mace/pcireg_mace.h:1.2 Sun Dec 11 12:18:54 2005
+++ src/sys/arch/sgimips/mace/pcireg_mace.h Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pcireg_mace.h,v 1.2 2005/12/11 12:18:54 christos Exp $ */
+/* $NetBSD: pcireg_mace.h,v 1.3 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang
@@ -83,6 +83,7 @@
#define CONTROL_INT5_INVAL_BUFS 0x00200000
#define CONTROL_INT6_INVAL_BUFS 0x00400000
#define CONTROL_INT7_INVAL_BUFS 0x00800000
+#define CONTROL_INT_INVAL_MASK 0x00ff0000
#define CONTROL_OVERRUN_COND_I 0x01000000
#define CONTROL_PARITY_ERROR_I 0x02000000
#define CONTROL_SYSTEM_ERROR_I 0x04000000
Index: src/sys/arch/sgimips/pci/pci_machdep.c
diff -u src/sys/arch/sgimips/pci/pci_machdep.c:1.24 src/sys/arch/sgimips/pci/pci_machdep.c:1.25
--- src/sys/arch/sgimips/pci/pci_machdep.c:1.24 Sat Mar 29 19:28:30 2014
+++ src/sys/arch/sgimips/pci/pci_machdep.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_machdep.c,v 1.24 2014/03/29 19:28:30 christos Exp $ */
+/* $NetBSD: pci_machdep.c,v 1.25 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.24 2014/03/29 19:28:30 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.25 2015/02/18 16:47:59 macallan Exp $");
#include "opt_pci.h"
#include "pci.h"
@@ -47,7 +47,6 @@ __KERNEL_RCSID(0, "$NetBSD: pci_machdep.
#include <uvm/uvm_extern.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
#include <sys/bus.h>
#include <machine/intr.h>
#include <machine/sysconf.h>
@@ -57,7 +56,7 @@ __KERNEL_RCSID(0, "$NetBSD: pci_machdep.
#include <dev/pci/pcidevs.h>
#include <dev/pci/pciconf.h>
-struct sgimips_bus_dma_tag pci_bus_dma_tag;
+struct mips_bus_dma_tag pci_bus_dma_tag;
void
pci_attach_hook(device_t parent, device_t self, struct pcibus_attach_args *pba)
Index: src/sys/arch/sgimips/sgimips/bus.c
diff -u src/sys/arch/sgimips/sgimips/bus.c:1.65 src/sys/arch/sgimips/sgimips/bus.c:1.66
--- src/sys/arch/sgimips/sgimips/bus.c:1.65 Tue Oct 2 23:54:54 2012
+++ src/sys/arch/sgimips/sgimips/bus.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bus.c,v 1.65 2012/10/02 23:54:54 christos Exp $ */
+/* $NetBSD: bus.c,v 1.66 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.65 2012/10/02 23:54:54 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.66 2015/02/18 16:47:59 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -43,13 +43,12 @@ __KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.65
#include <sys/proc.h>
#include <sys/mbuf.h>
-#define _SGIMIPS_BUS_DMA_PRIVATE
+#define _MIPS_BUS_DMA_PRIVATE
+
#include <sys/bus.h>
#include <machine/cpu.h>
#include <machine/machtype.h>
-#include <dev/bus_dma/bus_dmamem_common.h>
-
#include <uvm/uvm_extern.h>
#include <mips/cpuregs.h>
@@ -60,51 +59,53 @@ __KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.65
#include "opt_sgimace.h"
-static int _bus_dmamap_load_buffer(bus_dmamap_t, void *, bus_size_t,
- struct vmspace *, int, vaddr_t *, int *, int);
-
-struct sgimips_bus_dma_tag sgimips_default_bus_dma_tag = {
- _bus_dmamap_create,
- _bus_dmamap_destroy,
- _bus_dmamap_load,
- _bus_dmamap_load_mbuf,
- _bus_dmamap_load_uio,
- _bus_dmamap_load_raw,
- _bus_dmamap_unload,
- NULL,
- _bus_dmamem_alloc,
- _bus_dmamem_free,
- _bus_dmamem_map,
- _bus_dmamem_unmap,
- _bus_dmamem_mmap,
+struct mips_bus_dma_tag sgimips_default_bus_dma_tag = {
+ ._dmamap_ops = _BUS_DMAMAP_OPS_INITIALIZER,
+ ._dmamem_ops = _BUS_DMAMEM_OPS_INITIALIZER,
+ ._dmatag_ops = _BUS_DMATAG_OPS_INITIALIZER,
};
+static void normal_bus_mem_init(bus_space_tag_t, void *);
+
+static struct mips_bus_space normal_mbst;
+bus_space_tag_t normal_memt = NULL;
+
+/*
+ * XXX
+ * I'm not sure how well the common MIPS bus_dma.c handles MIPS-I and I don't
+ * have any IP1x hardware, so I'll leave this in just in case it needs to be
+ * put back
+ */
+
void
sgimips_bus_dma_init(void)
{
+ printf("%s\n", __func__);
+ normal_bus_mem_init(&normal_mbst, NULL);
+ normal_memt = &normal_mbst;
+
+#if 0
switch (mach_type) {
/* R2000/R3000 */
case MACH_SGI_IP6 | MACH_SGI_IP10:
case MACH_SGI_IP12:
- sgimips_default_bus_dma_tag._dmamap_sync =
+ sgimips_default_bus_dma_tag._dmamap_ops.dmamap_sync =
_bus_dmamap_sync_mips1;
break;
- /* >=R4000*/
- case MACH_SGI_IP20:
- case MACH_SGI_IP22:
- case MACH_SGI_IP30:
- case MACH_SGI_IP32:
- sgimips_default_bus_dma_tag._dmamap_sync =
- _bus_dmamap_sync_mips3;
- break;
-
default:
panic("sgimips_bus_dma_init: unsupported mach type IP%d\n",
mach_type);
}
+#endif
}
+/*
+ * XXX
+ * left in for illustrative purposes
+ */
+
+#if 0
u_int8_t
bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
{
@@ -126,698 +127,8 @@ bus_space_read_1(bus_space_tag_t t, bus_
panic("no bus tag");
}
}
-
-void
-bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v)
-{
- switch (t) {
- case SGIMIPS_BUS_SPACE_NORMAL:
- *(volatile u_int8_t *)(vaddr_t)(h + o) = v;
- break;
- case SGIMIPS_BUS_SPACE_IP6_DPCLOCK:
- *(volatile u_int8_t *)(vaddr_t)(h + (o << 2)) = v;
- break;
- case SGIMIPS_BUS_SPACE_HPC:
- *(volatile u_int8_t *)(vaddr_t)(h + (o << 2) + 3) = v;
- break;
- case SGIMIPS_BUS_SPACE_MEM:
- case SGIMIPS_BUS_SPACE_IO:
- *(volatile u_int8_t *)(vaddr_t)(h + (o | 3) - (o & 3)) = v;
- break;
- case SGIMIPS_BUS_SPACE_MACE:
- *(volatile u_int8_t *)(vaddr_t)(h + (o << 8) + 7) = v;
- break;
- default:
- panic("no bus tag");
- }
-
- wbflush(); /* XXX */
-}
-
-u_int16_t
-bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
-{
- wbflush(); /* XXX ? */
-
- switch (t) {
- case SGIMIPS_BUS_SPACE_NORMAL:
- return *(volatile u_int16_t *)(vaddr_t)(h + o);
- case SGIMIPS_BUS_SPACE_HPC:
- return *(volatile u_int16_t *)(vaddr_t)(h + (o << 2) + 1);
- case SGIMIPS_BUS_SPACE_MEM:
- case SGIMIPS_BUS_SPACE_IO:
- return *(volatile u_int16_t *)(vaddr_t)(h + (o | 2) - (o & 3));
- default:
- panic("no bus tag");
- }
-}
-
-void
-bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v)
-{
- switch (t) {
- case SGIMIPS_BUS_SPACE_NORMAL:
- *(volatile u_int16_t *)(vaddr_t)(h + o) = v;
- break;
- case SGIMIPS_BUS_SPACE_HPC:
- *(volatile u_int16_t *)(vaddr_t)(h + (o << 2) + 1) = v;
- break;
- case SGIMIPS_BUS_SPACE_MEM:
- case SGIMIPS_BUS_SPACE_IO:
- *(volatile u_int16_t *)(vaddr_t)(h + (o | 2) - (o & 3)) = v;
- break;
- default:
- panic("no bus tag");
- }
-
- wbflush(); /* XXX */
-}
-
-u_int32_t
-bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t o)
-{
- u_int32_t reg;
-#ifdef MACE_NEEDS_DELAYS
- int s;
-#endif
-
- switch (tag) {
- case SGIMIPS_BUS_SPACE_MACE:
-#ifdef MACE_NEEDS_DELAYS
- s = splhigh();
- delay(10);
-#endif
- wbflush();
- reg = (*(volatile u_int32_t *)(vaddr_t)(bsh + o));
-#ifdef MACE_NEEDS_DELAYS
- delay(10);
- splx(s);
-#endif
- break;
- default:
- wbflush();
- reg = (*(volatile u_int32_t *)(vaddr_t)(bsh + o));
- break;
- }
- return reg;
-}
-
-
-void
-bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh,
- bus_size_t o, u_int32_t v)
-{
-#ifdef MACE_NEEDS_DELAYS
- int s;
-#endif
-
- switch (tag) {
- case SGIMIPS_BUS_SPACE_MACE:
-#ifdef MACE_NEEDS_DELAYS
- s = splhigh();
- delay(10);
-#endif
- *(volatile u_int32_t *)(vaddr_t)((bsh) + (o)) = (v);
- wbflush();
-#ifdef MACE_NEEDS_DELAYS
- delay(10);
- splx(s);
-#endif
- break;
- default:
- *(volatile u_int32_t *)(vaddr_t)((bsh) + (o)) = (v);
- wbflush(); /* XXX */
- break;
- }
-}
-
-u_int16_t
-bus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h,
- bus_size_t o)
-{
- u_int16_t v;
- wbflush(); /* XXX ? */
-
- switch (t) {
- case SGIMIPS_BUS_SPACE_NORMAL:
- return *(volatile u_int16_t *)(vaddr_t)(h + o);
- case SGIMIPS_BUS_SPACE_HPC:
- return *(volatile u_int16_t *)(vaddr_t)(h + (o << 2) + 1);
- case SGIMIPS_BUS_SPACE_MEM:
- case SGIMIPS_BUS_SPACE_IO:
- v = *(volatile u_int16_t *)(vaddr_t)(h + (o | 2) - (o & 3));
- return htole16(v);
- default:
- panic("no bus tag");
- }
-}
-
-u_int32_t
-bus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t bsh,
- bus_size_t o)
-{
- u_int32_t reg;
-#ifdef MACE_NEEDS_DELAYS
- int s;
-#endif
-
- switch (t) {
- case SGIMIPS_BUS_SPACE_MACE:
-#ifdef MACE_NEEDS_DELAYS
- s = splhigh();
- delay(10);
-#endif
- wbflush();
- reg = (*(volatile u_int32_t *)(vaddr_t)(bsh + o));
-#ifdef MACE_NEEDS_DELAYS
- delay(10);
- splx(s);
-#endif
- break;
- case SGIMIPS_BUS_SPACE_MEM:
- case SGIMIPS_BUS_SPACE_IO:
- wbflush();
- reg = (*(volatile u_int32_t *)(vaddr_t)(bsh + o));
- reg = htole32(reg);
- break;
- default:
- wbflush();
- reg = (*(volatile u_int32_t *)(vaddr_t)(bsh + o));
- break;
- }
- return reg;
-}
-
-void
-bus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h,
- bus_size_t o, u_int16_t v)
-{
- switch (t) {
- case SGIMIPS_BUS_SPACE_NORMAL:
- *(volatile u_int16_t *)(vaddr_t)(h + o) = v;
- break;
- case SGIMIPS_BUS_SPACE_HPC:
- *(volatile u_int16_t *)(vaddr_t)(h + (o << 2) + 1) = v;
- break;
- case SGIMIPS_BUS_SPACE_MEM:
- case SGIMIPS_BUS_SPACE_IO:
- v = le16toh(v);
- *(volatile u_int16_t *)(vaddr_t)(h + (o | 2) - (o & 3)) = v;
- break;
- default:
- panic("no bus tag");
- }
-
- wbflush(); /* XXX */
-}
-
-void
-bus_space_write_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
- bus_size_t o, u_int32_t v)
-{
-#ifdef MACE_NEEDS_DELAYS
- int s;
-#endif
-
- switch (tag) {
- case SGIMIPS_BUS_SPACE_MACE:
-#ifdef MACE_NEEDS_DELAYS
- s = splhigh();
- delay(10);
-#endif
- *(volatile u_int32_t *)(vaddr_t)((bsh) + (o)) = (v);
- wbflush();
-#ifdef MACE_NEEDS_DELAYS
- delay(10);
- splx(s);
-#endif
- break;
- case SGIMIPS_BUS_SPACE_IO:
- case SGIMIPS_BUS_SPACE_MEM:
- v = le32toh(v);
- *(volatile u_int32_t *)(vaddr_t)((bsh) + (o)) = (v);
- wbflush(); /* XXX */
- break;
- default:
- *(volatile u_int32_t *)(vaddr_t)((bsh) + (o)) = (v);
- wbflush(); /* XXX */
- break;
- }
-}
-
-#if defined(MIPS3)
-u_int64_t
-bus_space_read_8(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t o)
-{
- u_int64_t reg;
-#ifdef MACE_NEEDS_DELAYS
- int s;
-#endif
-
- /* see if we're properly aligned */
- KASSERT((o & 7) == 0);
-
- switch (tag) {
- case SGIMIPS_BUS_SPACE_MACE:
-#ifdef MACE_NEEDS_DELAYS
- s = splhigh();
- delay(10);
-#endif
- reg = mips3_ld((volatile uint64_t *)(vaddr_t)(bsh + o));
-#ifdef MACE_NEEDS_DELAYS
- delay(10);
- splx(s);
-#endif
- break;
- default:
- reg = mips3_ld((volatile uint64_t *)(vaddr_t)(bsh + o));
- break;
- }
- return reg;
-}
-
-void
-bus_space_write_8(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t o, u_int64_t v)
-{
-#ifdef MACE_NEEDS_DELAYS
- int s;
-#endif
-
- /* see if we're properly aligned */
- KASSERT((o & 7) == 0);
-
- switch (tag) {
- case SGIMIPS_BUS_SPACE_MACE:
-#ifdef MACE_NEEDS_DELAYS
- s = splhigh();
- delay(10);
-#endif
- mips3_sd((volatile uint64_t *)(vaddr_t)(bsh + o), v);
-#ifdef MACE_NEEDS_DELAYS
- delay(10);
- splx(s);
-#endif
- break;
- default:
- mips3_sd((volatile uint64_t *)(vaddr_t)(bsh + o), v);
- break;
- }
-}
-#endif /* MIPS3 */
-
-int
-bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size,
- int flags, bus_space_handle_t *bshp)
-{
- int cacheable = flags & BUS_SPACE_MAP_CACHEABLE;
-
- if (cacheable)
- *bshp = MIPS_PHYS_TO_KSEG0(bpa);
- else
- *bshp = MIPS_PHYS_TO_KSEG1(bpa);
-
-/*
- * XXX
- */
- /* XXX O2 */
- if (bpa > 0x80000000 && bpa < 0x82000000)
- *bshp = MIPS_PHYS_TO_KSEG1(MACE_PCI_LOW_MEMORY +
- (bpa & 0xfffffff));
- if (bpa < 0x00010000)
- *bshp = MIPS_PHYS_TO_KSEG1(MACE_PCI_LOW_IO + bpa);
-
- return 0;
-}
-
-int
-bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, bus_addr_t rend,
- bus_size_t size, bus_size_t alignment, bus_size_t boundary,
- int flags, bus_addr_t *bpap, bus_space_handle_t *bshp)
-{
- panic("bus_space_alloc: not implemented");
-}
-
-void
-bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
-{
- panic("bus_space_free: not implemented");
-}
-
-void
-bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
-{
- return;
-}
-
-int
-bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
- bus_size_t offset, bus_size_t size,
- bus_space_handle_t *nbshp)
-{
-
- *nbshp = bsh + offset;
- return 0;
-}
-
-void *
-bus_space_vaddr(bus_space_tag_t t, bus_space_handle_t bsh)
-{
- switch(t) {
- case SGIMIPS_BUS_SPACE_NORMAL:
- return ((void *)bsh);
-
- case SGIMIPS_BUS_SPACE_HPC:
- panic("bus_space_vaddr not supported on HPC space!");
-
- case SGIMIPS_BUS_SPACE_MEM:
- return ((void *)bsh);
-
- case SGIMIPS_BUS_SPACE_IO:
- panic("bus_space_vaddr not supported on I/O space!");
-
- default:
- panic("no bus tag");
- }
-}
-
-/*
- * Common function for DMA map creation. May be called by bus-specific
- * DMA map creation functions.
- */
-int
-_bus_dmamap_create(bus_dma_tag_t t, bus_size_t size, int nsegments,
- bus_size_t maxsegsz, bus_size_t boundary, int flags,
- bus_dmamap_t *dmamp)
-{
- struct sgimips_bus_dmamap *map;
- void *mapstore;
- size_t mapsize;
-
- /*
- * Allocate and initialize the DMA map. The end of the map
- * is a variable-sized array of segments, so we allocate enough
- * room for them in one shot.
- *
- * Note we don't preserve the WAITOK or NOWAIT flags. Preservation
- * of ALLOCNOW notifies others that we've reserved these resources,
- * and they are not to be freed.
- *
- * The bus_dmamap_t includes one bus_dma_segment_t, hence
- * the (nsegments - 1).
- */
- mapsize = sizeof(struct sgimips_bus_dmamap) +
- (sizeof(bus_dma_segment_t) * (nsegments - 1));
- if ((mapstore = malloc(mapsize, M_DMAMAP,
- (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK)) == NULL)
- return ENOMEM;
-
- memset(mapstore, 0, mapsize);
- map = (struct sgimips_bus_dmamap *)mapstore;
- map->_dm_size = size;
- map->_dm_segcnt = nsegments;
- map->_dm_maxmaxsegsz = maxsegsz;
- map->_dm_boundary = boundary;
- map->_dm_flags = flags & ~(BUS_DMA_WAITOK|BUS_DMA_NOWAIT);
- map->_dm_vmspace = NULL;
- map->dm_maxsegsz = maxsegsz;
- map->dm_mapsize = 0; /* no valid mappings */
- map->dm_nsegs = 0;
-
- *dmamp = map;
- return 0;
-}
-
-/*
- * Common function for DMA map destruction. May be called by bus-specific
- * DMA map destruction functions.
- */
-void
-_bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
-{
-
- free(map, M_DMAMAP);
-}
-extern paddr_t kvtophys(vaddr_t); /* XXX */
-
-/*
- * Utility function to load a linear buffer. lastaddrp holds state
- * between invocations (for multiple-buffer loads). segp contains
- * the starting segment on entrance, and the ending segment on exit.
- * first indicates if this is the first invocation of this function.
- */
-int
-_bus_dmamap_load_buffer(bus_dmamap_t map, void *buf, bus_size_t buflen,
- struct vmspace *vm, int flags, vaddr_t *lastaddrp,
- int *segp, int first)
-{
- bus_size_t sgsize;
- bus_addr_t lastaddr, baddr, bmask;
- paddr_t curaddr;
- vaddr_t vaddr = (vaddr_t)buf;
- int seg;
-
- lastaddr = *lastaddrp;
- bmask = ~(map->_dm_boundary - 1);
-
- for (seg = *segp; buflen > 0 ; ) {
- /*
- * Get the physical address for this segment.
- */
- if (!VMSPACE_IS_KERNEL_P(vm))
- (void) pmap_extract(vm_map_pmap(&vm->vm_map),
- vaddr, &curaddr);
- else
- curaddr = kvtophys(vaddr);
-
- /*
- * Compute the segment size, and adjust counts.
- */
- sgsize = PAGE_SIZE - ((u_long)vaddr & PGOFSET);
- if (buflen < sgsize)
- sgsize = buflen;
-
- /*
- * Make sure we don't cross any boundaries.
- */
- if (map->_dm_boundary > 0) {
- baddr = (curaddr + map->_dm_boundary) & bmask;
- if (sgsize > (baddr - curaddr))
- sgsize = (baddr - curaddr);
- }
-
- /*
- * Insert chunk into a segment, coalescing with
- * the previous segment if possible.
- */
- if (first) {
- map->dm_segs[seg].ds_addr = curaddr;
- map->dm_segs[seg].ds_len = sgsize;
- map->dm_segs[seg]._ds_vaddr = vaddr;
- first = 0;
- } else {
- if (curaddr == lastaddr &&
- (map->dm_segs[seg].ds_len + sgsize) <=
- map->dm_maxsegsz &&
- (map->_dm_boundary == 0 ||
- (map->dm_segs[seg].ds_addr & bmask) ==
- (curaddr & bmask)))
- map->dm_segs[seg].ds_len += sgsize;
- else {
- if (++seg >= map->_dm_segcnt)
- break;
- map->dm_segs[seg].ds_addr = curaddr;
- map->dm_segs[seg].ds_len = sgsize;
- map->dm_segs[seg]._ds_vaddr = vaddr;
- }
- }
-
- lastaddr = curaddr + sgsize;
- vaddr += sgsize;
- buflen -= sgsize;
- }
-
- *segp = seg;
- *lastaddrp = lastaddr;
-
- /*
- * Did we fit?
- */
- if (buflen != 0)
- return EFBIG; /* XXX Better return value here? */
-
- return 0;
-}
-
-/*
- * Common function for loading a direct-mapped DMA map with a linear
- * buffer.
- */
-int
-_bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
- bus_size_t buflen, struct proc *p, int flags)
-{
- vaddr_t lastaddr;
- int seg, error;
- struct vmspace *vm;
-
- /*
- * Make sure that on error condition we return "no valid mappings".
- */
- map->dm_mapsize = 0;
- map->dm_nsegs = 0;
- KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
-
- if (buflen > map->_dm_size)
- return EINVAL;
-
- if (p != NULL) {
- vm = p->p_vmspace;
- } else {
- vm = vmspace_kernel();
- }
-
- seg = 0;
- error = _bus_dmamap_load_buffer(map, buf, buflen,
- vm, flags, &lastaddr, &seg, 1);
- if (error == 0) {
- map->dm_mapsize = buflen;
- map->dm_nsegs = seg + 1;
- map->_dm_vmspace = vm;
-
- /*
- * For linear buffers, we support marking the mapping
- * as COHERENT.
- *
- * XXX Check TLB entries for cache-inhibit bits?
- */
- if (buf >= (void *)MIPS_KSEG1_START &&
- buf < (void *)MIPS_KSEG2_START)
- map->_dm_flags |= SGIMIPS_DMAMAP_COHERENT;
- }
- return error;
-}
-
-/*
- * Like _bus_dmamap_load(), but for mbufs.
- */
-int
-_bus_dmamap_load_mbuf(bus_dma_tag_t t, bus_dmamap_t map, struct mbuf *m0,
- int flags)
-{
- vaddr_t lastaddr;
- int seg, error, first;
- struct mbuf *m;
-
- /*
- * Make sure that on error condition we return "no valid mappings."
- */
- map->dm_mapsize = 0;
- map->dm_nsegs = 0;
- KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
-
-#ifdef DIAGNOSTIC
- if ((m0->m_flags & M_PKTHDR) == 0)
- panic("_bus_dmamap_load_mbuf: no packet header");
#endif
- if (m0->m_pkthdr.len > map->_dm_size)
- return EINVAL;
-
- first = 1;
- seg = 0;
- error = 0;
- for (m = m0; m != NULL && error == 0; m = m->m_next) {
- if (m->m_len == 0)
- continue;
- error = _bus_dmamap_load_buffer(map, m->m_data, m->m_len,
- vmspace_kernel(), flags, &lastaddr, &seg, first);
- first = 0;
- }
- if (error == 0) {
- map->dm_mapsize = m0->m_pkthdr.len;
- map->dm_nsegs = seg + 1;
- map->_dm_vmspace = vmspace_kernel(); /* always kernel */
- }
- return error;
-}
-
-/*
- * Like _bus_dmamap_load(), but for uios.
- */
-int
-_bus_dmamap_load_uio(bus_dma_tag_t t, bus_dmamap_t map, struct uio *uio,
- int flags)
-{
- vaddr_t lastaddr;
- int seg, i, error, first;
- bus_size_t minlen, resid;
- struct iovec *iov;
- void *addr;
-
- /*
- * Make sure that on error condition we return "no valid mappings."
- */
- map->dm_mapsize = 0;
- map->dm_nsegs = 0;
- KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
-
- resid = uio->uio_resid;
- iov = uio->uio_iov;
-
- first = 1;
- seg = 0;
- error = 0;
- for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) {
- /*
- * Now at the first iovec to load. Load each iovec
- * until we have exhausted the residual count.
- */
- minlen = resid < iov[i].iov_len ? resid : iov[i].iov_len;
- addr = (void *)iov[i].iov_base;
-
- error = _bus_dmamap_load_buffer(map, addr, minlen,
- uio->uio_vmspace, flags, &lastaddr, &seg, first);
- first = 0;
-
- resid -= minlen;
- }
- if (error == 0) {
- map->dm_mapsize = uio->uio_resid;
- map->dm_nsegs = seg + 1;
- map->_dm_vmspace = uio->uio_vmspace;
- }
- return error;
-}
-
-/*
- * Like _bus_dmamap_load(), but for raw memory.
- */
-int
-_bus_dmamap_load_raw(bus_dma_tag_t t, bus_dmamap_t map, bus_dma_segment_t *segs,
- int nsegs, bus_size_t size, int flags)
-{
-
- panic("_bus_dmamap_load_raw: not implemented");
-}
-
-/*
- * Common function for unloading a DMA map. May be called by
- * chipset-specific DMA map unload functions.
- */
-void
-_bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map)
-{
-
- /*
- * No resources to free; just mark the mappings as
- * invalid.
- */
- map->dm_maxsegsz = map->_dm_maxmaxsegsz;
- map->dm_mapsize = 0;
- map->dm_nsegs = 0;
- map->_dm_flags &= ~SGIMIPS_DMAMAP_COHERENT;
-}
-
/* Common function from DMA map synchronization. May be called
* by chipset-specific DMA map synchronization functions.
*
@@ -920,285 +231,7 @@ _bus_dmamap_sync_mips1(bus_dma_tag_t t,
}
}
-/*
- * Common function for DMA map synchronization. May be called
- * by chipset-specific DMA map synchronization functions.
- *
- * This is the R4x00/R5k version.
- */
-void
-_bus_dmamap_sync_mips3(bus_dma_tag_t t, bus_dmamap_t map, bus_addr_t offset,
- bus_size_t len, int ops)
-{
- bus_size_t minlen;
- vaddr_t vaddr, start, end, preboundary, firstboundary, lastboundary;
- int i, useindex;
-
- /*
- * Mixing PRE and POST operations is not allowed.
- */
- if ((ops & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 &&
- (ops & (BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)) != 0)
- panic("_bus_dmamap_sync_mips3: mix PRE and POST");
-
-#ifdef DIAGNOSTIC
- if (offset >= map->dm_mapsize)
- panic("_bus_dmamap_sync_mips3: bad offset %"PRIxPSIZE
- "(map size is %"PRIxPSIZE")", offset, map->dm_mapsize);
- if (len == 0 || (offset + len) > map->dm_mapsize)
- panic("_bus_dmamap_sync_mips3: bad length");
-#endif
-
- /*
- * Since we're dealing with a virtually-indexed, write-back
- * cache, we need to do the following things:
- *
- * PREREAD -- Invalidate D-cache. Note we might have
- * to also write-back here if we have to use an Index
- * op, or if the buffer start/end is not cache-line aligned.
- *
- * PREWRITE -- Write-back the D-cache. If we have to use
- * an Index op, we also have to invalidate. Note that if
- * we are doing PREREAD|PREWRITE, we can collapse everything
- * into a single op.
- *
- * POSTREAD -- Nothing.
- *
- * POSTWRITE -- Nothing.
- */
-
- /*
- * Flush the write buffer.
- * XXX Is this always necessary?
- */
- wbflush();
-
- /*
- * No cache flushes are necessary if we're only doing
- * POSTREAD or POSTWRITE (i.e. not doing PREREAD or PREWRITE).
- */
- ops &= (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
- if (ops == 0)
- return;
-
- /*
- * If the mapping is of COHERENT DMA-safe memory, no cache
- * flush is necessary.
- */
- if (map->_dm_flags & SGIMIPS_DMAMAP_COHERENT)
- return;
-
- /*
- * If the mapping belongs to the kernel, or it belongs
- * to the currently-running process (XXX actually, vmspace),
- * then we can use Hit ops. Otherwise, Index ops.
- *
- * This should be true the vast majority of the time.
- */
- if (__predict_true(VMSPACE_IS_KERNEL_P(map->_dm_vmspace) ||
- map->_dm_vmspace == curproc->p_vmspace))
- useindex = 0;
- else
- useindex = 1;
-
- for (i = 0; i < map->dm_nsegs && len != 0; i++) {
- /* Find the beginning segment. */
- if (offset >= map->dm_segs[i].ds_len) {
- offset -= map->dm_segs[i].ds_len;
- continue;
- }
-
- /*
- * Now at the first segment to sync; nail
- * each segment until we have exhausted the
- * length.
- */
- minlen = len < map->dm_segs[i].ds_len - offset ?
- len : map->dm_segs[i].ds_len - offset;
-
- vaddr = map->dm_segs[i]._ds_vaddr;
-
-#ifdef BUS_DMA_DEBUG
- printf("bus_dmamap_sync_mips3: flushing segment %d "
- "(0x%lx+%lx, 0x%lx+0x%lx) (olen = %ld)...", i,
- vaddr, offset, vaddr, offset + minlen - 1, len);
-#endif
-
- /*
- * If we are forced to use Index ops, it's always a
- * Write-back,Invalidate, so just do one test.
- */
- if (__predict_false(useindex)) {
- mips_dcache_wbinv_range_index(vaddr + offset, minlen);
-#ifdef BUS_DMA_DEBUG
- printf("\n");
-#endif
- offset = 0;
- len -= minlen;
- continue;
- }
-
- /* The code that follows is more correct than that in
- mips/bus_dma.c. */
- start = vaddr + offset;
- switch (ops) {
- case BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE:
- mips_dcache_wbinv_range(start, minlen);
- break;
-
- case BUS_DMASYNC_PREREAD: {
- struct mips_cache_info * const mci = &mips_cache_info;
- end = start + minlen;
- preboundary = start & ~mci->mci_dcache_align_mask;
- firstboundary = (start + mci->mci_dcache_align_mask)
- & ~mci->mci_dcache_align_mask;
- lastboundary = end & ~mci->mci_dcache_align_mask;
- if (preboundary < start && preboundary < lastboundary)
- mips_dcache_wbinv_range(preboundary,
- mci->mci_dcache_align);
- if (firstboundary < lastboundary)
- mips_dcache_inv_range(firstboundary,
- lastboundary - firstboundary);
- if (lastboundary < end)
- mips_dcache_wbinv_range(lastboundary,
- mci->mci_dcache_align);
- break;
- }
-
- case BUS_DMASYNC_PREWRITE:
- mips_dcache_wb_range(start, minlen);
- break;
- }
-#ifdef BUS_DMA_DEBUG
- printf("\n");
-#endif
- offset = 0;
- len -= minlen;
- }
-}
-
-/*
- * Common function for DMA-safe memory allocation. May be called
- * by bus-specific DMA memory allocation functions.
- */
-int
-_bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
- bus_size_t boundary, bus_dma_segment_t *segs,
- int nsegs, int *rsegs, int flags)
-{
- return (_bus_dmamem_alloc_range_common(t, size, alignment, boundary,
- segs, nsegs, rsegs, flags,
- mips_avail_start /*low*/, mips_avail_end - PAGE_SIZE /*high*/));
-}
-
-/*
- * Common function for freeing DMA-safe memory. May be called by
- * bus-specific DMA memory free functions.
- */
-void
-_bus_dmamem_free(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs)
-{
-
- _bus_dmamem_free_common(t, segs, nsegs);
-}
-
-/*
- * Common function for mapping DMA-safe memory. May be called by
- * bus-specific DMA memory map functions.
- */
-int
-_bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
- size_t size, void **kvap, int flags)
-{
- vaddr_t va;
- bus_addr_t addr;
- int curseg;
- const uvm_flag_t kmflags =
- (flags & BUS_DMA_NOWAIT) != 0 ? UVM_KMF_NOWAIT : 0;
- u_int pmapflags;
-
- /*
- * If we're only mapping 1 segment, use KSEG0 or KSEG1, to avoid
- * TLB thrashing.
- */
-
- if (nsegs == 1) {
- if (flags & BUS_DMA_COHERENT)
- *kvap = (void *)MIPS_PHYS_TO_KSEG1(segs[0].ds_addr);
- else
- *kvap = (void *)MIPS_PHYS_TO_KSEG0(segs[0].ds_addr);
- return 0;
- }
-
- size = round_page(size);
-
- va = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | kmflags);
-
- if (va == 0)
- return (ENOMEM);
-
- *kvap = (void *)va;
-
- pmapflags = VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED;
- if (flags & BUS_DMA_COHERENT)
- pmapflags |= PMAP_NOCACHE;
-
- for (curseg = 0; curseg < nsegs; curseg++) {
- for (addr = segs[curseg].ds_addr;
- addr < (segs[curseg].ds_addr + segs[curseg].ds_len);
- addr += PAGE_SIZE, va += PAGE_SIZE, size -= PAGE_SIZE) {
- if (size == 0)
- panic("_bus_dmamem_map: size botch");
- pmap_enter(pmap_kernel(), va, addr,
- VM_PROT_READ | VM_PROT_WRITE,
- pmapflags);
- }
- }
- pmap_update(pmap_kernel());
-
- return 0;
-}
-
-/*
- * Common function for unmapping DMA-safe memory. May be called by
- * bus-specific DMA memory unmapping functions.
- */
-void
-_bus_dmamem_unmap(bus_dma_tag_t t, void *kva, size_t size)
-{
-
- /*
- * Nothing to do if we mapped it with KSEG0 or KSEG1 (i.e.
- * not in KSEG2).
- */
- if (kva >= (void *)MIPS_KSEG0_START &&
- kva < (void *)MIPS_KSEG2_START)
- return;
-
- _bus_dmamem_unmap_common(t, kva, size);
-}
-
-/*
- * Common functin for mmap(2)'ing DMA-safe memory. May be called by
- * bus-specific DMA mmap(2)'ing functions.
- */
-paddr_t
-_bus_dmamem_mmap(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
- off_t off, int prot, int flags)
-{
- bus_addr_t rv;
-
- rv = _bus_dmamem_mmap_common(t, segs, nsegs, off, prot, flags);
- if (rv == (bus_addr_t)-1)
- return (-1);
-
-#if defined(_MIPS_PADDR_T_64BIT) || defined(_LP64)
- return (mips_btop(rv | PGC_NOCACHE));
-#else
- return (mips_btop(rv));
-#endif
-}
-
+#if 0
paddr_t
bus_space_mmap(bus_space_tag_t space, bus_addr_t addr, off_t off,
int prot, int flags)
@@ -1215,382 +248,13 @@ bus_space_mmap(bus_space_tag_t space, bu
return mips_btop((MIPS_KSEG1_TO_PHYS(addr) + off));
#endif
}
+#endif
-/*
- * Utility macros; do not use outside this file.
- */
-#define __PB_TYPENAME_PREFIX(BITS) ___CONCAT(u_int,BITS)
-#define __PB_TYPENAME(BITS) ___CONCAT(__PB_TYPENAME_PREFIX(BITS),_t)
-
-/*
- * void bus_space_read_multi_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * u_intN_t *addr, bus_size_t count);
- *
- * Read `count' 1, 2, 4, or 8 byte quantities from bus space
- * described by tag/handle/offset and copy into buffer provided.
- */
-
-#define __SGIMIPS_bus_space_read_multi(BYTES,BITS) \
-void __CONCAT(bus_space_read_multi_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_read_multi_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) \
- *a++ = __CONCAT(bus_space_read_,BYTES)(t, h, o); \
-}
-
-__SGIMIPS_bus_space_read_multi(1,8)
-__SGIMIPS_bus_space_read_multi(2,16)
-__SGIMIPS_bus_space_read_multi(4,32)
-
-#undef __SGIMIPS_bus_space_read_multi
-
-#define __SGIMIPS_bus_space_read_multi_stream(BYTES,BITS) \
-void __CONCAT(bus_space_read_multi_stream_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_read_multi_stream_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) \
- *a++ = __CONCAT(bus_space_read_stream_,BYTES)(t, h, o); \
-}
-
-
-__SGIMIPS_bus_space_read_multi_stream(2,16)
-__SGIMIPS_bus_space_read_multi_stream(4,32)
-
-#undef __SGIMIPS_bus_space_read_multi_stream
-
-/*
- * void bus_space_read_region_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * u_intN_t *addr, bus_size_t count);
- *
- * Read `count' 1, 2, 4, or 8 byte quantities from bus space
- * described by tag/handle and starting at `offset' and copy into
- * buffer provided.
- */
-
-#define __SGIMIPS_bus_space_read_region(BYTES,BITS) \
-void __CONCAT(bus_space_read_region_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_read_region_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) { \
- *a++ = __CONCAT(bus_space_read_,BYTES)(t, h, o); \
- o += BYTES; \
- } \
-}
-
-__SGIMIPS_bus_space_read_region(1,8)
-__SGIMIPS_bus_space_read_region(2,16)
-__SGIMIPS_bus_space_read_region(4,32)
-
-#undef __SGIMIPS_bus_space_read_region
-
-/*
- * void bus_space_read_region_stream_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * u_intN_t *addr, bus_size_t count);
- *
- * Read `count' 1, 2, 4, or 8 byte quantities from bus space
- * described by tag/handle and starting at `offset' and copy into
- * buffer provided. No byte order translation is done.
- */
-
-#define __SGIMIPS_bus_space_read_region_stream(BYTES,BITS) \
-void __CONCAT(bus_space_read_region_stream_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_read_region_stream_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) { \
- *a++ = __CONCAT(bus_space_read_stream_,BYTES)(t, h, o); \
- o += BYTES; \
- } \
-}
-
-__SGIMIPS_bus_space_read_region_stream(2,16)
-__SGIMIPS_bus_space_read_region_stream(4,32)
-
-#undef __SGIMIPS_bus_space_read_region_stream
-
-/*
- * void bus_space_write_multi_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * const u_intN_t *addr, bus_size_t count);
- *
- * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
- * provided to bus space described by tag/handle/offset.
- */
-
-#define __SGIMIPS_bus_space_write_multi(BYTES,BITS) \
-void __CONCAT(bus_space_write_multi_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- const __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_write_multi_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- const __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) \
- __CONCAT(bus_space_write_,BYTES)(t, h, o, *a++); \
-}
-
-__SGIMIPS_bus_space_write_multi(1,8)
-__SGIMIPS_bus_space_write_multi(2,16)
-__SGIMIPS_bus_space_write_multi(4,32)
-
-#undef __SGIMIPS_bus_space_write_multi
-
-#define __SGIMIPS_bus_space_write_multi_stream(BYTES,BITS) \
-void __CONCAT(bus_space_write_multi_stream_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- const __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_write_multi_stream_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- const __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) \
- __CONCAT(bus_space_write_stream_,BYTES)(t, h, o, *a++); \
-}
-
-__SGIMIPS_bus_space_write_multi_stream(2,16)
-__SGIMIPS_bus_space_write_multi_stream(4,32)
-
-#undef __SGIMIPS_bus_space_write_multi_stream
-
-/*
- * void bus_space_write_region_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * const u_intN_t *addr, bus_size_t count);
- *
- * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
- * to bus space described by tag/handle starting at `offset'.
- */
-
-#define __SGIMIPS_bus_space_write_region(BYTES,BITS) \
-void __CONCAT(bus_space_write_region_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- const __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_write_region_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- const __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) { \
- __CONCAT(bus_space_write_,BYTES)(t, h, o, *a++); \
- o += BYTES; \
- } \
-}
-
-__SGIMIPS_bus_space_write_region(1,8)
-__SGIMIPS_bus_space_write_region(2,16)
-__SGIMIPS_bus_space_write_region(4,32)
-
-#undef __SGIMIPS_bus_space_write_region
-
-/*
- * void bus_space_write_region_stream_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset,
- * const u_intN_t *addr, bus_size_t count);
- *
- * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
- * to bus space described by tag/handle starting at `offset', but without
- * byte-order translation
- */
-
-#define __SGIMIPS_bus_space_write_region_stream(BYTES,BITS) \
-void __CONCAT(bus_space_write_region_stream_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- const __PB_TYPENAME(BITS) *, bus_size_t); \
- \
-void \
-__CONCAT(bus_space_write_region_stream_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- const __PB_TYPENAME(BITS) *a, \
- bus_size_t c) \
-{ \
- \
- while (c--) { \
- __CONCAT(bus_space_write_stream_,BYTES)(t, h, o, *a++); \
- o += BYTES; \
- } \
-}
-
-__SGIMIPS_bus_space_write_region_stream(2,16)
-__SGIMIPS_bus_space_write_region_stream(4,32)
-
-#undef __SGIMIPS_bus_space_write_region_stream
-
-/*
- * void bus_space_set_multi_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
- * bus_size_t count);
- *
- * Write the 1, 2, 4, or 8 byte value `val' to bus space described
- * by tag/handle/offset `count' times.
- */
-
-#define __SGIMIPS_bus_space_set_multi(BYTES,BITS) \
-void __CONCAT(bus_space_set_multi_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- __PB_TYPENAME(BITS), bus_size_t); \
- \
-void \
-__CONCAT(bus_space_set_multi_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- __PB_TYPENAME(BITS) v, \
- bus_size_t c) \
-{ \
- \
- while (c--) \
- __CONCAT(bus_space_write_,BYTES)(t, h, o, v); \
-}
-
-__SGIMIPS_bus_space_set_multi(1,8)
-__SGIMIPS_bus_space_set_multi(2,16)
-__SGIMIPS_bus_space_set_multi(4,32)
-
-#undef __SGIMIPS_bus_space_set_multi
-
-/*
- * void bus_space_set_region_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
- * bus_size_t count);
- *
- * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
- * by tag/handle starting at `offset'.
- */
-
-#define __SGIMIPS_bus_space_set_region(BYTES,BITS) \
-void __CONCAT(bus_space_set_region_,BYTES) \
- (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
- __PB_TYPENAME(BITS), bus_size_t); \
- \
-void \
-__CONCAT(bus_space_set_region_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h, \
- bus_size_t o, \
- __PB_TYPENAME(BITS) v, \
- bus_size_t c) \
-{ \
- \
- while (c--) { \
- __CONCAT(bus_space_write_,BYTES)(t, h, o, v); \
- o += BYTES; \
- } \
-}
-
-__SGIMIPS_bus_space_set_region(1,8)
-__SGIMIPS_bus_space_set_region(2,16)
-__SGIMIPS_bus_space_set_region(4,32)
-
-#undef __SGIMIPS_bus_space_set_region
-
-/*
- * void bus_space_copy_region_N(bus_space_tag_t tag,
- * bus_space_handle_t bsh1, bus_size_t off1,
- * bus_space_handle_t bsh2, bus_size_t off2,
- * bus_size_t count);
- *
- * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
- * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
- */
-
-#define __SGIMIPS_copy_region(BYTES) \
-void __CONCAT(bus_space_copy_region_,BYTES) \
- (bus_space_tag_t, \
- bus_space_handle_t bsh1, bus_size_t off1, \
- bus_space_handle_t bsh2, bus_size_t off2, \
- bus_size_t count); \
- \
-void \
-__CONCAT(bus_space_copy_region_,BYTES)( \
- bus_space_tag_t t, \
- bus_space_handle_t h1, \
- bus_size_t o1, \
- bus_space_handle_t h2, \
- bus_size_t o2, \
- bus_size_t c) \
-{ \
- bus_size_t o; \
- \
- if ((h1 + o1) >= (h2 + o2)) { \
- /* src after dest: copy forward */ \
- for (o = 0; c != 0; c--, o += BYTES) \
- __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
- __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
- } else { \
- /* dest after src: copy backwards */ \
- for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \
- __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
- __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
- } \
-}
-
-__SGIMIPS_copy_region(1)
-__SGIMIPS_copy_region(2)
-__SGIMIPS_copy_region(4)
-
-#undef __SGIMIPS_copy_region
-
-#undef __PB_TYPENAME_PREFIX
-#undef __PB_TYPENAME
+#define CHIP normal
+#define CHIP_MEM /* defined */
+#define CHIP_W1_BUS_START(v) 0x00000000UL
+#define CHIP_W1_BUS_END(v) 0xffffffffUL
+#define CHIP_W1_SYS_START(v) 0x00000000UL
+#define CHIP_W1_SYS_END(v) 0xffffffffUL
+#include <mips/mips/bus_space_alignstride_chipdep.c>
Index: src/sys/arch/sgimips/sgimips/console.c
diff -u src/sys/arch/sgimips/sgimips/console.c:1.43 src/sys/arch/sgimips/sgimips/console.c:1.44
--- src/sys/arch/sgimips/sgimips/console.c:1.43 Sat Oct 13 17:58:54 2012
+++ src/sys/arch/sgimips/sgimips/console.c Wed Feb 18 16:47:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: console.c,v 1.43 2012/10/13 17:58:54 jdc Exp $ */
+/* $NetBSD: console.c,v 1.44 2015/02/18 16:47:59 macallan Exp $ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: console.c,v 1.43 2012/10/13 17:58:54 jdc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: console.c,v 1.44 2015/02/18 16:47:59 macallan Exp $");
#include "opt_kgdb.h"
@@ -115,7 +115,8 @@ consinit(void)
#if notyet
#if (NPCKBC > 0)
/* XXX Hardcoded iotag, MACE address XXX */
- pckbc_cnattach(SGIMIPS_BUS_SPACE_NORMAL,
+ mace_init_bus();
+ pckbc_cnattach(mace_isa_memt,
MACE_BASE + 0x320000, 8,
PCKBC_KBD_SLOT, 0);
#endif
@@ -191,7 +192,7 @@ gio_video_init(const char *consdev)
case MACH_SGI_IP22:
#if (NPCKBC > 0)
/* XXX Hardcoded iotag, HPC address XXX */
- pckbc_cnattach(SGIMIPS_BUS_SPACE_HPC,
+ pckbc_cnattach(normal_memt,
HPC_BASE_ADDRESS_0 +
HPC3_PBUS_CH6_DEVREGS + IOC_KB_REGS, KBCMDP,
PCKBC_KBD_SLOT, 0);
@@ -225,7 +226,8 @@ mace_serial_init(const char *consdev)
delay(10000);
/* XXX: hardcoded MACE iotag */
- if (comcnattach(SGIMIPS_BUS_SPACE_MACE, MIPS_PHYS_TO_KSEG1(MACE_BASE + base),
+ mace_init_bus();
+ if (comcnattach(mace_isa_memt, MIPS_PHYS_TO_KSEG1(MACE_BASE + base),
speed, COM_FREQ, COM_TYPE_NORMAL, comcnmode) == 0)
return (1);
}
@@ -240,9 +242,11 @@ kgdb_port_init(void)
{
# if (NCOM > 0)
# define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8)
- if (mach_type == MACH_SGI_IP32)
- com_kgdb_attach(SGIMIPS_BUS_SPACE_MACE, 0xbf398000, 9600, COM_FREQ, COM_TYPE_NORMAL,
+ if (mach_type == MACH_SGI_IP32) {
+ mace_init_bus();
+ com_kgdb_attach(mace_isa_memt, 0xbf398000, 9600, COM_FREQ, COM_TYPE_NORMAL,
KGDB_DEVMODE);
+ }
# endif /* (NCOM > 0) */
# if (NZSC > 0)