drm: fd.o bug #11895: Only add the AGP base to map offset if the caller didn't.
authorEric Anholt <eric@anholt.net>
Thu, 22 Nov 2007 06:55:15 +0000 (16:55 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 7 Feb 2008 05:09:38 +0000 (15:09 +1000)
The i830 and newer intel 2D code adds the AGP base to map offsets already,
because it wasn't doing the AGP enable which used to set dev->agp->base.

Credit goes to Zhenyu for finding the issue.

Signed-off-by: Dave Airlie <airlied@linux.ie>
drivers/char/drm/drm_bufs.c

index 07b774fa3f3815850bfd4f50b2459fc8bed91673..bde64b84166e1d783a2c5a8ece1816c483e76f0b 100644 (file)
@@ -229,11 +229,17 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
 #ifdef __alpha__
                map->offset += dev->hose->mem_space->start;
 #endif
-               /* Note: dev->agp->base may actually be 0 when the DRM
-                * is not in control of AGP space. But if user space is
-                * it should already have added the AGP base itself.
+               /* In some cases (i810 driver), user space may have already
+                * added the AGP base itself, because dev->agp->base previously
+                * only got set during AGP enable.  So, only add the base
+                * address if the map's offset isn't already within the
+                * aperture.
                 */
-               map->offset += dev->agp->base;
+               if (map->offset < dev->agp->base ||
+                   map->offset > dev->agp->base +
+                   dev->agp->agp_info.aper_size * 1024 * 1024 - 1) {
+                       map->offset += dev->agp->base;
+               }
                map->mtrr = dev->agp->agp_mtrr; /* for getmap */
 
                /* This assumes the DRM is in total control of AGP space.