void nv50_disp_chan_destroy(struct nv50_disp_chan *chan) { struct nv50_disp_base *base = (void *)nv_object(chan)->parent; base->chan &= ~(1 << chan->chid); nouveau_namedb_destroy(&chan->base); }
int nouveau_client_create_(const char *name, u64 devname, const char *cfg, const char *dbg, int length, void **pobject) { struct nouveau_object *device; struct nouveau_client *client; int ret; device = (void *)nouveau_device_find(devname); if (!device) return -ENODEV; ret = nouveau_namedb_create_(NULL, NULL, &nouveau_client_oclass, NV_CLIENT_CLASS, nouveau_device_sclass, 0, length, pobject); client = *pobject; if (ret) return ret; ret = nouveau_handle_create(nv_object(client), ~0, ~0, nv_object(client), &client->root); if (ret) { nouveau_namedb_destroy(&client->base); return ret; } /* prevent init/fini being called, os in in charge of this */ atomic_set(&nv_object(client)->usecount, 2); nouveau_object_ref(device, &client->device); snprintf(client->name, sizeof(client->name), "%s", name); client->debug = nouveau_dbgopt(dbg, "CLIENT"); return 0; }
static void nouveau_client_dtor(struct nouveau_object *object) { struct nouveau_client *client = (void *)object; nouveau_object_ref(NULL, &client->device); nouveau_handle_destroy(client->root); nouveau_namedb_destroy(&client->base); }
void nouveau_fifo_channel_destroy(struct nouveau_fifo_chan *chan) { struct nouveau_fifo *priv = (void *)nv_object(chan)->engine; unsigned long flags; #ifdef __NetBSD__ if (chan->mapped) { bus_space_unmap(chan->bst, chan->bsh, chan->size); chan->mapped = false; } #else iounmap(chan->user); #endif spin_lock_irqsave(&priv->lock, flags); priv->channel[chan->chid] = NULL; spin_unlock_irqrestore(&priv->lock, flags); nouveau_gpuobj_ref(NULL, &chan->pushgpu); nouveau_object_ref(NULL, (struct nouveau_object **)&chan->pushdma); nouveau_namedb_destroy(&chan->base); }