drm/nouveau/device: convert ctrl class to new-style nvkm_object
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:18 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:39 +0000 (12:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/engine/device/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/device/user.c

index 2467d4e0acf679f012679ca1e3235599374ae4e6..334d64dbb6413d5ea0b9640df3b120c74b1391a1 100644 (file)
@@ -274,6 +274,12 @@ enum nv_bus_type {
 
 void nvkm_device_del(struct nvkm_device **);
 
+struct nvkm_device_oclass {
+       int (*ctor)(struct nvkm_device *, const struct nvkm_oclass *,
+                   void *data, u32 size, struct nvkm_object **);
+       struct nvkm_sclass base;
+};
+
 extern const struct nvkm_sclass nvkm_udevice_sclass;
 
 /* device logging */
index 0abee2d21a78ffbb7f990cd1be668424a349224e..f24990a8d60b7218c993d004b54d2056cbc41579 100644 (file)
@@ -21,7 +21,7 @@
  *
  * Authors: Ben Skeggs <bskeggs@redhat.com>
  */
-#include "priv.h"
+#include "ctrl.h"
 
 #include <core/client.h>
 #include <subdev/clk.h>
 #include <nvif/unpack.h>
 
 static int
-nvkm_control_mthd_pstate_info(struct nvkm_object *object, void *data, u32 size)
+nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size)
 {
        union {
                struct nvif_control_pstate_info_v0 v0;
        } *args = data;
-       struct nvkm_clk *clk = nvkm_clk(object);
+       struct nvkm_clk *clk = ctrl->device->clk;
        int ret;
 
-       nvif_ioctl(object, "control pstate info size %d\n", size);
+       nvif_ioctl(&ctrl->object, "control pstate info size %d\n", size);
        if (nvif_unpack(args->v0, 0, 0, false)) {
-               nvif_ioctl(object, "control pstate info vers %d\n",
+               nvif_ioctl(&ctrl->object, "control pstate info vers %d\n",
                           args->v0.version);
        } else
                return ret;
@@ -64,12 +64,12 @@ nvkm_control_mthd_pstate_info(struct nvkm_object *object, void *data, u32 size)
 }
 
 static int
-nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size)
+nvkm_control_mthd_pstate_attr(struct nvkm_control *ctrl, void *data, u32 size)
 {
        union {
                struct nvif_control_pstate_attr_v0 v0;
        } *args = data;
-       struct nvkm_clk *clk = nvkm_clk(object);
+       struct nvkm_clk *clk = ctrl->device->clk;
        struct nvkm_domain *domain;
        struct nvkm_pstate *pstate;
        struct nvkm_cstate *cstate;
@@ -77,10 +77,10 @@ nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size)
        u32 lo, hi;
        int ret;
 
-       nvif_ioctl(object, "control pstate attr size %d\n", size);
+       nvif_ioctl(&ctrl->object, "control pstate attr size %d\n", size);
        if (nvif_unpack(args->v0, 0, 0, false)) {
-               nvif_ioctl(object, "control pstate attr vers %d state %d "
-                                  "index %d\n",
+               nvif_ioctl(&ctrl->object,
+                          "control pstate attr vers %d state %d index %d\n",
                           args->v0.version, args->v0.state, args->v0.index);
                if (!clk)
                        return -ENODEV;
@@ -137,19 +137,19 @@ nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size)
 }
 
 static int
-nvkm_control_mthd_pstate_user(struct nvkm_object *object, void *data, u32 size)
+nvkm_control_mthd_pstate_user(struct nvkm_control *ctrl, void *data, u32 size)
 {
        union {
                struct nvif_control_pstate_user_v0 v0;
        } *args = data;
-       struct nvkm_clk *clk = nvkm_clk(object);
+       struct nvkm_clk *clk = ctrl->device->clk;
        int ret;
 
-       nvif_ioctl(object, "control pstate user size %d\n", size);
+       nvif_ioctl(&ctrl->object, "control pstate user size %d\n", size);
        if (nvif_unpack(args->v0, 0, 0, false)) {
-               nvif_ioctl(object, "control pstate user vers %d ustate %d "
-                                  "pwrsrc %d\n", args->v0.version,
-                          args->v0.ustate, args->v0.pwrsrc);
+               nvif_ioctl(&ctrl->object,
+                          "control pstate user vers %d ustate %d pwrsrc %d\n",
+                          args->v0.version, args->v0.ustate, args->v0.pwrsrc);
                if (!clk)
                        return -ENODEV;
        } else
@@ -168,32 +168,44 @@ nvkm_control_mthd_pstate_user(struct nvkm_object *object, void *data, u32 size)
 static int
 nvkm_control_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
 {
+       struct nvkm_control *ctrl = nvkm_control(object);
        switch (mthd) {
        case NVIF_CONTROL_PSTATE_INFO:
-               return nvkm_control_mthd_pstate_info(object, data, size);
+               return nvkm_control_mthd_pstate_info(ctrl, data, size);
        case NVIF_CONTROL_PSTATE_ATTR:
-               return nvkm_control_mthd_pstate_attr(object, data, size);
+               return nvkm_control_mthd_pstate_attr(ctrl, data, size);
        case NVIF_CONTROL_PSTATE_USER:
-               return nvkm_control_mthd_pstate_user(object, data, size);
+               return nvkm_control_mthd_pstate_user(ctrl, data, size);
        default:
                break;
        }
        return -EINVAL;
 }
 
-static struct nvkm_ofuncs
-nvkm_control_ofuncs = {
-       .ctor = _nvkm_object_ctor,
-       .dtor = nvkm_object_destroy,
-       .init = _nvkm_object_init,
-       .fini = _nvkm_object_fini,
+static const struct nvkm_object_func
+nvkm_control = {
        .mthd = nvkm_control_mthd,
 };
 
-struct nvkm_oclass
-nvkm_control_oclass[] = {
-       { .handle = NVIF_IOCTL_NEW_V0_CONTROL,
-         .ofuncs = &nvkm_control_ofuncs
-       },
-       {}
+static int
+nvkm_control_new(struct nvkm_device *device, const struct nvkm_oclass *oclass,
+                void *data, u32 size, struct nvkm_object **pobject)
+{
+       struct nvkm_control *ctrl;
+
+       if (!(ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL)))
+               return -ENOMEM;
+       *pobject = &ctrl->object;
+       ctrl->device = device;
+
+       nvkm_object_ctor(&nvkm_control, oclass, &ctrl->object);
+       return 0;
+}
+
+const struct nvkm_device_oclass
+nvkm_control_oclass = {
+       .base.oclass = NVIF_IOCTL_NEW_V0_CONTROL,
+       .base.minver = -1,
+       .base.maxver = -1,
+       .ctor = nvkm_control_new,
 };
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.h b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.h
new file mode 100644 (file)
index 0000000..20249d8
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __NVKM_DEVICE_CTRL_H__
+#define __NVKM_DEVICE_CTRL_H__
+#define nvkm_control(p) container_of((p), struct nvkm_control, object)
+#include <core/device.h>
+
+struct nvkm_control {
+       struct nvkm_object object;
+       struct nvkm_device *device;
+};
+
+extern const struct nvkm_device_oclass nvkm_control_oclass;
+#endif
index 59e9026624080ceaf0e476f068420396f9c405d5..76b441ddc71339530c15584dfbff02af9fdd25d2 100644 (file)
@@ -47,8 +47,6 @@ int  nvkm_device_ctor(const struct nvkm_device_func *,
 int  nvkm_device_init(struct nvkm_device *);
 int  nvkm_device_fini(struct nvkm_device *, bool suspend);
 
-extern struct nvkm_oclass nvkm_control_oclass[];
-
 int nv04_identify(struct nvkm_device *);
 int nv10_identify(struct nvkm_device *);
 int nv20_identify(struct nvkm_device *);
index fb4d04dc9340fc2ae5c142bc0b45cc32c1b19d1a..d9d15385d0ad9fc9cb63658fa31db5073b488bef 100644 (file)
@@ -23,6 +23,7 @@
  */
 #define nvkm_udevice(p) container_of((p), struct nvkm_udevice, object)
 #include "priv.h"
+#include "ctrl.h"
 
 #include <core/client.h>
 #include <core/parent.h>
@@ -280,10 +281,8 @@ nvkm_udevice_child_new(const struct nvkm_oclass *oclass,
                       void *data, u32 size, struct nvkm_object **pobject)
 {
        struct nvkm_udevice *udev = nvkm_udevice(oclass->parent);
-       const struct nvkm_oclass *sclass = oclass->priv;
-       return nvkm_object_old(&udev->object, NULL,
-                              (struct nvkm_oclass *)sclass,
-                              data, size, pobject);
+       const struct nvkm_device_oclass *sclass = oclass->priv;
+       return sclass->ctor(udev->device, oclass, data, size, pobject);
 }
 
 static int
@@ -297,6 +296,7 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
                   (1ULL << NVDEV_ENGINE_FIFO) |
                   (1ULL << NVDEV_ENGINE_DISP) |
                   (1ULL << NVDEV_ENGINE_PM);
+       const struct nvkm_device_oclass *sclass;
        int i;
 
        for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) {
@@ -319,16 +319,16 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
                }
        }
 
-       if (index == 0) {
-               oclass->ctor = nvkm_udevice_child_new;
-               oclass->base.oclass = nvkm_control_oclass[0].handle;
-               oclass->base.minver = -2;
-               oclass->base.maxver = -2;
-               oclass->priv = &nvkm_control_oclass[0];
-               return 0;
+       switch (index) {
+       case 0: sclass = &nvkm_control_oclass; break;
+       default:
+               return -EINVAL;
        }
 
-       return -EINVAL;
+       oclass->ctor = nvkm_udevice_child_new;
+       oclass->base = sclass->base;
+       oclass->priv = sclass;
+       return 0;
 }
 
 static const struct nvkm_object_func