Module Name: src
Committed By: macallan
Date: Wed Feb 21 13:04:01 UTC 2024
Modified Files:
src/sys/arch/hppa/dev: gftfb.c
Log Message:
keep track of hw settings for blitter, fill of fb access to avoid unnecessary
register writes
while there, remove some accidentially left in debug goop
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/hppa/dev/gftfb.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/gftfb.c
diff -u src/sys/arch/hppa/dev/gftfb.c:1.4 src/sys/arch/hppa/dev/gftfb.c:1.5
--- src/sys/arch/hppa/dev/gftfb.c:1.4 Tue Feb 20 15:54:44 2024
+++ src/sys/arch/hppa/dev/gftfb.c Wed Feb 21 13:04:01 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: gftfb.c,v 1.4 2024/02/20 15:54:44 macallan Exp $ */
+/* $NetBSD: gftfb.c,v 1.5 2024/02/21 13:04:01 macallan Exp $ */
/* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */
@@ -76,7 +76,10 @@ struct gftfb_softc {
u_char sc_cmap_red[256];
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];
- uint32_t sc_reg10;
+ uint32_t sc_hwmode;
+#define HW_FB 0
+#define HW_FILL 1
+#define HW_BLIT 2
glyphcache sc_gc;
};
@@ -645,6 +648,7 @@ gftfb_setup_fb(struct gftfb_softc *sc)
bus_space_write_stream_4(memt, memh, NGLE_REG_14, 0x83000300);
gftfb_wait(sc);
bus_space_write_1(memt, memh, NGLE_REG_16b1, 1);
+ sc->sc_hwmode = HW_FB;
}
void
@@ -654,7 +658,7 @@ gftfb_setup(struct gftfb_softc *sc)
bus_space_tag_t memt = rom->memt;
bus_space_handle_t memh = rom->regh[2];
- sc->sc_reg10 = 0;
+ sc->sc_hwmode = HW_FB;
/* set Bt458 read mask register to all planes */
gftfb_wait(sc);
@@ -674,6 +678,10 @@ gftfb_setup(struct gftfb_softc *sc)
bus_space_write_stream_4(memt, memh, NGLE_REG_6, 0x00000000);
bus_space_write_stream_4(memt, memh, NGLE_REG_9,
(sc->sc_scr.scr_cfg.scr_width << 16) | sc->sc_scr.scr_cfg.scr_height);
+ /*
+ * blit into offscreen memory to force flush previous - apparently
+ * some chips have a bug this works around
+ */
bus_space_write_stream_4(memt, memh, NGLE_REG_6, 0x05000000);
bus_space_write_stream_4(memt, memh, NGLE_REG_9, 0x00040001);
@@ -682,6 +690,7 @@ gftfb_setup(struct gftfb_softc *sc)
gftfb_setup_fb(sc);
+ /* make sure video output is enabled */
gftfb_wait(sc);
bus_space_write_stream_4(memt, memh, NGLE_REG_21,
bus_space_read_stream_4(memt, memh, NGLE_REG_21) | 0x0a000000);
@@ -741,7 +750,7 @@ gftfb_ioctl(void *v, void *vs, u_long cm
sc->sc_mode = new_mode;
if(new_mode == WSDISPLAYIO_MODE_EMUL) {
gftfb_setup(sc);
- if (0) gftfb_restore_palette(sc);
+ gftfb_restore_palette(sc);
glyphcache_wipe(&sc->sc_gc);
gftfb_rectfill(sc, 0, 0, sc->sc_width,
sc->sc_height, ms->scr_ri.ri_devcmap[
@@ -932,19 +941,22 @@ gftfb_rectfill(struct gftfb_softc *sc, i
bus_space_tag_t memt = rom->memt;
bus_space_handle_t memh = rom->regh[2];
- gftfb_wait_fifo(sc, 5);
- /* transfer data */
- bus_space_write_stream_4(memt, memh, NGLE_REG_8, 0xffffffff);
+ if (sc->sc_hwmode != HW_FILL) {
+ gftfb_wait_fifo(sc, 4);
+ /* transfer data */
+ bus_space_write_stream_4(memt, memh, NGLE_REG_8, 0xffffffff);
+ /* plane mask */
+ bus_space_write_stream_4(memt, memh, NGLE_REG_13, 0xff);
+ /* bitmap op */
+ bus_space_write_stream_4(memt, memh, NGLE_REG_14,
+ IBOvals(RopSrc, 0, BitmapExtent08, 0, DataDynamic, MaskOtc, 0, 0));
+ /* dst bitmap access */
+ bus_space_write_stream_4(memt, memh, NGLE_REG_11,
+ BA(IndexedDcd, Otc32, OtsIndirect, AddrLong, 0, BINapp0I, 0));
+ sc->sc_hwmode = HW_FILL;
+ }
+ gftfb_wait_fifo(sc, 3);
bus_space_write_stream_4(memt, memh, NGLE_REG_35, bg);
- /* plane mask */
- bus_space_write_stream_4(memt, memh, NGLE_REG_13, 0xff);
- /* bitmap op */
- bus_space_write_stream_4(memt, memh, NGLE_REG_14,
- IBOvals(RopSrc, 0, BitmapExtent08, 0, DataDynamic, MaskOtc, 0, 0));
- /* dst bitmap access */
- bus_space_write_stream_4(memt, memh, NGLE_REG_11,
- BA(IndexedDcd, Otc32, OtsIndirect, AddrLong, 0, BINapp0I, 0));
- gftfb_wait_fifo(sc, 2);
/* dst XY */
bus_space_write_stream_4(memt, memh, NGLE_REG_6, (x << 16) | y);
/* len XY start */
@@ -970,6 +982,7 @@ gftfb_bitblt(void *cookie, int xs, int y
bus_space_write_stream_4(memt, memh, NGLE_REG_24, (xs << 16) | ys);
bus_space_write_stream_4(memt, memh, NGLE_REG_7, (wi << 16) | he);
bus_space_write_stream_4(memt, memh, NGLE_REG_25, (xd << 16) | yd);
+ sc->sc_hwmode = HW_BLIT;
}
static void
@@ -1065,7 +1078,7 @@ gftfb_putchar(void *cookie, int row, int
if (rv == GC_OK)
return;
- gftfb_setup_fb(sc);
+ if (sc->sc_hwmode != HW_FB) gftfb_setup_fb(sc);
sc->sc_putchar(cookie, row, col, c, attr);
if (rv == GC_ADD)