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);
+}