Allows PTE kind and tile mode on BO create with VM_BIND. This is needed to 
support modifiers in NVK and ensure correctness when dealing with the nouveau 
GL driver.

Signed-off-by: Mohamed Ahmed <mohamedahmedegypt2...@gmail.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index db8cbf615..0da0b5286 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -304,11 +304,25 @@ nouveau_bo_alloc(struct nouveau_cli *cli, u64 *size, int 
*align, u32 domain,
                }
                nvbo->page = vmm->page[pi].shift;
        } else {
-               /* reject other tile flags when in VM mode. */
-               if (tile_mode)
-                       return ERR_PTR(-EINVAL);
-               if (tile_flags & ~NOUVEAU_GEM_TILE_NONCONTIG)
-                       return ERR_PTR(-EINVAL);
+               if (cli->device.info.family >= NV_DEVICE_INFO_V0_FERMI) {
+                       nvbo->kind = (tile_flags & 0x0000ff00) >> 8;
+                       if (!nvif_mmu_kind_valid(mmu, nvbo->kind)) {
+                               kfree(nvbo);
+                               return ERR_PTR(-EINVAL);
+                       }
+
+                       nvbo->comp = mmu->kind[nvbo->kind] != nvbo->kind;
+               } else if (cli->device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
+                       nvbo->kind = (tile_flags & 0x00007f00) >> 8;
+                       nvbo->comp = (tile_flags & 0x00030000) >> 16;
+                       if (!nvif_mmu_kind_valid(mmu, nvbo->kind)) {
+                               kfree(nvbo);
+                               return ERR_PTR(-EINVAL);
+                       }
+               } else {
+                       nvbo->zeta = (tile_flags & 0x00000007);
+               }
+               nvbo->mode = tile_mode;
 
                /* Determine the desirable target GPU page size for the buffer. 
*/
                for (i = 0; i < vmm->page_nr; i++) {
-- 
2.44.0

Reply via email to