linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alan Cox <alan@lxorguk.ukuu.org.uk>
To: linux-kernel@vger.kernel.org, torvalds@osdl.org
Subject: PATCH: tdfx framebuffer updates
Date: Sun, 27 Jul 2003 21:17:07 +0100	[thread overview]
Message-ID: <200307272017.h6RKH7WU029737@hraefn.swansea.linux.org.uk> (raw)

((Richard Drummond)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.6.0-test2/drivers/video/fbmem.c linux-2.6.0-test2-ac1/drivers/video/fbmem.c
--- linux-2.6.0-test2/drivers/video/fbmem.c	2003-07-10 21:03:32.000000000 +0100
+++ linux-2.6.0-test2-ac1/drivers/video/fbmem.c	2003-07-23 15:45:30.000000000 +0100
@@ -214,6 +214,9 @@
 #ifdef CONFIG_FB_RIVA
 	{ "rivafb", rivafb_init, rivafb_setup },
 #endif
+#ifdef CONFIG_FB_3DFX
+	{ "tdfxfb", tdfxfb_init, tdfxfb_setup },
+#endif
 #ifdef CONFIG_FB_RADEON
 	{ "radeonfb", radeonfb_init, radeonfb_setup },
 #endif
@@ -294,9 +297,6 @@
 	 * Chipset specific drivers that don't use resource management (yet)
 	 */
 
-#ifdef CONFIG_FB_3DFX
-	{ "tdfxfb", tdfxfb_init, tdfxfb_setup },
-#endif
 #ifdef CONFIG_FB_SGIVW
 	{ "sgivwfb", sgivwfb_init, sgivwfb_setup },
 #endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.6.0-test2/drivers/video/tdfxfb.c linux-2.6.0-test2-ac1/drivers/video/tdfxfb.c
--- linux-2.6.0-test2/drivers/video/tdfxfb.c	2003-07-10 21:06:48.000000000 +0100
+++ linux-2.6.0-test2-ac1/drivers/video/tdfxfb.c	2003-07-23 15:45:30.000000000 +0100
@@ -1,3 +1,4 @@
+
 /*
  *
  * tdfxfb.c
@@ -177,7 +178,7 @@
 	.fb_pan_display	= tdfxfb_pan_display,
 	.fb_fillrect	= tdfxfb_fillrect,
 	.fb_copyarea	= tdfxfb_copyarea,
-	.fb_imageblit	= cfb_imageblit,
+	.fb_imageblit	= tdfxfb_imageblit,
 	.fb_sync	= banshee_wait_idle,
 	.fb_cursor	= soft_cursor,
 };
@@ -316,7 +317,9 @@
 
 static inline void banshee_make_room(struct tdfx_par *par, int size)
 {
-	while((tdfx_inl(par, STATUS) & 0x1f) < size);
+	/* Note: The Voodoo3's onboard FIFO has 32 slots. This loop
+	 * won't quit if you ask for more. */
+	while((tdfx_inl(par, STATUS) & 0x1f) < size-1);
 }
  
 static int banshee_wait_idle(struct fb_info *info)
@@ -746,6 +749,7 @@
 #if defined(__BIG_ENDIAN)
 	switch (info->var.bits_per_pixel) {
 		case 8:
+		case 24:
 			reg.miscinit0 &= ~(1 << 30);
 			reg.miscinit0 &= ~(1 << 31);
 			break;
@@ -753,7 +757,6 @@
 			reg.miscinit0 |= (1 << 30);
 			reg.miscinit0 |= (1 << 31);
 			break;
-		case 24:
 		case 32:
 			reg.miscinit0 |= (1 << 30);
 			reg.miscinit0 &= ~(1 << 31);
@@ -771,6 +774,9 @@
 	return 0;	
 }
 
+/* A handy macro shamelessly pinched from matroxfb */
+#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
+
 static int tdfxfb_setcolreg(unsigned regno, unsigned red, unsigned green,  
 			    unsigned blue,unsigned transp,struct fb_info *info) 
 {
@@ -788,13 +794,10 @@
 			break;
 		/* Truecolor has no hardware color palettes. */
 		case FB_VISUAL_TRUECOLOR:
-			rgbcol = (red << info->var.red.offset) |
-				 (green << info->var.green.offset) |
-				 (blue << info->var.blue.offset) |
-				 (transp << info->var.transp.offset);
-			if (info->var.bits_per_pixel <= 16)
-				((u16*)(info->pseudo_palette))[regno] = rgbcol;
-			else
+			rgbcol = (CNVT_TOHW( red, info->var.red.length) << info->var.red.offset) |
+				 (CNVT_TOHW( green, info->var.green.length) << info->var.green.offset) |
+				 (CNVT_TOHW( blue, info->var.blue.length) << info->var.blue.offset) |
+				 (CNVT_TOHW( transp, info->var.transp.length) << info->var.transp.offset);
 				((u32*)(info->pseudo_palette))[regno] = rgbcol;
 			break;
 		default:
@@ -934,6 +937,7 @@
 {
 	struct tdfx_par *par = (struct tdfx_par *) info->par;
 	int size = image->height * ((image->width * image->depth + 7)>>3);
+	int fifo_free;
 	int i, stride = info->fix.line_length;
 	u32 bpp = info->var.bits_per_pixel;
 	u32 dstfmt = stride | ((bpp+((bpp==8) ? 0 : 8)) << 13); 
@@ -946,10 +950,22 @@
 		cfb_imageblit(info, image);
 		return;
 	} else {
-		banshee_make_room(par, 8 + ((size + 3) >> 2));
+		banshee_make_room(par, 8);
+		switch (info->fix.visual) {
+			case FB_VISUAL_PSEUDOCOLOR:
 		tdfx_outl(par, COLORFORE, image->fg_color);
 		tdfx_outl(par, COLORBACK, image->bg_color);
+				break;
+			case FB_VISUAL_TRUECOLOR:
+			default:
+				tdfx_outl(par, COLORFORE, ((u32*)(info->pseudo_palette))[image->fg_color]);
+				tdfx_outl(par, COLORBACK, ((u32*)(info->pseudo_palette))[image->bg_color]);
+		}
+#ifdef __BIG_ENDIAN
+		srcfmt = 0x400000 | BIT(20);
+#else
 		srcfmt = 0x400000;
+#endif
 	}	
 
 	tdfx_outl(par,	SRCXY,     0);
@@ -959,13 +975,22 @@
 	tdfx_outl(par,	DSTFORMAT, dstfmt);
 	tdfx_outl(par,	DSTSIZE,   image->width | (image->height << 16));
 
+	/* A count of how many free FIFO entries we've requested.
+	 * When this goes negative, we need to request more. */
+	fifo_free = 0;
+
 	/* Send four bytes at a time of data */	
 	for (i = (size >> 2) ; i > 0; i--) { 
+		if(--fifo_free < 0) {
+			fifo_free=31;
+			banshee_make_room(par,fifo_free);
+		}
 		tdfx_outl(par,	LAUNCH_2D,*(u32*)chardata);
 		chardata += 4; 
 	}	
 
 	/* Send the leftovers now */	
+	banshee_make_room(par,3);
 	i = size%4;	
 	switch (i) {
 		case 0: break;

                 reply	other threads:[~2003-07-27 23:17 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200307272017.h6RKH7WU029737@hraefn.swansea.linux.org.uk \
    --to=alan@lxorguk.ukuu.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.org \
    --subject='Re: PATCH: tdfx framebuffer updates' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).