#include <sys/mman.h>
struct nouveau_ws_bo *
-nouveau_ws_bo_new(struct nouveau_ws_device *dev, uint64_t size, uint64_t align, enum nouveau_ws_bo_flags flags)
+nouveau_ws_bo_new(struct nouveau_ws_device *dev,
+ uint64_t size, uint64_t align,
+ enum nouveau_ws_bo_flags flags)
+{
+ return nouveau_ws_bo_new_tiled(dev, size, align, 0, 0, flags);
+}
+
+struct nouveau_ws_bo *
+nouveau_ws_bo_new_tiled(struct nouveau_ws_device *dev,
+ uint64_t size, uint64_t align,
+ uint8_t pte_kind, uint16_t tile_mode,
+ enum nouveau_ws_bo_flags flags)
{
struct nouveau_ws_bo *bo = CALLOC_STRUCT(nouveau_ws_bo);
struct drm_nouveau_gem_new req = {};
if (flags & NOUVEAU_WS_BO_MAP)
req.info.domain |= NOUVEAU_GEM_DOMAIN_MAPPABLE;
+ assert(pte_kind == 0 || !(flags & NOUVEAU_WS_BO_GART));
+ assert(tile_mode == 0 || !(flags & NOUVEAU_WS_BO_GART));
+ req.info.tile_flags = (uint32_t)pte_kind << 8;
+ req.info.tile_mode = tile_mode;
+
req.info.size = size;
req.align = align;
_Atomic uint32_t refcnt;
};
-struct nouveau_ws_bo *nouveau_ws_bo_new(struct nouveau_ws_device *, uint64_t size, uint64_t align, enum nouveau_ws_bo_flags);
+struct nouveau_ws_bo *nouveau_ws_bo_new(struct nouveau_ws_device *,
+ uint64_t size, uint64_t align,
+ enum nouveau_ws_bo_flags);
+struct nouveau_ws_bo *nouveau_ws_bo_new_tiled(struct nouveau_ws_device *,
+ uint64_t size, uint64_t align,
+ uint8_t pte_kind,
+ uint16_t tile_mode,
+ enum nouveau_ws_bo_flags);
void nouveau_ws_bo_destroy(struct nouveau_ws_bo *);
void *nouveau_ws_bo_map(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags);
bool nouveau_ws_bo_wait(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags flags);