aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_bufs.c
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2013-05-13 19:58:42 -0400
committerDave Airlie <airlied@redhat.com>2013-05-30 23:37:06 -0400
commitff47eaf24d01b5753e4964b10c606e0d711b143e (patch)
tree4a69ba395f6aaa743ce6cc12d5fe9a09286eae2c /drivers/gpu/drm/drm_bufs.c
parent247d36d75128ba1f63702e0e6185d9a7a23ee5cb (diff)
drm: Update drm_addmap and drm_mmap to use PAT WC instead of MTRRs
Previously, DRM_FRAME_BUFFER mappings, as well as DRM_REGISTERS mappings with DRM_WRITE_COMBINING set, resulted in an unconditional MTRR being added but the actual mappings being created as UC-. Now these mappings have the MTRR added only if needed, but they will be mapped with pgprot_writecombine. The non-WC DRM_REGISTERS case now uses pgprot_noncached instead of hardcoding the bit twiddling. The DRM_AGP case is unchanged for now. [airlied: fix ppc build] Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Andy Lutomirski <luto@amacapital.net> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_bufs.c')
-rw-r--r--drivers/gpu/drm/drm_bufs.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
index 0128147265f3..0190fce20078 100644
--- a/drivers/gpu/drm/drm_bufs.c
+++ b/drivers/gpu/drm/drm_bufs.c
@@ -210,12 +210,16 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
210 if (drm_core_has_MTRR(dev)) { 210 if (drm_core_has_MTRR(dev)) {
211 if (map->type == _DRM_FRAME_BUFFER || 211 if (map->type == _DRM_FRAME_BUFFER ||
212 (map->flags & _DRM_WRITE_COMBINING)) { 212 (map->flags & _DRM_WRITE_COMBINING)) {
213 map->mtrr = mtrr_add(map->offset, map->size, 213 map->mtrr =
214 MTRR_TYPE_WRCOMB, 1); 214 arch_phys_wc_add(map->offset, map->size);
215 } 215 }
216 } 216 }
217 if (map->type == _DRM_REGISTERS) { 217 if (map->type == _DRM_REGISTERS) {
218 map->handle = ioremap(map->offset, map->size); 218 if (map->flags & _DRM_WRITE_COMBINING)
219 map->handle = ioremap_wc(map->offset,
220 map->size);
221 else
222 map->handle = ioremap(map->offset, map->size);
219 if (!map->handle) { 223 if (!map->handle) {
220 kfree(map); 224 kfree(map);
221 return -ENOMEM; 225 return -ENOMEM;
@@ -451,11 +455,8 @@ int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map)
451 iounmap(map->handle); 455 iounmap(map->handle);
452 /* FALLTHROUGH */ 456 /* FALLTHROUGH */
453 case _DRM_FRAME_BUFFER: 457 case _DRM_FRAME_BUFFER:
454 if (drm_core_has_MTRR(dev) && map->mtrr >= 0) { 458 if (drm_core_has_MTRR(dev))
455 int retcode; 459 arch_phys_wc_del(map->mtrr);
456 retcode = mtrr_del(map->mtrr, map->offset, map->size);
457 DRM_DEBUG("mtrr_del=%d\n", retcode);
458 }
459 break; 460 break;
460 case _DRM_SHM: 461 case _DRM_SHM:
461 vfree(map->handle); 462 vfree(map->handle);