px.c revision 1.1
1/*	$NetBSD: px.c,v 1.1 1997/11/08 07:27:49 jonathan Exp $	*/
2
3/*
4 * Copyright (c) 1997 Jonathan Stone
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *      This product includes software developed by Jonathan Stone for
18 *      the NetBSD Project.
19 * 4. The name of the author may not be used to endorse or promote products
20 *    derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include <sys/cdefs.h>
35__KERNEL_RCSID(0, "$NetBSD: px.c,v 1.1 1997/11/08 07:27:49 jonathan Exp $");
36
37/*
38 * px.c: placebo driver for the DEC TURBOchannel 2-d and 3-d
39 * accelerated framebuffers with PixelStamp blitter asics and i860
40 * accelerators.
41 */
42
43#include <sys/param.h>
44#include <sys/systm.h>
45#include <sys/device.h>
46
47#include <dev/tc/tcvar.h>
48#include <dev/tc/sticvar.h>
49
50#include <machine/autoconf.h>
51#include <machine/cpu.h>
52#include <machine/bus.h>
53
54/*
55 * hardware offsets  within PX board's TC slot.
56 */
57#define PX_STIC_POLL_OFFSET	0x000000
58#define PX_STAMP_OFFSET		0x0c0000	/* pixelstamp space on STIC */
59#define PX_STIC_OFFSET		0x180000	/* STIC registers */
60#define PX_VDAC_OFFSET		0x200000
61#define PX_ROM_OFFSET		0x300000
62
63
64struct px_softc {
65	struct 	device sc_dv;		/* device information */
66	tc_addr_t px_slotbase;		/* kva of slot base. */
67  	struct stic_softc px_stic;	/* address of pixelstamp and stic. */
68};
69
70/*
71 * Local prototypes.
72 */
73int	px_match __P((struct device *, struct cfdata *, void *));
74void	px_attach __P((struct device *, struct device *, void *));
75int	px_intr __P((void *xxx_sc));
76void	px_vblank_ctl __P((struct px_softc *sc, int onoff));
77void	px_blank __P((struct  px_softc *sc));
78void	px_unblank __P((struct  px_softc *sc));
79
80struct cfattach px_ca = {
81	sizeof (struct px_softc), px_match, px_attach,
82};
83
84struct cfdriver px_cd = {
85	NULL, "px", DV_DULL
86};
87
88/*
89 * Match a PMAG-C pixelstamp board.
90 */
91int
92px_match(parent, match, aux)
93	struct device *parent;
94	struct cfdata *match;
95	void *aux;
96{
97	struct tc_attach_args *ta = aux;
98	void *pxaddr;
99
100	if (strncmp("PMAG-CA ", ta->ta_modname, TC_ROM_LLEN))
101		return (0);
102
103	pxaddr = (void*)ta->ta_addr;
104#if 0
105	if (tc_badaddr(pxaddr + 0))
106		return (0);
107#endif
108
109	return (1);
110}
111
112
113/*
114 * Attach a PMAG-C pixelstamp graphics board.
115 */
116void
117px_attach(parent, self, aux)
118	struct device *parent, *self;
119	void *aux;
120{
121	struct px_softc *sc  = (struct px_softc*)self;
122	struct tc_attach_args *ta = aux;
123
124	sc->px_slotbase = TC_PHYS_TO_UNCACHED(ta->ta_addr);
125	sc->px_stic.stic_pktbuf=
126	     (void*)(sc->px_slotbase + PX_STIC_POLL_OFFSET);
127	sc->px_stic.stic_addr = (void*)(sc->px_slotbase + PX_STIC_OFFSET);
128	sc->px_stic.stamp_addr = (void*)(sc->px_slotbase + PX_STAMP_OFFSET);
129	sc->px_stic.vdac_addr = (void*)(sc->px_slotbase + PX_VDAC_OFFSET);
130
131
132	/* Turn off vertical-blank interrupts, unless we're debugging. */
133#if !defined(DIAGNOSTIC) && !defined(DEBUG)
134	px_vblank_ctl(sc, 0);
135#endif
136
137	tc_intr_establish(parent, ta->ta_cookie, TC_IPL_NONE, px_intr, sc);
138
139	/* driver does nothing yet, except silently dismisses interrupts. */
140	printf(": no raster-console or X11 support.\n");
141
142}
143
144/*
145 * pixelstamp board interrupt hanlder.
146 * XXX examine pixelstamp blitter-chip packet area, and
147 * send new packets.
148 *
149 * For now, we ignore interrupts from the blitter chip or i860,
150 * and just handle vertical-retrace interrupt.
151 */
152int
153px_intr(xxx_sc)
154    void *xxx_sc;
155{
156	struct px_softc *sc = (struct px_softc *)xxx_sc;
157
158	volatile struct stic_regs * stic =
159	   STICADDR(sc->px_stic.stic_addr);
160
161	register int intr_status = stic->ipdvint;
162
163	/* Clear packet-done intr so we don't interrupt again. */
164	/* Packet interrupt? */
165	if (intr_status & STIC_INT_P) {
166
167		/*
168		 * Clear *only* packet done interrupt
169		 */
170		stic->ipdvint = (stic->ipdvint | STIC_INT_P_WE) &
171		     ~(STIC_INT_E_WE | STIC_INT_V_WE | STIC_INT_P);
172		tc_wmb();
173
174	}
175	/* Vertical-retrace interrupt ? */
176	else if (intr_status & STIC_INT_V) {
177
178		stic->ipdvint = (stic->ipdvint | STIC_INT_V_WE) &
179			~(STIC_INT_E_WE | STIC_INT_P_WE | STIC_INT_V);
180		tc_wmb();
181
182#ifdef notyet
183		/* Poll for LK-201 LED status, update LEDs */
184		lk201_led(unit);
185#endif
186
187	/* Error, stray interrupt ?*/
188	} else if (intr_status & STIC_INT_E) {
189#if defined(DIAGNOSTIC) || 1
190		 /* XXX not for me */
191		printf("px_intr: stray intr INT_E, %x %x %x %x %x",
192		       intr_status,
193		       stic->sticsr, stic->buscsr,
194		       stic->busadr, stic->busdat);
195		DELAY(1000000);
196		/*panic("px_intr: no intr condition\n");*/
197#endif
198	} else {
199#if defined(DIAGNOSTIC) || 1
200		DELAY(1000000);
201		 /* XXX not for me */
202		printf("px_intr:, no intr? %x %x %x %x %x",
203		       intr_status,
204		       stic->sticsr, stic->buscsr,
205		       stic->busadr, stic->busdat);
206		 DELAY(100000);
207		/*panic("px_intr: no intr condition\n");*/
208#endif
209	}
210
211	return(0); /* XXX forme */
212}
213
214
215/*
216 * Turn vertical retrace interrupt on or off
217 */
218void
219px_vblank_ctl(sc, switch_on)
220	struct px_softc	*sc;
221	int	switch_on;
222
223{
224	register volatile struct stic_regs *stic =
225	    STICADDR(sc->px_stic.stic_addr);
226
227	stic->ipdvint = (switch_on) ?
228		STIC_INT_V_WE | STIC_INT_V_EN :
229		STIC_INT_V_WE;
230
231	tc_wmb();
232}
233
234void
235px_blank(sc)
236	struct  px_softc *sc;
237{
238
239}
240
241
242void
243px_unblank(sc)
244	struct  px_softc *sc;
245{
246}
247