From 001331f4f1f094ef02497aa618ae5eeb2febedfb Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Mon, 27 Jul 2009 07:23:09 +1000 Subject: nouveau: drm api 0.0.15, update object header, remove fake bo support --- libdrm/nouveau/nouveau_bo.c | 398 ++++---------------------------------------- 1 file changed, 36 insertions(+), 362 deletions(-) (limited to 'libdrm/nouveau/nouveau_bo.c') diff --git a/libdrm/nouveau/nouveau_bo.c b/libdrm/nouveau/nouveau_bo.c index 6c8f6b0d..4f91a5da 100644 --- a/libdrm/nouveau/nouveau_bo.c +++ b/libdrm/nouveau/nouveau_bo.c @@ -90,28 +90,6 @@ nouveau_bo_ufree(struct nouveau_bo_priv *nvbo) } } -static void -nouveau_bo_kfree_nomm(struct nouveau_bo_priv *nvbo) -{ - struct nouveau_device_priv *nvdev = nouveau_device(nvbo->base.device); - struct drm_nouveau_mem_free req; - - if (nvbo->map) { - drmUnmap(nvbo->map, nvbo->size); - nvbo->map = NULL; - } - - req.offset = nvbo->offset; - if (nvbo->domain & NOUVEAU_BO_GART) - req.flags = NOUVEAU_MEM_AGP | NOUVEAU_MEM_PCI; - else - if (nvbo->domain & NOUVEAU_BO_VRAM) - req.flags = NOUVEAU_MEM_FB; - drmCommandWrite(nvdev->fd, DRM_NOUVEAU_MEM_FREE, &req, sizeof(req)); - - nvbo->handle = 0; -} - static void nouveau_bo_kfree(struct nouveau_bo_priv *nvbo) { @@ -121,11 +99,6 @@ nouveau_bo_kfree(struct nouveau_bo_priv *nvbo) if (!nvbo->handle) return; - if (!nvdev->mm_enabled) { - nouveau_bo_kfree_nomm(nvbo); - return; - } - if (nvbo->map) { munmap(nvbo->map, nvbo->size); nvbo->map = NULL; @@ -136,51 +109,6 @@ nouveau_bo_kfree(struct nouveau_bo_priv *nvbo) ioctl(nvdev->fd, DRM_IOCTL_GEM_CLOSE, &req); } -static int -nouveau_bo_kalloc_nomm(struct nouveau_bo_priv *nvbo) -{ - struct nouveau_device_priv *nvdev = nouveau_device(nvbo->base.device); - struct drm_nouveau_mem_alloc req; - int ret; - - if (nvbo->handle) - return 0; - - if (!(nvbo->flags & (NOUVEAU_BO_VRAM|NOUVEAU_BO_GART))) - nvbo->flags |= (NOUVEAU_BO_GART | NOUVEAU_BO_VRAM); - - req.size = nvbo->size; - req.alignment = nvbo->align; - req.flags = 0; - if (nvbo->flags & NOUVEAU_BO_VRAM) - req.flags |= NOUVEAU_MEM_FB; - if (nvbo->flags & NOUVEAU_BO_GART) - req.flags |= (NOUVEAU_MEM_AGP | NOUVEAU_MEM_PCI); - if (nvbo->flags & NOUVEAU_BO_TILED) { - req.flags |= NOUVEAU_MEM_TILE; - if (nvbo->flags & NOUVEAU_BO_ZTILE) - req.flags |= NOUVEAU_MEM_TILE_ZETA; - } - req.flags |= NOUVEAU_MEM_MAPPED; - - ret = drmCommandWriteRead(nvdev->fd, DRM_NOUVEAU_MEM_ALLOC, - &req, sizeof(req)); - if (ret) - return ret; - - nvbo->handle = - nvbo->map_handle = req.map_handle; - nvbo->size = req.size; - nvbo->offset = req.offset; - if (req.flags & (NOUVEAU_MEM_AGP | NOUVEAU_MEM_PCI)) - nvbo->domain = NOUVEAU_BO_GART; - else - if (req.flags & NOUVEAU_MEM_FB) - nvbo->domain = NOUVEAU_BO_VRAM; - - return 0; -} - static int nouveau_bo_kalloc(struct nouveau_bo_priv *nvbo, struct nouveau_channel *chan) { @@ -192,9 +120,6 @@ nouveau_bo_kalloc(struct nouveau_bo_priv *nvbo, struct nouveau_channel *chan) if (nvbo->handle || (nvbo->flags & NOUVEAU_BO_PIN)) return 0; - if (!nvdev->mm_enabled) - return nouveau_bo_kalloc_nomm(nvbo); - req.channel_hint = chan ? chan->id : 0; req.align = nvbo->align; @@ -226,21 +151,6 @@ nouveau_bo_kalloc(struct nouveau_bo_priv *nvbo, struct nouveau_channel *chan) return 0; } -static int -nouveau_bo_kmap_nomm(struct nouveau_bo_priv *nvbo) -{ - struct nouveau_device_priv *nvdev = nouveau_device(nvbo->base.device); - int ret; - - ret = drmMap(nvdev->fd, nvbo->handle, nvbo->size, &nvbo->map); - if (ret) { - nvbo->map = NULL; - return ret; - } - - return 0; -} - static int nouveau_bo_kmap(struct nouveau_bo_priv *nvbo) { @@ -252,9 +162,6 @@ nouveau_bo_kmap(struct nouveau_bo_priv *nvbo) if (!nvbo->map_handle) return -EINVAL; - if (!nvdev->mm_enabled) - return nouveau_bo_kmap_nomm(nvbo); - nvbo->map = mmap(0, nvbo->size, PROT_READ | PROT_WRITE, MAP_SHARED, nvdev->fd, nvbo->map_handle); if (nvbo->map == MAP_FAILED) { @@ -338,28 +245,6 @@ nouveau_bo_user(struct nouveau_device *dev, void *ptr, int size, return 0; } -int -nouveau_bo_fake(struct nouveau_device *dev, uint64_t offset, uint32_t flags, - uint32_t size, void *map, struct nouveau_bo **bo) -{ - struct nouveau_bo_priv *nvbo; - int ret; - - ret = nouveau_bo_new(dev, flags & ~NOUVEAU_BO_PIN, 0, size, bo); - if (ret) - return ret; - nvbo = nouveau_bo(*bo); - - nvbo->flags = flags | NOUVEAU_BO_PIN; - nvbo->domain = (flags & (NOUVEAU_BO_VRAM|NOUVEAU_BO_GART)); - nvbo->offset = offset; - nvbo->size = nvbo->base.size = size; - nvbo->map = map; - nvbo->base.flags = nvbo->flags; - nvbo->base.offset = nvbo->offset; - return 0; -} - int nouveau_bo_wrap(struct nouveau_device *dev, uint32_t handle, struct nouveau_bo **bo) @@ -369,9 +254,6 @@ nouveau_bo_wrap(struct nouveau_device *dev, uint32_t handle, struct nouveau_bo_priv *nvbo; int ret; - if (!nvdev->mm_enabled) - return -ENODEV; - ret = nouveau_bo_new(dev, 0, 0, 0, bo); if (ret) return ret; @@ -406,18 +288,14 @@ nouveau_bo_handle_get(struct nouveau_bo *bo, uint32_t *handle) if (ret) return ret; - if (nvdev->mm_enabled) { - req.handle = nvbo->handle; - ret = ioctl(nvdev->fd, DRM_IOCTL_GEM_FLINK, &req); - if (ret) { - nouveau_bo_kfree(nvbo); - return ret; - } - - nvbo->global_handle = req.name; - } else { - nvbo->global_handle = nvbo->offset; + req.handle = nvbo->handle; + ret = ioctl(nvdev->fd, DRM_IOCTL_GEM_FLINK, &req); + if (ret) { + nouveau_bo_kfree(nvbo); + return ret; } + + nvbo->global_handle = req.name; } *handle = nvbo->global_handle; @@ -433,50 +311,24 @@ nouveau_bo_handle_ref(struct nouveau_device *dev, uint32_t handle, struct drm_gem_open req; int ret; - if (!nvdev->mm_enabled) { - ret = nouveau_bo_new(dev, 0, 0, 0, bo); - if (ret) - return ret; - nvbo = nouveau_bo(*bo); - - nvbo->handle = 0; - nvbo->offset = handle; - nvbo->domain = NOUVEAU_BO_VRAM; - nvbo->flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_PIN; - nvbo->base.offset = nvbo->offset; - nvbo->base.flags = nvbo->flags; - } else { - req.name = handle; - ret = ioctl(nvdev->fd, DRM_IOCTL_GEM_OPEN, &req); - if (ret) { - nouveau_bo_ref(NULL, bo); - return ret; - } - - ret = nouveau_bo_wrap(dev, req.handle, bo); - if (ret) { - nouveau_bo_ref(NULL, bo); - return ret; - } + req.name = handle; + ret = ioctl(nvdev->fd, DRM_IOCTL_GEM_OPEN, &req); + if (ret) { + nouveau_bo_ref(NULL, bo); + return ret; + } - nvbo = nouveau_bo(*bo); + ret = nouveau_bo_wrap(dev, req.handle, bo); + if (ret) { + nouveau_bo_ref(NULL, bo); + return ret; } + nvbo = nouveau_bo(*bo); nvbo->base.handle = nvbo->handle; return 0; } -static void -nouveau_bo_del_cb(void *priv) -{ - struct nouveau_bo_priv *nvbo = priv; - - nouveau_fence_ref(NULL, &nvbo->fence); - nouveau_fence_ref(NULL, &nvbo->wr_fence); - nouveau_bo_kfree(nvbo); - free(nvbo); -} - static void nouveau_bo_del(struct nouveau_bo **bo) { @@ -496,18 +348,8 @@ nouveau_bo_del(struct nouveau_bo **bo) } nouveau_bo_ufree(nvbo); - - if (!nouveau_device(nvbo->base.device)->mm_enabled && nvbo->fence) { - nouveau_fence_flush(nvbo->fence->channel); - if (nouveau_fence(nvbo->fence)->signalled) { - nouveau_bo_del_cb(nvbo); - } else { - nouveau_fence_signal_cb(nvbo->fence, - nouveau_bo_del_cb, nvbo); - } - } else { - nouveau_bo_del_cb(nvbo); - } + nouveau_bo_kfree(nvbo); + free(nvbo); } int @@ -527,24 +369,7 @@ nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pbo) } static int -nouveau_bo_wait_nomm(struct nouveau_bo *bo, int cpu_write) -{ - struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - int ret = 0; - - if (cpu_write) - ret = nouveau_fence_wait(&nvbo->fence); - else - ret = nouveau_fence_wait(&nvbo->wr_fence); - if (ret) - return ret; - - nvbo->write_marker = 0; - return 0; -} - -static int -nouveau_bo_wait(struct nouveau_bo *bo, int cpu_write) +nouveau_bo_wait(struct nouveau_bo *bo, int cpu_write, int no_wait, int no_block) { struct nouveau_device_priv *nvdev = nouveau_device(bo->device); struct nouveau_bo_priv *nvbo = nouveau_bo(bo); @@ -560,10 +385,15 @@ nouveau_bo_wait(struct nouveau_bo *bo, int cpu_write) nouveau_pushbuf_flush(nvbo->pending_channel, 0); } - if (!nvdev->mm_enabled) - return nouveau_bo_wait_nomm(bo, cpu_write); - req.handle = nvbo->handle; + req.flags = 0; + if (cpu_write) + req.flags |= NOUVEAU_GEM_CPU_PREP_WRITE; + if (no_wait) + req.flags |= NOUVEAU_GEM_CPU_PREP_NOWAIT; + if (no_block) + req.flags |= NOUVEAU_GEM_CPU_PREP_NOBLOCK; + do { ret = drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_CPU_PREP, &req, sizeof(req)); @@ -608,7 +438,8 @@ nouveau_bo_map_range(struct nouveau_bo *bo, uint32_t delta, uint32_t size, return ret; if (!(flags & NOUVEAU_BO_NOSYNC)) { - ret = nouveau_bo_wait(bo, (flags & NOUVEAU_BO_WR)); + ret = nouveau_bo_wait(bo, (flags & NOUVEAU_BO_WR), + (flags & NOUVEAU_BO_NOWAIT), 0); if (ret) return ret; } @@ -633,10 +464,9 @@ nouveau_bo_map(struct nouveau_bo *bo, uint32_t flags) void nouveau_bo_unmap(struct nouveau_bo *bo) { - struct nouveau_device_priv *nvdev = nouveau_device(bo->device); struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - if (nvdev->mm_enabled && bo->map && !nvbo->sysmem) { + if (bo->map && !nvbo->sysmem) { struct nouveau_device_priv *nvdev = nouveau_device(bo->device); struct drm_nouveau_gem_cpu_fini req; @@ -648,95 +478,6 @@ nouveau_bo_unmap(struct nouveau_bo *bo) bo->map = NULL; } -int -nouveau_bo_validate_nomm(struct nouveau_bo_priv *nvbo, uint32_t flags) -{ - struct nouveau_bo *new = NULL; - uint32_t t_handle, t_domain, t_offset, t_size, t_maph; - void *t_map; - int ret; - - if ((flags & NOUVEAU_BO_VRAM) && nvbo->domain == NOUVEAU_BO_VRAM) - return 0; - if ((flags & NOUVEAU_BO_GART) && nvbo->domain == NOUVEAU_BO_GART) - return 0; - assert(flags & (NOUVEAU_BO_VRAM|NOUVEAU_BO_GART)); - - /* Keep tiling info */ - flags |= (nvbo->flags & (NOUVEAU_BO_TILED|NOUVEAU_BO_ZTILE)); - - ret = nouveau_bo_new(nvbo->base.device, flags, 0, nvbo->size, &new); - if (ret) - return ret; - - ret = nouveau_bo_kalloc(nouveau_bo(new), NULL); - if (ret) { - nouveau_bo_ref(NULL, &new); - return ret; - } - - if (nvbo->handle || nvbo->sysmem) { - nouveau_bo_kmap(nouveau_bo(new)); - - if (!nvbo->base.map) { - nouveau_bo_map(&nvbo->base, NOUVEAU_BO_RD); - memcpy(nouveau_bo(new)->map, nvbo->base.map, nvbo->base.size); - nouveau_bo_unmap(&nvbo->base); - } else { - memcpy(nouveau_bo(new)->map, nvbo->base.map, nvbo->base.size); - } - } - - t_handle = nvbo->handle; - t_maph = nvbo->map_handle; - t_domain = nvbo->domain; - t_offset = nvbo->offset; - t_size = nvbo->size; - t_map = nvbo->map; - - nvbo->handle = nouveau_bo(new)->handle; - nvbo->map_handle = nouveau_bo(new)->map_handle; - nvbo->domain = nouveau_bo(new)->domain; - nvbo->offset = nouveau_bo(new)->offset; - nvbo->size = nouveau_bo(new)->size; - nvbo->map = nouveau_bo(new)->map; - - nouveau_bo(new)->handle = t_handle; - nouveau_bo(new)->map_handle = t_maph; - nouveau_bo(new)->domain = t_domain; - nouveau_bo(new)->offset = t_offset; - nouveau_bo(new)->size = t_size; - nouveau_bo(new)->map = t_map; - - nouveau_bo_ref(NULL, &new); - - return 0; -} - -static int -nouveau_bo_pin_nomm(struct nouveau_bo *bo, uint32_t flags) -{ - struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - int ret; - - if (!nvbo->handle) { - if (!(flags & (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART))) - return -EINVAL; - - ret = nouveau_bo_validate_nomm(nvbo, flags & ~NOUVEAU_BO_PIN); - if (ret) - return ret; - } - - nvbo->pinned = 1; - - /* Fill in public nouveau_bo members */ - bo->flags = nvbo->domain; - bo->offset = nvbo->offset; - - return 0; -} - int nouveau_bo_pin(struct nouveau_bo *bo, uint32_t flags) { @@ -748,9 +489,6 @@ nouveau_bo_pin(struct nouveau_bo *bo, uint32_t flags) if (nvbo->pinned) return 0; - if (!nvdev->mm_enabled) - return nouveau_bo_pin_nomm(bo, flags); - /* Ensure we have a kernel object... */ if (!nvbo->flags) { if (!(flags & (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART))) @@ -801,80 +539,16 @@ nouveau_bo_unpin(struct nouveau_bo *bo) if (!nvbo->pinned) return; - if (nvdev->mm_enabled) { - req.handle = nvbo->handle; - drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_UNPIN, - &req, sizeof(req)); - } + req.handle = nvbo->handle; + drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_UNPIN, &req, sizeof(req)); nvbo->pinned = bo->offset = bo->flags = 0; } -int -nouveau_bo_tile(struct nouveau_bo *bo, uint32_t flags, uint32_t delta, - uint32_t size) -{ - struct nouveau_device_priv *nvdev = nouveau_device(bo->device); - struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - uint32_t kern_flags = 0; - int ret = 0; - - if (flags & NOUVEAU_BO_TILED) { - kern_flags |= NOUVEAU_MEM_TILE; - if (flags & NOUVEAU_BO_ZTILE) - kern_flags |= NOUVEAU_MEM_TILE_ZETA; - } - - if (nvdev->mm_enabled) { - struct drm_nouveau_gem_tile req; - - req.handle = nvbo->handle; - req.delta = delta; - req.size = size; - req.flags = kern_flags; - ret = drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_TILE, - &req, sizeof(req)); - } else { - struct drm_nouveau_mem_tile req; - - req.offset = nvbo->offset; - req.delta = delta; - req.size = size; - req.flags = kern_flags; - - if (flags & NOUVEAU_BO_VRAM) - req.flags |= NOUVEAU_MEM_FB; - if (flags & NOUVEAU_BO_GART) - req.flags |= NOUVEAU_MEM_AGP; - - ret = drmCommandWrite(nvdev->fd, DRM_NOUVEAU_MEM_TILE, - &req, sizeof(req)); - } - - return 0; -} - int nouveau_bo_busy(struct nouveau_bo *bo, uint32_t access) { - struct nouveau_device_priv *nvdev = nouveau_device(bo->device); - struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - - if (!nvdev->mm_enabled) { - struct nouveau_fence *fence; - - if (nvbo->pending && (nvbo->pending->write_domains || - (access & NOUVEAU_BO_WR))) - return 1; - - if (access & NOUVEAU_BO_WR) - fence = nvbo->fence; - else - fence = nvbo->wr_fence; - return !nouveau_fence(fence)->signalled; - } - - return 1; + return nouveau_bo_wait(bo, (access & NOUVEAU_BO_WR), 1, 1); } struct drm_nouveau_gem_pushbuf_bo * @@ -909,7 +583,7 @@ nouveau_bo_emit_buffer(struct nouveau_channel *chan, struct nouveau_bo *bo) } } - if (nvpb->nr_buffers >= NOUVEAU_PUSHBUF_MAX_BUFFERS) + if (nvpb->nr_buffers >= NOUVEAU_GEM_MAX_BUFFERS) return NULL; pbbo = nvpb->buffers + nvpb->nr_buffers++; nvbo->pending = pbbo; -- cgit v1.2.3