NetBSD Problem Report #10741

Received: (qmail 10343 invoked from network); 3 Aug 2000 13:07:30 -0000
Message-Id: <200008031307.GAA00321@nbwww.isc.org>
Date: Thu, 3 Aug 2000 06:07:30 -0700 (PDT)
From: twetzel@gwdg.de
Reply-To: twetzel@gwdg.de
To: gnats-bugs@gnats.netbsd.org
Subject: patch: provide basic support for internal 12bit color display
X-Send-Pr-Version: www-1.0

>Number:         10741
>Category:       port-next68k
>Synopsis:       patch: provide basic support for internal 12bit color display
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    port-next68k-maintainer
>State:          closed
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Thu Aug 03 13:09:00 +0000 2000
>Closed-Date:    Fri Sep 29 06:37:26 +0000 2000
>Last-Modified:  Fri Sep 29 06:37:26 +0000 2000
>Originator:     Timm Wetzel
>Release:        NetBSD-current around 1.4Z
>Organization:
>Environment:
N/A (NeXTstation turbocolor, 1.4Z ramdisk kernel with xe disabled and 
`options DISABLE_NEXT_BMAP_CHIP')

>Description:
This patch modifies the nextdisplay code to work for 12bit color 
systems. The diff is against 1.4Z.
I could only test it on a turbocolor station (the non-turbo color slabs 
could be different).
You need `options RCONS_16BPP' in your kernel config to make this work.

Some changes in the MI rcons code were necessary. Is the 16bpp rcons 
code used at all by other ports?

>How-To-Repeat:
Boot NeXTstation color or turbocolor.

>Fix:
Index: arch/next68k/dev/nextcons.c
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/arch/next68k/dev/nextcons.c,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 nextcons.c
--- nextcons.c	1999/08/09 12:08:05	1.1.1.3
+++ nextcons.c	2000/07/28 00:26:44
@@ -67,7 +67,9 @@
 {

 	if ((rom_machine_type == NeXT_WARP9)
-	    || (rom_machine_type == NeXT_X15))
+	    || (rom_machine_type == NeXT_X15)
+	    || (rom_machine_type == NeXT_WARP9C)
+	    || (rom_machine_type == NeXT_TURBO_COLOR))
 		cp->cn_pri = CN_INTERNAL;
 	else 
 		cp->cn_pri = CN_DEAD;
Index: arch/next68k/dev/nextdisplay.c
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/arch/next68k/dev/nextdisplay.c,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 nextdisplay.c
--- nextdisplay.c	2000/01/25 19:57:00	1.1.1.3
+++ nextdisplay.c	2000/07/30 22:46:35
@@ -141,7 +141,9 @@
 	void *aux;
 {
 	if ((rom_machine_type == NeXT_WARP9)
-	    || (rom_machine_type == NeXT_X15))
+	    || (rom_machine_type == NeXT_X15) 
+	    || (rom_machine_type == NeXT_WARP9C) 
+	    || (rom_machine_type == NeXT_TURBO_COLOR))
 		return (1);
 	else 
 		return (0);
@@ -168,14 +170,14 @@
 	dc->dc_paddr = color ? COLORP(addr) : MONOP(addr);
 	dc->dc_size = color ? NEXT_P_C16_VIDEOSIZE : NEXT_P_VIDEOSIZE;

-	dc->dc_wid = 1152; /* XXX color */
-	dc->dc_ht = 832; /* XXX color */
-	dc->dc_depth = color ? 8 : 2; 
+	dc->dc_wid = color ? 1120 : 1152; /* XXX color/mono turbo */
+	dc->dc_ht = color ? 832 : 864; /* XXX color */
+	dc->dc_depth = color ? 16 : 2; 
 	dc->dc_rowbytes = dc->dc_wid * dc->dc_depth / 8;

 	dc->dc_videobase = dc->dc_vaddr;

-#if 0
+#if 1
 	printf("intiobase at: %08x\n", intiobase);
 	printf("intiolimit at: %08x\n", intiolimit);
 	printf("videobase at: %08x\n", color ? colorbase : monobase);
@@ -194,12 +196,13 @@

 	/* clear the screen */
 	for (i = 0; i < dc->dc_ht * dc->dc_rowbytes; i += sizeof(u_int32_t))
-		*(u_int32_t *)(dc->dc_videobase + i) = 0xffffffff;
+		*(u_int32_t *)(dc->dc_videobase + i) = 
+			(color ? 0x0 : 0xffffffff);

 	rap = &dc->dc_raster;
 	rap->width = dc->dc_wid;
 	rap->height = dc->dc_ht;
-	rap->depth = color ? 8 : 2;
+	rap->depth = color ? 16 : 2;
 	rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t);
 	rap->pixels = (u_int32_t *)dc->dc_videobase;

@@ -234,7 +237,8 @@

 	sc = (struct nextdisplay_softc *)self;

