Module Name: src
Committed By: macallan
Date: Wed Nov 27 11:11:21 UTC 2024
Modified Files:
src/sys/arch/hppa/dev: summitfb.c
Log Message:
some cleanup & optimization:
- don't write the pixel mask register for operations that don't use it
- track write mode, only wait if we change it
- always sync when switching in and out of fb mode ( for X... )
- drop sc_hwmode
... about 10% speedup and no more glitches when starting X
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 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.7 src/sys/arch/hppa/dev/summitfb.c:1.8
--- src/sys/arch/hppa/dev/summitfb.c:1.7 Tue Nov 26 15:49:50 2024
+++ src/sys/arch/hppa/dev/summitfb.c Wed Nov 27 11:11:21 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: summitfb.c,v 1.7 2024/11/26 15:49:50 macallan Exp $ */
+/* $NetBSD: summitfb.c,v 1.8 2024/11/27 11:11:21 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.7 2024/11/26 15:49:50 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.8 2024/11/27 11:11:21 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -84,10 +84,7 @@ struct summitfb_softc {
u_char sc_cmap_red[256];
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];
- uint32_t sc_hwmode;
-#define HW_FB 0
-#define HW_FILL 1
-#define HW_BLIT 2
+ uint32_t sc_write_mode;
/* cursor stuff */
int sc_cursor_x, sc_cursor_y;
int sc_hot_x, sc_hot_y, sc_enabled;
@@ -168,6 +165,7 @@ 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
summitfb_match(device_t parent, cfdata_t cf, void *aux)
@@ -248,6 +246,7 @@ summitfb_attach(device_t parent, device_
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;
aprint_normal_dev(sc->sc_dev, "%s at %dx%d\n", sc->sc_scr.name,
sc->sc_width, sc->sc_height);
@@ -320,19 +319,6 @@ 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
}
/*
@@ -637,20 +623,25 @@ summitfb_wait(struct summitfb_softc *sc)
}
static inline void
+summitfb_write_mode(struct summitfb_softc *sc, uint32_t mode)
+{
+ if (sc->sc_write_mode == mode) return;
+ summitfb_wait(sc);
+ summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode);
+ sc->sc_write_mode = mode;
+}
+
+static inline void
summitfb_setup_fb(struct summitfb_softc *sc)
{
- 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);
+ summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
}
void
summitfb_setup(struct summitfb_softc *sc)
{
- sc->sc_hwmode = HW_FB;
sc->sc_hot_x = 0;
sc->sc_hot_y = 0;
sc->sc_enabled = 0;
@@ -676,8 +667,11 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write4(sc, 0xa0081c, 0); /* fx4 */
#endif
+ summitfb_wait(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_setup_fb(sc);
}
@@ -744,10 +738,10 @@ summitfb_ioctl(void *v, void *vs, u_long
summitfb_rectfill(sc, 0, 0, sc->sc_width,
sc->sc_height, ms->scr_ri.ri_devcmap[
(ms->scr_defattr >> 16) & 0xff]);
- summitfb_setup_fb(sc);
vcons_redraw_screen(ms);
summitfb_set_video(sc, 1);
}
+ summitfb_setup_fb(sc);
}
return 0;
}
@@ -971,11 +965,8 @@ summitfb_rectfill(struct summitfb_softc
uint32_t bg)
{
- summitfb_wait(sc);
- summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_FILL);
- summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+ summitfb_write_mode(sc, VISFX_WRITE_MODE_FILL);
summitfb_write4(sc, VISFX_FG_COLOUR, bg);
- summitfb_write4(sc, VISFX_BG_COLOUR, bg);
summitfb_write4(sc, VISFX_START, (x << 16) | y);
summitfb_write4(sc, VISFX_SIZE, (wi << 16) | he);
}
@@ -987,11 +978,7 @@ summitfb_bitblt(void *cookie, int xs, in
struct summitfb_softc *sc = cookie;
/* 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_write_mode(sc, 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);
@@ -1092,12 +1079,11 @@ summitfb_putchar(void *cookie, int row,
return;
#endif
- summitfb_wait(sc);
+ summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
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, VISFX_WRITE_MODE_EXPAND);
/* not a tpyo, coordinates *are* backwards for this register */
summitfb_write4(sc, VISFX_VRAM_WRITE_DEST, (y << 16) | x);
@@ -1161,7 +1147,7 @@ summitfb_putchar_aa(void *cookie, int ro
if (rv == GC_OK)
return;
- if (sc->sc_hwmode != HW_FB) summitfb_setup_fb(sc);
+ summitfb_setup_fb(sc);
sc->sc_putchar(cookie, row, col, c, attr);
if (rv == GC_ADD)