diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2015-02-25 22:44:51 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-04-14 03:00:46 -0400 |
commit | 996f545fbb0dc9ed4a640b5ef098f51fe28cca5c (patch) | |
tree | 4ef34ade7df6490c03202d0021b7a96581f9724d | |
parent | a7f6da6e758cd99fcae918b63549273893983189 (diff) |
drm/nouveau/gem: allow user-space to specify an object should be coherent
User-space use mappable BOs notably for fences, and expects that a
value update by the GPU will be immediatly visible through the
user-space mapping.
ARM has a property that may prevent this from happening though: memory
can be mapped multiple times only if the different mappings share the
same caching properties. However all the lowmem memory is already
identity-mapped into the kernel with cache enabled, so when user-space
requests an uncached mapping, we actually get an "undefined caching
policy" one and this has strange side-effects described on Freedesktop
bug 86690.
To prevent this from happening, allow user-space to explicitly specify
which objects should be coherent, and create such objects with the
TTM_PL_FLAG_UNCACHED flag. This will make TTM allocate memory using the
DMA API, which will fix the identify mapping and allow us to safely map
the objects to user-space uncached.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Reviewed-by: Lucas Stach <dev@lynxeye.de>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_gem.c | 3 | ||||
-rw-r--r-- | include/uapi/drm/nouveau_drm.h | 1 |
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 7c077fced1d1..0e690bf19fc9 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
@@ -189,6 +189,9 @@ nouveau_gem_new(struct drm_device *dev, int size, int align, uint32_t domain, | |||
189 | if (!flags || domain & NOUVEAU_GEM_DOMAIN_CPU) | 189 | if (!flags || domain & NOUVEAU_GEM_DOMAIN_CPU) |
190 | flags |= TTM_PL_FLAG_SYSTEM; | 190 | flags |= TTM_PL_FLAG_SYSTEM; |
191 | 191 | ||
192 | if (domain & NOUVEAU_GEM_DOMAIN_COHERENT) | ||
193 | flags |= TTM_PL_FLAG_UNCACHED; | ||
194 | |||
192 | ret = nouveau_bo_new(dev, size, align, flags, tile_mode, | 195 | ret = nouveau_bo_new(dev, size, align, flags, tile_mode, |
193 | tile_flags, NULL, NULL, pnvbo); | 196 | tile_flags, NULL, NULL, pnvbo); |
194 | if (ret) | 197 | if (ret) |
diff --git a/include/uapi/drm/nouveau_drm.h b/include/uapi/drm/nouveau_drm.h index 0d7608dc1a34..5507eead5863 100644 --- a/include/uapi/drm/nouveau_drm.h +++ b/include/uapi/drm/nouveau_drm.h | |||
@@ -39,6 +39,7 @@ | |||
39 | #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) | 39 | #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) |
40 | #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) | 40 | #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) |
41 | #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) | 41 | #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) |
42 | #define NOUVEAU_GEM_DOMAIN_COHERENT (1 << 4) | ||
42 | 43 | ||
43 | #define NOUVEAU_GEM_TILE_COMP 0x00030000 /* nv50-only */ | 44 | #define NOUVEAU_GEM_TILE_COMP 0x00030000 /* nv50-only */ |
44 | #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 | 45 | #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 |