drm/nouveau/gem: allow user-space to specify an object should be coherent
authorAlexandre Courbot <acourbot@nvidia.com>
Thu, 26 Feb 2015 03:44:51 +0000 (12:44 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 14 Apr 2015 07:00:46 +0000 (17:00 +1000)
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>
drivers/gpu/drm/nouveau/nouveau_gem.c
include/uapi/drm/nouveau_drm.h

index 7c077fced1d13b84fa9a38e6680ad6174f3d2f08..0e690bf19fc9c5d04d2fdab02df59a4eeddd3a2b 100644 (file)
@@ -189,6 +189,9 @@ nouveau_gem_new(struct drm_device *dev, int size, int align, uint32_t domain,
        if (!flags || domain & NOUVEAU_GEM_DOMAIN_CPU)
                flags |= TTM_PL_FLAG_SYSTEM;
 
+       if (domain & NOUVEAU_GEM_DOMAIN_COHERENT)
+               flags |= TTM_PL_FLAG_UNCACHED;
+
        ret = nouveau_bo_new(dev, size, align, flags, tile_mode,
                             tile_flags, NULL, NULL, pnvbo);
        if (ret)
index 0d7608dc1a345ce63f95596081e4b2752221f95d..5507eead58634f0aba8b2ad6766245346ff58117 100644 (file)
@@ -39,6 +39,7 @@
 #define NOUVEAU_GEM_DOMAIN_VRAM      (1 << 1)
 #define NOUVEAU_GEM_DOMAIN_GART      (1 << 2)
 #define NOUVEAU_GEM_DOMAIN_MAPPABLE  (1 << 3)
+#define NOUVEAU_GEM_DOMAIN_COHERENT  (1 << 4)
 
 #define NOUVEAU_GEM_TILE_COMP        0x00030000 /* nv50-only */
 #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00