mirror of https://gitee.com/openkylin/linux.git
drm/nouveau/core: object.engine is always a nouveau_engine now
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
8000fb2191
commit
ec0e55420d
|
@ -102,7 +102,7 @@ nouveau_engctx_create_(struct nouveau_object *parent,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client->vm)
|
if (client->vm)
|
||||||
atomic_inc(&client->vm->engref[nv_engidx(engobj)]);
|
atomic_inc(&client->vm->engref[nv_engidx(engine)]);
|
||||||
list_add(&nv_engctx(engctx)->head, &engine->contexts);
|
list_add(&nv_engctx(engctx)->head, &engine->contexts);
|
||||||
nv_engctx(engctx)->addr = ~0ULL;
|
nv_engctx(engctx)->addr = ~0ULL;
|
||||||
spin_unlock_irqrestore(&engine->lock, save);
|
spin_unlock_irqrestore(&engine->lock, save);
|
||||||
|
@ -112,8 +112,7 @@ nouveau_engctx_create_(struct nouveau_object *parent,
|
||||||
void
|
void
|
||||||
nouveau_engctx_destroy(struct nouveau_engctx *engctx)
|
nouveau_engctx_destroy(struct nouveau_engctx *engctx)
|
||||||
{
|
{
|
||||||
struct nouveau_object *engobj = nv_object(engctx)->engine;
|
struct nouveau_engine *engine = engctx->gpuobj.object.engine;
|
||||||
struct nouveau_engine *engine = nv_engine(engobj);
|
|
||||||
struct nouveau_client *client = nouveau_client(engctx);
|
struct nouveau_client *client = nouveau_client(engctx);
|
||||||
unsigned long save;
|
unsigned long save;
|
||||||
|
|
||||||
|
@ -123,7 +122,7 @@ nouveau_engctx_destroy(struct nouveau_engctx *engctx)
|
||||||
spin_unlock_irqrestore(&engine->lock, save);
|
spin_unlock_irqrestore(&engine->lock, save);
|
||||||
|
|
||||||
if (client->vm)
|
if (client->vm)
|
||||||
atomic_dec(&client->vm->engref[nv_engidx(engobj)]);
|
atomic_dec(&client->vm->engref[nv_engidx(engine)]);
|
||||||
|
|
||||||
if (engctx->gpuobj.size)
|
if (engctx->gpuobj.size)
|
||||||
nouveau_gpuobj_destroy(&engctx->gpuobj);
|
nouveau_gpuobj_destroy(&engctx->gpuobj);
|
||||||
|
|
|
@ -53,7 +53,7 @@ nouveau_engine_create_(struct nouveau_object *parent,
|
||||||
|
|
||||||
if (parent) {
|
if (parent) {
|
||||||
struct nouveau_device *device = nv_device(parent);
|
struct nouveau_device *device = nv_device(parent);
|
||||||
int engidx = nv_engidx(nv_object(engine));
|
int engidx = nv_engidx(engine);
|
||||||
|
|
||||||
if (device->disable_mask & (1ULL << engidx)) {
|
if (device->disable_mask & (1ULL << engidx)) {
|
||||||
if (!nouveau_boolopt(device->cfgopt, iname, false)) {
|
if (!nouveau_boolopt(device->cfgopt, iname, false)) {
|
||||||
|
|
|
@ -229,7 +229,7 @@ nouveau_gpuobj_new(struct nouveau_object *parent, struct nouveau_object *pargpu,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!nv_iclass(engine, NV_SUBDEV_CLASS))
|
if (!nv_iclass(engine, NV_SUBDEV_CLASS))
|
||||||
engine = engine->engine;
|
engine = &engine->engine->subdev.object;
|
||||||
BUG_ON(engine == NULL);
|
BUG_ON(engine == NULL);
|
||||||
|
|
||||||
return nouveau_object_ctor(parent, engine, &_nouveau_gpuobj_oclass,
|
return nouveau_object_ctor(parent, engine, &_nouveau_gpuobj_oclass,
|
||||||
|
@ -310,7 +310,7 @@ nouveau_gpuobj_dup(struct nouveau_object *parent, struct nouveau_gpuobj *base,
|
||||||
struct nouveau_gpuobj *gpuobj;
|
struct nouveau_gpuobj *gpuobj;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = nouveau_object_create(parent, parent->engine,
|
ret = nouveau_object_create(parent, &parent->engine->subdev.object,
|
||||||
&nouveau_gpudup_oclass, 0, &gpuobj);
|
&nouveau_gpudup_oclass, 0, &gpuobj);
|
||||||
*pgpuobj = gpuobj;
|
*pgpuobj = gpuobj;
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -43,7 +43,7 @@ nouveau_object_create_(struct nouveau_object *parent,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
nouveau_object_ref(parent, &object->parent);
|
nouveau_object_ref(parent, &object->parent);
|
||||||
nouveau_object_ref(engine, &object->engine);
|
nouveau_object_ref(engine, (struct nouveau_object **)&object->engine);
|
||||||
object->oclass = oclass;
|
object->oclass = oclass;
|
||||||
object->oclass->handle |= pclass;
|
object->oclass->handle |= pclass;
|
||||||
atomic_set(&object->refcount, 1);
|
atomic_set(&object->refcount, 1);
|
||||||
|
@ -77,7 +77,7 @@ nouveau_object_destroy(struct nouveau_object *object)
|
||||||
list_del(&object->list);
|
list_del(&object->list);
|
||||||
spin_unlock(&_objlist_lock);
|
spin_unlock(&_objlist_lock);
|
||||||
#endif
|
#endif
|
||||||
nouveau_object_ref(NULL, &object->engine);
|
nouveau_object_ref(NULL, (struct nouveau_object **)&object->engine);
|
||||||
nouveau_object_ref(NULL, &object->parent);
|
nouveau_object_ref(NULL, &object->parent);
|
||||||
kfree(object);
|
kfree(object);
|
||||||
}
|
}
|
||||||
|
@ -182,7 +182,7 @@ nouveau_object_inc(struct nouveau_object *object)
|
||||||
|
|
||||||
if (object->engine) {
|
if (object->engine) {
|
||||||
mutex_lock(&nv_subdev(object->engine)->mutex);
|
mutex_lock(&nv_subdev(object->engine)->mutex);
|
||||||
ret = nouveau_object_inc(object->engine);
|
ret = nouveau_object_inc(&object->engine->subdev.object);
|
||||||
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
nv_error(object, "engine failed, %d\n", ret);
|
nv_error(object, "engine failed, %d\n", ret);
|
||||||
|
@ -203,7 +203,7 @@ nouveau_object_inc(struct nouveau_object *object)
|
||||||
fail_self:
|
fail_self:
|
||||||
if (object->engine) {
|
if (object->engine) {
|
||||||
mutex_lock(&nv_subdev(object->engine)->mutex);
|
mutex_lock(&nv_subdev(object->engine)->mutex);
|
||||||
nouveau_object_dec(object->engine, false);
|
nouveau_object_dec(&object->engine->subdev.object, false);
|
||||||
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
||||||
}
|
}
|
||||||
fail_engine:
|
fail_engine:
|
||||||
|
@ -228,7 +228,7 @@ nouveau_object_decf(struct nouveau_object *object)
|
||||||
|
|
||||||
if (object->engine) {
|
if (object->engine) {
|
||||||
mutex_lock(&nv_subdev(object->engine)->mutex);
|
mutex_lock(&nv_subdev(object->engine)->mutex);
|
||||||
nouveau_object_dec(object->engine, false);
|
nouveau_object_dec(&object->engine->subdev.object, false);
|
||||||
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,7 +255,7 @@ nouveau_object_decs(struct nouveau_object *object)
|
||||||
|
|
||||||
if (object->engine) {
|
if (object->engine) {
|
||||||
mutex_lock(&nv_subdev(object->engine)->mutex);
|
mutex_lock(&nv_subdev(object->engine)->mutex);
|
||||||
ret = nouveau_object_dec(object->engine, true);
|
ret = nouveau_object_dec(&object->engine->subdev.object, true);
|
||||||
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
nv_warn(object, "engine failed suspend, %d\n", ret);
|
nv_warn(object, "engine failed suspend, %d\n", ret);
|
||||||
|
@ -277,7 +277,7 @@ nouveau_object_decs(struct nouveau_object *object)
|
||||||
fail_parent:
|
fail_parent:
|
||||||
if (object->engine) {
|
if (object->engine) {
|
||||||
mutex_lock(&nv_subdev(object->engine)->mutex);
|
mutex_lock(&nv_subdev(object->engine)->mutex);
|
||||||
rret = nouveau_object_inc(object->engine);
|
rret = nouveau_object_inc(&object->engine->subdev.object);
|
||||||
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
mutex_unlock(&nv_subdev(object->engine)->mutex);
|
||||||
if (rret)
|
if (rret)
|
||||||
nv_fatal(object, "engine failed to reinit, %d\n", rret);
|
nv_fatal(object, "engine failed to reinit, %d\n", rret);
|
||||||
|
|
|
@ -39,7 +39,7 @@ nouveau_parent_sclass(struct nouveau_object *parent, u16 handle,
|
||||||
sclass = nv_parent(parent)->sclass;
|
sclass = nv_parent(parent)->sclass;
|
||||||
while (sclass) {
|
while (sclass) {
|
||||||
if ((sclass->oclass->handle & 0xffff) == handle) {
|
if ((sclass->oclass->handle & 0xffff) == handle) {
|
||||||
*pengine = parent->engine;
|
*pengine = &parent->engine->subdev.object;
|
||||||
*poclass = sclass->oclass;
|
*poclass = sclass->oclass;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ nv_printk_(struct nouveau_object *object, int level, const char *fmt, ...)
|
||||||
while (subdev && !nv_iclass(subdev, NV_SUBDEV_CLASS))
|
while (subdev && !nv_iclass(subdev, NV_SUBDEV_CLASS))
|
||||||
subdev = subdev->parent;
|
subdev = subdev->parent;
|
||||||
} else {
|
} else {
|
||||||
subdev = object->engine;
|
subdev = &object->engine->subdev.object;
|
||||||
}
|
}
|
||||||
|
|
||||||
device = subdev;
|
device = subdev;
|
||||||
|
|
|
@ -96,7 +96,7 @@ nouveau_ramht_new(struct nouveau_object *parent, struct nouveau_object *pargpu,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = nouveau_gpuobj_create(parent, parent->engine ?
|
ret = nouveau_gpuobj_create(parent, parent->engine ?
|
||||||
parent->engine : parent, /* <nv50 ramht */
|
&parent->engine->subdev.object : parent, /* <nv50 ramht */
|
||||||
&nouveau_ramht_oclass, 0, pargpu, size,
|
&nouveau_ramht_oclass, 0, pargpu, size,
|
||||||
align, NVOBJ_FLAG_ZERO_ALLOC, &ramht);
|
align, NVOBJ_FLAG_ZERO_ALLOC, &ramht);
|
||||||
*pramht = ramht;
|
*pramht = ramht;
|
||||||
|
|
|
@ -33,7 +33,7 @@ nouveau_subdev(void *obj, int idx)
|
||||||
struct nouveau_object *object = nv_object(obj);
|
struct nouveau_object *object = nv_object(obj);
|
||||||
while (object && !nv_iclass(object, NV_SUBDEV_CLASS))
|
while (object && !nv_iclass(object, NV_SUBDEV_CLASS))
|
||||||
object = object->parent;
|
object = object->parent;
|
||||||
if (object == NULL || nv_subidx(object) != idx)
|
if (object == NULL || nv_subidx(nv_subdev(object)) != idx)
|
||||||
object = nv_device(obj)->subdev[idx];
|
object = nv_device(obj)->subdev[idx];
|
||||||
return object ? nv_subdev(object) : NULL;
|
return object ? nv_subdev(object) : NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ nvc0_copy_init(struct nouveau_object *object)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
nv_wo32(priv, 0x084, nv_engidx(object) - NVDEV_ENGINE_COPY0);
|
nv_wo32(priv, 0x084, nv_engidx(&priv->base.base) - NVDEV_ENGINE_COPY0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ nve0_copy_cclass = {
|
||||||
static void
|
static void
|
||||||
nve0_copy_intr(struct nouveau_subdev *subdev)
|
nve0_copy_intr(struct nouveau_subdev *subdev)
|
||||||
{
|
{
|
||||||
const int ce = nv_subidx(nv_object(subdev)) - NVDEV_ENGINE_COPY0;
|
const int ce = nv_subidx(subdev) - NVDEV_ENGINE_COPY0;
|
||||||
struct nve0_copy_priv *priv = (void *)subdev;
|
struct nve0_copy_priv *priv = (void *)subdev;
|
||||||
u32 stat = nv_rd32(priv, 0x104908 + (ce * 0x1000));
|
u32 stat = nv_rd32(priv, 0x104908 + (ce * 0x1000));
|
||||||
|
|
||||||
|
|
|
@ -516,7 +516,7 @@ nv_device(void *obj)
|
||||||
while (device && device->parent)
|
while (device && device->parent)
|
||||||
device = device->parent;
|
device = device->parent;
|
||||||
} else {
|
} else {
|
||||||
device = nv_object(obj)->engine;
|
device = &nv_object(obj)->engine->subdev.object;
|
||||||
if (device && device->parent)
|
if (device && device->parent)
|
||||||
device = device->parent;
|
device = device->parent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -445,7 +445,6 @@ static void
|
||||||
nvc0_fifo_recover(struct nvc0_fifo_priv *priv, struct nouveau_engine *engine,
|
nvc0_fifo_recover(struct nvc0_fifo_priv *priv, struct nouveau_engine *engine,
|
||||||
struct nvc0_fifo_chan *chan)
|
struct nvc0_fifo_chan *chan)
|
||||||
{
|
{
|
||||||
struct nouveau_object *engobj = nv_object(engine);
|
|
||||||
u32 chid = chan->base.chid;
|
u32 chid = chan->base.chid;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -456,7 +455,7 @@ nvc0_fifo_recover(struct nvc0_fifo_priv *priv, struct nouveau_engine *engine,
|
||||||
chan->state = KILLED;
|
chan->state = KILLED;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->base.lock, flags);
|
spin_lock_irqsave(&priv->base.lock, flags);
|
||||||
priv->mask |= 1ULL << nv_engidx(engobj);
|
priv->mask |= 1ULL << nv_engidx(engine);
|
||||||
spin_unlock_irqrestore(&priv->base.lock, flags);
|
spin_unlock_irqrestore(&priv->base.lock, flags);
|
||||||
schedule_work(&priv->fault);
|
schedule_work(&priv->fault);
|
||||||
}
|
}
|
||||||
|
|
|
@ -471,7 +471,6 @@ static void
|
||||||
nve0_fifo_recover(struct nve0_fifo_priv *priv, struct nouveau_engine *engine,
|
nve0_fifo_recover(struct nve0_fifo_priv *priv, struct nouveau_engine *engine,
|
||||||
struct nve0_fifo_chan *chan)
|
struct nve0_fifo_chan *chan)
|
||||||
{
|
{
|
||||||
struct nouveau_object *engobj = nv_object(engine);
|
|
||||||
u32 chid = chan->base.chid;
|
u32 chid = chan->base.chid;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -482,7 +481,7 @@ nve0_fifo_recover(struct nve0_fifo_priv *priv, struct nouveau_engine *engine,
|
||||||
chan->state = KILLED;
|
chan->state = KILLED;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->base.lock, flags);
|
spin_lock_irqsave(&priv->base.lock, flags);
|
||||||
priv->mask |= 1ULL << nv_engidx(engobj);
|
priv->mask |= 1ULL << nv_engidx(engine);
|
||||||
spin_unlock_irqrestore(&priv->base.lock, flags);
|
spin_unlock_irqrestore(&priv->base.lock, flags);
|
||||||
schedule_work(&priv->fault);
|
schedule_work(&priv->fault);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,9 @@ nv_engine(void *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
nv_engidx(struct nouveau_object *object)
|
nv_engidx(struct nouveau_engine *engine)
|
||||||
{
|
{
|
||||||
return nv_subidx(object);
|
return nv_subidx(&engine->subdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nouveau_engine *nouveau_engine(void *obj, int idx);
|
struct nouveau_engine *nouveau_engine(void *obj, int idx);
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
struct nouveau_object {
|
struct nouveau_object {
|
||||||
struct nouveau_oclass *oclass;
|
struct nouveau_oclass *oclass;
|
||||||
struct nouveau_object *parent;
|
struct nouveau_object *parent;
|
||||||
struct nouveau_object *engine;
|
struct nouveau_engine *engine;
|
||||||
atomic_t refcount;
|
atomic_t refcount;
|
||||||
atomic_t usecount;
|
atomic_t usecount;
|
||||||
#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
|
#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
|
||||||
|
|
|
@ -28,9 +28,9 @@ nv_subdev(void *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
nv_subidx(struct nouveau_object *object)
|
nv_subidx(struct nouveau_subdev *subdev)
|
||||||
{
|
{
|
||||||
return nv_hclass(nv_subdev(object)) & 0xff;
|
return nv_hclass(subdev) & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nouveau_subdev *nouveau_subdev(void *obj, int idx);
|
struct nouveau_subdev *nouveau_subdev(void *obj, int idx);
|
||||||
|
|
|
@ -110,7 +110,7 @@ nouveau_bar_alloc(struct nouveau_bar *bar, struct nouveau_object *parent,
|
||||||
struct nouveau_mem *mem, struct nouveau_object **pobject)
|
struct nouveau_mem *mem, struct nouveau_object **pobject)
|
||||||
{
|
{
|
||||||
struct nouveau_object *gpuobj;
|
struct nouveau_object *gpuobj;
|
||||||
int ret = nouveau_object_ctor(parent, parent->engine,
|
int ret = nouveau_object_ctor(parent, &parent->engine->subdev.object,
|
||||||
&nouveau_barobj_oclass,
|
&nouveau_barobj_oclass,
|
||||||
mem, 0, &gpuobj);
|
mem, 0, &gpuobj);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
|
|
@ -74,8 +74,8 @@ nouveau_instmem_alloc(struct nouveau_instmem *imem,
|
||||||
{
|
{
|
||||||
struct nouveau_instmem_impl *impl = (void *)imem->base.object.oclass;
|
struct nouveau_instmem_impl *impl = (void *)imem->base.object.oclass;
|
||||||
struct nouveau_instobj_args args = { .size = size, .align = align };
|
struct nouveau_instobj_args args = { .size = size, .align = align };
|
||||||
return nouveau_object_ctor(parent, parent->engine, impl->instobj, &args,
|
return nouveau_object_ctor(parent, &parent->engine->subdev.object,
|
||||||
sizeof(args), pobject);
|
impl->instobj, &args, sizeof(args), pobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in New Issue