|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1991,1990,1989 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: xcfb_hdw.c ! 28: * Author: Alessandro Forin, Carnegie Mellon University ! 29: * Date: 1/92 ! 30: * ! 31: * Driver for the MAXine Color Frame Buffer Display, ! 32: * hardware-level operations. ! 33: */ ! 34: ! 35: #include <xcfb.h> ! 36: #if (NXCFB > 0) ! 37: ! 38: #include <platforms.h> ! 39: ! 40: #include <machine/machspl.h> ! 41: #include <mach/std_types.h> ! 42: #include <chips/busses.h> ! 43: ! 44: #include <chips/screen_defs.h> ! 45: #include <chips/pm_defs.h> ! 46: #include <machine/machspl.h> ! 47: ! 48: #ifdef MAXINE ! 49: ! 50: #include <chips/xcfb_monitor.h> ! 51: ! 52: #include <mips/PMAX/pmag_xine.h> ! 53: #include <mips/PMAX/tc.h> ! 54: #define enable_interrupt(s,o,x) (*tc_enable_interrupt)(s,o,x) ! 55: ! 56: #else /* MAXINE */ ! 57: You must say the magic words to get the coockies: ! 58: #define enable_interrupt(slot,on,xx) ! 59: #define IMS332_ADDRESS ! 60: #define VRAM_OFFSET ! 61: #define IMS332_RESET_ADDRESS ! 62: #endif /* MAXINE */ ! 63: ! 64: typedef pm_softc_t xcfb_softc_t; ! 65: ! 66: ! 67: /* ! 68: * Definition of the driver for the auto-configuration program. ! 69: */ ! 70: ! 71: int xcfb_probe(), xcfb_intr(); ! 72: static void xcfb_attach(); ! 73: ! 74: vm_offset_t xcfb_std[NXCFB] = { 0 }; ! 75: struct bus_device *xcfb_info[NXCFB]; ! 76: struct bus_driver xcfb_driver = ! 77: { xcfb_probe, 0, xcfb_attach, 0, xcfb_std, "xcfb", xcfb_info, ! 78: 0, 0, BUS_INTR_DISABLED}; ! 79: ! 80: /* ! 81: * Probe/Attach functions ! 82: */ ! 83: ! 84: xcfb_probe( /* reg, ui */) ! 85: { ! 86: static probed_once = 0; ! 87: ! 88: /* ! 89: * Probing was really done sweeping the TC long ago ! 90: */ ! 91: if (tc_probe("xcfb") == 0) ! 92: return 0; ! 93: if (probed_once++ > 1) ! 94: printf("[mappable] "); ! 95: return 1; ! 96: } ! 97: ! 98: static void ! 99: xcfb_attach(ui) ! 100: struct bus_device *ui; ! 101: { ! 102: /* ... */ ! 103: printf(": color display"); ! 104: } ! 105: ! 106: ! 107: /* ! 108: * Interrupt routine ! 109: */ ! 110: ! 111: xcfb_intr(unit,spllevel) ! 112: spl_t spllevel; ! 113: { ! 114: /* interrupt has been acknowledge already */ ! 115: #if 0 ! 116: splx(spllevel); ! 117: /* XXX make it load the unsafe things */ ! 118: #endif ! 119: } ! 120: ! 121: xcfb_vretrace(xcfb, on) ! 122: xcfb_softc_t *xcfb; ! 123: { ! 124: int i; ! 125: ! 126: for (i = 0; i < NXCFB; i++) ! 127: if (xcfb_info[i]->address == (vm_offset_t)xcfb->framebuffer) ! 128: break; ! 129: if (i == NXCFB) return; ! 130: ! 131: enable_interrupt(xcfb_info[i]->adaptor, on, 0); ! 132: } ! 133: ! 134: /* ! 135: * Boot time initialization: must make device ! 136: * usable as console asap. ! 137: */ ! 138: ! 139: /* some of these values are made up using ad hocery */ ! 140: static struct xcfb_monitor_type monitors[] = { ! 141: { "VRM17", 1024, 768, 1024, 1024, 16, 33, ! 142: 6, 2, 2, 21, 326, 16, 10, 10 }, ! 143: /* XXX Add VRC16 */ ! 144: { "VR262", 1024, 864, 1024, 1024, 16, 35, ! 145: 5, 3, 3, 37, 330, 16, 10, 10 }, ! 146: { "VR299", 1024, 864, 1024, 1024, 16, 35, ! 147: 5, 3, 3, 37, 330, 16, 10, 10 }, ! 148: { 0 }}; ! 149: ! 150: /* set from prom command line */ ! 151: extern unsigned char *monitor_types[4]; ! 152: ! 153: xcfb_monitor_type_t xcfb_get_monitor_type() ! 154: { ! 155: xcfb_monitor_type_t m; ! 156: ! 157: m = monitors; ! 158: if (monitor_types[3]) ! 159: while (m->name) { ! 160: /* xcfb is always on the motherboard (slot 3), ! 161: fix if you need */ ! 162: if (!strcmp(monitor_types[3], m->name)) ! 163: break; ! 164: m++; ! 165: } ! 166: if (!m->name) /* the first is the default */ ! 167: m = monitors; ! 168: return m; ! 169: } ! 170: ! 171: ! 172: extern int ! 173: xcfb_soft_reset(), xcfb_set_status(), ! 174: ims332_pos_cursor(), ims332_video_on(), ! 175: ims332_video_off(), xcfb_vretrace(), ! 176: pm_get_status(), pm_char_paint(), ! 177: pm_insert_line(), pm_remove_line(), ! 178: pm_clear_bitmap(), pm_map_page(); ! 179: ! 180: static struct screen_switch xcfb_sw = { ! 181: screen_noop, /* graphic_open */ ! 182: xcfb_soft_reset, /* graphic_close */ ! 183: xcfb_set_status, /* set_status */ ! 184: pm_get_status, /* get_status */ ! 185: pm_char_paint, /* char_paint */ ! 186: ims332_pos_cursor, /* pos_cursor */ ! 187: pm_insert_line, /* insert_line */ ! 188: pm_remove_line, /* remove_line */ ! 189: pm_clear_bitmap, /* clear_bitmap */ ! 190: ims332_video_on, /* video_on */ ! 191: ims332_video_off, /* video_off */ ! 192: xcfb_vretrace, /* intr_enable */ ! 193: pm_map_page /* map_page */ ! 194: }; ! 195: ! 196: xcfb_cold_init(unit, up) ! 197: user_info_t *up; ! 198: { ! 199: xcfb_softc_t *xcfb; ! 200: screen_softc_t sc = screen(unit); ! 201: int base = tc_probe("xcfb"); ! 202: xcfb_monitor_type_t m = xcfb_get_monitor_type(); ! 203: ! 204: bcopy(&xcfb_sw, &sc->sw, sizeof(sc->sw)); ! 205: ! 206: sc->flags |= COLOR_SCREEN; /* XXX should come from m->flags? */ ! 207: sc->frame_scanline_width = m->frame_scanline_width; ! 208: sc->frame_height = m->frame_height; ! 209: sc->frame_visible_width = m->frame_visible_width; ! 210: sc->frame_visible_height = m->frame_visible_height; ! 211: ! 212: pm_init_screen_params(sc, up); ! 213: (void) screen_up(unit, up); ! 214: ! 215: xcfb = pm_alloc(unit, IMS332_ADDRESS, base + VRAM_OFFSET, 0); ! 216: xcfb->vdac_registers = (char *)IMS332_RESET_ADDRESS; ! 217: ! 218: screen_default_colors(up); ! 219: ! 220: xcfb_soft_reset(sc); ! 221: ! 222: /* ! 223: * Clearing the screen at boot saves from scrolling ! 224: * much, and speeds up booting quite a bit. ! 225: */ ! 226: screen_blitc( unit, 'C'-'@');/* clear screen */ ! 227: } ! 228: ! 229: ! 230: #endif (NXCFB > 0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.