Index: dev/fdt/simplefb.c =================================================================== RCS file: /home/netbsd/src/sys/dev/fdt/simplefb.c,v retrieving revision 1.8 diff -p -u -r1.8 simplefb.c --- dev/fdt/simplefb.c 23 Jul 2019 14:34:12 -0000 1.8 +++ dev/fdt/simplefb.c 17 Oct 2020 17:34:02 -0000 @@ -181,6 +181,10 @@ simplefb_attach_genfb(struct simplefb_so prop_dictionary_set_uint64(dict, "virtual_address", (uintptr_t)bus_space_vaddr(sc->sc_bst, sc->sc_bsh)); +#if defined(__ARMEB__) || defined(__AARCH64EB__) + prop_dictionary_set_bool(dict, "is_swapped", true); +#endif + genfb_init(&sc->sc_gen); if (sc->sc_gen.sc_width == 0 || sc->sc_gen.sc_fbsize == 0) { Index: dev/wsfb/genfb.c =================================================================== RCS file: /home/netbsd/src/sys/dev/wsfb/genfb.c,v retrieving revision 1.76 diff -p -u -r1.76 genfb.c --- dev/wsfb/genfb.c 18 Oct 2020 12:00:12 -0000 1.76 +++ dev/wsfb/genfb.c 18 Oct 2020 12:39:26 -0000 @@ -544,7 +539,7 @@ genfb_init_screen(void *cookie, struct v struct genfb_softc *sc = cookie; struct rasops_info *ri = &scr->scr_ri; int wantcols; - bool is_bgr; + bool is_bgr, is_swapped; ri->ri_depth = sc->sc_depth; ri->ri_width = sc->sc_width; @@ -571,23 +566,27 @@ genfb_init_screen(void *cookie, struct v case 32: case 24: ri->ri_flg |= RI_ENABLE_ALPHA; + ri->ri_rnum = 8; + ri->ri_gnum = 8; + ri->ri_bnum = 8; is_bgr = false; prop_dictionary_get_bool(device_properties(sc->sc_dev), "is_bgr", &is_bgr); + is_swapped = false; + prop_dictionary_get_bool(device_properties(sc->sc_dev), + "is_swapped", &is_swapped); if (is_bgr) { /* someone requested BGR */ - ri->ri_rnum = 8; - ri->ri_gnum = 8; - ri->ri_bnum = 8; ri->ri_rpos = 0; ri->ri_gpos = 8; ri->ri_bpos = 16; + } else if (ri->ri_depth == 32 && is_swapped) { + ri->ri_rpos = 8; + ri->ri_gpos = 16; + ri->ri_bpos = 24; } else { /* assume RGB */ - ri->ri_rnum = 8; - ri->ri_gnum = 8; - ri->ri_bnum = 8; ri->ri_rpos = 16; ri->ri_gpos = 8; ri->ri_bpos = 0; Index: arch/arm/fdt/arm_simplefb.c =================================================================== RCS file: /home/netbsd/src/sys/arch/arm/fdt/arm_simplefb.c,v retrieving revision 1.1 diff -p -u -r1.1 arm_simplefb.c --- arch/arm/fdt/arm_simplefb.c 10 Oct 2020 15:25:31 -0000 1.1 +++ arch/arm/fdt/arm_simplefb.c 17 Oct 2020 18:21:55 -0000 @@ -39,6 +39,7 @@ __KERNEL_RCSID(0, "$NetBSD: arm_simplefb #include #include #include +#include #include #include @@ -120,6 +121,16 @@ arm_simplefb_init_screen(void *cookie, s ri->ri_bits = sc->sc_bits; ri->ri_flg = RI_CENTER | RI_FULLCLEAR | RI_CLEAR; +#if BYTE_ORDER == BIG_ENDIAN + if (ri->ri_depth == 32) { + ri->ri_rnum = ri->ri_gnum = ri->ri_bnum = 8; + ri->ri_rpos = 8; + ri->ri_gpos = 16; + ri->ri_bpos = 24; + } + /* XXX 16bpp */ +#endif + scr->scr_flags |= VCONS_LOADFONT; scr->scr_flags |= VCONS_DONT_READ; Index: arch/arm/sunxi/sunxi_debe.c =================================================================== RCS file: /home/netbsd/src/sys/arch/arm/sunxi/sunxi_debe.c,v retrieving revision 1.9 diff -p -u -r1.9 sunxi_debe.c --- arch/arm/sunxi/sunxi_debe.c 1 Jun 2018 17:18:44 -0000 1.9 +++ arch/arm/sunxi/sunxi_debe.c 18 Oct 2020 11:17:51 -0000 @@ -613,7 +613,11 @@ sunxi_debe_set_videomode(device_t dev, c SUNXI_DEBE_ATTCTL1_LAY_FBFMT); val &= ~SUNXI_DEBE_ATTCTL1_LAY_BRSWAPEN; val &= ~SUNXI_DEBE_ATTCTL1_LAY_FBPS; -#if __ARMEB__ +#if 0 /* XXX __ARMEB__ */ +/* + * XXX this function is not called from anywhere. + * invert byte-order by genfb(4) instead. + */ val |= __SHIFTIN(SUNXI_DEBE_ATTCTL1_LAY_FBPS_32BPP_BGRA, SUNXI_DEBE_ATTCTL1_LAY_FBPS); #else Index: arch/arm/sunxi/sunxi_fb.c =================================================================== RCS file: /home/netbsd/src/sys/arch/arm/sunxi/sunxi_fb.c,v retrieving revision 1.3 diff -p -u -r1.3 sunxi_fb.c --- arch/arm/sunxi/sunxi_fb.c 30 Jan 2019 10:55:44 -0000 1.3 +++ arch/arm/sunxi/sunxi_fb.c 17 Oct 2020 18:37:41 -0000 @@ -34,6 +34,7 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_fb.c,v #include #include #include +#include #include @@ -90,12 +91,20 @@ sunxi_fb_attach(device_t parent, device_ aprint_naive("\n"); aprint_normal("\n"); -#ifdef WSDISPLAY_MULTICONS +#if defined(WSDISPLAY_MULTICONS) || BYTE_ORDER == BIG_ENDIAN prop_dictionary_t dict = device_properties(self); +#endif + +#ifdef WSDISPLAY_MULTICONS const bool is_console = true; prop_dictionary_set_bool(dict, "is_console", is_console); #endif +#if BYTE_ORDER == BIG_ENDIAN + const bool is_swapped = true; + prop_dictionary_set_bool(dict, "is_swapped", is_swapped); +#endif + const struct drmfb_attach_args da = { .da_dev = self, .da_fb_helper = sfa->sfa_fb_helper,