diff options
| author | hans <hans@NetBSD.org> | 2010-05-09 22:19:46 +0000 |
|---|---|---|
| committer | hans <hans@NetBSD.org> | 2010-05-09 22:19:46 +0000 |
| commit | cbf9d0d33fb1ff09acf6594457d89ecacae3e98e (patch) | |
| tree | 212cc998279dfe7cc5d6d17ed494e4da029e587d | |
| parent | da7cf0ef2f2c0a7e33182e03a6dcacba9372f638 (diff) | |
Make SPX work as console device on VAXstation 4000/9x.
| -rw-r--r-- | sys/arch/vax/vsa/spx.c | 125 |
1 files changed, 54 insertions, 71 deletions
diff --git a/sys/arch/vax/vsa/spx.c b/sys/arch/vax/vsa/spx.c index 54aea6a5ca3..75d37c9bdad 100644 --- a/sys/arch/vax/vsa/spx.c +++ b/sys/arch/vax/vsa/spx.c @@ -1,4 +1,4 @@ -/* $NetBSD: spx.c,v 1.2 2009/03/18 16:00:16 cegger Exp $ */ +/* $NetBSD: spx.c,v 1.3 2010/05/09 22:19:46 hans Exp $ */ /* * SPX/LCSPX/SPXg/SPXgt accelerated framebuffer driver for NetBSD/VAX * Copyright (c) 2005 Blaz Antonic @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: spx.c,v 1.2 2009/03/18 16:00:16 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spx.c,v 1.3 2010/05/09 22:19:46 hans Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -86,7 +86,7 @@ __KERNEL_RCSID(0, "$NetBSD: spx.c,v 1.2 2009/03/18 16:00:16 cegger Exp $"); /* * off-screen font storage space - * 32x16 glyphs, 256 regular and underliend chars + * 32x16 glyphs, 256 regular and underlined chars */ #define FONT_STORAGE_START (spx_xsize * spx_ysize) #define FONT_STORAGE_SIZE (32 * 16 * 256 * 2) @@ -204,7 +204,7 @@ CFATTACH_DECL_NEW(spx, sizeof(struct spx_softc), static void spx_cursor(void *, int, int, int); static int spx_mapchar(void *, int, unsigned int *); static void spx_putchar(void *, int, int, u_int, long); -static void spx_copycols(void *, int, int, int,int); +static void spx_copycols(void *, int, int, int, int); static void spx_erasecols(void *, int, int, int, long); static void spx_copyrows(void *, int, int, int); static void spx_eraserows(void *, int, int, long); @@ -595,7 +595,8 @@ SPXg_blkset(u_int xpos, u_int ypos, u_int xdim, u_int ydim, char color) counter--; } -int spx_match(device_t parent, cfdata_t match, void *aux) +int +spx_match(device_t parent, cfdata_t match, void *aux) { struct vsbus_softc *sc = device_private(parent); #if 0 @@ -608,31 +609,10 @@ int spx_match(device_t parent, cfdata_t match, void *aux) * add KA46 when/if ever somebody reports SPXg vax_confdata ID on VS 4000/60 * Ditto for SPX ID on KA42 & KA43 */ - if (vax_boardtype != VAX_BTYP_49) + if ((vax_boardtype != VAX_BTYP_49) || + ((vax_confdata & (CONF_LCSPX | CONF_SPXg)) == 0)) return 0; - /* KA49: Identify framebuffer type */ - switch (vax_confdata & (CONF_LCSPX | CONF_SPXg)) { - case CONF_LCSPX: - fb_type = FB_IS_SPX; - spx_blkcpy_func = SPX_blkcpy; - spx_blkset_func = SPX_blkset; - spx_putchar_func = SPX_putchar; - break; - case CONF_SPXg: - fb_type = FB_IS_SPXg; - spx_blkcpy_func = SPXg_blkcpy; - spx_blkset_func = SPXg_blkset; - spx_putchar_func = SPXg_putchar; - break; - case 0: - aprint_error("spx_match: no framebuffer found\n"); - break; - case CONF_LCSPX | CONF_SPXg: - panic("spx_match: incorrect FB configuration\n"); - break; - } - /* FIXME add RAMDAC ID code ??? */ #if 0 /* @@ -664,6 +644,24 @@ spx_attach(device_t parent, device_t self, void *aux) spx_init_common(self, va); + /* display FB type based on RAMDAC ID */ + switch (get_btreg(SPXDAC_REG_ID) & 0xff) { + case 0x4a: + aprint_normal_dev(self, + "RAMDAC ID: 0x%x, Bt459 (SPX/LCSPX) RAMDAC type\n", + get_btreg(SPXDAC_REG_ID) & 0xff); + break; + + case 0x4b: + aprint_normal_dev(self, + "RAMDAC ID: 0x%x, Bt460 (SPXg) RAMDAC type\n", + get_btreg(SPXDAC_REG_ID) & 0xff); + break; + default: + aprint_error_dev(self, "unknown RAMDAC type 0x%x\n", + get_btreg(SPXDAC_REG_ID) & 0xff); + } + curscr = &spx_conscreen; prevscr = curscr; @@ -1071,7 +1069,7 @@ spx_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep, static void spx_free_screen(void *v, void *cookie) { -/* FIXME add something to actually free malloc()ed screen ? */ +/* FIXME add something to actually free malloc()ed screen? */ } static int @@ -1178,7 +1176,7 @@ spxcninit(struct consdev *cndev) spx_blkset(0, 0, spx_xsize, spx_ysize, SPX_BG_COLOR); curscr = &spx_conscreen; - + for (i = 0; i < spx_cols * spx_rows; i++) spx_conscreen.ss_image[i].attr = (SPX_BG_COLOR << 4) | SPX_FG_COLOR; @@ -1203,7 +1201,7 @@ spxcnprobe(struct consdev *cndev) /* Only for VS 4000/90, 90A and 96 with LCSPX or SPXg/gt*/ if ((vax_boardtype != VAX_BTYP_49) || - ((vax_confdata & (CONF_LCSPX | CONF_SPXg)) != 0)) + ((vax_confdata & (CONF_LCSPX | CONF_SPXg)) == 0)) return; if (((vax_confdata & 8) && (vax_boardtype == VAX_BTYP_49)) || @@ -1215,25 +1213,6 @@ spxcnprobe(struct consdev *cndev) return; /* Diagnostic console */ } - /* KA49: Identify framebuffer type */ - switch (vax_confdata & (CONF_LCSPX | CONF_SPXg)) { - case CONF_LCSPX: - fb_type = FB_IS_SPX; - spx_blkcpy_func = SPX_blkcpy; - spx_blkset_func = SPX_blkset; - break; - case CONF_SPXg: - fb_type = FB_IS_SPXg; - spx_blkcpy_func = SPXg_blkcpy; - spx_blkset_func = SPXg_blkset; - break; - case 0: - aprint_error("spxcnprobe: no framebuffer found\n"); - break; - case CONF_LCSPX | CONF_SPXg: - panic("spxcnprobe: incorrect FB configuration\n"); break; - } - spx_init_common(NULL, NULL); cndev->cn_pri = CN_INTERNAL; @@ -1459,6 +1438,29 @@ spx_init_common(device_t self, struct vsbus_attach_args *va) u_int i, j, k; int cookie; struct wsdisplay_font *wf; + static int init_done; + + if (init_done) + return; + + /* KA49: Identify framebuffer type */ + switch (vax_confdata & (CONF_LCSPX | CONF_SPXg)) { + case CONF_LCSPX: + fb_type = FB_IS_SPX; + spx_blkcpy_func = SPX_blkcpy; + spx_blkset_func = SPX_blkset; + spx_putchar_func = SPX_putchar; + break; + case CONF_SPXg: + fb_type = FB_IS_SPXg; + spx_blkcpy_func = SPXg_blkcpy; + spx_blkset_func = SPXg_blkset; + spx_putchar_func = SPXg_putchar; + break; + case CONF_LCSPX | CONF_SPXg: + panic("spxcnprobe: incorrect FB configuration\n"); + break; + } /* map SPX registers first */ if (fb_type == FB_IS_SPX) { @@ -1489,9 +1491,6 @@ spx_init_common(device_t self, struct vsbus_attach_args *va) cookie = wsfont_find(NULL, 0, 0, 0, WSDISPLAY_FONTORDER_R2L, WSDISPLAY_FONTORDER_L2R); - if (cookie == -1) - aprint_error_dev(self, "spx_common_init: cookie = -1\n"); - if (cookie == -1 || wsfont_lock(cookie, &wf)) panic("spx_common_init: unable to load console font"); @@ -1524,24 +1523,6 @@ spx_init_common(device_t self, struct vsbus_attach_args *va) SPX_MAP_FB(self, va, SPXg); } - /* display FB type based on RAMDAC ID */ - switch (get_btreg(SPXDAC_REG_ID) & 0xff) { - case 0x4a: - aprint_normal_dev( - self, "RAMDAC ID: 0x%x, Bt459 (SPX/LCSPX) RAMDAC type\n", - get_btreg(SPXDAC_REG_ID) & 0xff); - break; - - case 0x4b: - aprint_normal_dev( - self, "RAMDAC ID: 0x%x, Bt460 (SPXg) RAMDAC type\n", - get_btreg(SPXDAC_REG_ID) & 0xff); - break; - default: - aprint_error_dev(self, "unknown RAMDAC type 0x%x\n", - get_btreg(SPXDAC_REG_ID) & 0xff); - } - /* render font glyphs to off-screen memory */ if (fb_type == FB_IS_SPX) SPX_render_font(); @@ -1608,4 +1589,6 @@ spx_init_common(device_t self, struct vsbus_attach_args *va) set_btreg(SPXDAC_REG_WWHI, 0); set_btreg(SPXDAC_REG_WHLO, 0); set_btreg(SPXDAC_REG_WHHI, 0); + + init_done = 1; } |
