Annotation of sys/arch/sparc/dev/bwtwo.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bwtwo.c,v 1.34 2006/12/03 16:38:12 miod Exp $ */
2: /* $NetBSD: bwtwo.c,v 1.33 1997/05/24 20:16:02 pk Exp $ */
3:
4: /*
5: * Copyright (c) 2002 Miodrag Vallat. All rights reserved.
6: * Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
7: * Copyright (c) 1992, 1993
8: * The Regents of the University of California. All rights reserved.
9: *
10: * This software was developed by the Computer Systems Engineering group
11: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
12: * contributed to Berkeley.
13: *
14: * All advertising materials mentioning features or use of this software
15: * must display the following acknowledgement:
16: * This product includes software developed by the University of
17: * California, Lawrence Berkeley Laboratory.
18: *
19: * Redistribution and use in source and binary forms, with or without
20: * modification, are permitted provided that the following conditions
21: * are met:
22: * 1. Redistributions of source code must retain the above copyright
23: * notice, this list of conditions and the following disclaimer.
24: * 2. Redistributions in binary form must reproduce the above copyright
25: * notice, this list of conditions and the following disclaimer in the
26: * documentation and/or other materials provided with the distribution.
27: * 3. Neither the name of the University nor the names of its contributors
28: * may be used to endorse or promote products derived from this software
29: * without specific prior written permission.
30: *
31: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
32: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41: * SUCH DAMAGE.
42: *
43: * @(#)bwtwo.c 8.1 (Berkeley) 6/11/93
44: */
45:
46: /*
47: * black&white display (bwtwo) driver.
48: *
49: * P4 and overlay plane support by Jason R. Thorpe <thorpej@NetBSD.ORG>.
50: * Overlay plane handling hints and ideas provided by Brad Spencer.
51: */
52:
53: #include <sys/param.h>
54: #include <sys/systm.h>
55: #include <sys/device.h>
56: #include <sys/ioctl.h>
57: #include <sys/malloc.h>
58: #include <sys/mman.h>
59: #include <sys/tty.h>
60: #include <sys/conf.h>
61:
62: #include <uvm/uvm_extern.h>
63:
64: #include <machine/autoconf.h>
65: #include <machine/eeprom.h>
66: #include <machine/ctlreg.h>
67: #include <machine/conf.h>
68: #include <sparc/sparc/asm.h>
69:
70: #include <sparc/dev/btreg.h>
71: #include <sparc/dev/bwtworeg.h>
72: #include <sparc/dev/sbusvar.h>
73: #if defined(SUN4)
74: #include <sparc/dev/pfourreg.h>
75: #endif
76:
77: #include <dev/wscons/wsconsio.h>
78: #include <dev/wscons/wsdisplayvar.h>
79: #include <dev/rasops/rasops.h>
80: #include <machine/fbvar.h>
81:
82: #include <machine/pmap.h>
83:
84: /* per-display variables */
85: struct bwtwo_softc {
86: struct sunfb sc_sunfb; /* common base part */
87: volatile struct fbcontrol *sc_reg;/* control registers */
88: struct rom_reg sc_phys; /* phys address description */
89: int sc_bustype; /* type of bus we live on */
90: int sc_pixeloffset; /* offset to framebuffer */
91: };
92:
93: void bwtwo_burner(void *, u_int, u_int);
94: int bwtwo_intr(void *);
95: int bwtwo_ioctl(void *, u_long, caddr_t, int, struct proc *);
96: paddr_t bwtwo_mmap(void *, off_t, int);
97:
98: struct wsdisplay_accessops bwtwo_accessops = {
99: bwtwo_ioctl,
100: bwtwo_mmap,
101: NULL, /* alloc_screen */
102: NULL, /* free_screen */
103: NULL, /* show_screen */
104: NULL, /* load_font */
105: NULL, /* scrollback */
106: NULL, /* getchar */
107: bwtwo_burner,
108: NULL /* pollc */
109: };
110:
111:
112: /* autoconfiguration driver */
113: void bwtwoattach(struct device *, struct device *, void *);
114: int bwtwomatch(struct device *, void *, void *);
115:
116: struct cfattach bwtwo_ca = {
117: sizeof(struct bwtwo_softc), bwtwomatch, bwtwoattach
118: };
119:
120: struct cfdriver bwtwo_cd = {
121: NULL, "bwtwo", DV_DULL
122: };
123:
124: int
125: bwtwomatch(struct device *parent, void *vcf, void *aux)
126: {
127: struct cfdata *cf = vcf;
128: struct confargs *ca = aux;
129: struct romaux *ra = &ca->ca_ra;
130:
131: if (strcmp(cf->cf_driver->cd_name, ra->ra_name))
132: return (0);
133:
134: #if 0
135: if (CPU_ISSUN4 && cf->cf_unit != 0)
136: return (0);
137: #endif
138:
139: if (ca->ca_bustype == BUS_SBUS)
140: return (1);
141:
142: /*
143: * Make sure there's hardware there.
144: */
145: if (probeget(ra->ra_vaddr, 4) == -1)
146: return (0);
147:
148: switch (ca->ca_bustype) {
149: case BUS_VME16:
150: case BUS_VME32:
151: return (1);
152: case BUS_OBIO:
153: #if defined(SUN4)
154: if (CPU_ISSUN4) {
155: /*
156: * Check for a pfour framebuffer, but do not match the
157: * overlay planes for color pfour framebuffers.
158: */
159: switch (fb_pfour_id(ra->ra_vaddr)) {
160: case PFOUR_ID_BW:
161: case PFOUR_NOTPFOUR:
162: return (1);
163: case PFOUR_ID_COLOR8P1: /* bwtwo in ... */
164: case PFOUR_ID_COLOR24: /* ...overlay plane */
165: default:
166: return (0);
167: }
168: }
169: #endif
170: return (1);
171: default:
172: return (0);
173: }
174: }
175:
176: void
177: bwtwoattach(struct device *parent, struct device *self, void *args)
178: {
179: struct bwtwo_softc *sc = (struct bwtwo_softc *)self;
180: struct confargs *ca = args;
181: int node = ca->ca_ra.ra_node;
182: int isconsole = 0;
183: int sbus = 1;
184: char *nam;
185:
186: printf(": ");
187:
188: /*
189: * Map the control register.
190: */
191: #if defined(SUN4)
192: if (CPU_ISSUN4 && ca->ca_bustype == BUS_OBIO &&
193: fb_pfour_id(ca->ca_ra.ra_vaddr) != PFOUR_NOTPFOUR) {
194: SET(sc->sc_sunfb.sf_flags, FB_PFOUR);
195: sc->sc_sunfb.sf_pfour = (volatile u_int32_t *)
196: mapiodev(ca->ca_ra.ra_reg, 0, sizeof(u_int32_t));
197: } else
198: #endif
199: {
200: sc->sc_reg = (volatile struct fbcontrol *)
201: mapiodev(ca->ca_ra.ra_reg, BWREG_REG,
202: sizeof(struct fbcontrol));
203: }
204:
205: /* Set up default pixel offset. May be changed below. */
206: sc->sc_pixeloffset = BWREG_MEM;
207:
208: switch (ca->ca_bustype) {
209: case BUS_OBIO:
210: if (CPU_ISSUN4M) /* 4m has framebuffer on obio */
211: goto obp_name;
212:
213: sbus = node = 0;
214: #if defined(SUN4)
215: if (ISSET(sc->sc_sunfb.sf_flags, FB_PFOUR)) {
216: nam = "p4";
217: sc->sc_pixeloffset = PFOUR_BW_OFF;
218: } else
219: #endif
220: nam = NULL;
221: break;
222:
223: case BUS_VME32:
224: case BUS_VME16:
225: sbus = node = 0;
226: nam = NULL;
227: break;
228:
229: case BUS_SBUS:
230: obp_name:
231: #if defined(SUN4C) || defined(SUN4M)
232: nam = getpropstring(node, "model");
233: #endif
234: break;
235: }
236:
237: if (nam != NULL && *nam != '\0')
238: printf("%s, ", nam);
239:
240: #if defined(SUN4)
241: if (CPU_ISSUN4) {
242: struct eeprom *eep = (struct eeprom *)eeprom_va;
243: int constype = ISSET(sc->sc_sunfb.sf_flags, FB_PFOUR) ?
244: EE_CONS_P4OPT : EE_CONS_BW;
245: /*
246: * Assume this is the console if there's no eeprom info
247: * to be found.
248: */
249: if (eep == NULL || eep->eeConsole == constype)
250: isconsole = 1;
251: else
252: /*
253: * On sun4 systems without on-board framebuffers (such as
254: * the 4/3xx models), the PROM will accept the EE_CONS_BW
255: * setting although the framebuffer is a P4.
256: * Accept this setting as well.
257: */
258: if (eep->eeConsole == EE_CONS_BW)
259: isconsole = 1;
260: }
261: #endif
262:
263: if (CPU_ISSUN4COR4M)
264: isconsole = node == fbnode;
265:
266: sc->sc_phys = ca->ca_ra.ra_reg[0];
267: sc->sc_bustype = ca->ca_bustype;
268:
269: /* enable video */
270: bwtwo_burner(sc, 1, 0);
271:
272: fb_setsize(&sc->sc_sunfb, 1, 1152, 900, node, ca->ca_bustype);
273: printf("%dx%d\n", sc->sc_sunfb.sf_width, sc->sc_sunfb.sf_height);
274:
275: sc->sc_sunfb.sf_ro.ri_bits = mapiodev(ca->ca_ra.ra_reg,
276: sc->sc_pixeloffset, round_page(sc->sc_sunfb.sf_fbsize));
277: sc->sc_sunfb.sf_ro.ri_hw = sc;
278: fbwscons_init(&sc->sc_sunfb, isconsole ? 0 : RI_CLEAR);
279:
280: if (isconsole) {
281: fbwscons_console_init(&sc->sc_sunfb, -1);
282: }
283:
284: fbwscons_attach(&sc->sc_sunfb, &bwtwo_accessops, isconsole);
285: }
286:
287: int
288: bwtwo_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p)
289: {
290: struct bwtwo_softc *sc = v;
291: struct wsdisplay_fbinfo *wdf;
292:
293: switch (cmd) {
294: case WSDISPLAYIO_GTYPE:
295: *(u_int *)data = WSDISPLAY_TYPE_SUNBW;
296: break;
297: case WSDISPLAYIO_GINFO:
298: wdf = (struct wsdisplay_fbinfo *)data;
299: wdf->height = sc->sc_sunfb.sf_height;
300: wdf->width = sc->sc_sunfb.sf_width;
301: wdf->depth = sc->sc_sunfb.sf_depth;
302: wdf->cmsize = 0; /* no colormap */
303: break;
304: case WSDISPLAYIO_LINEBYTES:
305: *(u_int *)data = sc->sc_sunfb.sf_linebytes;
306: break;
307:
308: case WSDISPLAYIO_GETCMAP:
309: case WSDISPLAYIO_PUTCMAP:
310: break;
311:
312: case WSDISPLAYIO_SVIDEO:
313: case WSDISPLAYIO_GVIDEO:
314: break;
315:
316: case WSDISPLAYIO_GCURPOS:
317: case WSDISPLAYIO_SCURPOS:
318: case WSDISPLAYIO_GCURMAX:
319: case WSDISPLAYIO_GCURSOR:
320: case WSDISPLAYIO_SCURSOR:
321: default:
322: return (-1); /* not supported yet */
323: }
324:
325: return (0);
326: }
327:
328: paddr_t
329: bwtwo_mmap(void *v, off_t offset, int prot)
330: {
331: struct bwtwo_softc *sc = v;
332:
333: if (offset & PGOFSET)
334: return (-1);
335:
336: if (offset >= 0 && offset < sc->sc_sunfb.sf_fbsize) {
337: return (REG2PHYS(&sc->sc_phys, sc->sc_pixeloffset + offset) |
338: PMAP_NC);
339: }
340:
341: return (-1);
342: }
343:
344: void
345: bwtwo_burner(void *v, u_int on, u_int flags)
346: {
347: struct bwtwo_softc *sc = v;
348: int s;
349:
350: #if defined(SUN4)
351: if (CPU_ISSUN4 && (sc->sc_bustype == BUS_OBIO)) {
352: if (ISSET(sc->sc_sunfb.sf_flags, FB_PFOUR)) {
353: fb_pfour_burner(v, on, flags);
354: return;
355: }
356: if (on)
357: stba(AC_SYSENABLE, ASI_CONTROL,
358: lduba(AC_SYSENABLE, ASI_CONTROL) | SYSEN_VIDEO);
359: else
360: stba(AC_SYSENABLE, ASI_CONTROL,
361: lduba(AC_SYSENABLE, ASI_CONTROL) & ~SYSEN_VIDEO);
362:
363: return;
364: }
365: #endif
366:
367: s = splhigh();
368: if (on)
369: sc->sc_reg->fbc_ctrl |= FBC_VENAB | FBC_TIMING;
370: else {
371: sc->sc_reg->fbc_ctrl &= ~FBC_VENAB;
372: if (flags & WSDISPLAY_BURN_VBLANK)
373: sc->sc_reg->fbc_ctrl &= ~FBC_TIMING;
374: }
375: splx(s);
376: }
CVSweb