|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1992 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: sfb_hdw.c
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 11/92
30: *
31: * Driver for the Smart Color Frame Buffer Display,
32: * hardware-level operations.
33: */
34:
35: #include <sfb.h>
36: #if (NSFB > 0)
37: #include <platforms.h>
38:
39: #include <machine/machspl.h>
40: #include <mach/std_types.h>
41: #include <chips/busses.h>
42: #include <chips/screen_defs.h>
43: #include <chips/pm_defs.h>
44: #include <machine/machspl.h>
45:
46: typedef pm_softc_t sfb_softc_t;
47:
48: #ifdef DECSTATION
49: #include <mips/PMAX/pmagb_ba.h>
50: #include <mips/PMAX/tc.h>
51: #endif
52:
53: #ifdef FLAMINGO
54: #include <mips/PMAX/pmagb_ba.h> /* XXXX fixme */
55: #include <alpha/DEC/tc.h>
56: #define sparsify(x) ((1L << 28) | (((x) & 0x7ffffff) << 1) | \
57: ((x) & ~0x7ffffffL))
58: #endif
59:
60: #ifndef sparsify
61: #define sparsify(x) x
62: #endif
63:
64: /*
65: * Definition of the driver for the auto-configuration program.
66: */
67:
68: int sfb_probe(), sfb_intr();
69: void sfb_attach();
70:
71: vm_offset_t sfb_std[NSFB] = { 0 };
72: struct bus_device *sfb_info[NSFB];
73: struct bus_driver sfb_driver =
74: { sfb_probe, 0, sfb_attach, 0, sfb_std, "sfb", sfb_info,
75: 0, 0, BUS_INTR_DISABLED};
76:
77: /*
78: * Probe/Attach functions
79: */
80:
81: sfb_probe(
82: vm_offset_t addr,
83: struct bus_device *device)
84: {
85: static probed_once = 0;
86:
87: /*
88: * Probing was really done sweeping the TC long ago
89: */
90: if (tc_probe("sfb") == 0)
91: return 0;
92: if (probed_once++ > 1) {
93: printf("[mappable] ");
94: device->address = addr;
95: }
96: return 1;
97: }
98:
99: void sfb_attach(
100: struct bus_device *ui)
101: {
102: /* ... */
103: printf(": smart frame buffer");
104: }
105:
106:
107: /*
108: * Interrupt routine
109: */
110:
111: sfb_intr(
112: int unit,
113: spl_t spllevel)
114: {
115: register volatile char *ack;
116:
117: /* acknowledge interrupt */
118: ack = (volatile char *) sfb_info[unit]->address + SFB_OFFSET_ICLR;
119: *ack = 0;
120:
121: #if mips
122: splx(spllevel);
123: #endif
124: lk201_led(unit);
125: }
126:
127: sfb_vretrace(
128: sfb_softc_t *sfb,
129: boolean_t on)
130: {
131: sfb_regs *regs;
132:
133: regs = (sfb_regs *) ((char *)sfb->framebuffer - SFB_OFFSET_VRAM + SFB_OFFSET_REGS);
134:
135: regs->intr_enable = (on) ? 1 : 0;
136: }
137:
138: /*
139: * Boot time initialization: must make device
140: * usable as console asap.
141: */
142: #define sfb_set_status cfb_set_status
143:
144: extern int
145: sfb_soft_reset(), sfb_set_status(),
146: sfb_pos_cursor(), bt459_video_on(),
147: bt459_video_off(), sfb_vretrace(),
148: pm_get_status(), pm_char_paint(),
149: pm_insert_line(), pm_remove_line(),
150: pm_clear_bitmap(), pm_map_page();
151:
152: static struct screen_switch sfb_sw = {
153: screen_noop, /* graphic_open */
154: sfb_soft_reset, /* graphic_close */
155: sfb_set_status, /* set_status */
156: pm_get_status, /* get_status */
157: pm_char_paint, /* char_paint */
158: sfb_pos_cursor, /* pos_cursor */
159: pm_insert_line, /* insert_line */
160: pm_remove_line, /* remove_line */
161: pm_clear_bitmap, /* clear_bitmap */
162: bt459_video_on, /* video_on */
163: bt459_video_off, /* video_off */
164: sfb_vretrace, /* intr_enable */
165: pm_map_page /* map_page */
166: };
167:
168: sfb_cold_init(
169: int unit,
170: user_info_t *up)
171: {
172: sfb_softc_t *sfb;
173: screen_softc_t sc = screen(unit);
174: vm_offset_t base = tc_probe("sfb");
175: int hor_p, ver_p;
176: boolean_t makes_sense;
177:
178: bcopy(&sfb_sw, &sc->sw, sizeof(sc->sw));
179: sc->flags |= COLOR_SCREEN;
180:
181: /*
182: * I am confused here by the documentation. One document
183: * sez there are three boards:
184: * "PMAGB-BA" can do 1280x1024 @66Hz or @72Hz
185: * "PMAGB-BC" can do 1024x864 @60Hz or 1280x1024 @72Hz
186: * "PMAGB-BE" can do 1024x768 @72Hz or 1280x1024 @72Hz
187: * Another document sez things differently:
188: * "PMAGB-BB" can do 1024x768 @72Hz
189: * "PMAGB-BD" can do 1024x864 @60Hz or 1280x1024 @72Hz
190: *
191: * I would be inclined to believe the first one, which came
192: * with an actual piece of hardware attached (a PMAGB-BA).
193: * But I could swear I got a first board (which blew up
194: * instantly) and it was calling itself PMAGB-BB...
195: *
196: * Since I have not seen any other hardware I will make
197: * this code as hypothetical as I can. Should work :-))
198: */
199:
200: makes_sense = FALSE;
201:
202: {
203: sfb_regs *regs;
204:
205: regs = (sfb_regs *) ((char *)base + SFB_OFFSET_REGS);
206: hor_p = (regs->vhor_setup & 0x1ff) * 4;
207: ver_p = regs->vvert_setup & 0x7ff;
208:
209: if (((hor_p == 1280) && (ver_p == 1024)) ||
210: ((hor_p == 1024) && (ver_p == 864)) ||
211: ((hor_p == 1024) && (ver_p == 768)))
212: makes_sense = TRUE;
213: }
214:
215: if (makes_sense) {
216: sc->frame_scanline_width = hor_p;
217: sc->frame_height = ver_p;
218: sc->frame_visible_width = hor_p;
219: sc->frame_visible_height = ver_p;
220: } else {
221: sc->frame_scanline_width = 1280;
222: sc->frame_height = 1024;
223: sc->frame_visible_width = 1280;
224: sc->frame_visible_height = 1024;
225: }
226:
227: pm_init_screen_params(sc,up);
228: (void) screen_up(unit, up);
229:
230: sfb = pm_alloc( unit, sparsify(base + SFB_OFFSET_BT459),
231: base + SFB_OFFSET_VRAM, -1);
232:
233: screen_default_colors(up);
234:
235: sfb_soft_reset(sc);
236:
237: /*
238: * Clearing the screen at boot saves from scrolling
239: * much, and speeds up booting quite a bit.
240: */
241: screen_blitc( unit, 'C'-'@');/* clear screen */
242: }
243:
244: #if 0 /* this is how you find out about a new screen */
245: fill(addr,n,c)
246: char *addr;
247: {
248: while (n-- > 0) *addr++ = c;
249: }
250: #endif
251:
252:
253: #endif (NSFB > 0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.