linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] atyfb: MTRR support
@ 2004-08-24 23:46 Ville Syrjälä
  0 siblings, 0 replies; only message in thread
From: Ville Syrjälä @ 2004-08-24 23:46 UTC (permalink / raw)
  To: linux-fbdev-devel

[-- Attachment #1: Type: text/plain, Size: 316 bytes --]

The attached patch adds MTRR support to atyfb.

Write-combining is enabled for the whole PCI resource and an uncachable 
hole is made for MMIO registers if necessary.

I also changed aty_init() to return 0 on success like the other functions.

-- 
Ville Syrjälä
syrjala@sci.fi
http://www.sci.fi/~syrjala/

[-- Attachment #2: atyfb-2.6-mtrr.patch --]
[-- Type: text/plain, Size: 3473 bytes --]

diff -NaurbB linux-irq2/drivers/video/aty/atyfb.h linux-mtrr/drivers/video/aty/atyfb.h
--- linux-irq2/drivers/video/aty/atyfb.h	2004-07-22 21:08:19.000000000 +0300
+++ linux-mtrr/drivers/video/aty/atyfb.h	2004-08-16 10:13:14.000000000 +0300
@@ -178,6 +178,10 @@
 	unsigned long irq_flags;
 	unsigned int irq;
 	spinlock_t int_lock;
+#ifdef CONFIG_MTRR
+	int mtrr_aper;
+	int mtrr_reg;
+#endif
 };
 
     /*
diff -NaurbB linux-irq2/drivers/video/aty/atyfb_base.c linux-mtrr/drivers/video/aty/atyfb_base.c
--- linux-irq2/drivers/video/aty/atyfb_base.c	2004-08-25 01:52:01.631006776 +0300
+++ linux-mtrr/drivers/video/aty/atyfb_base.c	2004-08-25 01:51:41.023139648 +0300
@@ -92,6 +92,9 @@
 #ifdef CONFIG_PMAC_BACKLIGHT
 #include <asm/backlight.h>
 #endif
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
 
 
 /*
@@ -286,6 +289,7 @@
 };
 
 static char noaccel __initdata = 0;
+static char nomtrr __initdata = 0;
 static u32 default_vram __initdata = 0;
 static int default_pll __initdata = 0;
 static int default_mclk __initdata = 0;
@@ -2388,6 +2392,26 @@
 	if (par->aux_start)
 		aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par);
 
+#ifdef CONFIG_MTRR
+	par->mtrr_aper = -1;
+	par->mtrr_reg = -1;
+	if (!nomtrr) {
+		/* Cover the whole resource. */
+		par->mtrr_aper = mtrr_add(par->res_start,
+					  par->res_size, MTRR_TYPE_WRCOMB, 1);
+		if (par->mtrr_aper >= 0 && !par->aux_start) {
+			/* Make a hole for mmio. */
+			par->mtrr_reg = mtrr_add(par->res_start + 0x800000 -
+						 GUI_RESERVE, GUI_RESERVE,
+						 MTRR_TYPE_UNCACHABLE, 1);
+			if (par->mtrr_reg < 0) {
+				mtrr_del(par->mtrr_aper, 0, 0);
+				par->mtrr_aper = -1;
+			}
+		}
+	}
+#endif
+
 	/* Clear the video memory */
 	fb_memset((void *) info->screen_base, 0, info->fix.smem_len);
 
@@ -2457,7 +2481,7 @@
 
 	if (atyfb_check_var(&var, info)) {
 		printk(KERN_CRIT "atyfb: can't set default video mode\n");
-		return 0;
+		goto err_del_mtrr;
 	}
 
 #ifdef __sparc__
@@ -2473,13 +2497,22 @@
 	fb_alloc_cmap(&info->cmap, 256, 0);
 
 	if (register_framebuffer(info) < 0)
-		return 0;
+		goto err_del_mtrr;
 
 	fb_list = info;
 
 	printk("fb%d: %s frame buffer device on %s\n",
 	       info->node, info->fix.id, name);
-	return 1;
+	return 0;
+
+ err_del_mtrr:
+#ifdef CONFIG_MTRR
+	if (par->mtrr_reg >= 0)
+		mtrr_del(par->mtrr_reg, 0, 0);
+	if (par->mtrr_aper >= 0)
+		mtrr_del(par->mtrr_aper, 0, 0);
+#endif
+	return -1;
 }
 
 #ifndef MODULE
@@ -2493,6 +2526,8 @@
 	while ((this_opt = strsep(&options, ",")) != NULL) {
 		if (!strncmp(this_opt, "noaccel", 7))
 			noaccel = 1;
+		else if (!strncmp(this_opt, "nomtrr", 6))
+			nomtrr = 1;
 		else if (!strncmp(this_opt, "vram:", 5))
 			default_vram =
 			    simple_strtoul(this_opt + 5, NULL, 0);
@@ -3364,7 +3399,7 @@
 	pci_set_drvdata(pdev, info);
 
 	/* Init chip & register framebuffer */
-	if (!aty_init(info, "PCI"))
+	if (aty_init(info, "PCI"))
 		goto err_release_io;
 
 #ifdef __sparc__
@@ -3466,7 +3501,7 @@
 			break;
 		}
 
-		if (!aty_init(info, "ISA bus")) {
+		if (aty_init(info, "ISA bus")) {
 			framebuffer_release(info);
 			/* This is insufficient! kernel_map has added two large chunks!! */
 			return -ENXIO;
@@ -3482,6 +3517,12 @@
 
 	unregister_framebuffer(info);
 
+#ifdef CONFIG_MTRR
+	if (par->mtrr_reg >= 0)
+		mtrr_del(par->mtrr_reg, 0, 0);
+	if (par->mtrr_aper >= 0)
+		mtrr_del(par->mtrr_aper, 0, 0);
+#endif
 #ifndef __sparc__
 	if (par->ati_regbase)
 		iounmap((void *) par->ati_regbase);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-08-24 23:46 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-24 23:46 [PATCH] atyfb: MTRR support Ville Syrjälä

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).