1*cbab9cadSchs /* $NetBSD: vme_two_68k.c,v 1.10 2012/10/27 17:18:04 chs Exp $ */
25bd17a12Sscw
35bd17a12Sscw /*-
45bd17a12Sscw * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
55bd17a12Sscw * All rights reserved.
65bd17a12Sscw *
75bd17a12Sscw * This code is derived from software contributed to The NetBSD Foundation
85bd17a12Sscw * by Steve C. Woodford.
95bd17a12Sscw *
105bd17a12Sscw * Redistribution and use in source and binary forms, with or without
115bd17a12Sscw * modification, are permitted provided that the following conditions
125bd17a12Sscw * are met:
135bd17a12Sscw * 1. Redistributions of source code must retain the above copyright
145bd17a12Sscw * notice, this list of conditions and the following disclaimer.
155bd17a12Sscw * 2. Redistributions in binary form must reproduce the above copyright
165bd17a12Sscw * notice, this list of conditions and the following disclaimer in the
175bd17a12Sscw * documentation and/or other materials provided with the distribution.
185bd17a12Sscw *
195bd17a12Sscw * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
205bd17a12Sscw * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
215bd17a12Sscw * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
225bd17a12Sscw * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
235bd17a12Sscw * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
245bd17a12Sscw * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
255bd17a12Sscw * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
265bd17a12Sscw * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
275bd17a12Sscw * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
285bd17a12Sscw * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
295bd17a12Sscw * POSSIBILITY OF SUCH DAMAGE.
305bd17a12Sscw */
315bd17a12Sscw
325bd17a12Sscw /*
335bd17a12Sscw * Front-end for the VMEchip2 found on the MVME-1[67][27] boards.
345bd17a12Sscw */
355bd17a12Sscw
364b2744bfSlukem #include <sys/cdefs.h>
37*cbab9cadSchs __KERNEL_RCSID(0, "$NetBSD: vme_two_68k.c,v 1.10 2012/10/27 17:18:04 chs Exp $");
384b2744bfSlukem
395bd17a12Sscw #include "vmetwo.h"
405bd17a12Sscw
415bd17a12Sscw #include <sys/param.h>
425bd17a12Sscw #include <sys/kernel.h>
435bd17a12Sscw #include <sys/systm.h>
445bd17a12Sscw #include <sys/device.h>
455bd17a12Sscw
465bd17a12Sscw #include <machine/cpu.h>
475bd17a12Sscw #include <machine/bus.h>
485bd17a12Sscw
495bd17a12Sscw #include <dev/vme/vmereg.h>
505bd17a12Sscw #include <dev/vme/vmevar.h>
515bd17a12Sscw
525bd17a12Sscw #include <mvme68k/mvme68k/isr.h>
535bd17a12Sscw #include <mvme68k/dev/mainbus.h>
545bd17a12Sscw
555bd17a12Sscw #include <dev/mvme/mvmebus.h>
565bd17a12Sscw #include <dev/mvme/vme_tworeg.h>
575bd17a12Sscw #include <dev/mvme/vme_twovar.h>
585bd17a12Sscw
59a07f7c80Stsutsui #include "ioconf.h"
607e69c325Sscw
617e69c325Sscw static void vmetwoisrlink(void *, int (*)(void *), void *,
627e69c325Sscw int, int, struct evcnt *);
637e69c325Sscw static void vmetwoisrunlink(void *, int);
647e69c325Sscw static struct evcnt *vmetwoisrevcnt(void *, int);
657e69c325Sscw
667e69c325Sscw #if NVMETWO > 0
677e69c325Sscw
68*cbab9cadSchs int vmetwo_match(device_t, cfdata_t, void *);
69*cbab9cadSchs void vmetwo_attach(device_t, device_t, void *);
705bd17a12Sscw
71*cbab9cadSchs CFATTACH_DECL_NEW(vmetwo, sizeof(struct vmetwo_softc),
72c5e91d44Sthorpej vmetwo_match, vmetwo_attach, NULL, NULL);
735bd17a12Sscw
745bd17a12Sscw
755bd17a12Sscw /* ARGSUSED */
765bd17a12Sscw int
vmetwo_match(device_t parent,cfdata_t cf,void * aux)77*cbab9cadSchs vmetwo_match(device_t parent, cfdata_t cf, void *aux)
785bd17a12Sscw {
795bd17a12Sscw struct mainbus_attach_args *ma;
805bd17a12Sscw static int matched = 0;
815bd17a12Sscw
825bd17a12Sscw ma = aux;
835bd17a12Sscw
845bd17a12Sscw if (strcmp(ma->ma_name, vmetwo_cd.cd_name))
85a07f7c80Stsutsui return 0;
865bd17a12Sscw
875bd17a12Sscw /* Only one VMEchip2, please. */
885bd17a12Sscw if (matched++)
89a07f7c80Stsutsui return 0;
905bd17a12Sscw
915bd17a12Sscw /*
925bd17a12Sscw * Some mvme1[67]2 boards have a `no VMEchip2' build option...
935bd17a12Sscw */
94a07f7c80Stsutsui return vmetwo_probe(ma->ma_bust, ma->ma_offset) ? 1 : 0;
955bd17a12Sscw }
965bd17a12Sscw
975bd17a12Sscw /* ARGSUSED */
985bd17a12Sscw void
vmetwo_attach(device_t parent,device_t self,void * aux)99*cbab9cadSchs vmetwo_attach(device_t parent, device_t self, void *aux)
1005bd17a12Sscw {
1015bd17a12Sscw struct mainbus_attach_args *ma;
1025bd17a12Sscw struct vmetwo_softc *sc;
1035bd17a12Sscw
104*cbab9cadSchs sc = device_private(self);
105*cbab9cadSchs sc->sc_mvmebus.sc_dev = self;
1065bd17a12Sscw ma = aux;
1075bd17a12Sscw
1085bd17a12Sscw /*
1095bd17a12Sscw * Map the local control registers
1105bd17a12Sscw */
1115bd17a12Sscw bus_space_map(ma->ma_bust, ma->ma_offset + VME2REG_LCSR_OFFSET,
1125bd17a12Sscw VME2LCSR_SIZE, 0, &sc->sc_lcrh);
1135bd17a12Sscw
1145bd17a12Sscw #ifdef notyet
1155bd17a12Sscw /*
1165bd17a12Sscw * Map the global control registers
1175bd17a12Sscw */
1185bd17a12Sscw bus_space_map(ma->ma_bust, ma->ma_offset + VME2REG_GCSR_OFFSET,
1195bd17a12Sscw VME2GCSR_SIZE, 0, &sc->sc_gcrh);
1205bd17a12Sscw #endif
1215bd17a12Sscw
1225bd17a12Sscw /* Initialise stuff for the common vme_two back-end */
1235bd17a12Sscw sc->sc_mvmebus.sc_bust = ma->ma_bust;
1245bd17a12Sscw sc->sc_mvmebus.sc_dmat = ma->ma_dmat;
1257e69c325Sscw
1267e69c325Sscw vmetwo_init(sc);
1277e69c325Sscw }
1287e69c325Sscw
1297e69c325Sscw #endif /* NVMETWO > 0 */
1307e69c325Sscw
1317e69c325Sscw void
vmetwo_md_intr_init(struct vmetwo_softc * sc)132a07f7c80Stsutsui vmetwo_md_intr_init(struct vmetwo_softc *sc)
1337e69c325Sscw {
1347e69c325Sscw
1355bd17a12Sscw sc->sc_isrlink = vmetwoisrlink;
1365bd17a12Sscw sc->sc_isrunlink = vmetwoisrunlink;
1375bd17a12Sscw sc->sc_isrevcnt = vmetwoisrevcnt;
1385bd17a12Sscw }
1395bd17a12Sscw
1405bd17a12Sscw /* ARGSUSED */
1415bd17a12Sscw static void
vmetwoisrlink(void * cookie,int (* fn)(void *),void * arg,int ipl,int vec,struct evcnt * evcnt)142a07f7c80Stsutsui vmetwoisrlink(void *cookie, int (*fn)(void *), void *arg, int ipl, int vec,
143a07f7c80Stsutsui struct evcnt *evcnt)
1445bd17a12Sscw {
1455bd17a12Sscw
1465bd17a12Sscw isrlink_vectored(fn, arg, ipl, vec, evcnt);
1475bd17a12Sscw }
1485bd17a12Sscw
1495bd17a12Sscw /* ARGSUSED */
1505bd17a12Sscw static void
vmetwoisrunlink(void * cookie,int vec)151a07f7c80Stsutsui vmetwoisrunlink(void *cookie, int vec)
1525bd17a12Sscw {
1535bd17a12Sscw
1545bd17a12Sscw isrunlink_vectored(vec);
1555bd17a12Sscw }
1565bd17a12Sscw
1575bd17a12Sscw /* ARGSUSED */
1585bd17a12Sscw static struct evcnt *
vmetwoisrevcnt(void * cookie,int ipl)159a07f7c80Stsutsui vmetwoisrevcnt(void *cookie, int ipl)
1605bd17a12Sscw {
1615bd17a12Sscw
162a07f7c80Stsutsui return isrlink_evcnt(ipl);
1635bd17a12Sscw }
164