Module Name: src Committed By: macallan Date: Tue Dec 10 09:10:58 UTC 2024
Modified Files: src/sys/arch/hppa/dev: summitfb.c Log Message: some udates: - fetch the ROM font, convert it to ISO and hand it to wsfont so we can mimic firmware output should we feel like it - set read mode to match write mode whenever we touch the latter To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/arch/hppa/dev/summitfb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/hppa/dev/summitfb.c diff -u src/sys/arch/hppa/dev/summitfb.c:1.13 src/sys/arch/hppa/dev/summitfb.c:1.14 --- src/sys/arch/hppa/dev/summitfb.c:1.13 Sat Dec 7 21:56:37 2024 +++ src/sys/arch/hppa/dev/summitfb.c Tue Dec 10 09:10:57 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: summitfb.c,v 1.13 2024/12/07 21:56:37 riastradh Exp $ */ +/* $NetBSD: summitfb.c,v 1.14 2024/12/10 09:10:57 macallan Exp $ */ /* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */ @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.13 2024/12/07 21:56:37 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.14 2024/12/10 09:10:57 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -60,6 +60,8 @@ __KERNEL_RCSID(0, "$NetBSD: summitfb.c,v #define DPRINTF(s) __nothing #endif +//#define SUMMITFB_ENABLE_GC + int summitfb_match(device_t, cfdata_t, void *); void summitfb_attach(device_t, device_t, void *); @@ -165,6 +167,8 @@ static int summitfb_do_cursor(struct sum static void summitfb_set_video(struct summitfb_softc *, int); +static void summitfb_copyfont(struct summitfb_softc *); + struct wsdisplay_accessops summitfb_accessops = { .ioctl = summitfb_ioctl, .mmap = summitfb_mmap, @@ -179,6 +183,9 @@ struct wsdisplay_accessops summitfb_acce static inline void summitfb_wait_fifo(struct summitfb_softc *, uint32_t); static inline void summitfb_wait(struct summitfb_softc *); +int sti_fetchfonts(struct sti_screen *, struct sti_inqconfout *, uint32_t, + u_int); + int summitfb_match(device_t parent, cfdata_t cf, void *aux) { @@ -255,7 +262,11 @@ summitfb_attach(device_t parent, device_ sc->sc_scr.scr_rom = sc->sc_base.sc_rom; ret = sti_screen_setup(&sc->sc_scr, STI_FBMODE); - + { + struct sti_dd *dd = &rom->rom_dd; + sti_fetchfonts(&sc->sc_scr, NULL, dd->dd_fntaddr, 0); + summitfb_copyfont(sc); + } sc->sc_width = sc->sc_scr.scr_cfg.scr_width; sc->sc_height = sc->sc_scr.scr_cfg.scr_height; sc->sc_write_mode = 0xffffffff; @@ -658,6 +669,8 @@ summitfb_write_mode(struct summitfb_soft if (sc->sc_write_mode == mode) return; summitfb_wait(sc); summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode); + summitfb_write4(sc, VISFX_VRAM_READ_MODE, + (mode & 0x07000000) | 0x400); sc->sc_write_mode = mode; } @@ -666,7 +679,6 @@ summitfb_setup_fb(struct summitfb_softc { summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN); - summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY); } void @@ -703,7 +715,6 @@ summitfb_setup(struct summitfb_softc *sc summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff); summitfb_write4(sc, VISFX_PLANE_MASK, 0xffffffff); summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN); - summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY); summitfb_write4(sc, VISFX_CLIP_TL, 0); summitfb_write4(sc, VISFX_CLIP_WH, ((sc->sc_scr.fbwidth + 1) << 16) | (sc->sc_scr.fbheight + 1)); @@ -848,7 +859,7 @@ summitfb_mmap(void *v, void *vs, off_t o /* framebuffer */ pa = bus_space_mmap(rom->memt, sc->sc_scr.fbaddr, offset, prot, BUS_SPACE_MAP_LINEAR); - } else if (offset >= 0x80000000 && offset < 0x80400000) { + } else if (offset >= 0x80000000 && offset < 0x81000000) { /* blitter registers etc. */ pa = bus_space_mmap(rom->memt, rom->regh[0], offset - 0x80000000, prot, BUS_SPACE_MAP_LINEAR); @@ -1037,7 +1048,6 @@ summitfb_bitblt(void *cookie, int xs, in summitfb_write_mode(sc, rop); } else summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN); - summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_WRITE_MODE_PLAIN); summitfb_write4(sc, VISFX_COPY_SRC, (xs << 16) | ys); summitfb_write4(sc, VISFX_COPY_WH, (wi << 16) | he); summitfb_write4(sc, VISFX_COPY_DST, (xd << 16) | yd); @@ -1248,7 +1258,6 @@ summitfb_putchar_fast(void *cookie, int fg = ri->ri_devcmap[(attr >> 24) & 0x0f]; summitfb_write_mode(sc, 0x050000c0); - summitfb_write4(sc, VISFX_VRAM_READ_MODE, 0x05000400); summitfb_write4(sc, VISFX_FG_COLOUR, fg); summitfb_write4(sc, VISFX_BG_COLOUR, bg); @@ -1457,6 +1466,7 @@ summitfb_do_cursor(struct summitfb_softc summitfb_write4(sc, VISFX_CURSOR_COLOR, rgb); rgb = r[1] << 16 | g[1] << 8 | b[1]; /* this isn't right */ + summitfb_write4(sc, VISFX_CURSOR_INDEX, 1); summitfb_write4(sc, VISFX_CURSOR_COLOR + 4, rgb); } @@ -1566,3 +1576,54 @@ summitfb_set_video(struct summitfb_softc } else { } } + +extern const uint8_t sti_unitoroman[]; + +static void +summitfb_copyfont(struct summitfb_softc *sc) +{ + struct sti_font *fp = &sc->sc_scr.scr_curfont; + uint8_t *font = sc->sc_scr.scr_romfont; + uint8_t *fontbuf, *fontdata, *src, *dst; + struct wsdisplay_font *f; + int bufsize, i, si; + + if (font == NULL) return; + bufsize = sizeof(struct wsdisplay_font) + 32 + fp->bpc * ( fp->last - fp->first); + printf("%s: %dx%d %d\n", __func__, fp->width, fp->height, bufsize); + fontbuf = kmem_alloc(bufsize, KM_NOSLEEP); + if (fontbuf == NULL) return; + f = (struct wsdisplay_font *)fontbuf; + f->name = fontbuf + sizeof(struct wsdisplay_font); + fontdata = fontbuf + sizeof(struct wsdisplay_font) + 32; + strcpy(fontbuf + sizeof(struct wsdisplay_font), "HP ROM"); + f->firstchar = fp->first; + f->numchars = (fp->last + 1) - fp->first; + f->encoding = WSDISPLAY_FONTENC_ISO; + f->fontwidth = fp->width; + f->fontheight = fp->height; + f->stride = (fp->width + 7) >> 3; + f->bitorder = WSDISPLAY_FONTORDER_L2R; + f->byteorder = WSDISPLAY_FONTORDER_L2R; + f->data = fontdata; + /* skip over font struct */ + font += sizeof(struct sti_font); + /* now copy and rearrange the glyphs into ISO order */ + /* first, copy the characters up to 0x7f */ + memcpy(fontdata, font, (0x80 - fp->first) * fp->bpc); + /* zero 0x80 to 0x9f */ + memset(fontdata + 0x80 * fp->bpc, 0, 0x20 * fp->bpc); + /* rearrange 0xa0 till last */ + for (i = 0xa0; i < (fp->last + 1); i++) { + dst = fontdata + fp->bpc * i; + si = sti_unitoroman[i - 0xa0]; + if (si != 0) { + src = font + fp->bpc * si; + memcpy(dst, src, fp->bpc); + } else { + /* no mapping - zeeo this cell */ + memset(dst, 0, fp->bpc); + } + } + wsfont_add(f, 0); +}