Resent-Date: Mon, 1 Feb 1999 10:07:36 +0100 (MET)
Date: Mon, 1 Feb 1999 10:09:35 +0100 (CET)
From: "Christian T. Steigies" <cts@ap031.experimentalphysik.uni-kiel.de>
Reply-To: "Christian T. Steigies" <steigies@physik.uni-kiel.de>
To: Ken Tyler <kent@werple.net.au>
cc: linux-apus@sunsite.auc.dk, linux-m68k <linux-m68k@lists.linux-m68k.org>
Subject: Patch for 16 bit on CV64-3D on Zorro2
In-Reply-To: <Pine.AMI.3.96.990130074819.140348456E-100000@werple.net.au>
Resent-From: linux-m68k@phil.uni-sb.de

Eh voila, 16 bit modes with CV3D on Zorro2 :-)
This one was easy, the board is allready initialized, there is not much
address space available, so just use the same address we allways use.
16 bit modes are working with the console, cant test with X, need to upgrade
xfree for that. But it looks ok so far on a 1024x768-16 screen (using the
cfb8 driver), to top half of the screen is used and I see the picture twice.
Might look ok with the cbf16 driver...
Booting in 16 bit takes its time on Zorro2, I do not really recommend this.
It might be usefull when we can switch the video mode, the function
Select_Zorro2_FrameBuffer() will probably be needed for this.

Ciao,
Christian.

--- linux-2.2.0pre7/drivers/video/virgefb.c_ken	Fri Jan 29 22:57:38 1999
+++ linux-2.2.0pre7/drivers/video/virgefb.c	Sat Jan 30 23:52:30 1999
@@ -89,6 +89,18 @@
 #define rl_3d(reg) \
                 (*((unsigned long volatile *)(CyberRegs + reg)))
 
+#define Select_Zorro2_FrameBuffer(flag) \
+	do { \
+		*((unsigned char volatile *)((Cyber_vcode_switch_base) + 0x08)) = \
+		((flag * 0x40) & 0xffff); asm volatile ("nop"); \
+	} while (0)
+/*
+ *	may be needed when we initialize the board?
+ *	8bit: flag = 2, 16 bit: flag = 1, 24/32bit: flag = 0 
+ *	_when_ the board is initialized, depth doesnt matter, we allways write
+ *	to the same address, aperture seems not to matter on Z2.
+ */
+
 struct virgefb_par {
    int xres;
    int yres;
@@ -429,13 +441,17 @@
 {
 	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
 	strcpy(fix->id, virgefb_name);
-	switch (par->bpp) {
-		case 8:
-			fix->smem_start = (char*) (CyberMem_phys + CYBMEM_OFFSET_8);
-			break;
-		case 16:
-			fix->smem_start = (char*) (CyberMem_phys + CYBMEM_OFFSET_16);
-			break;
+	if (cv3d_on_zorro2) {
+		fix->smem_start = (char*) CyberMem_phys;
+	} else {
+		switch (par->bpp) {
+			case 8:
+				fix->smem_start = (char*) (CyberMem_phys + CYBMEM_OFFSET_8);
+				break;
+			case 16:
+				fix->smem_start = (char*) (CyberMem_phys + CYBMEM_OFFSET_16);
+				break;
+		}
 	}
 	fix->smem_len = CyberSize;
 	fix->mmio_start = (char*) CyberRegs_phys;
@@ -932,13 +948,17 @@
 	virgefb_get_fix(&fix, con, info);
 	if (con == -1)
 		con = 0;
-        switch (display->var.bits_per_pixel) {
-		case 8:
-			display->screen_base = (char*) (CyberMem + CYBMEM_OFFSET_8);
-			break;
-		case 16:
-			display->screen_base = (char*) (CyberMem + CYBMEM_OFFSET_16);
-			break;
+	if(cv3d_on_zorro2) {
+		display->screen_base = (char*) CyberMem;
+	} else {
+	        switch (display->var.bits_per_pixel) {
+			case 8:
+				display->screen_base = (char*) (CyberMem + CYBMEM_OFFSET_8);
+				break;
+			case 16:
+				display->screen_base = (char*) (CyberMem + CYBMEM_OFFSET_16);
+				break;
+		}
 	}
 	display->visual = fix.visual;
 	display->type = fix.type;

