Module Name: src
Committed By: macallan
Date: Thu Dec 26 10:44:11 UTC 2024
Modified Files:
src/sys/arch/hppa/dev: summitfb.c
Log Message:
now that we can do ROPs, use them and enable all the lazy cursor update stuff
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 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.19 src/sys/arch/hppa/dev/summitfb.c:1.20
--- src/sys/arch/hppa/dev/summitfb.c:1.19 Wed Dec 25 05:44:12 2024
+++ src/sys/arch/hppa/dev/summitfb.c Thu Dec 26 10:44:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: summitfb.c,v 1.19 2024/12/25 05:44:12 macallan Exp $ */
+/* $NetBSD: summitfb.c,v 1.20 2024/12/26 10:44:11 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.19 2024/12/25 05:44:12 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.20 2024/12/26 10:44:11 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -147,9 +147,7 @@ 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_fast(void *, int, int, u_int, long);
static void summitfb_loadfont(struct summitfb_softc *);
@@ -669,8 +667,7 @@ 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 & 0x07fff000) | 0x400);
+ summitfb_write4(sc, VISFX_VRAM_READ_MODE,mode & 0x07fff000);
sc->sc_write_mode = mode;
}
@@ -678,6 +675,7 @@ static inline void
summitfb_setup_fb(struct summitfb_softc *sc)
{
+ summitfb_wait(sc);
if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
@@ -686,7 +684,9 @@ summitfb_setup_fb(struct summitfb_softc
summitfb_write_mode(sc, OTC01 | BIN8F | BUFFL);
summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_32);
summitfb_write4(sc, VISFX_OTR, OTR_A); // all transparent
- }
+ }
+ summitfb_write4(sc, VISFX_IBO, RopSrc);
+ //summitfb_write4(sc, VISFX_CONTROL, CONTROL_WFC);
}
void
@@ -699,6 +699,7 @@ summitfb_setup(struct summitfb_softc *sc
sc->sc_enabled = 0;
sc->sc_video_on = 1;
+ summitfb_wait(sc);
#if 1
summitfb_write4(sc, 0xb08044, 0x1b);
summitfb_write4(sc, 0xb08048, 0x1b);
@@ -731,14 +732,19 @@ summitfb_setup(struct summitfb_softc *sc
/* turn off force attr so the above takes effect */
summitfb_write4(sc, VISFX_FATTR, 0);
+ summitfb_write4(sc, VISFX_TCR, 0x10001000); /* disable throttling */
+
summitfb_wait(sc);
+ summitfb_write4(sc, VISFX_CONTROL, 0); // clear WFC
summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
summitfb_write4(sc, VISFX_PLANE_MASK, 0xffffffff);
+ summitfb_write4(sc, VISFX_FOE, FOE_BLEND_ROP);
+ summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
summitfb_write4(sc, VISFX_CLIP_TL, 0);
summitfb_write4(sc, VISFX_CLIP_WH,
- ((sc->sc_scr.fbwidth + 1) << 16) | (sc->sc_scr.fbheight + 1));
+ ((sc->sc_scr.fbwidth) << 16) | (sc->sc_scr.fbheight));
/* turn off the cursor sprite */
summitfb_write4(sc, VISFX_CURSOR_POS, 0);
summitfb_setup_fb(sc);
@@ -922,7 +928,7 @@ 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_NO_CURSOR;
+ 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);
@@ -933,7 +939,7 @@ summitfb_init_screen(void *cookie, struc
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;
#ifdef SUMMITFB_ENABLE_GC
sc->sc_putchar = ri->ri_ops.putchar;
if (FONT_IS_ALPHA(ri->ri_font)) {
@@ -1048,13 +1054,11 @@ summitfb_putpalreg(struct summitfb_softc
static inline void
summitfb_wait_fifo(struct summitfb_softc *sc, uint32_t slots)
{
-#if 0
uint32_t reg;
do {
- reg = summitfb_read4(sc, NGLE_REG_34);
+ reg = summitfb_read4(sc, VISFX_FIFO);
} while (reg < slots);
-#endif
}
static void
@@ -1063,6 +1067,8 @@ summitfb_rectfill(struct summitfb_softc
{
summitfb_write_mode(sc, VISFX_WRITE_MODE_FILL);
+ summitfb_wait_fifo(sc, 4);
+ summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write4(sc, VISFX_FG_COLOUR, bg);
summitfb_write4(sc, VISFX_START, (x << 16) | y);
summitfb_write4(sc, VISFX_SIZE, (wi << 16) | he);
@@ -1074,18 +1080,15 @@ summitfb_bitblt(void *cookie, int xs, in
{
struct summitfb_softc *sc = cookie;
- /* XXX no ROP support yet */
- if (rop != RopSrc) {
- summitfb_write_mode(sc, rop);
- } else
- summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+ summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+ summitfb_wait_fifo(sc, 4);
+ summitfb_write4(sc, VISFX_IBO, rop);
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)
{
@@ -1098,7 +1101,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;
- if (0) summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
+ summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
ri->ri_flg &= ~RI_CURSOR;
}
}
@@ -1133,7 +1136,6 @@ summitfb_cursor(void *cookie, int on, in
}
}
-#endif
static void
summitfb_putchar(void *cookie, int row, int col, u_int c, long attr)
@@ -1152,12 +1154,10 @@ summitfb_putchar(void *cookie, int row,
if (!CHAR_IN_FONT(c, font))
return;
- /* XXX as long as we use putchar() to draw the cursor */
-#if 0
if (row == ri->ri_crow && col == ri->ri_ccol) {
ri->ri_flg &= ~RI_CURSOR;
}
-#endif
+
wi = font->fontwidth;
he = font->fontheight;
@@ -1175,6 +1175,8 @@ summitfb_putchar(void *cookie, int row,
fg = ri->ri_devcmap[(attr >> 24) & 0x0f];
summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
+ summitfb_wait_fifo(sc, 6);
+ summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write4(sc, VISFX_FG_COLOUR, fg);
summitfb_write4(sc, VISFX_BG_COLOUR, bg);
mask = 0xffffffff << (32 - wi);
@@ -1213,7 +1215,7 @@ summitfb_loadfont(struct summitfb_softc
summitfb_setup(sc);
summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
-
+ summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write4(sc, VISFX_FG_COLOUR, 0xffffffff);
summitfb_write4(sc, VISFX_BG_COLOUR, 0);
@@ -1266,12 +1268,10 @@ summitfb_putchar_fast(void *cookie, int
return;
}
- /* XXX as long as we use putchar() to draw the cursor */
-#if 0
if (row == ri->ri_crow && col == ri->ri_ccol) {
ri->ri_flg &= ~RI_CURSOR;
}
-#endif
+
wi = font->fontwidth;
he = font->fontheight;
@@ -1289,6 +1289,8 @@ summitfb_putchar_fast(void *cookie, int
fg = ri->ri_devcmap[(attr >> 24) & 0x0f];
summitfb_write_mode(sc, 0x050000c0);
+ summitfb_wait_fifo(sc, 6);
+ summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write4(sc, VISFX_FG_COLOUR, fg);
summitfb_write4(sc, VISFX_BG_COLOUR, bg);
@@ -1358,13 +1360,13 @@ 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;
@@ -1412,12 +1414,12 @@ 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;