|
@@ -21,23 +21,19 @@
|
|
|
*
|
|
|
* Authors: Ben Skeggs <bskeggs@redhat.com>
|
|
|
*/
|
|
|
-
|
|
|
-#include <core/object.h>
|
|
|
-#include <core/parent.h>
|
|
|
+#include <core/ioctl.h>
|
|
|
+#include <core/client.h>
|
|
|
+#include <core/engine.h>
|
|
|
#include <core/handle.h>
|
|
|
#include <core/namedb.h>
|
|
|
-#include <core/client.h>
|
|
|
-#include <core/device.h>
|
|
|
-#include <core/ioctl.h>
|
|
|
-#include <core/event.h>
|
|
|
|
|
|
#include <nvif/unpack.h>
|
|
|
#include <nvif/ioctl.h>
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_nop(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_nop(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_nop none;
|
|
|
} *args = data;
|
|
@@ -52,9 +48,9 @@ nvkm_ioctl_nop(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_sclass(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_sclass(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_sclass_v0 v0;
|
|
|
} *args = data;
|
|
@@ -70,8 +66,8 @@ nvkm_ioctl_sclass(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
nv_ioctl(object, "sclass vers %d count %d\n",
|
|
|
args->v0.version, args->v0.count);
|
|
|
if (size == args->v0.count * sizeof(args->v0.oclass[0])) {
|
|
|
- ret = nouveau_parent_lclass(object, args->v0.oclass,
|
|
|
- args->v0.count);
|
|
|
+ ret = nvkm_parent_lclass(object, args->v0.oclass,
|
|
|
+ args->v0.count);
|
|
|
if (ret >= 0) {
|
|
|
args->v0.count = ret;
|
|
|
ret = 0;
|
|
@@ -85,17 +81,17 @@ nvkm_ioctl_sclass(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_new(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
union {
|
|
|
struct nvif_ioctl_new_v0 v0;
|
|
|
} *args = data;
|
|
|
- struct nouveau_client *client = nouveau_client(handle->object);
|
|
|
- struct nouveau_object *engctx = NULL;
|
|
|
- struct nouveau_object *object = NULL;
|
|
|
- struct nouveau_parent *parent;
|
|
|
- struct nouveau_object *engine;
|
|
|
- struct nouveau_oclass *oclass;
|
|
|
+ struct nvkm_client *client = nvkm_client(handle->object);
|
|
|
+ struct nvkm_object *engctx = NULL;
|
|
|
+ struct nvkm_object *object = NULL;
|
|
|
+ struct nvkm_parent *parent;
|
|
|
+ struct nvkm_object *engine;
|
|
|
+ struct nvkm_oclass *oclass;
|
|
|
u32 _handle, _oclass;
|
|
|
int ret;
|
|
|
|
|
@@ -108,8 +104,8 @@ nvkm_ioctl_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
|
|
|
nv_ioctl(client, "new vers %d handle %08x class %08x "
|
|
|
"route %02x token %llx\n",
|
|
|
- args->v0.version, _handle, _oclass,
|
|
|
- args->v0.route, args->v0.token);
|
|
|
+ args->v0.version, _handle, _oclass,
|
|
|
+ args->v0.route, args->v0.token);
|
|
|
|
|
|
if (!nv_iclass(handle->object, NV_PARENT_CLASS)) {
|
|
|
nv_debug(handle->object, "cannot have children (ctor)\n");
|
|
@@ -120,7 +116,7 @@ nvkm_ioctl_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
parent = nv_parent(handle->object);
|
|
|
|
|
|
/* check that parent supports the requested subclass */
|
|
|
- ret = nouveau_parent_sclass(&parent->object, _oclass, &engine, &oclass);
|
|
|
+ ret = nvkm_parent_sclass(&parent->object, _oclass, &engine, &oclass);
|
|
|
if (ret) {
|
|
|
nv_debug(parent, "illegal class 0x%04x\n", _oclass);
|
|
|
goto fail_class;
|
|
@@ -131,7 +127,7 @@ nvkm_ioctl_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
* state calculated at init (ie. default context construction)
|
|
|
*/
|
|
|
if (engine) {
|
|
|
- ret = nouveau_object_inc(engine);
|
|
|
+ ret = nvkm_object_inc(engine);
|
|
|
if (ret)
|
|
|
goto fail_class;
|
|
|
}
|
|
@@ -140,53 +136,53 @@ nvkm_ioctl_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
* between the parent and its children (eg. PGRAPH context)
|
|
|
*/
|
|
|
if (engine && nv_engine(engine)->cclass) {
|
|
|
- ret = nouveau_object_ctor(&parent->object, engine,
|
|
|
- nv_engine(engine)->cclass,
|
|
|
- data, size, &engctx);
|
|
|
+ ret = nvkm_object_ctor(&parent->object, engine,
|
|
|
+ nv_engine(engine)->cclass,
|
|
|
+ data, size, &engctx);
|
|
|
if (ret)
|
|
|
goto fail_engctx;
|
|
|
} else {
|
|
|
- nouveau_object_ref(&parent->object, &engctx);
|
|
|
+ nvkm_object_ref(&parent->object, &engctx);
|
|
|
}
|
|
|
|
|
|
/* finally, create new object and bind it to its handle */
|
|
|
- ret = nouveau_object_ctor(engctx, engine, oclass, data, size, &object);
|
|
|
+ ret = nvkm_object_ctor(engctx, engine, oclass, data, size, &object);
|
|
|
client->data = object;
|
|
|
if (ret)
|
|
|
goto fail_ctor;
|
|
|
|
|
|
- ret = nouveau_object_inc(object);
|
|
|
+ ret = nvkm_object_inc(object);
|
|
|
if (ret)
|
|
|
goto fail_init;
|
|
|
|
|
|
- ret = nouveau_handle_create(&parent->object, handle->name,
|
|
|
- _handle, object, &handle);
|
|
|
+ ret = nvkm_handle_create(&parent->object, handle->name,
|
|
|
+ _handle, object, &handle);
|
|
|
if (ret)
|
|
|
goto fail_handle;
|
|
|
|
|
|
- ret = nouveau_handle_init(handle);
|
|
|
+ ret = nvkm_handle_init(handle);
|
|
|
handle->route = args->v0.route;
|
|
|
handle->token = args->v0.token;
|
|
|
if (ret)
|
|
|
- nouveau_handle_destroy(handle);
|
|
|
+ nvkm_handle_destroy(handle);
|
|
|
|
|
|
fail_handle:
|
|
|
- nouveau_object_dec(object, false);
|
|
|
+ nvkm_object_dec(object, false);
|
|
|
fail_init:
|
|
|
- nouveau_object_ref(NULL, &object);
|
|
|
+ nvkm_object_ref(NULL, &object);
|
|
|
fail_ctor:
|
|
|
- nouveau_object_ref(NULL, &engctx);
|
|
|
+ nvkm_object_ref(NULL, &engctx);
|
|
|
fail_engctx:
|
|
|
if (engine)
|
|
|
- nouveau_object_dec(engine, false);
|
|
|
+ nvkm_object_dec(engine, false);
|
|
|
fail_class:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_del(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_del(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_del none;
|
|
|
} *args = data;
|
|
@@ -195,18 +191,18 @@ nvkm_ioctl_del(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
nv_ioctl(object, "delete size %d\n", size);
|
|
|
if (nvif_unvers(args->none)) {
|
|
|
nv_ioctl(object, "delete\n");
|
|
|
- nouveau_handle_fini(handle, false);
|
|
|
- nouveau_handle_destroy(handle);
|
|
|
+ nvkm_handle_fini(handle, false);
|
|
|
+ nvkm_handle_destroy(handle);
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_mthd(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_mthd(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
- struct nouveau_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
+ struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
union {
|
|
|
struct nvif_ioctl_mthd_v0 v0;
|
|
|
} *args = data;
|
|
@@ -225,10 +221,10 @@ nvkm_ioctl_mthd(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_rd(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_rd(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
- struct nouveau_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
+ struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
union {
|
|
|
struct nvif_ioctl_rd_v0 v0;
|
|
|
} *args = data;
|
|
@@ -237,7 +233,7 @@ nvkm_ioctl_rd(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
nv_ioctl(object, "rd size %d\n", size);
|
|
|
if (nvif_unpack(args->v0, 0, 0, false)) {
|
|
|
nv_ioctl(object, "rd vers %d size %d addr %016llx\n",
|
|
|
- args->v0.version, args->v0.size, args->v0.addr);
|
|
|
+ args->v0.version, args->v0.size, args->v0.addr);
|
|
|
switch (args->v0.size) {
|
|
|
case 1:
|
|
|
if (ret = -ENODEV, ofuncs->rd08) {
|
|
@@ -267,10 +263,10 @@ nvkm_ioctl_rd(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_wr(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_wr(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
- struct nouveau_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
+ struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
union {
|
|
|
struct nvif_ioctl_wr_v0 v0;
|
|
|
} *args = data;
|
|
@@ -310,10 +306,10 @@ nvkm_ioctl_wr(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_map(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_map(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
- struct nouveau_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
+ struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
union {
|
|
|
struct nvif_ioctl_map_v0 v0;
|
|
|
} *args = data;
|
|
@@ -332,9 +328,9 @@ nvkm_ioctl_map(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_unmap(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_unmap(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_unmap none;
|
|
|
} *args = data;
|
|
@@ -349,10 +345,10 @@ nvkm_ioctl_unmap(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_ntfy_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_ntfy_new(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
- struct nouveau_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
+ struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
|
|
|
union {
|
|
|
struct nvif_ioctl_ntfy_new_v0 v0;
|
|
|
} *args = data;
|
|
@@ -378,10 +374,10 @@ nvkm_ioctl_ntfy_new(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_ntfy_del(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_ntfy_del(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_client *client = nouveau_client(handle->object);
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_client *client = nvkm_client(handle->object);
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_ntfy_del_v0 v0;
|
|
|
} *args = data;
|
|
@@ -398,10 +394,10 @@ nvkm_ioctl_ntfy_del(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_ntfy_get(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_ntfy_get(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_client *client = nouveau_client(handle->object);
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_client *client = nvkm_client(handle->object);
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_ntfy_get_v0 v0;
|
|
|
} *args = data;
|
|
@@ -418,10 +414,10 @@ nvkm_ioctl_ntfy_get(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_ntfy_put(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
+nvkm_ioctl_ntfy_put(struct nvkm_handle *handle, void *data, u32 size)
|
|
|
{
|
|
|
- struct nouveau_client *client = nouveau_client(handle->object);
|
|
|
- struct nouveau_object *object = handle->object;
|
|
|
+ struct nvkm_client *client = nvkm_client(handle->object);
|
|
|
+ struct nvkm_object *object = handle->object;
|
|
|
union {
|
|
|
struct nvif_ioctl_ntfy_put_v0 v0;
|
|
|
} *args = data;
|
|
@@ -439,7 +435,7 @@ nvkm_ioctl_ntfy_put(struct nouveau_handle *handle, void *data, u32 size)
|
|
|
|
|
|
static struct {
|
|
|
int version;
|
|
|
- int (*func)(struct nouveau_handle *, void *, u32);
|
|
|
+ int (*func)(struct nvkm_handle *, void *, u32);
|
|
|
}
|
|
|
nvkm_ioctl_v0[] = {
|
|
|
{ 0x00, nvkm_ioctl_nop },
|
|
@@ -458,13 +454,12 @@ nvkm_ioctl_v0[] = {
|
|
|
};
|
|
|
|
|
|
static int
|
|
|
-nvkm_ioctl_path(struct nouveau_handle *parent, u32 type, u32 nr,
|
|
|
- u32 *path, void *data, u32 size,
|
|
|
- u8 owner, u8 *route, u64 *token)
|
|
|
+nvkm_ioctl_path(struct nvkm_handle *parent, u32 type, u32 nr, u32 *path,
|
|
|
+ void *data, u32 size, u8 owner, u8 *route, u64 *token)
|
|
|
{
|
|
|
- struct nouveau_handle *handle = parent;
|
|
|
- struct nouveau_namedb *namedb;
|
|
|
- struct nouveau_object *object;
|
|
|
+ struct nvkm_handle *handle = parent;
|
|
|
+ struct nvkm_namedb *namedb;
|
|
|
+ struct nvkm_object *object;
|
|
|
int ret;
|
|
|
|
|
|
while ((object = parent->object), nr--) {
|
|
@@ -475,16 +470,15 @@ nvkm_ioctl_path(struct nouveau_handle *parent, u32 type, u32 nr,
|
|
|
}
|
|
|
|
|
|
if (!(namedb = (void *)nv_pclass(object, NV_NAMEDB_CLASS)) ||
|
|
|
- !(handle = nouveau_namedb_get(namedb, path[nr]))) {
|
|
|
+ !(handle = nvkm_namedb_get(namedb, path[nr]))) {
|
|
|
nv_debug(object, "handle 0x%08x not found\n", path[nr]);
|
|
|
return -ENOENT;
|
|
|
}
|
|
|
- nouveau_namedb_put(handle);
|
|
|
+ nvkm_namedb_put(handle);
|
|
|
parent = handle;
|
|
|
}
|
|
|
|
|
|
- if (owner != NVIF_IOCTL_V0_OWNER_ANY &&
|
|
|
- owner != handle->route) {
|
|
|
+ if (owner != NVIF_IOCTL_V0_OWNER_ANY && owner != handle->route) {
|
|
|
nv_ioctl(object, "object route != owner\n");
|
|
|
return -EACCES;
|
|
|
}
|
|
@@ -492,16 +486,15 @@ nvkm_ioctl_path(struct nouveau_handle *parent, u32 type, u32 nr,
|
|
|
*token = handle->token;
|
|
|
|
|
|
if (ret = -EINVAL, type < ARRAY_SIZE(nvkm_ioctl_v0)) {
|
|
|
- if (nvkm_ioctl_v0[type].version == 0) {
|
|
|
+ if (nvkm_ioctl_v0[type].version == 0)
|
|
|
ret = nvkm_ioctl_v0[type].func(handle, data, size);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-nvkm_ioctl(struct nouveau_client *client, bool supervisor,
|
|
|
+nvkm_ioctl(struct nvkm_client *client, bool supervisor,
|
|
|
void *data, u32 size, void **hack)
|
|
|
{
|
|
|
union {
|
|
@@ -519,7 +512,7 @@ nvkm_ioctl(struct nouveau_client *client, bool supervisor,
|
|
|
ret = nvkm_ioctl_path(client->root, args->v0.type,
|
|
|
args->v0.path_nr, args->v0.path,
|
|
|
data, size, args->v0.owner,
|
|
|
- &args->v0.route, &args->v0.token);
|
|
|
+ &args->v0.route, &args->v0.token);
|
|
|
}
|
|
|
|
|
|
nv_ioctl(client, "return %d\n", ret);
|
|
@@ -527,6 +520,7 @@ nvkm_ioctl(struct nouveau_client *client, bool supervisor,
|
|
|
*hack = client->data;
|
|
|
client->data = NULL;
|
|
|
}
|
|
|
+
|
|
|
client->super = false;
|
|
|
return ret;
|
|
|
}
|