xref: /netbsd-src/sys/arch/mvme68k/dev/vme_two_68k.c (revision cbab9cadce21ae72fac13910001079fff214cc29)
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