changeset 1951:b2b85982fc0e

MTRR autoconfigure
author nick
date Tue, 25 Sep 2001 07:20:42 +0000
parents 940c467eae09
children b55163894e30
files drivers/radeon/radeonfb.c
diffstat 1 files changed, 45 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/drivers/radeon/radeonfb.c	Mon Sep 24 21:08:40 2001 +0000
+++ b/drivers/radeon/radeonfb.c	Tue Sep 25 07:20:42 2001 +0000
@@ -31,7 +31,7 @@
  *			Disable SURFACE_CNTL because mplayer doesn't work
  *			propertly (by NK)
  *			0.1.0-ve.1
- *
+ *	2001-09-25	MTRR support (by NK)
  *	Special thanks to ATI DevRel team for their hardware donations.
  *
  * LIMITATIONS: on dualhead Radeons (VE, M6, M7) driver doesn't work in
@@ -75,6 +75,10 @@
 #include <video/fbcon-cfb24.h>
 #include <video/fbcon-cfb32.h>
 
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
+
 #include "radeon.h"
 
 
@@ -281,7 +285,9 @@
 
 	u32 hack_crtc_ext_cntl;
 	u32 hack_crtc_v_sync_strt_wid;
-
+#ifdef CONFIG_MTRR
+	struct { int vram; int vram_valid; } mtrr;
+#endif
 #if defined(FBCON_HAS_CFB16) || defined(FBCON_HAS_CFB32)
         union {
 #if defined(FBCON_HAS_CFB16)
@@ -529,6 +535,7 @@
 static char fontname[40] __initdata;
 static char *mode_option __initdata;
 static char noaccel __initdata = 0;
+static int  nomtrr __initdata = 0;
 
 #if 0
 #ifdef FBCON_HAS_CFB8
@@ -536,6 +543,10 @@
 #endif
 #endif
 
+#ifdef CONFIG_MTRR
+static int mtrr = 1;
+#endif
+
 /*
  * prototypes
  */
@@ -606,7 +617,13 @@
 
 int __init radeonfb_init (void)
 {
-	return pci_module_init (&radeonfb_driver);
+#ifdef CONFIG_MTRR
+    if (nomtrr) {
+        mtrr = 0;
+        printk("radeonfb: Parameter NOMTRR set\n");
+    }
+#endif
+    return pci_module_init (&radeonfb_driver);
 }
 
 
@@ -637,6 +654,11 @@
                 } else if (!strncmp(this_opt, "noaccel", 7)) {
 			noaccel = 1;
 		}
+#ifdef CONFIG_MTRR
+		else if(!strncmp(this_opt, "nomtrr", 6)) {
+		mtrr = 0;
+		}
+#endif
                 else    mode_option = this_opt;
         }
 
@@ -651,6 +673,10 @@
 
 MODULE_AUTHOR("Ani Joshi. (Radeon VE extensions by Nick Kurshev)");
 MODULE_DESCRIPTION("framebuffer driver for ATI Radeon chipset. Ver: "RADEON_VERSION);
+#ifdef CONFIG_MTRR
+MODULE_PARM(nomtrr, "i");
+MODULE_PARM_DESC(nomtrr, "Don't touch MTRR (touch=0(default))");
+#endif
 
 static char * GET_MON_NAME(int type)
 {
@@ -951,6 +977,15 @@
 	else
 	    printk("radeonfb: CRT port has %s monitor connected\n",GET_MON_NAME(rinfo->crtDispType));
 	printk("radeonfb: This card has %sTVout\n",rinfo->hasTVout ? "" : "no ");
+#ifdef CONFIG_MTRR
+	if (mtrr) {
+		rinfo->mtrr.vram = mtrr_add(rinfo->fb_base_phys,
+				rinfo->video_ram, MTRR_TYPE_WRCOMB, 1);
+		rinfo->mtrr.vram_valid = 1;
+		/* let there be speed */
+		printk("radeonfb: MTRR set to ON\n");
+	}
+#endif /* CONFIG_MTRR */
 
 	return 0;
 }
@@ -968,7 +1003,11 @@
         radeon_write_mode (rinfo, &rinfo->init_state);
  
         unregister_framebuffer ((struct fb_info *) rinfo);
-                
+#ifdef CONFIG_MTRR
+        if (rinfo->mtrr.vram_valid)
+            mtrr_del(rinfo->mtrr.vram, rinfo->fb_base_phys,
+                     rinfo->video_ram);
+#endif /* CONFIG_MTRR */
         iounmap ((void*)rinfo->mmio_base);
         iounmap ((void*)rinfo->fb_base);
  
@@ -1940,8 +1979,8 @@
 	newmode.dac_cntl = INREG(DAC_CNTL) | DAC_MASK_ALL | DAC_VGA_ADR_EN |
 			   DAC_8BIT_EN;
 
-	newmode.crtc_h_total_disp = ((((hTotal / 8) - 1) & 0xffff) |
-				     (((mode->xres / 8) - 1) << 16));
+	newmode.crtc_h_total_disp = ((((hTotal / 8) - 1) & 0x3ff) |
+				     ((((mode->xres / 8) - 1) & 0x1ff) << 16));
 
 	newmode.crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) |
 					(hsync_wid << 16) | (h_sync_pol << 23));
@@ -2061,7 +2100,6 @@
 		OUTREG(CRTC_EXT_CNTL, rinfo->hack_crtc_ext_cntl);
 		OUTREG(CRTC_V_SYNC_STRT_WID, rinfo->hack_crtc_v_sync_strt_wid);
 	}
-
 	return;
 }