diff options
author | Andy Lutomirski <luto@amacapital.net> | 2013-05-13 19:58:42 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-05-30 23:37:06 -0400 |
commit | ff47eaf24d01b5753e4964b10c606e0d711b143e (patch) | |
tree | 4a69ba395f6aaa743ce6cc12d5fe9a09286eae2c /drivers/gpu/drm/drm_bufs.c | |
parent | 247d36d75128ba1f63702e0e6185d9a7a23ee5cb (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.c | 17 |
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); |