Module Name: src Committed By: jmcneill Date: Sat Jan 20 00:24:58 UTC 2024
Modified Files: src/sys/dev/wsfb: genfb.c Log Message: wsfb: add support for optional "devcmap" property A hardware driver can supply a pointer to a 16x 32-bit array to override the default rasops device colour map in the "devcmap" property. To generate a diff of this commit: cvs rdiff -u -r1.90 -r1.91 src/sys/dev/wsfb/genfb.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/dev/wsfb/genfb.c diff -u src/sys/dev/wsfb/genfb.c:1.90 src/sys/dev/wsfb/genfb.c:1.91 --- src/sys/dev/wsfb/genfb.c:1.90 Mon Aug 1 23:30:10 2022 +++ src/sys/dev/wsfb/genfb.c Sat Jan 20 00:24:58 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: genfb.c,v 1.90 2022/08/01 23:30:10 riastradh Exp $ */ +/* $NetBSD: genfb.c,v 1.91 2024/01/20 00:24:58 jmcneill Exp $ */ /*- * Copyright (c) 2007 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.90 2022/08/01 23:30:10 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.91 2024/01/20 00:24:58 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -85,6 +85,7 @@ struct genfb_private { struct genfb_parameter_callback *sc_backlight; struct genfb_parameter_callback *sc_brightness; struct genfb_mode_callback *sc_modecb; + uint32_t *sc_devcmap; int sc_backlight_level, sc_backlight_on; void *sc_shadowfb; bool sc_enable_shadowfb; @@ -167,7 +168,7 @@ genfb_init(struct genfb_softc *sc) { struct genfb_private *scp; prop_dictionary_t dict; - uint64_t cmap_cb, pmf_cb, mode_cb, bl_cb, br_cb, fbaddr; + uint64_t cmap_cb, pmf_cb, mode_cb, bl_cb, br_cb, devcmap, fbaddr; uint64_t fboffset; bool console; @@ -225,6 +226,13 @@ genfb_init(struct genfb_softc *sc) sc->sc_fbsize = sc->sc_height * sc->sc_stride; + /* optional device colour map */ + scp->sc_devcmap = NULL; + if (prop_dictionary_get_uint64(dict, "devcmap", &devcmap)) { + if (devcmap != 0) + scp->sc_devcmap = (uint32_t *)(uintptr_t)devcmap; + } + /* optional colour map callback */ scp->sc_cmcb = NULL; if (prop_dictionary_get_uint64(dict, "cmap_callback", &cmap_cb)) { @@ -721,6 +729,10 @@ genfb_init_screen(void *cookie, struct v rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight, sc->sc_width / ri->ri_font->fontwidth); + if (scp->sc_devcmap != NULL) { + memcpy(ri->ri_devcmap, scp->sc_devcmap, sizeof(ri->ri_devcmap)); + } + ri->ri_hw = scr; #if GENFB_GLYPHCACHE > 0 scp->sc_putchar = ri->ri_ops.putchar;