Module Name: src Committed By: jmcneill Date: Fri Apr 3 18:03:05 UTC 2015
Modified Files: src/sys/arch/arm/amlogic: amlogic_genfb.c amlogic_vpureg.h src/sys/arch/evbarm/amlogic: amlogic_machdep.c Log Message: Allow for choosing between 16 and 24bpp framebuffers. The default is now 16 instead of 24. Set 'fb.depth=16' or 'fb.depth=24' on kernel command-line to explicitly select a colour depth. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/amlogic/amlogic_genfb.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/amlogic/amlogic_vpureg.h cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/amlogic/amlogic_machdep.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/arm/amlogic/amlogic_genfb.c diff -u src/sys/arch/arm/amlogic/amlogic_genfb.c:1.4 src/sys/arch/arm/amlogic/amlogic_genfb.c:1.5 --- src/sys/arch/arm/amlogic/amlogic_genfb.c:1.4 Thu Mar 26 16:26:35 2015 +++ src/sys/arch/arm/amlogic/amlogic_genfb.c Fri Apr 3 18:03:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_genfb.c,v 1.4 2015/03/26 16:26:35 joerg Exp $ */ +/* $NetBSD: amlogic_genfb.c,v 1.5 2015/04/03 18:03:05 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_genfb.c,v 1.4 2015/03/26 16:26:35 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_genfb.c,v 1.5 2015/04/03 18:03:05 jmcneill Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -50,6 +50,8 @@ __KERNEL_RCSID(0, "$NetBSD: amlogic_genf #include <dev/wsfb/genfbvar.h> +#define AMLOGIC_GENFB_DEFAULT_DEPTH 16 + /* Map CEA-861-D video code (VIC) to framebuffer dimensions */ static const struct amlogic_genfb_vic2mode { u_int vic; @@ -268,12 +270,13 @@ amlogic_genfb_canvas_config(struct amlog prop_dictionary_t cfg = device_properties(sc->sc_gen.sc_dev); const paddr_t pa = sc->sc_dmamap->dm_segs[0].ds_addr; uint32_t datal, datah, addr; - u_int width, height; + u_int width, height, depth; prop_dictionary_get_uint32(cfg, "width", &width); prop_dictionary_get_uint32(cfg, "height", &height); + prop_dictionary_get_uint32(cfg, "depth", &depth); - const uint32_t w = (width * 3) >> 3; + const uint32_t w = (width * (depth/8)) >> 3; const uint32_t h = height; datal = CAV_READ(sc, DC_CAV_LUT_DATAL_REG); @@ -303,17 +306,56 @@ static void amlogic_genfb_osd_config(struct amlogic_genfb_softc *sc) { prop_dictionary_t cfg = device_properties(sc->sc_gen.sc_dev); - uint32_t w0, w1, w2, w3, w4; - u_int width, height; + uint32_t cs, tc, w0, w1, w2, w3, w4; + u_int width, height, depth; bool interlace_p; prop_dictionary_get_uint32(cfg, "width", &width); prop_dictionary_get_uint32(cfg, "height", &height); + prop_dictionary_get_uint32(cfg, "depth", &depth); prop_dictionary_get_bool(cfg, "interlace", &interlace_p); + cs = VPU_READ(sc, VIU_OSD2_CTRL_STAT_REG); + cs |= VIU_OSD_CTRL_STAT_ENABLE; + cs &= ~VIU_OSD_CTRL_STAT_GLOBAL_ALPHA; + cs |= __SHIFTIN(0xff, VIU_OSD_CTRL_STAT_GLOBAL_ALPHA); + cs |= VIU_OSD_CTRL_STAT_BLK0_ENABLE; + cs &= ~VIU_OSD_CTRL_STAT_BLK1_ENABLE; + cs &= ~VIU_OSD_CTRL_STAT_BLK2_ENABLE; + cs &= ~VIU_OSD_CTRL_STAT_BLK3_ENABLE; + VPU_WRITE(sc, VIU_OSD2_CTRL_STAT_REG, cs); + + tc = __SHIFTIN(0, VIU_OSD_TCOLOR_R) | + __SHIFTIN(0, VIU_OSD_TCOLOR_G) | + __SHIFTIN(0, VIU_OSD_TCOLOR_B) | + __SHIFTIN(255, VIU_OSD_TCOLOR_A); + VPU_WRITE(sc, VIU_OSD2_TCOLOR_AG0_REG, tc); + w0 = VPU_READ(sc, VIU_OSD2_BLK0_CFG_W0_REG); + w0 |= VIU_OSD_BLK_CFG_W0_RGB_EN; + w0 &= ~VIU_OSD_BLK_CFG_W0_TC_ALPHA_EN; w0 &= ~VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE; - w0 |= __SHIFTIN(7, VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE); + w0 &= ~VIU_OSD_BLK_CFG_W0_COLOR_MATRIX; + switch (depth) { + case 32: + w0 |= __SHIFTIN(VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_32BPP, + VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE); + w0 |= __SHIFTIN(VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_ARGB, + VIU_OSD_BLK_CFG_W0_COLOR_MATRIX); + break; + case 24: + w0 |= __SHIFTIN(VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_24BPP, + VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE); + w0 |= __SHIFTIN(VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_RGB, + VIU_OSD_BLK_CFG_W0_COLOR_MATRIX); + break; + case 16: + w0 |= __SHIFTIN(VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_16BPP, + VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE); + w0 |= __SHIFTIN(VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_RGB565, + VIU_OSD_BLK_CFG_W0_COLOR_MATRIX); + break; + } w0 |= VIU_OSD_BLK_CFG_W0_LITTLE_ENDIAN; w0 &= ~VIU_OSD_BLK_CFG_W0_RPT_Y; w0 &= ~VIU_OSD_BLK_CFG_W0_INTERP_CTRL; @@ -322,8 +364,6 @@ amlogic_genfb_osd_config(struct amlogic_ } else { w0 &= ~VIU_OSD_BLK_CFG_W0_INTERLACE_EN; } - w0 |= VIU_OSD_BLK_CFG_W0_RGB_EN; - w0 &= ~VIU_OSD_BLK_CFG_W0_COLOR_MATRIX; VPU_WRITE(sc, VIU_OSD2_BLK0_CFG_W0_REG, w0); w1 = __SHIFTIN(width - 1, VIU_OSD_BLK_CFG_W1_X_END) | @@ -456,7 +496,7 @@ amlogic_genfb_init(struct amlogic_genfb_ { prop_dictionary_t cfg = device_properties(sc->sc_gen.sc_dev); const struct sysctlnode *node, *devnode; - u_int width = 0, height = 0, flags, i, scale = 100; + u_int width = 0, height = 0, depth, flags, i, scale = 100; int error; /* @@ -479,7 +519,22 @@ amlogic_genfb_init(struct amlogic_genfb_ return; } - const uint32_t fbsize = width * height * 3; + depth = AMLOGIC_GENFB_DEFAULT_DEPTH; + prop_dictionary_get_uint32(cfg, "depth", &depth); + switch (depth) { + case 16: + case 24: + break; + default: + aprint_error_dev(sc->sc_gen.sc_dev, + "unsupported depth %d, using %d\n", depth, + AMLOGIC_GENFB_DEFAULT_DEPTH); + depth = AMLOGIC_GENFB_DEFAULT_DEPTH; + break; + } + prop_dictionary_set_uint8(cfg, "depth", depth); + + const uint32_t fbsize = width * height * (depth / 8); sc->sc_dmasize = (fbsize + 3) & ~3; error = amlogic_genfb_alloc_videomem(sc); @@ -502,8 +557,7 @@ amlogic_genfb_init(struct amlogic_genfb_ prop_dictionary_set_uint32(cfg, "height", height); prop_dictionary_set_bool(cfg, "dblscan", !!(flags & DBLSCAN)); prop_dictionary_set_bool(cfg, "interlace", !!(flags & INTERLACE)); - prop_dictionary_set_uint8(cfg, "depth", 24); - prop_dictionary_set_uint16(cfg, "linebytes", width * 3); + prop_dictionary_set_uint16(cfg, "linebytes", width * (depth / 8)); prop_dictionary_set_uint32(cfg, "address", 0); prop_dictionary_set_uint32(cfg, "virtual_address", (uintptr_t)sc->sc_dmap); Index: src/sys/arch/arm/amlogic/amlogic_vpureg.h diff -u src/sys/arch/arm/amlogic/amlogic_vpureg.h:1.2 src/sys/arch/arm/amlogic/amlogic_vpureg.h:1.3 --- src/sys/arch/arm/amlogic/amlogic_vpureg.h:1.2 Sun Mar 22 13:53:33 2015 +++ src/sys/arch/arm/amlogic/amlogic_vpureg.h Fri Apr 3 18:03:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_vpureg.h,v 1.2 2015/03/22 13:53:33 jmcneill Exp $ */ +/* $NetBSD: amlogic_vpureg.h,v 1.3 2015/04/03 18:03:05 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -32,6 +32,10 @@ #define VPU_REG(n) ((n) << 2) #define VIU_OSD2_CTRL_STAT_REG VPU_REG(0x1a30) +#define VIU_OSD2_TCOLOR_AG0_REG VPU_REG(0x1a37) +#define VIU_OSD2_TCOLOR_AG1_REG VPU_REG(0x1a38) +#define VIU_OSD2_TCOLOR_AG2_REG VPU_REG(0x1a39) +#define VIU_OSD2_TCOLOR_AG3_REG VPU_REG(0x1a3a) #define VIU_OSD2_BLK0_CFG_W0_REG VPU_REG(0x1a3b) #define VIU_OSD2_BLK0_CFG_W1_REG VPU_REG(0x1a3c) #define VIU_OSD2_BLK0_CFG_W2_REG VPU_REG(0x1a3d) @@ -51,19 +55,38 @@ #define VPP_OSD_SCO_V_REG VPU_REG(0x1dcb) #define VIU_OSD_CTRL_STAT_ENABLE __BIT(21) +#define VIU_OSD_CTRL_STAT_GLOBAL_ALPHA __BITS(20,12) #define VIU_OSD_CTRL_STAT_BLK3_ENABLE __BIT(3) #define VIU_OSD_CTRL_STAT_BLK2_ENABLE __BIT(2) #define VIU_OSD_CTRL_STAT_BLK1_ENABLE __BIT(1) #define VIU_OSD_CTRL_STAT_BLK0_ENABLE __BIT(0) +#define VIU_OSD_TCOLOR_R __BITS(31,24) +#define VIU_OSD_TCOLOR_G __BITS(23,16) +#define VIU_OSD_TCOLOR_B __BITS(15,8) +#define VIU_OSD_TCOLOR_A __BITS(7,0) + #define VIU_OSD_BLK_CFG_W0_TBL_ADDR __BITS(23,16) #define VIU_OSD_BLK_CFG_W0_LITTLE_ENDIAN __BIT(15) #define VIU_OSD_BLK_CFG_W0_RPT_Y __BIT(14) #define VIU_OSD_BLK_CFG_W0_INTERP_CTRL __BITS(13,12) #define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE __BITS(11,8) +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_PAL4 0 +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_PAL16 1 +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_PAL256 2 +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_YUV 3 +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_16BPP 4 +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_32BPP 5 +#define VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE_24BPP 7 #define VIU_OSD_BLK_CFG_W0_RGB_EN __BIT(7) #define VIU_OSD_BLK_CFG_W0_TC_ALPHA_EN __BIT(6) #define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX __BITS(5,2) +#define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_RGB 0 +#define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_RGBA 0 +#define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_ARGB 1 +#define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_ABGR 2 +#define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_BGRA 3 +#define VIU_OSD_BLK_CFG_W0_COLOR_MATRIX_RGB565 4 #define VIU_OSD_BLK_CFG_W0_INTERLACE_EN __BIT(1) #define VIU_OSD_BLK_CFG_W0_INTERLACE_SEL_ODD __BIT(0) @@ -79,7 +102,12 @@ #define VIU_OSD_BLK_CFG_W4_V_END __BITS(27,16) #define VIU_OSD_BLK_CFG_W4_V_START __BITS(11,0) +#define VPP_MISC_OSD2_PREBLEND __BIT(17) +#define VPP_MISC_OSD1_PREBLEND __BIT(16) +#define VPP_MISC_OSD2_POSTBLEND __BIT(13) +#define VPP_MISC_OSD1_POSTBLEND __BIT(12) #define VPP_MISC_POSTBLEND __BIT(7) +#define VPP_MISC_PREBLEND __BIT(6) #define VPP_OSD_VSC_PHASE_STEP_FORMAT __BITS(27,0) Index: src/sys/arch/evbarm/amlogic/amlogic_machdep.c diff -u src/sys/arch/evbarm/amlogic/amlogic_machdep.c:1.19 src/sys/arch/evbarm/amlogic/amlogic_machdep.c:1.20 --- src/sys/arch/evbarm/amlogic/amlogic_machdep.c:1.19 Sun Mar 29 22:49:44 2015 +++ src/sys/arch/evbarm/amlogic/amlogic_machdep.c Fri Apr 3 18:03:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_machdep.c,v 1.19 2015/03/29 22:49:44 jmcneill Exp $ */ +/* $NetBSD: amlogic_machdep.c,v 1.20 2015/04/03 18:03:05 jmcneill Exp $ */ /* * Machine dependent functions for kernel setup for TI OSK5912 board. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_machdep.c,v 1.19 2015/03/29 22:49:44 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_machdep.c,v 1.20 2015/04/03 18:03:05 jmcneill Exp $"); #include "opt_machdep.h" #include "opt_ddb.h" @@ -545,7 +545,7 @@ amlogic_device_register(device_t self, v #if NGENFB > 0 if (device_is_a(self, "genfb")) { char *ptr; - int scale; + int scale, depth; amlogic_genfb_set_console_dev(self); #ifdef DDB db_trap_callback = amlogic_genfb_ddb_trap_callback; @@ -563,6 +563,10 @@ amlogic_device_register(device_t self, v BOOTOPT_TYPE_INT, &scale) && scale > 0) { prop_dictionary_set_uint32(dict, "scale", scale); } + if (get_bootconf_option(boot_args, "fb.depth", + BOOTOPT_TYPE_INT, &depth)) { + prop_dictionary_set_uint32(dict, "depth", depth); + } } #endif }