diff options
author | Eric Anholt <eric@anholt.net> | 2007-11-22 01:55:15 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2008-02-07 00:09:38 -0500 |
commit | 47a184a80800dd69abd1206eea1b961070ce2ca3 (patch) | |
tree | 8153346752a78eb81749478bfae3088dfc7d2144 /drivers/char | |
parent | ba8bbcf6ff4650712f64c0ef61139c73898e2165 (diff) |
drm: fd.o bug #11895: Only add the AGP base to map offset if the caller didn't.
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>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/drm/drm_bufs.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c index 07b774fa3f38..bde64b84166e 100644 --- a/drivers/char/drm/drm_bufs.c +++ b/drivers/char/drm/drm_bufs.c | |||
@@ -229,11 +229,17 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset, | |||
229 | #ifdef __alpha__ | 229 | #ifdef __alpha__ |
230 | map->offset += dev->hose->mem_space->start; | 230 | map->offset += dev->hose->mem_space->start; |
231 | #endif | 231 | #endif |
232 | /* Note: dev->agp->base may actually be 0 when the DRM | 232 | /* In some cases (i810 driver), user space may have already |
233 | * is not in control of AGP space. But if user space is | 233 | * added the AGP base itself, because dev->agp->base previously |
234 | * it should already have added the AGP base itself. | 234 | * only got set during AGP enable. So, only add the base |
235 | * address if the map's offset isn't already within the | ||
236 | * aperture. | ||
235 | */ | 237 | */ |
236 | map->offset += dev->agp->base; | 238 | if (map->offset < dev->agp->base || |
239 | map->offset > dev->agp->base + | ||
240 | dev->agp->agp_info.aper_size * 1024 * 1024 - 1) { | ||
241 | map->offset += dev->agp->base; | ||
242 | } | ||
237 | map->mtrr = dev->agp->agp_mtrr; /* for getmap */ | 243 | map->mtrr = dev->agp->agp_mtrr; /* for getmap */ |
238 | 244 | ||
239 | /* This assumes the DRM is in total control of AGP space. | 245 | /* This assumes the DRM is in total control of AGP space. |