Annotation of sys/arch/sparc/dev/cgeight.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: cgeight.c,v 1.28 2006/12/03 22:13:05 miod Exp $ */
2: /* $NetBSD: cgeight.c,v 1.13 1997/05/24 20:16:04 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) 1995 Theo de Raadt
8: * Copyright (c) 1992, 1993
9: * The Regents of the University of California. All rights reserved.
10: *
11: * This software was developed by the Computer Systems Engineering group
12: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
13: * contributed to Berkeley.
14: *
15: * All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by the University of
18: * California, Lawrence Berkeley Laboratory.
19: *
20: * Redistribution and use in source and binary forms, with or without
21: * modification, are permitted provided that the following conditions
22: * are met:
23: * 1. Redistributions of source code must retain the above copyright
24: * notice, this list of conditions and the following disclaimer.
25: * 2. Redistributions in binary form must reproduce the above copyright
26: * notice, this list of conditions and the following disclaimer in the
27: * documentation and/or other materials provided with the distribution.
28: * 3. Neither the name of the University nor the names of its contributors
29: * may be used to endorse or promote products derived from this software
30: * without specific prior written permission.
31: *
32: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
33: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
34: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
36: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
40: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
41: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
42: * SUCH DAMAGE.
43: *
44: * from @(#)cgthree.c 8.2 (Berkeley) 10/30/93
45: */
46:
47: /*
48: * color display (cgeight) driver.
49: *
50: * For performance reasons, we run the emulation mode in the (monochrome)
51: * overlay plane, but X11 in the 24-bit color plane.
52: *
53: * Does not handle interrupts, even though they can occur.
54: */
55:
56: #include <sys/param.h>
57: #include <sys/systm.h>
58: #include <sys/buf.h>
59: #include <sys/device.h>
60: #include <sys/ioctl.h>
61: #include <sys/malloc.h>
62: #include <sys/mman.h>
63: #include <sys/tty.h>
64: #include <sys/conf.h>
65:
66: #include <uvm/uvm_extern.h>
67:
68: #include <machine/autoconf.h>
69: #include <machine/pmap.h>
70: #include <machine/eeprom.h>
71: #include <machine/conf.h>
72:
73: #include <dev/wscons/wsconsio.h>
74: #include <dev/wscons/wsdisplayvar.h>
75: #include <dev/rasops/rasops.h>
76: #include <machine/fbvar.h>
77:
78: #include <sparc/dev/btreg.h>
79: #include <sparc/dev/btvar.h>
80: #include <sparc/dev/pfourreg.h>
81:
82: /* per-display variables */
83: struct cgeight_softc {
84: struct sunfb sc_sunfb; /* common base device */
85: struct rom_reg sc_phys;
86: volatile struct fbcontrol *sc_fbc; /* Brooktree registers */
87: volatile u_char *sc_enable; /* enable plane */
88: };
89:
90: int cgeight_ioctl(void *, u_long, caddr_t, int, struct proc *);
91: paddr_t cgeight_mmap(void *, off_t, int);
92: void cgeight_reset(struct cgeight_softc *, int);
93:
94: struct wsdisplay_accessops cgeight_accessops = {
95: cgeight_ioctl,
96: cgeight_mmap,
97: NULL, /* alloc_screen */
98: NULL, /* free_screen */
99: NULL, /* show_screen */
100: NULL, /* load_font */
101: NULL, /* scrollback */
102: NULL, /* getchar */
103: fb_pfour_burner,
104: NULL /* pollc */
105: };
106:
107: void cgeightattach(struct device *, struct device *, void *);
108: int cgeightmatch(struct device *, void *, void *);
109:
110: struct cfattach cgeight_ca = {
111: sizeof(struct cgeight_softc), cgeightmatch, cgeightattach
112: };
113:
114: struct cfdriver cgeight_cd = {
115: NULL, "cgeight", DV_DULL
116: };
117:
118: int
119: cgeightmatch(struct device *parent, void *vcf, void *aux)
120: {
121: struct cfdata *cf = vcf;
122: struct confargs *ca = aux;
123: struct romaux *ra = &ca->ca_ra;
124:
125: if (strcmp(cf->cf_driver->cd_name, ra->ra_name))
126: return (0);
127:
128: if (!CPU_ISSUN4 || ca->ca_bustype != BUS_OBIO)
129: return (0);
130:
131: /*
132: * Make sure there's hardware there.
133: */
134: if (probeget(ra->ra_vaddr, 4) == -1)
135: return (0);
136:
137: /*
138: * Check the pfour register.
139: */
140: if (fb_pfour_id(ra->ra_vaddr) == PFOUR_ID_COLOR24)
141: return (1);
142:
143: return (0);
144: }
145:
146: void
147: cgeightattach(struct device *parent, struct device *self, void *args)
148: {
149: struct cgeight_softc *sc = (struct cgeight_softc *)self;
150: struct confargs *ca = args;
151: int node = 0;
152: volatile struct bt_regs *bt;
153: int isconsole = 0;
154:
155: /* Map the pfour register. */
156: SET(sc->sc_sunfb.sf_flags, FB_PFOUR);
157: sc->sc_sunfb.sf_pfour = (volatile u_int32_t *)
158: mapiodev(ca->ca_ra.ra_reg, 0, sizeof(u_int32_t));
159:
160: if (cputyp == CPU_SUN4) {
161: struct eeprom *eep = (struct eeprom *)eeprom_va;
162:
163: /*
164: * Assume this is the console if there's no eeprom info
165: * to be found.
166: */
167: if (eep == NULL || eep->eeConsole == EE_CONS_P4OPT)
168: isconsole = 1;
169: }
170:
171: /* Map the Brooktree. */
172: sc->sc_fbc = (volatile struct fbcontrol *)
173: mapiodev(ca->ca_ra.ra_reg,
174: PFOUR_COLOR_OFF_CMAP, sizeof(struct fbcontrol));
175:
176: sc->sc_phys = ca->ca_ra.ra_reg[0];
177:
178: /* enable video */
179: fb_pfour_burner(sc, 1, 0);
180: bt = &sc->sc_fbc->fbc_dac;
181: BT_INIT(bt, 0);
182:
183: fb_setsize(&sc->sc_sunfb, 1, 1152, 900, node, ca->ca_bustype);
184: sc->sc_sunfb.sf_ro.ri_hw = sc;
185:
186: /*
187: * Map the overlay and overlay enable planes.
188: */
189: sc->sc_enable = (volatile u_char *)mapiodev(ca->ca_ra.ra_reg,
190: PFOUR_COLOR_OFF_ENABLE, round_page(sc->sc_sunfb.sf_fbsize));
191: sc->sc_sunfb.sf_ro.ri_bits = mapiodev(ca->ca_ra.ra_reg,
192: PFOUR_COLOR_OFF_OVERLAY, round_page(sc->sc_sunfb.sf_fbsize));
193:
194: cgeight_reset(sc, WSDISPLAYIO_MODE_EMUL);
195: fbwscons_init(&sc->sc_sunfb, isconsole ? 0 : RI_CLEAR);
196: printf(": p4, %dx%d", sc->sc_sunfb.sf_width,
197: sc->sc_sunfb.sf_height);
198:
199: if (isconsole) {
200: fbwscons_console_init(&sc->sc_sunfb, -1);
201: }
202:
203: fbwscons_attach(&sc->sc_sunfb, &cgeight_accessops, isconsole);
204: }
205:
206: void
207: cgeight_reset(struct cgeight_softc *sc, int mode)
208: {
209: volatile struct bt_regs *bt;
210: union bt_cmap cm;
211: u_int c;
212:
213: bt = &sc->sc_fbc->fbc_dac;
214:
215: /*
216: * Depending on the mode requested, disable or enable
217: * the overlay plane.
218: */
219: if (mode == WSDISPLAYIO_MODE_EMUL) {
220: memset((void *)sc->sc_enable, 0xff,
221: round_page(sc->sc_sunfb.sf_fbsize));
222:
223: /* Setup a strict mono colormap */
224: cm.cm_map[0][0] = cm.cm_map[0][1] = cm.cm_map[0][2] = 0x00;
225: for (c = 1; c < 256; c++) {
226: cm.cm_map[c][0] = cm.cm_map[c][1] = cm.cm_map[c][2] =
227: 0xff;
228: }
229: } else {
230: memset((void *)sc->sc_enable, 0x00,
231: round_page(sc->sc_sunfb.sf_fbsize));
232:
233: /* Setup a ramp colormap (direct color) */
234: for (c = 0; c < 256; c++) {
235: cm.cm_map[c][0] = cm.cm_map[c][1] = cm.cm_map[c][2] = c;
236: }
237: }
238:
239: /* Upload the colormap into the DAC */
240: bt_loadcmap(&cm, bt, 0, 256, 0);
241: }
242:
243: int
244: cgeight_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p)
245: {
246: struct cgeight_softc *sc = v;
247: struct wsdisplay_fbinfo *wdf;
248:
249: switch (cmd) {
250: case WSDISPLAYIO_GTYPE:
251: *(u_int *)data = WSDISPLAY_TYPE_SUNCG8;
252: break;
253: case WSDISPLAYIO_GINFO:
254: wdf = (struct wsdisplay_fbinfo *)data;
255: wdf->height = sc->sc_sunfb.sf_height;
256: wdf->width = sc->sc_sunfb.sf_width;
257: wdf->depth = 24;
258: wdf->cmsize = 0;
259: break;
260: case WSDISPLAYIO_SMODE:
261: cgeight_reset(sc, *(int *)data);
262: break;
263: case WSDISPLAYIO_SVIDEO:
264: case WSDISPLAYIO_GVIDEO:
265: break;
266:
267: case WSDISPLAYIO_GETCMAP: /* nothing to do */
268: case WSDISPLAYIO_PUTCMAP: /* nothing to do */
269: case WSDISPLAYIO_GCURPOS: /* not supported */
270: case WSDISPLAYIO_SCURPOS: /* not supported */
271: case WSDISPLAYIO_GCURMAX: /* not supported */
272: case WSDISPLAYIO_GCURSOR: /* not supported */
273: case WSDISPLAYIO_SCURSOR: /* not supported */
274: default:
275: return (-1);
276: }
277:
278: return (0);
279: }
280:
281: paddr_t
282: cgeight_mmap(void *v, off_t offset, int prot)
283: {
284: struct cgeight_softc *sc = v;
285:
286: if (offset & PGOFSET)
287: return (-1);
288:
289: /* Allow mapping of the 24-bit color planes */
290: if (offset >= 0 && offset < round_page(24 * sc->sc_sunfb.sf_fbsize)) {
291: return (REG2PHYS(&sc->sc_phys,
292: offset + PFOUR_COLOR_OFF_COLOR) | PMAP_NC);
293: }
294:
295: return (-1);
296: }
CVSweb