diff --git a/include/drm/nouveau_drm.h b/include/drm/nouveau_drm.h index fe917dee..f115eab6 100644 --- a/include/drm/nouveau_drm.h +++ b/include/drm/nouveau_drm.h @@ -80,6 +80,7 @@ struct drm_nouveau_gpuobj_free { #define NOUVEAU_GETPARAM_VM_VRAM_BASE 12 #define NOUVEAU_GETPARAM_GRAPH_UNITS 13 #define NOUVEAU_GETPARAM_PTIMER_TIME 14 +#define NOUVEAU_GETPARAM_HAS_BO_USAGE 15 struct drm_nouveau_getparam { uint64_t param; uint64_t value; @@ -95,6 +96,12 @@ struct drm_nouveau_setparam { #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) +#define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 +#define NOUVEAU_GEM_TILE_16BPP 0x00000001 +#define NOUVEAU_GEM_TILE_32BPP 0x00000002 +#define NOUVEAU_GEM_TILE_ZETA 0x00000004 +#define NOUVEAU_GEM_TILE_NONCONTIG 0x00000008 + struct drm_nouveau_gem_info { uint32_t handle; uint32_t domain; diff --git a/nouveau/nouveau_bo.c b/nouveau/nouveau_bo.c index 32b23b65..c1432b0b 100644 --- a/nouveau/nouveau_bo.c +++ b/nouveau/nouveau_bo.c @@ -52,7 +52,8 @@ nouveau_bo_info(struct nouveau_bo_priv *nvbo, struct drm_nouveau_gem_info *arg) nvbo->offset = arg->offset; nvbo->map_handle = arg->map_handle; nvbo->base.tile_mode = arg->tile_mode; - nvbo->base.tile_flags = arg->tile_flags; + /* XXX - flag inverted for backwards compatibility */ + nvbo->base.tile_flags = arg->tile_flags ^ NOUVEAU_GEM_TILE_NONCONTIG; return 0; } @@ -140,6 +141,10 @@ nouveau_bo_kalloc(struct nouveau_bo_priv *nvbo, struct nouveau_channel *chan) info->tile_mode = nvbo->base.tile_mode; info->tile_flags = nvbo->base.tile_flags; + /* XXX - flag inverted for backwards compatibility */ + info->tile_flags ^= NOUVEAU_GEM_TILE_NONCONTIG; + if (!nvdev->has_bo_usage) + info->tile_flags &= NOUVEAU_GEM_TILE_LAYOUT_MASK; ret = drmCommandWriteRead(nvdev->fd, DRM_NOUVEAU_GEM_NEW, &req, sizeof(req)); diff --git a/nouveau/nouveau_bo.h b/nouveau/nouveau_bo.h index 1e77ab0f..3a1f2d4a 100644 --- a/nouveau/nouveau_bo.h +++ b/nouveau/nouveau_bo.h @@ -39,6 +39,12 @@ #define NOUVEAU_BO_IFLUSH (1 << 15) #define NOUVEAU_BO_DUMMY (1 << 31) +#define NOUVEAU_BO_TILE_LAYOUT_MASK 0x0000ff00 +#define NOUVEAU_BO_TILE_16BPP 0x00000001 +#define NOUVEAU_BO_TILE_32BPP 0x00000002 +#define NOUVEAU_BO_TILE_ZETA 0x00000004 +#define NOUVEAU_BO_TILE_SCANOUT 0x00000008 + struct nouveau_bo { struct nouveau_device *device; uint32_t handle; diff --git a/nouveau/nouveau_device.c b/nouveau/nouveau_device.c index 9a091fba..2ffcba6f 100644 --- a/nouveau/nouveau_device.c +++ b/nouveau/nouveau_device.c @@ -95,6 +95,11 @@ nouveau_device_open_existing(struct nouveau_device **dev, int close, } nvdev->base.chipset = value; + ret = nouveau_device_get_param(&nvdev->base, + NOUVEAU_GETPARAM_HAS_BO_USAGE, &value); + if (!ret) + nvdev->has_bo_usage = value; + *dev = &nvdev->base; return 0; } diff --git a/nouveau/nouveau_drmif.h b/nouveau/nouveau_drmif.h index bc860d2e..ec226a22 100644 --- a/nouveau/nouveau_drmif.h +++ b/nouveau/nouveau_drmif.h @@ -35,6 +35,7 @@ struct nouveau_device_priv { drm_context_t ctx; drmLock *lock; int needs_close; + int has_bo_usage; }; #define nouveau_device(n) ((struct nouveau_device_priv *)(n))