Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/sbus following a hunch...



details:   https://anonhg.NetBSD.org/src/rev/af38c0d98e27
branches:  trunk
changeset: 376681:af38c0d98e27
user:      macallan <macallan%NetBSD.org@localhost>
date:      Wed Jun 28 11:08:47 2023 +0000

description:
following a hunch...
- cache DEC and FG registers, only write them if the value actually changes
- wait for the engine to go idle before writing DEC
- wait for FIFO slots on everything else
with this we avoid waiting if possible and still avoid overlapping blit and
fill commands

diffstat:

 sys/dev/sbus/mgx.c |  45 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 32 insertions(+), 13 deletions(-)

diffs (112 lines):

diff -r db7b390b792a -r af38c0d98e27 sys/dev/sbus/mgx.c
--- a/sys/dev/sbus/mgx.c        Wed Jun 28 09:35:42 2023 +0000
+++ b/sys/dev/sbus/mgx.c        Wed Jun 28 11:08:47 2023 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mgx.c,v 1.22 2023/06/28 08:53:43 macallan Exp $ */
+/*     $NetBSD: mgx.c,v 1.23 2023/06/28 11:08:47 macallan Exp $ */
 
 /*-
  * Copyright (c) 2014 Michael Lorenz
@@ -29,7 +29,7 @@
 /* a console driver for the SSB 4096V-MGX graphics card */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mgx.c,v 1.22 2023/06/28 08:53:43 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mgx.c,v 1.23 2023/06/28 11:08:47 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -80,7 +80,7 @@ struct mgx_softc {
        int             sc_fbsize;
        int             sc_mode;
        char            sc_name[8];
-       uint32_t        sc_dec;
+       uint32_t        sc_dec, sc_r_dec, sc_r_fg;
        u_char          sc_cmap_red[256];
        u_char          sc_cmap_green[256];
        u_char          sc_cmap_blue[256];
@@ -216,6 +216,24 @@ mgx_write_4(struct mgx_softc *sc, uint32
        bus_space_write_4(sc->sc_tag, sc->sc_blith, reg, val);
 }
 
+static inline void
+mgx_set_dec(struct mgx_softc *sc, uint32_t dec)
+{
+       if (dec == sc->sc_r_dec) return;
+       sc->sc_r_dec = dec;
+       mgx_wait_engine(sc);
+       mgx_write_4(sc, ATR_DEC, dec);
+}
+
+static inline void
+mgx_set_fg(struct mgx_softc *sc, uint32_t fg)
+{
+       if (fg == sc->sc_r_fg) return;
+       sc->sc_r_fg = fg;
+       mgx_wait_fifo(sc, 1);   
+       mgx_write_4(sc, ATR_FG, fg);
+}
+
 static int
 mgx_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -531,6 +549,8 @@ mgx_setup(struct mgx_softc *sc, int dept
        int i;
        uint8_t reg;
 
+       sc->sc_r_dec = 0xffffffff;
+       sc->sc_r_fg = 0x12345678;
        /* wait for everything to go idle */
        if (mgx_wait_engine(sc) == 0)
                return;
@@ -643,9 +663,9 @@ mgx_bitblt(void *cookie, int xs, int ys,
                yd += he - 1;
                dec |= DEC_DIR_Y_REVERSE;
        }
-       mgx_wait_fifo(sc, 5);
+       mgx_set_dec(sc, dec);
+       mgx_wait_fifo(sc, 4);
        mgx_write_1(sc, ATR_ROP, rop);
-       mgx_write_4(sc, ATR_DEC, dec);
        mgx_write_4(sc, ATR_SRC_XY, (ys << 16) | xs);
        mgx_write_4(sc, ATR_DST_XY, (yd << 16) | xd);
        mgx_write_4(sc, ATR_WH, (he << 16) | wi);
@@ -666,11 +686,10 @@ mgx_rectfill(void *cookie, int x, int y,
        dec = sc->sc_dec;
        dec |= (DEC_COMMAND_RECT << DEC_COMMAND_SHIFT) |
               (DEC_START_DIMX << DEC_START_SHIFT);
-       //mgx_wait_fifo(sc, 5);
-       mgx_wait_engine(sc);
+       mgx_set_dec(sc, dec);
+       mgx_set_fg(sc, col);
+       mgx_wait_fifo(sc, 3);
        mgx_write_1(sc, ATR_ROP, ROP_SRC);
-       mgx_write_4(sc, ATR_FG, col);
-       mgx_write_4(sc, ATR_DEC, dec);
        mgx_write_4(sc, ATR_DST_XY, (y << 16) | x);
        mgx_write_4(sc, ATR_WH, (he << 16) | wi);
 }
@@ -754,8 +773,8 @@ mgx_putchar_mono(void *cookie, int row, 
                return;
        }
 
-       mgx_wait_fifo(sc, 3);
-       mgx_write_4(sc, ATR_FG, ri->ri_devcmap[fg]);
+       mgx_set_fg(sc, ri->ri_devcmap[fg]);
+       mgx_wait_fifo(sc, 2);
        mgx_write_4(sc, ATR_BG, ri->ri_devcmap[bg]);
        mgx_write_1(sc, ATR_ROP, ROP_SRC);
 
@@ -790,10 +809,10 @@ mgx_putchar_mono(void *cookie, int row, 
                for (i = 0; i < ri->ri_fontscale; i++)
                        d[i] = s[i];
        }
-       mgx_wait_fifo(sc, 5);
-       mgx_write_4(sc, ATR_DEC, sc->sc_dec | (DEC_COMMAND_BLT << DEC_COMMAND_SHIFT) |
+       mgx_set_dec(sc, sc->sc_dec | (DEC_COMMAND_BLT << DEC_COMMAND_SHIFT) |
               (DEC_START_DIMX << DEC_START_SHIFT) |
               DEC_SRC_LINEAR | DEC_SRC_CONTIGUOUS | DEC_MONOCHROME);
+       mgx_wait_fifo(sc, 3);
        mgx_write_4(sc, ATR_SRC_XY, ((scratch & 0xfff000) << 4) | (scratch & 0xfff));
        mgx_write_4(sc, ATR_DST_XY, (y << 16) | x);
        mgx_write_4(sc, ATR_WH, (he << 16) | wi);



Home | Main Index | Thread Index | Old Index