Module Name: src
Committed By: macallan
Date: Wed Feb 28 14:12:12 UTC 2024
Modified Files:
src/sys/arch/hppa/dev: gftfb.c
Log Message:
support WSDISPLAYIO_SVIDEO so X can turn the monitor off
so far I only know how to turn off video output, not sync(s). Better than
nothing though.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 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.7 src/sys/arch/hppa/dev/gftfb.c:1.8
--- src/sys/arch/hppa/dev/gftfb.c:1.7 Wed Feb 28 10:25:36 2024
+++ src/sys/arch/hppa/dev/gftfb.c Wed Feb 28 14:12:12 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: gftfb.c,v 1.7 2024/02/28 10:25:36 macallan Exp $ */
+/* $NetBSD: gftfb.c,v 1.8 2024/02/28 14:12:12 macallan Exp $ */
/* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */
@@ -91,7 +91,7 @@ struct gftfb_softc {
/* cursor stuff */
int sc_cursor_x, sc_cursor_y;
int sc_hot_x, sc_hot_y, sc_enabled;
- uint32_t sc_pos;
+ int sc_video_on;
glyphcache sc_gc;
};
@@ -148,6 +148,8 @@ static void gftfb_eraserows(void *, int,
static void gftfb_move_cursor(struct gftfb_softc *, int, int);
static int gftfb_do_cursor(struct gftfb_softc *, struct wsdisplay_cursor *);
+static void gftfb_set_video(struct gftfb_softc *, int);
+
struct wsdisplay_accessops gftfb_accessops = {
gftfb_ioctl,
gftfb_mmap,
@@ -683,6 +685,7 @@ gftfb_setup(struct gftfb_softc *sc)
sc->sc_hot_x = 0;
sc->sc_hot_y = 0;
sc->sc_enabled = 0;
+ sc->sc_video_on = 1;
/* set Bt458 read mask register to all planes */
gftfb_wait(sc);
@@ -824,6 +827,7 @@ gftfb_ioctl(void *v, void *vs, u_long cm
sc->sc_height, ms->scr_ri.ri_devcmap[
(ms->scr_defattr >> 16) & 0xff]);
vcons_redraw_screen(ms);
+ gftfb_set_video(sc, 1);
}
}
}
@@ -868,8 +872,14 @@ gftfb_ioctl(void *v, void *vs, u_long cm
return gftfb_do_cursor(sc, cursor);
}
- }
+ case WSDISPLAYIO_SVIDEO:
+ gftfb_set_video(sc, *(int *)data);
+ return 0;
+ case WSDISPLAYIO_GVIDEO:
+ return sc->sc_video_on ?
+ WSDISPLAYIO_VIDEO_ON : WSDISPLAYIO_VIDEO_OFF;
+ }
return EPASSTHROUGH;
}
@@ -1464,3 +1474,29 @@ gftfb_do_cursor(struct gftfb_softc *sc,
return 0;
}
+
+static void
+gftfb_set_video(struct gftfb_softc *sc, int on)
+{
+ struct sti_rom *rom = sc->sc_base.sc_rom;
+ bus_space_tag_t memt = rom->memt;
+ bus_space_handle_t memh = rom->regh[2];
+
+ if (sc->sc_video_on == on)
+ return;
+
+ sc->sc_video_on = on;
+
+ gftfb_wait(sc);
+ if (on) {
+ bus_space_write_stream_4(memt, memh, NGLE_REG_21,
+ bus_space_read_stream_4(memt, memh, NGLE_REG_21) | 0x0a000000);
+ bus_space_write_stream_4(memt, memh, NGLE_REG_27,
+ bus_space_read_stream_4(memt, memh, NGLE_REG_27) | 0x00800000);
+ } else {
+ bus_space_write_stream_4(memt, memh, NGLE_REG_21,
+ bus_space_read_stream_4(memt, memh, NGLE_REG_21) & ~0x0a000000);
+ bus_space_write_stream_4(memt, memh, NGLE_REG_27,
+ bus_space_read_stream_4(memt, memh, NGLE_REG_27) & ~0x00800000);
+ }
+}