Module Name: src
Committed By: macallan
Date: Tue Nov 26 14:58:00 UTC 2024
Modified Files:
src/sys/arch/hppa/dev: summitfb.c
Log Message:
now that we know how, use the blitter to:
- draw characters
- scroll
- rectangle fills
no ROP support yet, so the cursor is drawn using putchar
while there get rid of some unused cargo-culted goop from gftfb
MUCH faster now
CV: ----------------------------------------------------------------------
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 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.5 src/sys/arch/hppa/dev/summitfb.c:1.6
--- src/sys/arch/hppa/dev/summitfb.c:1.5 Wed Nov 20 05:24:46 2024
+++ src/sys/arch/hppa/dev/summitfb.c Tue Nov 26 14:58:00 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: summitfb.c,v 1.5 2024/11/20 05:24:46 macallan Exp $ */
+/* $NetBSD: summitfb.c,v 1.6 2024/11/26 14:58:00 macallan Exp $ */
/* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.5 2024/11/20 05:24:46 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.6 2024/11/26 14:58:00 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -84,7 +84,6 @@ struct summitfb_softc {
u_char sc_cmap_red[256];
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];
- kmutex_t sc_hwlock;
uint32_t sc_hwmode;
#define HW_FB 0
#define HW_FILL 1
@@ -141,7 +140,9 @@ static void summitfb_rectfill(struct sum
static void summitfb_bitblt(void *, int, int, int, int, int,
int, int);
+#if 0
static void summitfb_cursor(void *, int, int, int);
+#endif
static void summitfb_putchar(void *, int, int, u_int, long);
static void summitfb_putchar_aa(void *, int, int, u_int, long);
static void summitfb_copycols(void *, int, int, int, int);
@@ -202,26 +203,6 @@ summitfb_write4(struct summitfb_softc *s
bus_space_write_stream_4(memt, memh, offset - 0x400000, val);
}
-static inline uint8_t
-summitfb_read1(struct summitfb_softc *sc, uint32_t offset)
-{
- struct sti_rom *rom = sc->sc_base.sc_rom;
- bus_space_tag_t memt = rom->memt;
- bus_space_handle_t memh = rom->regh[2];
-
- return bus_space_read_1(memt, memh, offset);
-}
-
-static inline void
-summitfb_write1(struct summitfb_softc *sc, uint32_t offset, uint8_t val)
-{
- struct sti_rom *rom = sc->sc_base.sc_rom;
- bus_space_tag_t memt = rom->memt;
- bus_space_handle_t memh = rom->regh[2];
-
- bus_space_write_1(memt, memh, offset, val);
-}
-
void
summitfb_attach(device_t parent, device_t self, void *aux)
{
@@ -241,9 +222,6 @@ summitfb_attach(device_t parent, device_
sc->sc_base.sc_enable_rom = summitfb_enable_rom;
sc->sc_base.sc_disable_rom = summitfb_disable_rom;
- /* we can *not* be interrupted when doing colour map accesses */
- mutex_init(&sc->sc_hwlock, MUTEX_DEFAULT, IPL_HIGH);
-
aprint_normal("\n");
if (summitfb_check_rom(sc, paa) != 0)
@@ -342,6 +320,19 @@ summitfb_attach(device_t parent, device_
aa.accesscookie = &sc->vd;
config_found(sc->sc_dev, &aa, wsemuldisplaydevprint, CFARGS_NONE);
+
+#if 0
+ summitfb_rectfill(sc, 10, 850, 100, 100, 1);
+ summitfb_rectfill(sc, 120, 850, 10, 100, 1);
+ summitfb_rectfill(sc, 200, 840, 1000, 120, 14);
+ summitfb_write4(sc, VISFX_PIXEL_MASK, 0xf0f0cc88);
+ summitfb_bitblt(sc, 0, 845, 205, 845, 150, 110, 0x00000830);
+ //summitfb_bitblt(sc, 0, 845, 405, 845, 150, 110, 0x04000000);
+ summitfb_bitblt(sc, 0, 845, 605, 845, 150, 110, 0x01000000);
+ //summitfb_bitblt(sc, 0, 845, 805, 845, 150, 110, 0x0000020c);
+ //summitfb_bitblt(sc, 0, 845, 1005, 845, 150, 110, 0x04000000);
+ summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+#endif
}
/*
@@ -652,6 +643,7 @@ summitfb_setup_fb(struct summitfb_softc
sc->sc_hwmode = HW_FB;
summitfb_wait(sc);
summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN);
+ summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
}
void
@@ -679,7 +671,9 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write4(sc, 0xa0086c, 0);
summitfb_write4(sc, 0x921114, 0);
summitfb_write4(sc, 0xac1050, 0);
- summitfb_write4(sc, 0xa00858, 0xb0);
+ summitfb_write4(sc, 0xa00858, 0xb0); /* 0 on fx4 */
+ summitfb_write4(sc, 0xa00850, 0); /* fx4 */
+ summitfb_write4(sc, 0xa0081c, 0); /* fx4 */
#endif
summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
@@ -849,25 +843,25 @@ summitfb_init_screen(void *cookie, struc
rasops_init(ri, 0, 0);
ri->ri_caps = WSSCREEN_WSCOLORS | WSSCREEN_HILIT | WSSCREEN_UNDERLINE |
WSSCREEN_RESIZE;
- scr->scr_flags |= VCONS_LOADFONT | VCONS_DONT_READ;
+ scr->scr_flags |= VCONS_LOADFONT | VCONS_NO_CURSOR;
rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight,
sc->sc_width / ri->ri_font->fontwidth);
ri->ri_hw = scr;
-if (0) {
+
sc->sc_putchar = ri->ri_ops.putchar;
+
ri->ri_ops.copyrows = summitfb_copyrows;
ri->ri_ops.copycols = summitfb_copycols;
ri->ri_ops.eraserows = summitfb_eraserows;
ri->ri_ops.erasecols = summitfb_erasecols;
- ri->ri_ops.cursor = summitfb_cursor;
+ //ri->ri_ops.cursor = summitfb_cursor;
if (FONT_IS_ALPHA(ri->ri_font)) {
ri->ri_ops.putchar = summitfb_putchar_aa;
} else
ri->ri_ops.putchar = summitfb_putchar;
}
-}
static int
summitfb_putcmap(struct summitfb_softc *sc, struct wsdisplay_cmap *cm)
@@ -952,13 +946,11 @@ summitfb_putpalreg(struct summitfb_softc
uint8_t r, uint8_t g, uint8_t b)
{
- mutex_enter(&sc->sc_hwlock);
summitfb_write4(sc, VISFX_COLOR_INDEX, 0xc0005100 + idx);
summitfb_write4(sc, VISFX_COLOR_VALUE, (r << 16) | ( g << 8) | b);
summitfb_write4(sc, VISFX_COLOR_MASK, 0xff);
summitfb_write4(sc, 0x80004c, 0xc);
summitfb_write4(sc, 0x800000, 0);
- mutex_exit(&sc->sc_hwlock);
return 0;
}
@@ -981,6 +973,7 @@ summitfb_rectfill(struct summitfb_softc
summitfb_wait(sc);
summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_FILL);
+ summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
summitfb_write4(sc, VISFX_FG_COLOUR, bg);
summitfb_write4(sc, VISFX_BG_COLOUR, bg);
summitfb_write4(sc, VISFX_START, (x << 16) | y);
@@ -991,11 +984,21 @@ static void
summitfb_bitblt(void *cookie, int xs, int ys, int xd, int yd, int wi,
int he, int rop)
{
-#if 0
struct summitfb_softc *sc = cookie;
-#endif
+
+ /* XXX no ROP support yet */
+ summitfb_wait(sc);
+ if ((rop == 3) || (rop == 0xc)) rop = 0;
+ summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN | rop);
+ summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
+ //summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+ 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);
+
}
+#if 0
static void
summitfb_nuke_cursor(struct rasops_info *ri)
{
@@ -1008,7 +1011,7 @@ summitfb_nuke_cursor(struct rasops_info
he = ri->ri_font->fontheight;
x = ri->ri_ccol * wi + ri->ri_xorigin;
y = ri->ri_crow * he + ri->ri_yorigin;
- summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
+ if (0) summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
ri->ri_flg &= ~RI_CURSOR;
}
}
@@ -1043,17 +1046,17 @@ summitfb_cursor(void *cookie, int on, in
}
}
+#endif
static void
summitfb_putchar(void *cookie, int row, int col, u_int c, long attr)
{
-#if 0
struct rasops_info *ri = cookie;
struct wsdisplay_font *font = PICK_FONT(ri, c);
struct vcons_screen *scr = ri->ri_hw;
struct summitfb_softc *sc = scr->scr_cookie;
- //void *data;
- int x, y, wi, he, rv = GC_NOPE;
+ void *data;
+ int i, x, y, wi, he/*, rv = GC_NOPE*/;
uint32_t bg, fg, mask;
if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL)
@@ -1062,10 +1065,11 @@ summitfb_putchar(void *cookie, int row,
if (!CHAR_IN_FONT(c, font))
return;
+#if 0
if (row == ri->ri_crow && col == ri->ri_ccol) {
ri->ri_flg &= ~RI_CURSOR;
}
-
+#endif
wi = font->fontwidth;
he = font->fontheight;
@@ -1082,15 +1086,39 @@ summitfb_putchar(void *cookie, int row,
fg = ri->ri_devcmap[(attr >> 24) & 0x0f];
+#if 0
rv = glyphcache_try(&sc->sc_gc, c, x, y, attr);
if (rv == GC_OK)
return;
+#endif
- /* clear the character cell */
- summitfb_rectfill(sc, x, y, wi, he, bg);
-
- //data = WSFONT_GLYPH(c, font);
-/* ... */
+ summitfb_wait(sc);
+ summitfb_write4(sc, VISFX_FG_COLOUR, fg);
+ summitfb_write4(sc, VISFX_BG_COLOUR, bg);
+ mask = 0xffffffff << (32 - wi);
+ summitfb_write4(sc, VISFX_PIXEL_MASK, mask);
+ summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, 0x050000c0);
+ /* not a tpyo, coordinates *are* backwards for this register */
+ summitfb_write4(sc, VISFX_VRAM_WRITE_DEST, (y << 16) | x);
+
+ data = WSFONT_GLYPH(c, font);
+
+ if (ri->ri_font->stride == 1) {
+ uint8_t *data8 = data;
+ for (i = 0; i < he; i++) {
+ mask = *data8;
+ summitfb_write4(sc, VISFX_VRAM_WRITE_DATA_INCRY, mask << 24);
+ data8++;
+ }
+ } else {
+ uint16_t *data16 = data;
+ for (i = 0; i < he; i++) {
+ mask = *data16;
+ summitfb_write4(sc, VISFX_VRAM_WRITE_DATA_INCRY, mask << 16);
+ data16++;
+ }
+ }
+#if 0
if (rv == GC_ADD)
glyphcache_add(&sc->sc_gc, c, x, y);
#endif
@@ -1149,18 +1177,20 @@ summitfb_copycols(void *cookie, int row,
int32_t xs, xd, y, width, height;
if ((sc->sc_locked == 0) && (sc->sc_mode == WSDISPLAYIO_MODE_EMUL)) {
+#if 0
if (ri->ri_crow == row &&
ri->ri_ccol >= srccol && ri->ri_ccol < (srccol + ncols) &&
(ri->ri_flg & RI_CURSOR)) {
summitfb_nuke_cursor(ri);
}
-
+#endif
xs = ri->ri_xorigin + ri->ri_font->fontwidth * srccol;
xd = ri->ri_xorigin + ri->ri_font->fontwidth * dstcol;
y = ri->ri_yorigin + ri->ri_font->fontheight * row;
width = ri->ri_font->fontwidth * ncols;
height = ri->ri_font->fontheight;
summitfb_bitblt(sc, xs, y, xd, y, width, height, RopSrc);
+
if (ri->ri_crow == row &&
ri->ri_ccol >= dstcol && ri->ri_ccol < (dstcol + ncols))
ri->ri_flg &= ~RI_CURSOR;
@@ -1184,6 +1214,7 @@ summitfb_erasecols(void *cookie, int row
rasops_unpack_attr(fillattr, &fg, &bg, &ul);
summitfb_rectfill(sc, x, y, width, height, ri->ri_devcmap[bg]);
+
if (ri->ri_crow == row &&
ri->ri_ccol >= startcol &&
ri->ri_ccol < (startcol + ncols))
@@ -1200,16 +1231,19 @@ summitfb_copyrows(void *cookie, int srcr
int32_t x, ys, yd, width, height;
if ((sc->sc_locked == 0) && (sc->sc_mode == WSDISPLAYIO_MODE_EMUL)) {
+#if 0
if (ri->ri_crow >= srcrow && ri->ri_crow < (srcrow + nrows) &&
(ri->ri_flg & RI_CURSOR)) {
summitfb_nuke_cursor(ri);
}
+#endif
x = ri->ri_xorigin;
ys = ri->ri_yorigin + ri->ri_font->fontheight * srcrow;
yd = ri->ri_yorigin + ri->ri_font->fontheight * dstrow;
width = ri->ri_emuwidth;
height = ri->ri_font->fontheight * nrows;
summitfb_bitblt(sc, x, ys, x, yd, width, height, RopSrc);
+
if (ri->ri_crow >= dstrow && ri->ri_crow < (dstrow + nrows))
ri->ri_flg &= ~RI_CURSOR;
}
@@ -1277,13 +1311,13 @@ summitfb_do_cursor(struct summitfb_softc
copyin(cur->cmap.blue, b, 2);
copyin(cur->cmap.green, g, 2);
copyin(cur->cmap.red, r, 2);
- mutex_enter(&sc->sc_hwlock);
summitfb_write4(sc, VISFX_CURSOR_INDEX, 0);
rgb = r[0] << 16 | g[0] << 8 | b[0];
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_COLOR + 4, rgb);
- mutex_exit(&sc->sc_hwlock);
+
}
if (cur->which & WSDISPLAY_CURSOR_DOSHAPE) {