Module Name: src Committed By: tsutsui Date: Thu Apr 15 14:43:19 UTC 2021
Modified Files: src/sys/arch/hp300/dev: diofb.c topcat.c Log Message: Fix two problems on old topcat(4) framebuffers found on HP332/340. - Fix panic on monochrome framebuffers. They don't have palette registers. The problem was reported from Anders Gustafsson and also Andrew Gillham back in 2013: https://mail-index.netbsd.org/port-hp300/2013/09/27/msg000086.html https://mail-index.netbsd.org/port-hp300/2013/09/28/msg000087.html - Fix incorrect framebuffer width of 98542/98544 framebuffers on HP332. Reported from Andrew Gillham (98542) as above and Chris Hanson (98543): https://mail-index.netbsd.org/port-hp300/2013/09/27/msg000083.html https://mail-index.netbsd.org/port-hp300/2020/05/01/msg000164.html Worth to pullup to netbsd-9. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/hp300/dev/diofb.c \ src/sys/arch/hp300/dev/topcat.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/hp300/dev/diofb.c diff -u src/sys/arch/hp300/dev/diofb.c:1.4 src/sys/arch/hp300/dev/diofb.c:1.5 --- src/sys/arch/hp300/dev/diofb.c:1.4 Mon Mar 24 19:42:58 2014 +++ src/sys/arch/hp300/dev/diofb.c Thu Apr 15 14:43:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: diofb.c,v 1.4 2014/03/24 19:42:58 christos Exp $ */ +/* $NetBSD: diofb.c,v 1.5 2021/04/15 14:43:19 tsutsui Exp $ */ /* $OpenBSD: diofb.c,v 1.18 2010/12/26 15:40:59 miod Exp $ */ /* @@ -146,6 +146,15 @@ diofb_fbinquire(struct diofb *fb, int sc if (fb->dheight > fb->fbheight) fb->dheight = fb->fbheight; + /* + * Some displays, such as the HP332 and HP340 internal video + * appear to return a display width of 1024 instead of 512. + */ + if (fbr->num_planes == 1 || fbr->num_planes == 4) { + if (fb->dwidth == 1024 && fb->dheight == 400) + fb->dwidth = 512; + } + fb->planes = fbr->num_planes; if (fb->planes > 8) fb->planes = 8; Index: src/sys/arch/hp300/dev/topcat.c diff -u src/sys/arch/hp300/dev/topcat.c:1.4 src/sys/arch/hp300/dev/topcat.c:1.5 --- src/sys/arch/hp300/dev/topcat.c:1.4 Fri Feb 18 19:15:43 2011 +++ src/sys/arch/hp300/dev/topcat.c Thu Apr 15 14:43:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: topcat.c,v 1.4 2011/02/18 19:15:43 tsutsui Exp $ */ +/* $NetBSD: topcat.c,v 1.5 2021/04/15 14:43:19 tsutsui Exp $ */ /* $OpenBSD: topcat.c,v 1.15 2006/08/11 18:33:13 miod Exp $ */ /* @@ -274,7 +274,10 @@ topcat_end_attach(struct topcat_softc *s case GID_TOPCAT: switch (sc->sc_fb->planes) { case 1: - fbname = "HP98544 topcat"; + if (sc->sc_fb->dheight == 400) + fbname = "HP98542 topcat"; + else + fbname = "HP98544 topcat"; break; case 4: if (sc->sc_fb->dheight == 400) @@ -413,8 +416,12 @@ topcat_ioctl(void *v, void *vs, u_long c *(u_int *)data = fb->ri.ri_stride; return 0; case WSDISPLAYIO_GETCMAP: + if (fb->planemask == 1) + return EPASSTHROUGH; return diofb_getcmap(fb, (struct wsdisplay_cmap *)data); case WSDISPLAYIO_PUTCMAP: + if (fb->planemask == 1) + return EPASSTHROUGH; return topcat_setcmap(fb, (struct wsdisplay_cmap *)data); case WSDISPLAYIO_GVIDEO: case WSDISPLAYIO_SVIDEO: @@ -429,6 +436,10 @@ topcat_setcolor(struct diofb *fb, u_int { volatile struct tcboxfb *tc = (struct tcboxfb *)fb->regkva; + /* No color map registers on monochrome framebuffers. */ + if (fb->planemask == 1) + return; + if (tc->regs.fbid != GID_TOPCAT) { tccm_waitbusy(tc); tc->plane_mask = 0xff;