Module Name: src
Committed By: snj
Date: Sat Jul 1 08:39:22 UTC 2017
Modified Files:
src/share/man/man4 [netbsd-8]: tc.4
src/sys/arch/alpha/tc [netbsd-8]: tcasic.c
src/sys/arch/pmax/tc [netbsd-8]: tcbus.c
src/sys/arch/vax/conf [netbsd-8]: files.vax
src/sys/arch/vax/vsa [netbsd-8]: tc_vsbus.c
src/sys/dev/tc [netbsd-8]: tc.c tcvar.h
Log Message:
Pull up following revision(s) (requested by flxd in ticket #65):
share/man/man4/tc.4: revision 1.7
sys/arch/alpha/tc/tcasic.c: revision 1.46
sys/arch/pmax/tc/tcbus.c: revision 1.33
sys/arch/vax/conf/files.vax: revision 1.121
sys/arch/vax/vsa/tc_vsbus.c: revision 1.8, 1.9
sys/dev/tc/tc.c: revision 1.55
sys/dev/tc/tcvar.h: revision 1.27
Make VAXstation 4000 TURBOchannel adaptor work.
PIO and IRQ tested on VS4000/60 and /96 with TC-USB (slhci) and PMAD-AA (le).
DMA is untested.
vax needs space to be mapped out, so memory space is pre-mapped for TC option
drivers not bus_space'ified yet, also providing custom bus_space methods for
this kludge.
--
whitespace
--
Add vax.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.6.6.1 src/share/man/man4/tc.4
cvs rdiff -u -r1.45 -r1.45.8.1 src/sys/arch/alpha/tc/tcasic.c
cvs rdiff -u -r1.32 -r1.32.8.1 src/sys/arch/pmax/tc/tcbus.c
cvs rdiff -u -r1.120 -r1.120.10.1 src/sys/arch/vax/conf/files.vax
cvs rdiff -u -r1.7 -r1.7.46.1 src/sys/arch/vax/vsa/tc_vsbus.c
cvs rdiff -u -r1.54 -r1.54.8.1 src/sys/dev/tc/tc.c
cvs rdiff -u -r1.26 -r1.26.46.1 src/sys/dev/tc/tcvar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man4/tc.4
diff -u src/share/man/man4/tc.4:1.6 src/share/man/man4/tc.4:1.6.6.1
--- src/share/man/man4/tc.4:1.6 Mon Dec 26 16:03:50 2016
+++ src/share/man/man4/tc.4 Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-.\" $NetBSD: tc.4,v 1.6 2016/12/26 16:03:50 wiz Exp $
+.\" $NetBSD: tc.4,v 1.6.6.1 2017/07/01 08:39:21 snj Exp $
.\"
.\" Copyright (c) 1996, 1997 Jonathan Stone.
.\" All rights reserved.
@@ -28,7 +28,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd December 26, 2016
+.Dd June 23, 2017
.Dt TC 4
.Os
.Sh NAME
@@ -39,12 +39,15 @@
.Cd "tc* at tcasic?"
.Ss pmax
.Cd "tc* at mainbus0"
+.Ss vax
+.Cd "tc0 at vsbus0"
.Sh DESCRIPTION
The
.Nm
driver provides machine-independent support for the DEC TURBOchannel
-expansion bus found on all DEC 5000-series machines with MIPS and DEC
-3000-series with Alpha processors.
+expansion bus found on all DEC 5000-series machines with MIPS, DEC
+3000-series with Alpha processors and VAXstation 4000 machines with the
+optional TURBOchannel adaptor.
.Pp
Your system may support additional
.Tn TURBOchannel
Index: src/sys/arch/alpha/tc/tcasic.c
diff -u src/sys/arch/alpha/tc/tcasic.c:1.45 src/sys/arch/alpha/tc/tcasic.c:1.45.8.1
--- src/sys/arch/alpha/tc/tcasic.c:1.45 Mon Dec 12 17:03:40 2016
+++ src/sys/arch/alpha/tc/tcasic.c Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tcasic.c,v 1.45 2016/12/12 17:03:40 flxd Exp $ */
+/* $NetBSD: tcasic.c,v 1.45.8.1 2017/07/01 08:39:21 snj Exp $ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: tcasic.c,v 1.45 2016/12/12 17:03:40 flxd Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcasic.c,v 1.45.8.1 2017/07/01 08:39:21 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -222,7 +222,7 @@ tc_fb_cnattach(tc_addr_t tcaddr)
char tcname[TC_ROM_LLEN];
int i;
- if (tc_badaddr(tcaddr) || (tc_checkslot(tcaddr, tcname) == 0))
+ if (tc_badaddr(tcaddr) || (tc_checkslot(tcaddr, tcname, NULL) == 0))
return (EINVAL);
for (i = 0; i < sizeof(cnboards) / sizeof(cnboards[0]); i++)
Index: src/sys/arch/pmax/tc/tcbus.c
diff -u src/sys/arch/pmax/tc/tcbus.c:1.32 src/sys/arch/pmax/tc/tcbus.c:1.32.8.1
--- src/sys/arch/pmax/tc/tcbus.c:1.32 Mon Dec 12 17:03:41 2016
+++ src/sys/arch/pmax/tc/tcbus.c Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tcbus.c,v 1.32 2016/12/12 17:03:41 flxd Exp $ */
+/* $NetBSD: tcbus.c,v 1.32.8.1 2017/07/01 08:39:21 snj Exp $ */
/*-
* Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcbus.c,v 1.32 2016/12/12 17:03:41 flxd Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcbus.c,v 1.32.8.1 2017/07/01 08:39:21 snj Exp $");
#define _PMAX_BUS_DMA_PRIVATE
/*
@@ -221,7 +221,7 @@ tcfb_cnattach(int slotno)
int i;
tcaddr = promcall(callv->_slot_address, slotno);
- if (tc_badaddr(tcaddr) || tc_checkslot(tcaddr, tcname) == 0)
+ if (tc_badaddr(tcaddr) || tc_checkslot(tcaddr, tcname, NULL) == 0)
panic("TC console designated by PROM does not exist!?");
for (i = 0; i < __arraycount(cnboards); i++) {
Index: src/sys/arch/vax/conf/files.vax
diff -u src/sys/arch/vax/conf/files.vax:1.120 src/sys/arch/vax/conf/files.vax:1.120.10.1
--- src/sys/arch/vax/conf/files.vax:1.120 Sun Jul 5 03:06:27 2015
+++ src/sys/arch/vax/conf/files.vax Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.vax,v 1.120 2015/07/05 03:06:27 matt Exp $
+# $NetBSD: files.vax,v 1.120.10.1 2017/07/01 08:39:21 snj Exp $
#
# new style config file for vax architecture
#
@@ -110,8 +110,8 @@ include "dev/qbus/files.uba"
# TurboCHANNEL bus support and device drivers
include "dev/tc/files.tc"
-attach tc at vsbus with tcbus
-file arch/vax/vsa/tc_vsbus.c tcbus
+attach tc at vsbus with tc_vsbus
+file arch/vax/vsa/tc_vsbus.c tc_vsbus
attach uba at mainbus with uba_mainbus
file arch/vax/uba/uba_mainbus.c uba_mainbus
Index: src/sys/arch/vax/vsa/tc_vsbus.c
diff -u src/sys/arch/vax/vsa/tc_vsbus.c:1.7 src/sys/arch/vax/vsa/tc_vsbus.c:1.7.46.1
--- src/sys/arch/vax/vsa/tc_vsbus.c:1.7 Sun Jun 5 16:12:50 2011
+++ src/sys/arch/vax/vsa/tc_vsbus.c Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tc_vsbus.c,v 1.7 2011/06/05 16:12:50 christos Exp $ */
+/* $NetBSD: tc_vsbus.c,v 1.7.46.1 2017/07/01 08:39:21 snj Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -28,120 +28,407 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: tc_vsbus.c,v 1.7.46.1 2017/07/01 08:39:21 snj Exp $");
+
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/cpu.h>
#include <sys/device.h>
+#include <machine/cpu.h>
#include <machine/pte.h>
#include <machine/scb.h>
+#include <machine/sid.h>
#include <machine/vsbus.h>
+
#include <dev/tc/tcvar.h>
-static int tcbus_match(device_t, cfdata_t, void *);
-static void tcbus_attach(device_t, device_t, void *);
+#define NSLOTS 1
-struct tcbus_softc {
+struct tc_vsbus_softc {
struct tc_softc sc_tc;
- struct tc_slotdesc sc_slots[1];
+ struct tc_slotdesc sc_slots[NSLOTS];
struct vax_bus_dma_tag sc_dmatag;
struct vax_sgmap sc_sgmap;
struct evcnt sc_ev;
- bus_space_handle_t sc_memh;
+ int (*sc_intr_func)(void *);
+ void *sc_intr_arg;
+ bus_space_tag_t sc_bst;
+ bus_space_handle_t sc_bsh_csr;
+ int sc_cvec;
};
-static bus_dma_tag_t tcbus_dmat;
+static int tc_vsbus_match(device_t, cfdata_t, void *);
+static void tc_vsbus_attach(device_t, device_t, void *);
+
+static int tc_vsbus_dma_init(device_t);
+static bus_dma_tag_t tc_vsbus_get_dma_tag(int);
+
+static void tc_vsbus_intr(void *);
+static void tc_vsbus_intr_establish(device_t, void *, int, int (*)(void *),
+ void *);
+static void tc_vsbus_intr_disestablish(device_t, void *);
+static const struct evcnt *tc_vsbus_intr_evcnt(device_t, void *);
+
+static int vax_tc_bus_space_map(void *, bus_addr_t, bus_size_t, int,
+ bus_space_handle_t *, int);
+static int vax_tc_bus_space_subregion(void *, bus_space_handle_t, bus_size_t,
+ bus_size_t, bus_space_handle_t *);
+static void vax_tc_bus_space_unmap(void *, bus_space_handle_t, bus_size_t, int);
+static int vax_tc_bus_space_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t,
+ bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
+static void vax_tc_bus_space_free(void *, bus_space_handle_t, bus_size_t);
+static paddr_t vax_tc_bus_space_mmap(void *, bus_addr_t, off_t, int, int);
+
+CFATTACH_DECL_NEW(tc_vsbus, sizeof(struct tc_vsbus_softc),
+ tc_vsbus_match, tc_vsbus_attach, 0, 0);
+
+static bus_dma_tag_t tc_vsbus_dmat;
+
+struct vax_bus_space vax_tc_bus_space = {
+ NULL,
+ vax_tc_bus_space_map,
+ vax_tc_bus_space_unmap,
+ vax_tc_bus_space_subregion,
+ vax_tc_bus_space_alloc,
+ vax_tc_bus_space_free,
+ vax_tc_bus_space_mmap,
+};
+
+/*
+ * taken from KA46 System Board Specification, KA46-0-DBF, Rev. X.02,
+ * 10 October 1990
+ */
+#define KA46_BWF0 0x20080014
+#define KA46_BWF0_ADP __BIT(31)
+#define KA46_BWF0_SZ 4
+
+/*
+ * taken from KA49 Processor Module Specification V 1.1, 20 August 1992
+ */
+#define KA49_CFG 0x25800000
+#define KA49_CFG_BA __BIT(0)
+#define KA49_CFG_SZ 2
+
+/*
+ * taken from Pmariah TURBOchannel Adapter Specification, 29 November 1991
+ */
+#define KA4x_TCA_BASE 0x30000000
+#define KA4x_TCA_DIAG_TRIG (KA4x_TCA_BASE + 0x4000000)
+#define KA4x_TCA_MAP_CHK_SEQ (KA4x_TCA_BASE + 0x4800000)
+#define KA4x_TCA_FIFO_DIAG (KA4x_TCA_BASE + 0x5000000)
+#define KA4x_TCA_SGMAP (KA4x_TCA_BASE + 0x5800000)
+#define KA4x_TCA_DIAG_ROM (KA4x_TCA_BASE + 0x6000000)
+#define KA4x_TCA_CSR (KA4x_TCA_BASE + 0x6800000)
+#define KA4x_TCA_CSR_BLK_SZ __BITS(0, 2) /* 0x00007 RW */
+#define KA4x_TCA_CSR_SPARE __BIT(3) /* 0x00008 RW */
+#define KA4x_TCA_CSR_BAD_PAR __BITS(4, 7) /* 0x000f0 RW */
+#define KA4x_TCA_CSR_RST_TC __BIT(8) /* 0x00100 RW */
+#define KA4x_TCA_CSR_EN_MAP __BIT(9) /* 0x00200 RW */
+#define KA4x_TCA_CSR_INVAL_REF __BIT(10) /* 0x00400 RW1C */
+#define KA4x_TCA_CSR_TC_TMO __BIT(11) /* 0x00800 RW */
+#define KA4x_TCA_CSR_EN_TC_IRQ __BIT(12) /* 0x01000 RW */
+#define KA4x_TCA_CSR_TC_IRQ __BIT(13) /* 0x02000 R */
+#define KA4x_TCA_CSR_ERR __BIT(14) /* 0x04000 RW1C */
+#define KA4x_TCA_CSR_ALT_CYC_ST __BIT(15) /* 0x08000 RW */
+#define KA4x_TCA_CSR_EN_PAR __BIT(16) /* 0x10000 RW */
+#define KA4x_TCA_CSR_FIFO_EMPTY __BIT(17) /* 0x20000 R */
+#define KA4x_TCA_CSR_SZ 4
+
+static int
+tc_vsbus_match(device_t parent, cfdata_t cfdata, void *aux)
+{
+ struct vsbus_attach_args * const va = aux;
+ uint32_t *csr;
+ bus_space_tag_t bst = va->va_memt;
+ bus_space_handle_t bsh;
+ int found, rc;
+
+ if (va->va_paddr != KA4x_TCA_CSR)
+ return 0;
+
+ /* Bus adaptor present? */
+ switch (vax_boardtype) {
+ case VAX_BTYP_46:
+ if (bus_space_map(bst, KA46_BWF0, KA46_BWF0_SZ, 0, &bsh))
+ return 0;
+ found = ((bus_space_read_4(bst, bsh, 0) & KA46_BWF0_ADP) != 0);
+ bus_space_unmap(bst, bsh, KA46_BWF0_SZ);
+ /*
+ * On VS4000/60, although interrupting on a real vector, fool
+ * vsbus interrupt, as no interrupt bit will be set in
+ * vsbus_softc's sc_intreq for TC adaptor.
+ */
+ rc = 20;
+ break;
+ case VAX_BTYP_49:
+ if (bus_space_map(bst, KA49_CFG, KA49_CFG_SZ, 0, &bsh))
+ return 0;
+ found = ((bus_space_read_2(bst, bsh, 0) & KA49_CFG_BA) != 0);
+ bus_space_unmap(bst, bsh, KA49_CFG_SZ);
+ rc = 10;
+ break;
+ default:
+ return 0;
+ }
+ if (!found)
+ return 0;
+
+ /* XXX Assume a found bus adaptor is the TC bus adaptor. */
+
+ /* Force interrupt. */
+ csr = (uint32_t *)va->va_addr;
+ *csr |= KA4x_TCA_CSR_TC_TMO;
+ DELAY(10000);
+ *csr &= ~KA4x_TCA_CSR_TC_TMO;
+ DELAY(10000);
+
+ return rc;
+}
+
+#define INIT_SLOTSZ 1
+
+static void
+tc_vsbus_attach(device_t parent, device_t self, void *aux)
+{
+ struct tcbus_attach_args tba;
+ struct vsbus_attach_args * const va = aux;
+ struct tc_vsbus_softc * const sc = device_private(self);
+ struct tc_rommap *rommap;
+ bus_space_tag_t bst = va->va_memt;
+ bus_space_handle_t bsh_csr, bsh_slot;
+ const bus_size_t slotb = 4194304;
+ uint32_t csr;
+ int error, slotsz;
+
+ sc->sc_cvec = va->va_cvec;
-CFATTACH_DECL_NEW(tcbus, sizeof(struct tcbus_softc),
- tcbus_match, tcbus_attach, 0, 0);
+ error = bus_space_map(bst, KA4x_TCA_CSR, KA4x_TCA_CSR_SZ, 0, &bsh_csr);
+ if (error) {
+ aprint_normal(": failed to map TCA CSR: %d\n", error);
+ return;
+ }
+ sc->sc_bst = bst;
+ sc->sc_bsh_csr = bsh_csr;
+
+ /* Deassert TC option reset and clean up. */
+ csr = bus_space_read_4(bst, bsh_csr, 0);
+ csr &= ~(KA4x_TCA_CSR_TC_TMO | KA4x_TCA_CSR_RST_TC);
+ csr |= KA4x_TCA_CSR_ERR | KA4x_TCA_CSR_INVAL_REF;
+ bus_space_write_4(bst, bsh_csr, 0, csr);
+
+ /*
+ * Map initial number of "slots" (4 MB each) to read the option ROM
+ * header.
+ */
+ error = bus_space_map(bst, KA4x_TCA_BASE, INIT_SLOTSZ * slotb,
+ BUS_SPACE_MAP_LINEAR, &bsh_slot);
+ if (error) {
+ aprint_normal(": failed to map TC slot: %d", error);
+ goto fail;
+ }
+ /* Determine number of slots required from option ROM header. */
+ slotsz = 0;
+ if (tc_checkslot((tc_addr_t)bus_space_vaddr(bst, bsh_slot), NULL,
+ &rommap))
+ slotsz = rommap->tcr_ssize.v;
+ if (slotsz == 0) {
+ /* Invalid option ROM header or no option present. */
+ bus_space_unmap(bst, bsh_slot, INIT_SLOTSZ * slotb);
+ goto fail;
+ } else if (slotsz > INIT_SLOTSZ) {
+ /* Remap with actual slot size required. */
+ bus_space_unmap(bst, bsh_slot, INIT_SLOTSZ * slotb);
+ error = bus_space_map(bst, KA4x_TCA_BASE, slotsz * slotb,
+ BUS_SPACE_MAP_LINEAR, &bsh_slot);
+ if (error) {
+ aprint_normal(": failed to map TC slot: %d", error);
+ goto fail;
+ }
+ } else
+ slotsz = INIT_SLOTSZ;
+
+ /* Pass pre-mapped space for TC drivers not bus_space'ified yet. */
+ sc->sc_slots[0].tcs_addr = (tc_addr_t)bus_space_vaddr(bst, bsh_slot);
+ sc->sc_slots[0].tcs_cookie = sc;
+ sc->sc_slots[0].tcs_used = 0;
+
+ tba.tba_busname = "tc";
+ /* Tag with custom methods for pre-mapped bus_space. */
+ tba.tba_memt = &vax_tc_bus_space;
+ tba.tba_speed = TC_SPEED_12_5_MHZ;
+ tba.tba_nslots = __arraycount(sc->sc_slots);
+ tba.tba_slots = sc->sc_slots;
+ tba.tba_nbuiltins = 0;
+ tba.tba_intr_evcnt = tc_vsbus_intr_evcnt;
+ tba.tba_intr_establish = tc_vsbus_intr_establish;
+ tba.tba_intr_disestablish = tc_vsbus_intr_disestablish;
+ tba.tba_get_dma_tag = tc_vsbus_get_dma_tag;
+
+ error = tc_vsbus_dma_init(self);
+ if (error) {
+ aprint_normal(": failed to init DMA: %d", error);
+ bus_space_unmap(bst, bsh_slot, slotsz * slotb);
+ goto fail;
+ }
+
+ evcnt_attach_dynamic(&sc->sc_ev, EVCNT_TYPE_INTR, NULL,
+ device_xname(self), "intr");
+
+ /* Enable SGDMA and option IRQ now. */
+ csr = bus_space_read_4(bst, bsh_csr, 0);
+ csr &= ~(KA4x_TCA_CSR_TC_TMO | KA4x_TCA_CSR_RST_TC);
+ csr |= KA4x_TCA_CSR_ERR | KA4x_TCA_CSR_EN_TC_IRQ |
+ KA4x_TCA_CSR_INVAL_REF | KA4x_TCA_CSR_EN_MAP;
+ bus_space_write_4(bst, bsh_csr, 0, csr);
+
+ /* XXX: why not config_found(9)?? */
+ tcattach(parent, self, &tba);
+
+ return;
+
+fail:
+ aprint_normal("\n");
+ /* Clear possible timeout bit which asserts TC interrupt. */
+ csr = bus_space_read_4(bst, bsh_csr, 0);
+ csr &= ~KA4x_TCA_CSR_TC_TMO;
+ bus_space_write_4(bst, bsh_csr, 0, csr);
+ bus_space_unmap(bst, bsh_csr, KA4x_TCA_CSR_SZ);
+}
+
+static int
+tc_vsbus_dma_init(device_t dev)
+{
+ struct tc_vsbus_softc * const sc = device_private(dev);
+ struct pte *pte;
+ bus_dma_tag_t dmat = &sc->sc_dmatag;
+ bus_space_tag_t bst = sc->sc_bst;
+ bus_space_handle_t bsh;
+ const bus_size_t ptecnt = 8192;
+ const bus_size_t mapsize = ptecnt * sizeof(pte[0]);
+ int error;
+
+ vax_sgmap_dmatag_init(dmat, sc, ptecnt);
+
+ dmat->_sgmap = &sc->sc_sgmap;
+
+ error = bus_space_map(bst, KA4x_TCA_SGMAP, mapsize,
+ BUS_SPACE_MAP_LINEAR, &bsh);
+ if (error)
+ return error;
+ bus_space_set_region_4(bst, bsh, 0, 0, ptecnt);
+ pte = bus_space_vaddr(bst, bsh);
+
+ /* Initialize the SGMAP. */
+ vax_sgmap_init(dmat, &sc->sc_sgmap, "tc_sgmap", dmat->_wbase,
+ dmat->_wsize, pte, 0);
+
+ tc_vsbus_dmat = dmat;
+
+ return 0;
+}
static bus_dma_tag_t
-tcbus_get_dma_tag(int slotno)
+tc_vsbus_get_dma_tag(int slotno)
{
- return tcbus_dmat;
+
+ return tc_vsbus_dmat;
+}
+
+static void
+tc_vsbus_intr(void *arg)
+{
+ struct tc_vsbus_softc * const sc = arg;
+ bus_space_tag_t bst = sc->sc_bst;
+ bus_space_handle_t bsh = sc->sc_bsh_csr;
+ uint32_t csr;
+
+ sc->sc_ev.ev_count++;
+
+ csr = bus_space_read_4(bst, bsh, 0);
+ if (__predict_true((csr & KA4x_TCA_CSR_TC_IRQ) == 0)) /* active low */
+ sc->sc_intr_func(sc->sc_intr_arg);
+
+ /* Clear possible timeout bit which asserts TC interrupt. */
+ csr = bus_space_read_4(bst, bsh, 0);
+ csr &= ~KA4x_TCA_CSR_TC_TMO;
+ bus_space_write_4(bst, bsh, 0, csr);
}
static void
-tcbus_intr_establish(device_t dv, void *cookie, int level,
- int (*func)(void *), void *arg)
+tc_vsbus_intr_establish(device_t dv, void *cookie, int level,
+ int (*func)(void *), void *arg)
{
- struct tcbus_softc * const sc = cookie;
+ struct tc_vsbus_softc * const sc = cookie;
+
+ sc->sc_intr_func = func;
+ sc->sc_intr_arg = arg;
- scb_vecalloc(0x51, (void (*)(void *)) func, arg, SCB_ISTACK,
- &sc->sc_ev);
+ scb_vecalloc(sc->sc_cvec, tc_vsbus_intr, sc, SCB_ISTACK, &sc->sc_ev);
}
static void
-tcbus_intr_disestablish(device_t dv, void *cookie)
+tc_vsbus_intr_disestablish(device_t dv, void *cookie)
{
+
+ /* Do nothing. */
}
static const struct evcnt *
-tcbus_intr_evcnt(device_t dv, void *cookie)
+tc_vsbus_intr_evcnt(device_t dv, void *cookie)
{
- return NULL;
+ struct tc_vsbus_softc * const sc = device_private(dv);
+
+ return &sc->sc_ev;
}
-int
-tcbus_match(device_t parent, cfdata_t cfdata, void *aux)
+static int
+vax_tc_bus_space_map(void *t, bus_addr_t pa, bus_size_t size, int cacheable,
+ bus_space_handle_t *bshp, int f2)
{
+
+ /* bus_space is pre-mapped, so "pa" is a virtual address already. */
+ *bshp = pa;
return 0;
}
-#define KA4x_TURBO 0x30000000
-#define KA4x_TURBOMAPS 0x35800000
-#define KA4x_TURBOCSR 0x36800000
-
-void
-tcbus_attach(device_t parent, device_t self, void *aux)
+static int
+vax_tc_bus_space_subregion(void *t, bus_space_handle_t h, bus_size_t o,
+ bus_size_t s, bus_space_handle_t *hp)
{
- struct vsbus_attach_args * const va = aux;
- struct tcbus_softc * const sc = device_private(self);
- struct tcbus_attach_args tba;
- struct pte *pte;
- const size_t nentries = 32768;
- int error;
- int i;
- error = bus_space_map(va->va_memt, KA4x_TURBO, 0x10000,
- BUS_SPACE_MAP_LINEAR, &sc->sc_memh);
- if (error) {
- aprint_error(": failed to map TC slot 0: %d\n", error);
- return;
- }
+ *hp = h + o;
+ return 0;
+}
- sc->sc_slots[0].tcs_addr = sc->sc_memh;
- sc->sc_slots[0].tcs_cookie = sc;
+static void
+vax_tc_bus_space_unmap(void *t, bus_space_handle_t h, bus_size_t size, int f)
+{
- tba.tba_speed = TC_SPEED_12_5_MHZ;
- tba.tba_slots = sc->sc_slots;
- tba.tba_nslots = 1;
- tba.tba_intr_evcnt = tcbus_intr_evcnt;
- tba.tba_intr_establish = tcbus_intr_establish;
- tba.tba_intr_disestablish = tcbus_intr_disestablish;
- tba.tba_get_dma_tag = tcbus_get_dma_tag;
-
- vax_sgmap_dmatag_init(&sc->sc_dmatag, sc, nentries);
- pte = (struct pte *) vax_map_physmem(KA4x_TURBOMAPS,
- nentries * sizeof(pte[0]));
+ /* Do nothing. */
+}
- for (i = nentries; i > 0; )
- ((uint32_t *) pte)[--i] = 0;
+static int
+vax_tc_bus_space_alloc(void *t, bus_addr_t rs, bus_addr_t re, bus_size_t s,
+ bus_size_t a, bus_size_t b, int f, bus_addr_t *ap, bus_space_handle_t *hp)
+{
- sc->sc_dmatag._sgmap = &sc->sc_sgmap;
- /*
- * Initialize the SGMAP.
- */
- vax_sgmap_init(&sc->sc_dmatag, &sc->sc_sgmap, "tc_sgmap",
- sc->sc_dmatag._wbase, sc->sc_dmatag._wsize, pte, 0);
+ panic("vax_tc_bus_space_alloc not implemented");
+}
- aprint_normal("\n");
+static void
+vax_tc_bus_space_free(void *t, bus_space_handle_t h, bus_size_t s)
+{
- aprint_verbose_dev(self, "32K entry DMA SGMAP at PA 0x%x (VA %p)\n",
- KA4x_TURBOMAPS, pte);
+ panic("vax_tc_bus_space_free not implemented");
+}
- tcbus_dmat = &sc->sc_dmatag;
+static paddr_t
+vax_tc_bus_space_mmap(void *v, bus_addr_t addr, off_t off, int prot, int flags)
+{
+ bus_addr_t rv;
- /* XXX: why not config_found(9)?? */
- tcattach(parent, self, &tba);
+ rv = addr + off;
+ return btop(rv);
}
Index: src/sys/dev/tc/tc.c
diff -u src/sys/dev/tc/tc.c:1.54 src/sys/dev/tc/tc.c:1.54.8.1
--- src/sys/dev/tc/tc.c:1.54 Mon Dec 12 17:03:41 2016
+++ src/sys/dev/tc/tc.c Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tc.c,v 1.54 2016/12/12 17:03:41 flxd Exp $ */
+/* $NetBSD: tc.c,v 1.54.8.1 2017/07/01 08:39:21 snj Exp $ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tc.c,v 1.54 2016/12/12 17:03:41 flxd Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tc.c,v 1.54.8.1 2017/07/01 08:39:21 snj Exp $");
#include "opt_tcverbose.h"
@@ -156,7 +156,7 @@ tcattach(device_t parent, device_t self,
tcaddr = slot->tcs_addr;
if (tc_badaddr(tcaddr))
continue;
- if (tc_checkslot(tcaddr, ta.ta_modname) == 0)
+ if (tc_checkslot(tcaddr, ta.ta_modname, NULL) == 0)
continue;
/*
@@ -201,9 +201,7 @@ tcprint(void *aux, const char *pnp)
static const tc_offset_t tc_slot_romoffs[] = {
TC_SLOT_ROM,
-#ifndef __vax__
TC_SLOT_PROTOROM,
-#endif
};
static int
@@ -234,7 +232,7 @@ tc_check_romp(const struct tc_rommap *ro
}
int
-tc_checkslot(tc_addr_t slotbase, char *namep)
+tc_checkslot(tc_addr_t slotbase, char *namep, struct tc_rommap **rompp)
{
struct tc_rommap *romp;
int i, j;
@@ -246,9 +244,13 @@ tc_checkslot(tc_addr_t slotbase, char *n
if (!tc_check_romp(romp))
continue;
- for (j = 0; j < TC_ROM_LLEN; j++)
- namep[j] = romp->tcr_modname[j].v;
- namep[j] = '\0';
+ if (namep != NULL) {
+ for (j = 0; j < TC_ROM_LLEN; j++)
+ namep[j] = romp->tcr_modname[j].v;
+ namep[j] = '\0';
+ }
+ if (rompp != NULL)
+ *rompp = romp;
return (1);
}
return (0);
Index: src/sys/dev/tc/tcvar.h
diff -u src/sys/dev/tc/tcvar.h:1.26 src/sys/dev/tc/tcvar.h:1.26.46.1
--- src/sys/dev/tc/tcvar.h:1.26 Sat Jun 4 01:57:34 2011
+++ src/sys/dev/tc/tcvar.h Sat Jul 1 08:39:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tcvar.h,v 1.26 2011/06/04 01:57:34 tsutsui Exp $ */
+/* $NetBSD: tcvar.h,v 1.26.46.1 2017/07/01 08:39:21 snj Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
@@ -139,7 +139,7 @@ struct tc_builtin {
/*
* Interrupt establishment functions.
*/
-int tc_checkslot(tc_addr_t, char *);
+int tc_checkslot(tc_addr_t, char *, struct tc_rommap **);
void tcattach(device_t, device_t, void *);
const struct evcnt *tc_intr_evcnt(device_t, void *);
void tc_intr_establish(device_t, void *, int, int (*)(void *),