summaryrefslogtreecommitdiff
path: root/nouveau
diff options
context:
space:
mode:
Diffstat (limited to 'nouveau')
-rw-r--r--nouveau/nouveau_bo.c41
1 files changed, 17 insertions, 24 deletions
diff --git a/nouveau/nouveau_bo.c b/nouveau/nouveau_bo.c
index ae11b689..10cc8a67 100644
--- a/nouveau/nouveau_bo.c
+++ b/nouveau/nouveau_bo.c
@@ -59,7 +59,7 @@ nouveau_bo_info(struct nouveau_bo_priv *nvbo, struct drm_nouveau_gem_info *arg)
static int
nouveau_bo_allocated(struct nouveau_bo_priv *nvbo)
{
- if (nvbo->sysmem || nvbo->handle || (nvbo->flags & NOUVEAU_BO_PIN))
+ if (nvbo->sysmem || nvbo->handle)
return 1;
return 0;
}
@@ -116,7 +116,7 @@ nouveau_bo_kalloc(struct nouveau_bo_priv *nvbo, struct nouveau_channel *chan)
struct drm_nouveau_gem_info *info = &req.info;
int ret;
- if (nvbo->handle || (nvbo->flags & NOUVEAU_BO_PIN))
+ if (nvbo->handle)
return 0;
req.channel_hint = chan ? chan->id : 0;
@@ -191,20 +191,24 @@ nouveau_bo_new_tile(struct nouveau_device *dev, uint32_t flags, int align,
nvbo->base.tile_flags = tile_flags;
nvbo->refcount = 1;
- /* Don't set NOUVEAU_BO_PIN here, or nouveau_bo_allocated() will
- * decided the buffer's already allocated when it's not. The
- * call to nouveau_bo_pin() later will set this flag.
- */
- nvbo->flags = (flags & ~NOUVEAU_BO_PIN);
+ nvbo->flags = flags;
nvbo->size = size;
nvbo->align = align;
- if (flags & NOUVEAU_BO_PIN) {
- ret = nouveau_bo_pin((void *)nvbo, nvbo->flags);
+ if (flags & (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)) {
+ ret = nouveau_bo_kalloc(nvbo, NULL);
if (ret) {
nouveau_bo_ref(NULL, (void *)nvbo);
return ret;
}
+
+ if (flags & NOUVEAU_BO_PIN) {
+ ret = nouveau_bo_pin((void *)nvbo, nvbo->flags);
+ if (ret) {
+ nouveau_bo_ref(NULL, (void *)nvbo);
+ return ret;
+ }
+ }
}
*bo = &nvbo->base;
@@ -489,25 +493,15 @@ nouveau_bo_pin(struct nouveau_bo *bo, uint32_t flags)
if (nvbo->pinned)
return 0;
- /* Ensure we have a kernel object... */
- if (!nvbo->flags) {
- if (!(flags & (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)))
- return -EINVAL;
- nvbo->flags = flags;
- }
-
- if (!nvbo->handle) {
- ret = nouveau_bo_kalloc(nvbo, NULL);
- if (ret)
- return ret;
- }
+ if (!nvbo->handle)
+ return -EINVAL;
/* Now force it to stay put :) */
req.handle = nvbo->handle;
req.domain = 0;
- if (nvbo->flags & NOUVEAU_BO_VRAM)
+ if (flags & NOUVEAU_BO_VRAM)
req.domain |= NOUVEAU_GEM_DOMAIN_VRAM;
- if (nvbo->flags & NOUVEAU_BO_GART)
+ if (flags & NOUVEAU_BO_GART)
req.domain |= NOUVEAU_GEM_DOMAIN_GART;
ret = drmCommandWriteRead(nvdev->fd, DRM_NOUVEAU_GEM_PIN, &req,
@@ -517,7 +511,6 @@ nouveau_bo_pin(struct nouveau_bo *bo, uint32_t flags)
nvbo->offset = req.offset;
nvbo->domain = req.domain;
nvbo->pinned = 1;
- nvbo->flags |= NOUVEAU_BO_PIN;
/* Fill in public nouveau_bo members */
if (nvbo->domain & NOUVEAU_GEM_DOMAIN_VRAM)