Module Name: src
Committed By: macallan
Date: Wed Dec 25 05:44:12 UTC 2024
Modified Files:
src/sys/arch/hppa/dev: summitfb.c
Log Message:
some updates:
- setup attributes for RGB8 in the image planes and 8I in the overlay
- explicitly select LUT 0 for the overlay so we don't depend on what STI sets
anymore - now this should work on all FX cards
- expose 24bit framebuffer to X
- make sure we switch overlay transparency according to WSDISPLAY_SMODE
- remove unnecessary register writes when accessing the colour map
- no need to call summitfb_setup_fb() in summitfb_do_cursot() - that was for
HCRX and friends
- support screen blanking
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 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.18 src/sys/arch/hppa/dev/summitfb.c:1.19
--- src/sys/arch/hppa/dev/summitfb.c:1.18 Wed Dec 18 05:22:05 2024
+++ src/sys/arch/hppa/dev/summitfb.c Wed Dec 25 05:44:12 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: summitfb.c,v 1.18 2024/12/18 05:22:05 macallan Exp $ */
+/* $NetBSD: summitfb.c,v 1.19 2024/12/25 05:44:12 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.18 2024/12/18 05:22:05 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.19 2024/12/25 05:44:12 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -670,7 +670,7 @@ summitfb_write_mode(struct summitfb_soft
summitfb_wait(sc);
summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode);
summitfb_write4(sc, VISFX_VRAM_READ_MODE,
- (mode & 0x07000000) | 0x400);
+ (mode & 0x07fff000) | 0x400);
sc->sc_write_mode = mode;
}
@@ -678,12 +678,21 @@ static inline void
summitfb_setup_fb(struct summitfb_softc *sc)
{
- summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+ if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
+ summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+ summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
+ summitfb_write4(sc, VISFX_OTR, OTR_T | OTR_L1 | OTR_L0); // opaque
+ } else {
+ 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
+ }
}
void
summitfb_setup(struct summitfb_softc *sc)
{
+ int i;
sc->sc_hot_x = 0;
sc->sc_hot_y = 0;
@@ -695,7 +704,7 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write4(sc, 0xb08048, 0x1b);
summitfb_write4(sc, 0x920860, 0xe4);
- summitfb_write4(sc, 0x921110, 0);
+ summitfb_write4(sc, VISFX_IBO, 0);
summitfb_write4(sc, 0x921114, 0);
summitfb_write4(sc, 0x9211d8, 0);
@@ -706,6 +715,22 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write4(sc, 0xa0086c, 0);
#endif
+ /* make sure the overlay is opaque */
+ summitfb_write4(sc, VISFX_OTR, OTR_T | OTR_L1 | OTR_L0);
+ /*
+ * initialize XLUT
+ * the whole thing so we don't have to clear the attribute plane
+ */
+ for (i = 0; i < 16; i++)
+ summitfb_write4(sc, VISFX_IAA(i), IAA_8F | IAA_CFS1); /* RGB, CFS1 */
+ summitfb_write4(sc, VISFX_CFS(1), CFS_8F | CFS_BYPASS);
+ /* overlay is 8bit, uses LUT 0 */
+ summitfb_write4(sc, VISFX_CFS(16), CFS_8I | CFS_LUT0);
+ summitfb_write4(sc, VISFX_CFS(17), CFS_8I | CFS_LUT0);
+
+ /* turn off force attr so the above takes effect */
+ summitfb_write4(sc, VISFX_FATTR, 0);
+
summitfb_wait(sc);
summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
@@ -797,7 +822,18 @@ summitfb_ioctl(void *v, void *vs, u_long
int ret;
ret = wsdisplayio_get_fbinfo(&ms->scr_ri, fbi);
- fbi->fbi_fbsize = sc->sc_scr.fbheight * 2048;
+ //fbi->fbi_fbsize = sc->sc_height * 2048;
+ fbi->fbi_stride = 8192;
+ fbi->fbi_bitsperpixel = 32;
+ fbi->fbi_pixeltype = WSFB_RGB;
+ fbi->fbi_subtype.fbi_rgbmasks.red_offset = 16;
+ fbi->fbi_subtype.fbi_rgbmasks.red_size = 8;
+ fbi->fbi_subtype.fbi_rgbmasks.green_offset = 8;
+ fbi->fbi_subtype.fbi_rgbmasks.green_size = 8;
+ fbi->fbi_subtype.fbi_rgbmasks.blue_offset = 0;
+ fbi->fbi_subtype.fbi_rgbmasks.blue_size = 8;
+ fbi->fbi_subtype.fbi_rgbmasks.alpha_size = 0;
+ fbi->fbi_fbsize = sc->sc_scr.fbheight * 8192;
return ret;
}
@@ -1003,10 +1039,9 @@ summitfb_putpalreg(struct summitfb_softc
uint8_t r, uint8_t g, uint8_t b)
{
- summitfb_write4(sc, VISFX_COLOR_INDEX, 0xc0005100 + idx);
+ summitfb_write4(sc, VISFX_COLOR_INDEX, idx);
summitfb_write4(sc, VISFX_COLOR_VALUE, (r << 16) | ( g << 8) | b);
summitfb_write4(sc, VISFX_COLOR_MASK, 0xff);
- summitfb_write4(sc, 0x80004c, 0xc);
return 0;
}
@@ -1550,7 +1585,6 @@ summitfb_do_cursor(struct summitfb_softc
latch |= tmp << 7;
summitfb_write4(sc, VISFX_CURSOR_DATA, latch);
}
- summitfb_setup_fb(sc);
}
return 0;
@@ -1567,7 +1601,9 @@ summitfb_set_video(struct summitfb_softc
summitfb_wait(sc);
if (on) {
+ summitfb_write4(sc, VISFX_MPC, MPC_VIDEO_ON);
} else {
+ summitfb_write4(sc, VISFX_MPC, MPC_VSYNC_OFF | MPC_HSYNC_OFF);
}
}