diff options
Diffstat (limited to 'sys/arch/pmax/dev/mfb.c')
-rw-r--r-- | sys/arch/pmax/dev/mfb.c | 178 |
1 files changed, 118 insertions, 60 deletions
diff --git a/sys/arch/pmax/dev/mfb.c b/sys/arch/pmax/dev/mfb.c index 927467e4c8a..d1b243ce73e 100644 --- a/sys/arch/pmax/dev/mfb.c +++ b/sys/arch/pmax/dev/mfb.c @@ -1,4 +1,4 @@ -/* $NetBSD: mfb.c,v 1.8 1995/09/11 07:45:41 jonathan Exp $ */ +/* $NetBSD: mfb.c,v 1.13.4.2 1996/09/09 20:07:04 thorpej Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -80,14 +80,19 @@ * v 9.2 90/02/13 22:16:24 shirriff Exp SPRITE (DECWRL)"; */ -#include <fb.h> -#include <mfb.h> +#include "fb.h" +#include "mfb.h" #if NMFB > 0 #include <sys/param.h> #include <sys/kernel.h> #include <sys/fcntl.h> +#include <sys/malloc.h> #include <sys/errno.h> #include <sys/device.h> +#include <sys/systm.h> + +#include <machine/autoconf.h> +#include <dev/tc/tcvar.h> #include <machine/machConst.h> #include <machine/pmioctl.h> @@ -107,15 +112,22 @@ struct fbuaccess mfbu; struct pmax_fbtty mfbfb; struct fbinfo mfbfi; /*XXX*/ +extern int pmax_boardtype; + /* * Forward references. */ +#define CMAP_BITS (3 * 256) /* 256 entries, 3 bytes per. */ +static u_char cmap_bits [CMAP_BITS]; /* colormap for console... */ + extern void fbScreenInit __P((struct fbinfo *fia)); void mfbPosCursor __P((struct fbinfo *fi, int x, int y)); +int mfbinit __P((struct fbinfo *fi, caddr_t mfbaddr, int unit, int silent)); + #if 1 /* these go away when we use the abstracted-out chip drivers */ static void mfbLoadCursor __P((struct fbinfo *fi, u_short *ptr)); static void mfbRestoreCursorColor __P((struct fbinfo *fi)); @@ -136,9 +148,16 @@ int mfbGetColorMap __P((struct fbinfo *fi, caddr_t, int, int)); static int bt455_video_on __P((struct fbinfo *)); static int bt455_video_off __P((struct fbinfo *)); -static void bt431_select_reg(); -static void bt431_write_reg(), bt431_init(); -static u_char bt431_read_reg(); + +static void bt431_init __P((bt431_regmap_t *regs)); +static void bt431_select_reg __P((bt431_regmap_t *regs, int regno)); +static void bt431_write_reg __P((bt431_regmap_t *regs, int regno, int val)); + +#ifdef notused +static u_char bt431_read_reg __P((bt431_regmap_t *regs, int regno)); +#endif + + /* * old pmax-framebuffer hackery @@ -173,8 +192,6 @@ struct fbdriver mfb_driver = { #define MFB_OFFSET_ROM 0x0 /* Diagnostic ROM */ #define MFB_FB_SIZE 0x200000 /* frame buffer size */ -#include <sys/device.h> -#include <machine/autoconf.h> /* * Autoconfiguration data for config.new. @@ -184,22 +201,15 @@ struct fbdriver mfb_driver = { int mfbmatch __P((struct device *, void *, void *)); void mfbattach __P((struct device *, struct device *, void *)); +int mfb_intr __P((void *sc)); -struct cfdriver mfbcd = { - NULL, "mfb", mfbmatch, mfbattach, DV_DULL, sizeof(struct device), 0 +struct cfattach mfb_ca = { + sizeof(struct device), mfbmatch, mfbattach }; -#if 0 -int -mfbprobe(addr) - caddr_t addr; -{ - - /* make sure that we're looking for this type of device. */ - if (!BUS_MATCHNAME(ca, "PMAG-AA ")) - return (0); -} -#endif +struct cfdriver mfb_cd = { + NULL, "mfb", DV_DULL +}; int mfbmatch(parent, match, aux) @@ -207,9 +217,7 @@ mfbmatch(parent, match, aux) void *match; void *aux; { - struct cfdata *cf = match; - struct confargs *ca = aux; - static int nmfbs = 1; + struct tc_attach_args *ta = aux; #ifdef FBDRIVER_DOES_ATTACH /* leave configuration to the fb driver */ @@ -217,14 +225,9 @@ mfbmatch(parent, match, aux) #endif /* make sure that we're looking for this type of device. */ - if (!BUS_MATCHNAME(ca, "PMAG-AA ")) + if (!TC_BUS_MATCHNAME(ta, "PMAG-AA ")) return (0); -#ifdef notyet - /* if it can't have the one mentioned, reject it */ - if (cf->cf_unit >= nmfbs) - return (0); -#endif return (1); } @@ -234,23 +237,32 @@ mfbattach(parent, self, aux) struct device *self; void *aux; { - struct confargs *ca = aux; - caddr_t base = BUS_CVTADDR(ca); + struct tc_attach_args *ta = aux; + caddr_t mfbaddr = (caddr_t) ta->ta_addr; int unit = self->dv_unit; - struct fbinfo *fi = &mfbfi; + struct fbinfo *fi = (struct fbinfo *) self; #ifdef notyet + struct fbinfo *fi = &mfbfi; + /* if this is the console, it's already configured. */ - if (ca->ca_slotpri == cons_slot) + if (ta->ta_cookie == cons_slot) return; /* XXX patch up f softc pointer */ #endif - - if (!mfbinit(BUS_CVTADDR(ca), unit, 0)) + if (!mfbinit(fi, mfbaddr, unit, 0)) return; - /* no interrupts for MFB */ - /*BUS_INTR_ESTABLISH(ca, sccintr, self->dv_unit);*/ + /* + * 3MIN does not mask un-established TC option interrupts, + * so establish a handler. + * XXX Should store cmap updates in softc and apply in the + * interrupt handler, which interrupts during vertical-retrace. + */ + if (pmax_boardtype == DS_3MIN) { + tc_intr_establish(parent, (void*)ta->ta_cookie, TC_IPL_NONE, + mfb_intr, fi); + } printf("\n"); } @@ -259,17 +271,37 @@ mfbattach(parent, self, aux) * Initialization */ int -mfbinit(mfbaddr, unit, silent) +mfbinit(fi, mfbaddr, unit, silent) + struct fbinfo *fi; caddr_t mfbaddr; int unit; int silent; { - register struct fbinfo *fi = &mfbfi; + + register int isconsole = 0; + + /* + * If this device is being intialized as the console, malloc() + * is not yet up and we must use statically-allocated space. + */ + if (fi == NULL) { + fi = &mfbfi; /* XXX */ + fi->fi_cmap_bits = (caddr_t)cmap_bits; + isconsole = 1; + } + else { + fi->fi_cmap_bits = malloc(CMAP_BITS, M_DEVBUF, M_NOWAIT); + if (fi->fi_cmap_bits == NULL) { + printf("mfb%d: no memory for cmap\n", unit); + return (0); + } + } /* check for no frame buffer */ - if (badaddr(mfbaddr, 4)) + if (badaddr(mfbaddr, 4)) { + printf("mfb: bad address 0x%p\n", mfbaddr); return (0); - + } /* Fill in main frame buffer info struct. */ fi->fi_unit = unit; @@ -281,7 +313,6 @@ mfbinit(mfbaddr, unit, silent) fi->fi_linebytes = 1280; fi->fi_driver = &mfb_driver; fi->fi_blanked = 0; - fi->fi_cmap_bits = (caddr_t)0; /* Fill in Frame Buffer Type struct. */ fi->fi_type.fb_boardtype = PMAX_FBTYPE_MFB; @@ -326,7 +357,9 @@ mfbinit(mfbaddr, unit, silent) if (tb_kbdmouseconfig(fi)) return (0); - mfbInitColorMapBlack(fi, 0); + /* white-on-black if console, black-on-black otherwise. */ + mfbInitColorMapBlack(fi, isconsole); + /* * Connect to the raster-console pseudo-driver. @@ -417,11 +450,11 @@ mfbRestoreCursorColor (fi) else fg = 0; regs->addr_ovly = fg; - MachEmptyWriteBuffer(); + wbflush(); regs->addr_ovly = fg; - MachEmptyWriteBuffer(); + wbflush(); regs->addr_ovly = fg; - MachEmptyWriteBuffer(); + wbflush(); } /* Set the color of the cursor. */ @@ -431,7 +464,7 @@ mfbCursorColor(fi, color) struct fbinfo *fi; unsigned int color[]; { - register int i, j; + register int i; for (i = 0; i < 6; i++) cursor_RGB[i] = (u_char)(color[i] >> 8); @@ -544,14 +577,15 @@ mfbLoadColorMap(fi, bits, index, count) for (i = 0; i < count; i++) { cmap [(i + index) * 3] = regs->addr_cmap_data = cmap_bits [i * 3] >> 4; - MachEmptyWriteBuffer(); + wbflush(); cmap [(i + index) * 3 + 1] = regs->addr_cmap_data = cmap_bits [i * 3 + 1] >> 4; - MachEmptyWriteBuffer(); + wbflush(); cmap [(i + index) * 3 + 2] = regs->addr_cmap_data = cmap_bits [i * 3 + 2] >> 4; - MachEmptyWriteBuffer(); + wbflush(); } + return 0; } /* stub for driver */ @@ -573,10 +607,9 @@ mfbGetColorMap(fi, bits, index, count) caddr_t bits; int index, count; { - bt455_regmap_t *regs = (bt455_regmap_t *)(fi -> fi_vdac); + /*bt455_regmap_t *regs = (bt455_regmap_t *)(fi -> fi_vdac);*/ u_char *cmap_bits; u_char *cmap; - int i; if (index > 15 || index < 0 || index + count > 15) return EINVAL; @@ -599,7 +632,7 @@ bt455_video_on(fi) u_char *cmap; if (!fi -> fi_blanked) - return; + return 0; cmap = (u_char *)(fi -> fi_cmap_bits); @@ -607,10 +640,12 @@ bt455_video_on(fi) BT455_SELECT_ENTRY(regs, 0); for (i = 0; i < 6; i++) { regs->addr_cmap_data = cmap [i]; - MachEmptyWriteBuffer(); + wbflush(); } mfbRestoreCursorColor (fi); fi -> fi_blanked = 0; + + return 0; } /* @@ -638,7 +673,7 @@ bt455_video_off(fi) u_char *cmap; if (fi -> fi_blanked) - return; + return 0; cmap = (u_char *)(fi -> fi_cmap_bits); @@ -649,13 +684,15 @@ bt455_video_off(fi) for (i = 0; i < 6; i++) { cursor_RGB[i] = 0; regs->addr_cmap_data = 0; - MachEmptyWriteBuffer(); + wbflush(); } mfbRestoreCursorColor (fi); bcopy (cursor_save, cursor_RGB, 6); fi -> fi_blanked = 0; + + return 0; } /* @@ -667,7 +704,7 @@ bt431_select_reg(regs, regno) { regs->addr_lo = SET_VALUE(regno & 0xff); regs->addr_hi = SET_VALUE((regno >> 8) & 0xff); - MachEmptyWriteBuffer(); + wbflush(); } static void @@ -676,9 +713,10 @@ bt431_write_reg(regs, regno, val) { bt431_select_reg(regs, regno); regs->addr_reg = SET_VALUE(val); - MachEmptyWriteBuffer(); + wbflush(); } +#ifdef notused static u_char bt431_read_reg(regs, regno) bt431_regmap_t *regs; @@ -686,12 +724,13 @@ bt431_read_reg(regs, regno) bt431_select_reg(regs, regno); return (GET_VALUE(regs->addr_reg)); } +#endif + static void bt431_init(regs) bt431_regmap_t *regs; { - register int i; /* use 4:1 input mux */ bt431_write_reg(regs, BT431_REG_CMD, @@ -714,5 +753,24 @@ bt431_init(regs) BT431_WRITE_REG_AUTOI(regs, 0x00); BT431_WRITE_REG_AUTOI(regs, 0x00); } + +/* + * copied from cfb_intr + */ +int +mfb_intr(sc) + void *sc; +{ + struct fbinfo *fi = /* XXX (struct fbinfo *)sc */ &mfbfi; + volatile int junk; + char *slot_addr = (((char *)fi->fi_base) - MFB_OFFSET_BT431); + + /* reset vertical-retrace interrupt by writing a dont-care */ + junk = *(volatile int*) (slot_addr + MFB_OFFSET_IREQ); + *(volatile int*) (slot_addr + MFB_OFFSET_IREQ) = 0; + + return (0); +} + #endif /* NMFB */ |