Commit 0e29998a authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/device: convert ctrl class to new-style nvkm_object

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 2a9f847f
...@@ -274,6 +274,12 @@ enum nv_bus_type { ...@@ -274,6 +274,12 @@ enum nv_bus_type {
void nvkm_device_del(struct nvkm_device **); 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; extern const struct nvkm_sclass nvkm_udevice_sclass;
/* device logging */ /* device logging */
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* *
* Authors: Ben Skeggs <bskeggs@redhat.com> * Authors: Ben Skeggs <bskeggs@redhat.com>
*/ */
#include "priv.h" #include "ctrl.h"
#include <core/client.h> #include <core/client.h>
#include <subdev/clk.h> #include <subdev/clk.h>
...@@ -31,17 +31,17 @@ ...@@ -31,17 +31,17 @@
#include <nvif/unpack.h> #include <nvif/unpack.h>
static int 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 { union {
struct nvif_control_pstate_info_v0 v0; struct nvif_control_pstate_info_v0 v0;
} *args = data; } *args = data;
struct nvkm_clk *clk = nvkm_clk(object); struct nvkm_clk *clk = ctrl->device->clk;
int ret; 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)) { 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); args->v0.version);
} else } else
return ret; return ret;
...@@ -64,12 +64,12 @@ nvkm_control_mthd_pstate_info(struct nvkm_object *object, void *data, u32 size) ...@@ -64,12 +64,12 @@ nvkm_control_mthd_pstate_info(struct nvkm_object *object, void *data, u32 size)
} }
static int 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 { union {
struct nvif_control_pstate_attr_v0 v0; struct nvif_control_pstate_attr_v0 v0;
} *args = data; } *args = data;
struct nvkm_clk *clk = nvkm_clk(object); struct nvkm_clk *clk = ctrl->device->clk;
struct nvkm_domain *domain; struct nvkm_domain *domain;
struct nvkm_pstate *pstate; struct nvkm_pstate *pstate;
struct nvkm_cstate *cstate; struct nvkm_cstate *cstate;
...@@ -77,10 +77,10 @@ nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size) ...@@ -77,10 +77,10 @@ nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size)
u32 lo, hi; u32 lo, hi;
int ret; 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)) { if (nvif_unpack(args->v0, 0, 0, false)) {
nvif_ioctl(object, "control pstate attr vers %d state %d " nvif_ioctl(&ctrl->object,
"index %d\n", "control pstate attr vers %d state %d index %d\n",
args->v0.version, args->v0.state, args->v0.index); args->v0.version, args->v0.state, args->v0.index);
if (!clk) if (!clk)
return -ENODEV; return -ENODEV;
...@@ -137,19 +137,19 @@ nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size) ...@@ -137,19 +137,19 @@ nvkm_control_mthd_pstate_attr(struct nvkm_object *object, void *data, u32 size)
} }
static int 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 { union {
struct nvif_control_pstate_user_v0 v0; struct nvif_control_pstate_user_v0 v0;
} *args = data; } *args = data;
struct nvkm_clk *clk = nvkm_clk(object); struct nvkm_clk *clk = ctrl->device->clk;
int ret; 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)) { if (nvif_unpack(args->v0, 0, 0, false)) {
nvif_ioctl(object, "control pstate user vers %d ustate %d " nvif_ioctl(&ctrl->object,
"pwrsrc %d\n", args->v0.version, "control pstate user vers %d ustate %d pwrsrc %d\n",
args->v0.ustate, args->v0.pwrsrc); args->v0.version, args->v0.ustate, args->v0.pwrsrc);
if (!clk) if (!clk)
return -ENODEV; return -ENODEV;
} else } else
...@@ -168,32 +168,44 @@ nvkm_control_mthd_pstate_user(struct nvkm_object *object, void *data, u32 size) ...@@ -168,32 +168,44 @@ nvkm_control_mthd_pstate_user(struct nvkm_object *object, void *data, u32 size)
static int static int
nvkm_control_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size) nvkm_control_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
{ {
struct nvkm_control *ctrl = nvkm_control(object);
switch (mthd) { switch (mthd) {
case NVIF_CONTROL_PSTATE_INFO: 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: 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: case NVIF_CONTROL_PSTATE_USER:
return nvkm_control_mthd_pstate_user(object, data, size); return nvkm_control_mthd_pstate_user(ctrl, data, size);
default: default:
break; break;
} }
return -EINVAL; return -EINVAL;
} }
static struct nvkm_ofuncs static const struct nvkm_object_func
nvkm_control_ofuncs = { nvkm_control = {
.ctor = _nvkm_object_ctor,
.dtor = nvkm_object_destroy,
.init = _nvkm_object_init,
.fini = _nvkm_object_fini,
.mthd = nvkm_control_mthd, .mthd = nvkm_control_mthd,
}; };
struct nvkm_oclass static int
nvkm_control_oclass[] = { nvkm_control_new(struct nvkm_device *device, const struct nvkm_oclass *oclass,
{ .handle = NVIF_IOCTL_NEW_V0_CONTROL, void *data, u32 size, struct nvkm_object **pobject)
.ofuncs = &nvkm_control_ofuncs {
}, 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,
}; };
#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
...@@ -47,8 +47,6 @@ int nvkm_device_ctor(const struct nvkm_device_func *, ...@@ -47,8 +47,6 @@ int nvkm_device_ctor(const struct nvkm_device_func *,
int nvkm_device_init(struct nvkm_device *); int nvkm_device_init(struct nvkm_device *);
int nvkm_device_fini(struct nvkm_device *, bool suspend); int nvkm_device_fini(struct nvkm_device *, bool suspend);
extern struct nvkm_oclass nvkm_control_oclass[];
int nv04_identify(struct nvkm_device *); int nv04_identify(struct nvkm_device *);
int nv10_identify(struct nvkm_device *); int nv10_identify(struct nvkm_device *);
int nv20_identify(struct nvkm_device *); int nv20_identify(struct nvkm_device *);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
#define nvkm_udevice(p) container_of((p), struct nvkm_udevice, object) #define nvkm_udevice(p) container_of((p), struct nvkm_udevice, object)
#include "priv.h" #include "priv.h"
#include "ctrl.h"
#include <core/client.h> #include <core/client.h>
#include <core/parent.h> #include <core/parent.h>
...@@ -280,10 +281,8 @@ nvkm_udevice_child_new(const struct nvkm_oclass *oclass, ...@@ -280,10 +281,8 @@ nvkm_udevice_child_new(const struct nvkm_oclass *oclass,
void *data, u32 size, struct nvkm_object **pobject) void *data, u32 size, struct nvkm_object **pobject)
{ {
struct nvkm_udevice *udev = nvkm_udevice(oclass->parent); struct nvkm_udevice *udev = nvkm_udevice(oclass->parent);
const struct nvkm_oclass *sclass = oclass->priv; const struct nvkm_device_oclass *sclass = oclass->priv;
return nvkm_object_old(&udev->object, NULL, return sclass->ctor(udev->device, oclass, data, size, pobject);
(struct nvkm_oclass *)sclass,
data, size, pobject);
} }
static int static int
...@@ -297,6 +296,7 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, ...@@ -297,6 +296,7 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
(1ULL << NVDEV_ENGINE_FIFO) | (1ULL << NVDEV_ENGINE_FIFO) |
(1ULL << NVDEV_ENGINE_DISP) | (1ULL << NVDEV_ENGINE_DISP) |
(1ULL << NVDEV_ENGINE_PM); (1ULL << NVDEV_ENGINE_PM);
const struct nvkm_device_oclass *sclass;
int i; int i;
for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) { for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) {
...@@ -319,16 +319,16 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, ...@@ -319,16 +319,16 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
} }
} }
if (index == 0) { switch (index) {
oclass->ctor = nvkm_udevice_child_new; case 0: sclass = &nvkm_control_oclass; break;
oclass->base.oclass = nvkm_control_oclass[0].handle; default:
oclass->base.minver = -2; return -EINVAL;
oclass->base.maxver = -2;
oclass->priv = &nvkm_control_oclass[0];
return 0;
} }
return -EINVAL; oclass->ctor = nvkm_udevice_child_new;
oclass->base = sclass->base;
oclass->priv = sclass;
return 0;
} }
static const struct nvkm_object_func static const struct nvkm_object_func
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment