drm/nouveau/core: move handle-based object apis to handle.c
authorBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 18:10:20 +0000 (04:10 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 19:13:01 +0000 (05:13 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/core/handle.c
drivers/gpu/drm/nouveau/core/core/object.c
drivers/gpu/drm/nouveau/core/include/core/handle.h
drivers/gpu/drm/nouveau/core/include/core/object.h

index 264c2b338ac3a23fc82e1f6594d58dffcf8547d8..734777ce43f4d9f45b375b0bf1b237bcc8a0c93c 100644 (file)
@@ -224,3 +224,116 @@ nouveau_handle_put(struct nouveau_handle *handle)
        if (handle)
                nouveau_namedb_put(handle);
 }
+
+int
+nouveau_handle_new(struct nouveau_object *client, u32 _parent, u32 _handle,
+                  u16 _oclass, void *data, u32 size,
+                  struct nouveau_object **pobject)
+{
+       struct nouveau_object *parent = NULL;
+       struct nouveau_object *engctx = NULL;
+       struct nouveau_object *object = NULL;
+       struct nouveau_object *engine;
+       struct nouveau_oclass *oclass;
+       struct nouveau_handle *handle;
+       int ret;
+
+       /* lookup parent object and ensure it *is* a parent */
+       parent = nouveau_handle_ref(client, _parent);
+       if (!parent) {
+               nv_error(client, "parent 0x%08x not found\n", _parent);
+               return -ENOENT;
+       }
+
+       if (!nv_iclass(parent, NV_PARENT_CLASS)) {
+               nv_error(parent, "cannot have children\n");
+               ret = -EINVAL;
+               goto fail_class;
+       }
+
+       /* check that parent supports the requested subclass */
+       ret = nouveau_parent_sclass(parent, _oclass, &engine, &oclass);
+       if (ret) {
+               nv_debug(parent, "illegal class 0x%04x\n", _oclass);
+               goto fail_class;
+       }
+
+       /* make sure engine init has been completed *before* any objects
+        * it controls are created - the constructors may depend on
+        * state calculated at init (ie. default context construction)
+        */
+       if (engine) {
+               ret = nouveau_object_inc(engine);
+               if (ret)
+                       goto fail_class;
+       }
+
+       /* if engine requires it, create a context object to insert
+        * between the parent and its children (eg. PGRAPH context)
+        */
+       if (engine && nv_engine(engine)->cclass) {
+               ret = nouveau_object_ctor(parent, engine,
+                                         nv_engine(engine)->cclass,
+                                         data, size, &engctx);
+               if (ret)
+                       goto fail_engctx;
+       } else {
+               nouveau_object_ref(parent, &engctx);
+       }
+
+       /* finally, create new object and bind it to its handle */
+       ret = nouveau_object_ctor(engctx, engine, oclass, data, size, &object);
+       *pobject = object;
+       if (ret)
+               goto fail_ctor;
+
+       ret = nouveau_object_inc(object);
+       if (ret)
+               goto fail_init;
+
+       ret = nouveau_handle_create(parent, _parent, _handle, object, &handle);
+       if (ret)
+               goto fail_handle;
+
+       ret = nouveau_handle_init(handle);
+       if (ret)
+               nouveau_handle_destroy(handle);
+
+fail_handle:
+       nouveau_object_dec(object, false);
+fail_init:
+       nouveau_object_ref(NULL, &object);
+fail_ctor:
+       nouveau_object_ref(NULL, &engctx);
+fail_engctx:
+       if (engine)
+               nouveau_object_dec(engine, false);
+fail_class:
+       nouveau_object_ref(NULL, &parent);
+       return ret;
+}
+
+int
+nouveau_handle_del(struct nouveau_object *client, u32 _parent, u32 _handle)
+{
+       struct nouveau_object *parent = NULL;
+       struct nouveau_object *namedb = NULL;
+       struct nouveau_handle *handle = NULL;
+
+       parent = nouveau_handle_ref(client, _parent);
+       if (!parent)
+               return -ENOENT;
+
+       namedb = nv_pclass(parent, NV_NAMEDB_CLASS);
+       if (namedb) {
+               handle = nouveau_namedb_get(nv_namedb(namedb), _handle);
+               if (handle) {
+                       nouveau_namedb_put(handle);
+                       nouveau_handle_fini(handle, false);
+                       nouveau_handle_destroy(handle);
+               }
+       }
+
+       nouveau_object_ref(NULL, &parent);
+       return handle ? 0 : -EINVAL;
+}
index 3776fbacf68546ba8bd8586651c72b5277089795..d6fea944a5a7808248cc823133536ef9cf2f0956 100644 (file)
@@ -23,9 +23,6 @@
  */
 
 #include <core/object.h>
-#include <core/parent.h>
-#include <core/namedb.h>
-#include <core/handle.h>
 #include <core/engine.h>
 
 #ifdef NOUVEAU_OBJECT_MAGIC
@@ -164,119 +161,6 @@ nouveau_object_ref(struct nouveau_object *obj, struct nouveau_object **ref)
        *ref = obj;
 }
 
-int
-nouveau_object_new(struct nouveau_object *client, u32 _parent, u32 _handle,
-                  u16 _oclass, void *data, u32 size,
-                  struct nouveau_object **pobject)
-{
-       struct nouveau_object *parent = NULL;
-       struct nouveau_object *engctx = NULL;
-       struct nouveau_object *object = NULL;
-       struct nouveau_object *engine;
-       struct nouveau_oclass *oclass;
-       struct nouveau_handle *handle;
-       int ret;
-
-       /* lookup parent object and ensure it *is* a parent */
-       parent = nouveau_handle_ref(client, _parent);
-       if (!parent) {
-               nv_error(client, "parent 0x%08x not found\n", _parent);
-               return -ENOENT;
-       }
-
-       if (!nv_iclass(parent, NV_PARENT_CLASS)) {
-               nv_error(parent, "cannot have children\n");
-               ret = -EINVAL;
-               goto fail_class;
-       }
-
-       /* check that parent supports the requested subclass */
-       ret = nouveau_parent_sclass(parent, _oclass, &engine, &oclass);
-       if (ret) {
-               nv_debug(parent, "illegal class 0x%04x\n", _oclass);
-               goto fail_class;
-       }
-
-       /* make sure engine init has been completed *before* any objects
-        * it controls are created - the constructors may depend on
-        * state calculated at init (ie. default context construction)
-        */
-       if (engine) {
-               ret = nouveau_object_inc(engine);
-               if (ret)
-                       goto fail_class;
-       }
-
-       /* if engine requires it, create a context object to insert
-        * between the parent and its children (eg. PGRAPH context)
-        */
-       if (engine && nv_engine(engine)->cclass) {
-               ret = nouveau_object_ctor(parent, engine,
-                                         nv_engine(engine)->cclass,
-                                         data, size, &engctx);
-               if (ret)
-                       goto fail_engctx;
-       } else {
-               nouveau_object_ref(parent, &engctx);
-       }
-
-       /* finally, create new object and bind it to its handle */
-       ret = nouveau_object_ctor(engctx, engine, oclass, data, size, &object);
-       *pobject = object;
-       if (ret)
-               goto fail_ctor;
-
-       ret = nouveau_object_inc(object);
-       if (ret)
-               goto fail_init;
-
-       ret = nouveau_handle_create(parent, _parent, _handle, object, &handle);
-       if (ret)
-               goto fail_handle;
-
-       ret = nouveau_handle_init(handle);
-       if (ret)
-               nouveau_handle_destroy(handle);
-
-fail_handle:
-       nouveau_object_dec(object, false);
-fail_init:
-       nouveau_object_ref(NULL, &object);
-fail_ctor:
-       nouveau_object_ref(NULL, &engctx);
-fail_engctx:
-       if (engine)
-               nouveau_object_dec(engine, false);
-fail_class:
-       nouveau_object_ref(NULL, &parent);
-       return ret;
-}
-
-int
-nouveau_object_del(struct nouveau_object *client, u32 _parent, u32 _handle)
-{
-       struct nouveau_object *parent = NULL;
-       struct nouveau_object *namedb = NULL;
-       struct nouveau_handle *handle = NULL;
-
-       parent = nouveau_handle_ref(client, _parent);
-       if (!parent)
-               return -ENOENT;
-
-       namedb = nv_pclass(parent, NV_NAMEDB_CLASS);
-       if (namedb) {
-               handle = nouveau_namedb_get(nv_namedb(namedb), _handle);
-               if (handle) {
-                       nouveau_namedb_put(handle);
-                       nouveau_handle_fini(handle, false);
-                       nouveau_handle_destroy(handle);
-               }
-       }
-
-       nouveau_object_ref(NULL, &parent);
-       return handle ? 0 : -EINVAL;
-}
-
 int
 nouveau_object_inc(struct nouveau_object *object)
 {
index 363674cdf8ab9c86f18783d2de91edd6cebeae6a..b4789a2e5859feac801fd531be1c26fced642fc8 100644 (file)
@@ -20,6 +20,11 @@ void nouveau_handle_destroy(struct nouveau_handle *);
 int  nouveau_handle_init(struct nouveau_handle *);
 int  nouveau_handle_fini(struct nouveau_handle *, bool suspend);
 
+int  nouveau_handle_new(struct nouveau_object *, u32 parent, u32 handle,
+                       u16 oclass, void *data, u32 size,
+                       struct nouveau_object **);
+int  nouveau_handle_del(struct nouveau_object *, u32 parent, u32 handle);
+
 struct nouveau_object *
 nouveau_handle_ref(struct nouveau_object *, u32 name);
 
index 62e68baef087b17b48fefb0b0478716c75f28b09..c04143b4f7794198ccfb66c2b9df6564197818f5 100644 (file)
@@ -106,10 +106,6 @@ void nouveau_object_ref(struct nouveau_object *, struct nouveau_object **);
 int nouveau_object_inc(struct nouveau_object *);
 int nouveau_object_dec(struct nouveau_object *, bool suspend);
 
-int nouveau_object_new(struct nouveau_object *, u32 parent, u32 handle,
-                      u16 oclass, void *data, u32 size,
-                      struct nouveau_object **);
-int nouveau_object_del(struct nouveau_object *, u32 parent, u32 handle);
 void nouveau_object_debug(void);
 
 static inline int
@@ -199,4 +195,21 @@ nv_memcmp(void *obj, u32 addr, const char *str, u32 len)
        return 0;
 }
 
+#include <core/handle.h>
+
+static inline int
+nouveau_object_new(struct nouveau_object *client, u32 parent, u32 handle,
+                  u16 oclass, void *data, u32 size,
+                  struct nouveau_object **pobject)
+{
+       return nouveau_handle_new(client, parent, handle, oclass,
+                                 data, size, pobject);
+}
+
+static inline int
+nouveau_object_del(struct nouveau_object *client, u32 parent, u32 handle)
+{
+       return nouveau_handle_del(client, parent, handle);
+}
+
 #endif