-	if (rom_machine_type == NeXT_WARP9C) {
+	if ((rom_machine_type == NeXT_WARP9C) 
+		|| (rom_machine_type == NeXT_TURBO_COLOR)) {
 		iscolor = 1;
 		addr = (paddr_t)colorbase;
 	} else {
@@ -261,7 +265,7 @@
 	waa.scrdata = iscolor ? &nextdisplay_screenlist_color : &nextdisplay_screenlist_mono;
 	waa.accessops = &nextdisplay_accessops;
 	waa.accesscookie = sc;
-#if 0
+#if 1
 	printf("nextdisplay: access cookie is %p\n", sc);
 #endif
 	config_found(self, &waa, wsemuldisplaydevprint);
@@ -338,7 +342,7 @@
 	*curxp = 0;
 	*curyp = 0;
 	rcons_alloc_attr(&sc->sc_dc->dc_rcons, 0, 0, 
-			 WSATTR_REVERSE, &defattr);
+			 (strcmp(type->name, "color") == 0) ? 0 : WSATTR_REVERSE, &defattr);
 	*defattrp = defattr;
 	sc->nscreens++;
 #if 0
@@ -388,7 +392,8 @@
 	long defattr;
 	int iscolor;

-	if (rom_machine_type == NeXT_WARP9C) {
+	if ((rom_machine_type == NeXT_WARP9C) 
+		|| (rom_machine_type == NeXT_TURBO_COLOR)) {
 		iscolor = 1;
 		nextdisplay_consaddr = (paddr_t)colorbase;
 	} else {
@@ -399,7 +404,7 @@
 	/* set up the display */
 	nextdisplay_init(&nextdisplay_console_dc, iscolor);

-	rcons_alloc_attr(&dc->dc_rcons, 0, 0, WSATTR_REVERSE, &defattr);
+	rcons_alloc_attr(&dc->dc_rcons, 0, 0, iscolor ? 0 /* XXX */: WSATTR_REVERSE, &defattr);

 	wsdisplay_cnattach(iscolor ? &nextdisplay_color : &nextdisplay_mono,
 			   &dc->dc_rcons, 0, 0, defattr);
Index: arch/next68k/include/bus_space.h
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/arch/next68k/include/bus_space.h,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 bus_space.h
--- bus_space.h	1999/08/09 12:08:11	1.1.1.3
+++ bus_space.h	2000/07/30 21:37:27
@@ -86,6 +86,7 @@
  * Value for the next68k mono video bus space tag, not to be used directly by MI code.
  */
 #define NEXT68K_MONO_VIDEO_BUS_SPACE	monobase
+#define NEXT68K_COLOR_VIDEO_BUS_SPACE	colorbase

 /*
  * Mapping and unmapping operations.
@@ -95,7 +96,8 @@
      ((*(hp)=(bus_space_handle_t)((t)+((a)-INTIOBASE))),0) :            \
      ((((a)>=MONOBASE)&&((a)+(s)<MONOTOP)) ?                          \
       ((*(hp)=(bus_space_handle_t)((t)+((a)-MONOBASE))),0) :           \
-      (-1)))
+      ((((a)>=COLORBASE)&&((a)+(s)<COLORTOP)) ?                         \
+       ((*(hp)=(bus_space_handle_t)((t)+((a)-COLORBASE))),0) : (-1))))

 #define	bus_space_unmap(t, h, s)

Index: arch/next68k/include/cpu.h
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/arch/next68k/include/cpu.h,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 cpu.h
--- cpu.h	2000/06/10 09:57:24	1.1.1.5
+++ cpu.h	2000/07/30 21:50:19
@@ -204,7 +204,7 @@
 #endif /* _KERNEL */

 #define NEXT_RAMBASE  (0x4000000) /* really depends on slot, but... */
-#define NEXT_BANKSIZE (0x1000000) /* Size of a memory bank in physical address */
+#define NEXT_BANKSIZE (0x1000000) /* Size of a memory bank in physical address */	/* XXX turbo chipset? */

 #if 0
 /* @@@ this needs to be fixed to work on 030's */
@@ -299,7 +299,11 @@
 #define NEXT_P_MEMSIZE		0x04000000
 #define NEXT_P_VIDEOMEM		(NEXT_SLOT_ID+0x0b000000)
 #define NEXT_P_VIDEOSIZE	0x0003a800
+/* Huh? */
+#if 0
 #define NEXT_P_C16_VIDEOMEM	(NEXT_SLOT_ID+0x06000000)	/* COLOR_FB */
+#endif
+#define NEXT_P_C16_VIDEOMEM	(0x2c000000)			/* COLOR_FB */
 #define NEXT_P_C16_VIDEOSIZE	0x001D4000		/* COLOR_FB */
 #define NEXT_P_WF4VIDEO		(NEXT_SLOT_ID+0x0c000000)	/* w A+B-AB function */
 #define NEXT_P_WF3VIDEO		(NEXT_SLOT_ID+0x0d000000)	/* w (1-A)B function */
@@ -390,8 +394,8 @@
 #define	INTIOTOP	(0x02120000)
 #define MONOBASE        (0x0b000000)
 #define MONOTOP         (0x0b03a800)
-#define COLORBASE	(0x06000000)
-#define COLORTOP	(0x061D4000)
+#define COLORBASE	(0x2c000000)
+#define COLORTOP	(0x2c1D4000)

 #define NEXT_INTR_BITS \
 "\20\40NMI\37PFAIL\36TIMER\35ENETX_DMA\34ENETR_DMA\33SCSI_DMA\32DISK_DMA\31PRINTER_DMA\30SOUND_OUT_DMA\27SOUND_IN_DMA\26SCC_DMA\25DSP_DMA\24M2R_DMA\23R2M_DMA\22SCC\21REMOTE\20BUS\17DSP_4\16DISK|C16_VIDEO\15SCSI\14PRINTER\13ENETX\12ENETR\11SOUND_OVRUN\10PHONE\07DSP_3\06VIDEO\05MONITOR\04KYBD_MOUSE\03POWER\02SOFTINT1\01SOFTINT0"
Index: dev/rcons/raster.h
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/dev/rcons/raster.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 raster.h
--- raster.h	1999/02/03 23:12:04	1.1.1.1
+++ raster.h	2000/07/31 19:16:39
@@ -159,12 +159,20 @@
 #define RAS_OR			0xe	/* src | dst */
 #define RAS_SET			0xf	/* 1 */

+#ifndef RCONS_16BPP
 #define RAS_COLOR(color) ( ( (color) & 0xff ) << 4 )
+#else
+#define RAS_COLOR(color) ( ( (color) & 0xffff ) << 4 )
+#endif

 /* Get the op from a rop. */
 #define RAS_GETOP(op) ( (op) & 0xf )
 /* Get the color from a rop. */
+#ifndef RCONS_16BPP
 #define RAS_GETCOLOR(op) ( ( (op) >> 4 ) & 0xff )
+#else
+#define RAS_GETCOLOR(op) ( ( (op) >> 4 ) & 0xffff )
+#endif
 /* Get the longword address of a pixel. */
 #define RAS_ADDR( r, x, y ) \
     ( (r)->pixels + (y) * (r)->linelongs + (x) * (r)->depth / 32 )
Index: dev/rcons/raster_op.c
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/dev/rcons/raster_op.c,v
retrieving revision 1.1.1.4
diff -u -r1.1.1.4 raster_op.c
--- raster_op.c	2000/06/08 22:45:34	1.1.1.4
+++ raster_op.c	2000/07/31 23:37:20
@@ -72,8 +72,8 @@

 #include <sys/types.h>
 #ifdef _KERNEL
-#include <dev/rcons/raster.h>
 #include "opt_rcons.h"
+#include <dev/rcons/raster.h>
 #else
 #include "raster.h"
 #endif
@@ -924,7 +924,7 @@

 	    color = RAS_GETCOLOR( rop );
 	    if ( color == 0 )
-		color = 255;
+		color = 0xffff;

 	    /* Make 32 bits of color so we can do the ROP without shifting. */
 	    color |= ( color << 16 );
@@ -1538,7 +1538,7 @@

 	color = RAS_GETCOLOR( rop );
 	if ( color == 0 )
-		color = 255; /* XXX */
+		color = 0xffff; /* XXX */

 	/* Make 32 bits of color so we can do the ROP without shifting. */
 	color |= ( color << 16 );


>Release-Note:
>Audit-Trail:

From: Timm Wetzel  <twetzel@gwdg.de>
To: gnats-bugs@netbsd.org
Cc:  
Subject: port-next68k/10741 update
Date: Mon, 7 Aug 2000 11:48:03 +0200 (MET DST)

 Greg Oster reported that the non-turbo color slabs need a framebuffer
 width of 1152 to work correctly.

 Consequently, the code in nextdisplay.c:nextdisplay_init() could look like
 this:

         if ((rom_machine_type == NeXT_WARP9)
             || (rom_machine_type == NeXT_WARP9C)
             || (rom_machine_type == NeXT_X15))
 {
         dc->dc_wid = 1152;
         dc->dc_ht = 864;
 }
 else
 {
 	/* turbo color (and turbo mono?)	*/
         dc->dc_wid = 1120;
         dc->dc_ht = 832;
 }

 While we're at it, we could make the machine type check in both
 nextdisplay.c:nextdisplay_match() and nextcons.c:nextcnprobe() also check
 for mono turbo:
         if ((rom_machine_type == NeXT_WARP9)
 -           || (rom_machine_type == NeXT_X15))
 +           || (rom_machine_type == NeXT_X15)
 +           || (rom_machine_type == NeXT_WARP9C)
 +           || (rom_machine_type == NeXT_TURBO_MONO)
 +           || (rom_machine_type == NeXT_TURBO_COLOR))

 (With `#define NeXT_TURBO_MONO 4' slapped into next68k/nextrom.h.)

 Note that the framebuffer dimensions for turbo mono are more or less a 
 guess, but I'm quite confident about the hardware id: The mainboard
 schematics which appeared some time ago seem to confirm this.

State-Changed-From-To: open->closed  
State-Changed-By: deberg 
State-Changed-When: Thu Sep 28 23:37:08 PDT 2000 
State-Changed-Why:  
applied, thanks for the patch! 
>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.