From ac8bbb355a53c54512b2d3cdfdbf3b009f5cf826 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:54 -0600 Subject: [PATCH] nouveau: Add a function to allocate a tiled buffer Part-of: --- src/nouveau/winsys/nouveau_bo.c | 18 +++++++++++++++++- src/nouveau/winsys/nouveau_bo.h | 9 ++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/nouveau/winsys/nouveau_bo.c b/src/nouveau/winsys/nouveau_bo.c index 00114f2a07d..dec1130903c 100644 --- a/src/nouveau/winsys/nouveau_bo.c +++ b/src/nouveau/winsys/nouveau_bo.c @@ -7,7 +7,18 @@ #include 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 = {}; @@ -25,6 +36,11 @@ nouveau_ws_bo_new(struct nouveau_ws_device *dev, uint64_t size, uint64_t align, 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; diff --git a/src/nouveau/winsys/nouveau_bo.h b/src/nouveau/winsys/nouveau_bo.h index 93925aceeec..7342706f76e 100644 --- a/src/nouveau/winsys/nouveau_bo.h +++ b/src/nouveau/winsys/nouveau_bo.h @@ -28,7 +28,14 @@ struct nouveau_ws_bo { _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);