mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] DRM: Fix radeon mapping of AGP
@ 2005-05-18  2:57 Benjamin Herrenschmidt
  0 siblings, 0 replies; only message in thread
From: Benjamin Herrenschmidt @ 2005-05-18  2:57 UTC (permalink / raw)
  To: Dave Airlie; +Cc: Linux Kernel list, dri-devel

Hi David! 

Here's my latest version of the patch for radeon_cp that fixes the
possible overlap mapping we talked about. I went the paranoid way this
time, by checking both CONFIG_MEMSIZE and MC_FB_LOCATION "top", in order
to put the AGP aperture always above any of those. This should avoid bad
surprises in the future and fix the problem with existing ppc r300's who
have CONFIG_APER_SIZE < CONFIG_MEM_SIZE.

The X.org side is still bogus, but at least, with this DRM fix, this
won't break it all, X will just use only half of VRAM I suppose. I'll
work on fixing X later.

Let me know if that patch is ok, others on the list, I would appreciate
if you could give it a try and make sure it doesn't cause any
regression. It applies against current Linus git tree.

Index: linux-work/drivers/char/drm/radeon_drv.h
===================================================================
--- linux-work.orig/drivers/char/drm/radeon_drv.h	2005-05-02 10:48:09.000000000 +1000
+++ linux-work/drivers/char/drm/radeon_drv.h	2005-05-18 11:39:00.000000000 +1000
@@ -346,6 +346,7 @@
 #define RADEON_CLOCK_CNTL_DATA		0x000c
 #	define RADEON_PLL_WR_EN			(1 << 7)
 #define RADEON_CLOCK_CNTL_INDEX		0x0008
+#define RADEON_CONFIG_MEMSIZE		0x00f8
 #define RADEON_CONFIG_APER_SIZE		0x0108
 #define RADEON_CRTC_OFFSET		0x0224
 #define RADEON_CRTC_OFFSET_CNTL		0x0228
Index: linux-work/drivers/char/drm/radeon_cp.c
===================================================================
--- linux-work.orig/drivers/char/drm/radeon_cp.c	2005-05-02 10:48:09.000000000 +1000
+++ linux-work/drivers/char/drm/radeon_cp.c	2005-05-18 12:00:07.000000000 +1000
@@ -1267,7 +1267,8 @@
 
 static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
 {
-	drm_radeon_private_t *dev_priv = dev->dev_private;;
+	drm_radeon_private_t *dev_priv = dev->dev_private;
+	u32 gart_loc, mem_size, mem_top;
 	DRM_DEBUG( "\n" );
 
 	dev_priv->is_pci = init->is_pci;
@@ -1476,8 +1477,32 @@
 
 
 	dev_priv->gart_size = init->gart_size;
-	dev_priv->gart_vm_start = dev_priv->fb_location
-				+ RADEON_READ( RADEON_CONFIG_APER_SIZE );
+	mem_size = RADEON_READ(RADEON_CONFIG_MEMSIZE);
+	mem_top = RADEON_READ(RADEON_MC_FB_LOCATION) & 0xffff0000;
+
+	/* assume mem_size of 0 means one of those buggy M6 and thus
+	 * is 8Mb
+	 */
+	if (mem_size == 0)
+		mem_size = 0x00800000;
+	
+	/* if MC_FB_LOCATION was set for a bigger aperture, then adapt,
+	 * we really want to make sure there is no overlap between the
+	 * region defined by MC_FB_LOCATION and the AGP aperture
+	 */
+	if (((mem_top + 1) - dev_priv->fb_location) > mem_size)
+		mem_size = (mem_top + 1) - dev_priv->fb_location;
+	/* try to put the gart after the framebuffer */
+	gart_loc = dev_priv->fb_location + mem_size;
+	/* if it overflows, warn and try to put it _before_ the framebuffer */
+	if ((gart_loc + dev_priv->gart_size) < dev_priv->fb_location) {
+		DRM_INFO("Warning ! Gart does not fit above framebuffer in "
+			 "card space, moving it below. Risks collision with "
+			 " main memory ! ");
+		gart_loc = dev_priv->fb_location - dev_priv->gart_size;
+	}
+	
+	dev_priv->gart_vm_start = gart_loc;
 
 #if __OS_HAS_AGP
 	if ( !dev_priv->is_pci )



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

only message in thread, other threads:[~2005-05-18  2:58 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-05-18  2:57 [PATCH] DRM: Fix radeon mapping of AGP Benjamin Herrenschmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®