summaryrefslogtreecommitdiff
path: root/chips/xcfb_hdw.c
diff options
context:
space:
mode:
Diffstat (limited to 'chips/xcfb_hdw.c')
-rw-r--r--chips/xcfb_hdw.c230
1 files changed, 230 insertions, 0 deletions
diff --git a/chips/xcfb_hdw.c b/chips/xcfb_hdw.c
new file mode 100644
index 0000000..b2c67d6
--- /dev/null
+++ b/chips/xcfb_hdw.c
@@ -0,0 +1,230 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+/*
+ * File: xcfb_hdw.c
+ * Author: Alessandro Forin, Carnegie Mellon University
+ * Date: 1/92
+ *
+ * Driver for the MAXine Color Frame Buffer Display,
+ * hardware-level operations.
+ */
+
+#include <xcfb.h>
+#if (NXCFB > 0)
+
+#include <platforms.h>
+
+#include <machine/machspl.h>
+#include <mach/std_types.h>
+#include <chips/busses.h>
+
+#include <chips/screen_defs.h>
+#include <chips/pm_defs.h>
+#include <machine/machspl.h>
+
+#ifdef MAXINE
+
+#include <chips/xcfb_monitor.h>
+
+#include <mips/PMAX/pmag_xine.h>
+#include <mips/PMAX/tc.h>
+#define enable_interrupt(s,o,x) (*tc_enable_interrupt)(s,o,x)
+
+#else /* MAXINE */
+You must say the magic words to get the coockies:
+#define enable_interrupt(slot,on,xx)
+#define IMS332_ADDRESS
+#define VRAM_OFFSET
+#define IMS332_RESET_ADDRESS
+#endif /* MAXINE */
+
+typedef pm_softc_t xcfb_softc_t;
+
+
+/*
+ * Definition of the driver for the auto-configuration program.
+ */
+
+int xcfb_probe(), xcfb_intr();
+static void xcfb_attach();
+
+vm_offset_t xcfb_std[NXCFB] = { 0 };
+struct bus_device *xcfb_info[NXCFB];
+struct bus_driver xcfb_driver =
+ { xcfb_probe, 0, xcfb_attach, 0, xcfb_std, "xcfb", xcfb_info,
+ 0, 0, BUS_INTR_DISABLED};
+
+/*
+ * Probe/Attach functions
+ */
+
+xcfb_probe( /* reg, ui */)
+{
+ static probed_once = 0;
+
+ /*
+ * Probing was really done sweeping the TC long ago
+ */
+ if (tc_probe("xcfb") == 0)
+ return 0;
+ if (probed_once++ > 1)
+ printf("[mappable] ");
+ return 1;
+}
+
+static void
+xcfb_attach(ui)
+ struct bus_device *ui;
+{
+ /* ... */
+ printf(": color display");
+}
+
+
+/*
+ * Interrupt routine
+ */
+
+xcfb_intr(unit,spllevel)
+ spl_t spllevel;
+{
+ /* interrupt has been acknowledge already */
+#if 0
+ splx(spllevel);
+ /* XXX make it load the unsafe things */
+#endif
+}
+
+xcfb_vretrace(xcfb, on)
+ xcfb_softc_t *xcfb;
+{
+ int i;
+
+ for (i = 0; i < NXCFB; i++)
+ if (xcfb_info[i]->address == (vm_offset_t)xcfb->framebuffer)
+ break;
+ if (i == NXCFB) return;
+
+ enable_interrupt(xcfb_info[i]->adaptor, on, 0);
+}
+
+/*
+ * Boot time initialization: must make device
+ * usable as console asap.
+ */
+
+/* some of these values are made up using ad hocery */
+static struct xcfb_monitor_type monitors[] = {
+ { "VRM17", 1024, 768, 1024, 1024, 16, 33,
+ 6, 2, 2, 21, 326, 16, 10, 10 },
+ /* XXX Add VRC16 */
+ { "VR262", 1024, 864, 1024, 1024, 16, 35,
+ 5, 3, 3, 37, 330, 16, 10, 10 },
+ { "VR299", 1024, 864, 1024, 1024, 16, 35,
+ 5, 3, 3, 37, 330, 16, 10, 10 },
+ { 0 }};
+
+/* set from prom command line */
+extern unsigned char *monitor_types[4];
+
+xcfb_monitor_type_t xcfb_get_monitor_type()
+{
+ xcfb_monitor_type_t m;
+
+ m = monitors;
+ if (monitor_types[3])
+ while (m->name) {
+ /* xcfb is always on the motherboard (slot 3),
+ fix if you need */
+ if (!strcmp(monitor_types[3], m->name))
+ break;
+ m++;
+ }
+ if (!m->name) /* the first is the default */
+ m = monitors;
+ return m;
+}
+
+
+extern int
+ xcfb_soft_reset(), xcfb_set_status(),
+ ims332_pos_cursor(), ims332_video_on(),
+ ims332_video_off(), xcfb_vretrace(),
+ pm_get_status(), pm_char_paint(),
+ pm_insert_line(), pm_remove_line(),
+ pm_clear_bitmap(), pm_map_page();
+
+static struct screen_switch xcfb_sw = {
+ screen_noop, /* graphic_open */
+ xcfb_soft_reset, /* graphic_close */
+ xcfb_set_status, /* set_status */
+ pm_get_status, /* get_status */
+ pm_char_paint, /* char_paint */
+ ims332_pos_cursor, /* pos_cursor */
+ pm_insert_line, /* insert_line */
+ pm_remove_line, /* remove_line */
+ pm_clear_bitmap, /* clear_bitmap */
+ ims332_video_on, /* video_on */
+ ims332_video_off, /* video_off */
+ xcfb_vretrace, /* intr_enable */
+ pm_map_page /* map_page */
+};
+
+xcfb_cold_init(unit, up)
+ user_info_t *up;
+{
+ xcfb_softc_t *xcfb;
+ screen_softc_t sc = screen(unit);
+ int base = tc_probe("xcfb");
+ xcfb_monitor_type_t m = xcfb_get_monitor_type();
+
+ bcopy(&xcfb_sw, &sc->sw, sizeof(sc->sw));
+
+ sc->flags |= COLOR_SCREEN; /* XXX should come from m->flags? */
+ sc->frame_scanline_width = m->frame_scanline_width;
+ sc->frame_height = m->frame_height;
+ sc->frame_visible_width = m->frame_visible_width;
+ sc->frame_visible_height = m->frame_visible_height;
+
+ pm_init_screen_params(sc, up);
+ (void) screen_up(unit, up);
+
+ xcfb = pm_alloc(unit, IMS332_ADDRESS, base + VRAM_OFFSET, 0);
+ xcfb->vdac_registers = (char *)IMS332_RESET_ADDRESS;
+
+ screen_default_colors(up);
+
+ xcfb_soft_reset(sc);
+
+ /*
+ * Clearing the screen at boot saves from scrolling
+ * much, and speeds up booting quite a bit.
+ */
+ screen_blitc( unit, 'C'-'@');/* clear screen */
+}
+
+
+#endif (NXCFB > 0)