#include <core/client.h>
#include <core/notify.h>
+#include <core/ramht.h>
#include <subdev/bios.h>
#include <subdev/bios/dcb.h>
struct nvkm_head *head;
void *data = disp;
- if (disp->func->dtor)
- data = disp->func->dtor(disp);
+ nvkm_ramht_del(&disp->ramht);
+ nvkm_gpuobj_del(&disp->inst);
+
+ nvkm_event_fini(&disp->uevent);
+ if (disp->super.wq)
+ destroy_workqueue(disp->super.wq);
nvkm_event_fini(&disp->vblank);
nvkm_event_fini(&disp->hpd);
};
int
-nvkm_disp_ctor(const struct nvkm_disp_func *func, struct nvkm_device *device,
- enum nvkm_subdev_type type, int inst, struct nvkm_disp *disp)
+nvkm_disp_new_(const struct nvkm_disp_func *func, struct nvkm_device *device,
+ enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
{
+ struct nvkm_disp *disp;
+ int ret;
+
+ if (!(disp = *pdisp = kzalloc(sizeof(**pdisp), GFP_KERNEL)))
+ return -ENOMEM;
+
disp->func = func;
INIT_LIST_HEAD(&disp->heads);
INIT_LIST_HEAD(&disp->iors);
INIT_LIST_HEAD(&disp->outps);
INIT_LIST_HEAD(&disp->conns);
spin_lock_init(&disp->client.lock);
- return nvkm_engine_ctor(&nvkm_disp, device, type, inst, true, &disp->engine);
-}
-int
-nvkm_disp_new_(const struct nvkm_disp_func *func, struct nvkm_device *device,
- enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
-{
- if (!(*pdisp = kzalloc(sizeof(**pdisp), GFP_KERNEL)))
- return -ENOMEM;
- return nvkm_disp_ctor(func, device, type, inst, *pdisp);
+ ret = nvkm_engine_ctor(&nvkm_disp, device, type, inst, true, &disp->engine);
+ if (ret)
+ return ret;
+
+ if (func->super) {
+ disp->super.wq = create_singlethread_workqueue("nvkm-disp");
+ if (!disp->super.wq)
+ return -ENOMEM;
+
+ INIT_WORK(&disp->super.work, func->super);
+ }
+
+ return nvkm_event_init(func->uevent, 1, ARRAY_SIZE(disp->chan), &disp->uevent);
}
static const struct nvkm_disp_func
g84_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
g84_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&g84_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&g84_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
g94_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
g94_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&g94_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&g94_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
ga102_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = tu102_disp_init,
.fini = gv100_disp_fini,
ga102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&ga102_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&ga102_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gf119_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gf119_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gf119_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gf119_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gk104_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gk104_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gk104_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gk104_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gk110_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gk110_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gk110_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gk110_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gm107_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gm107_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gm107_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gm107_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gm200_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gm200_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gm200_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gm200_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gp100_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gp100_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gp100_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gp100_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gp102_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gf119_disp_init,
.fini = gf119_disp_fini,
gp102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gp102_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gp102_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gt200_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
gt200_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(>200_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(>200_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gt215_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
gt215_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(>215_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(>215_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
gv100_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = gv100_disp_init,
.fini = gv100_disp_fini,
gv100_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&gv100_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&gv100_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
mcp77_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
mcp77_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&mcp77_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&mcp77_disp, device, type, inst, pdisp);
}
static const struct nvkm_disp_func
mcp89_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
mcp89_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&mcp89_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&mcp89_disp, device, type, inst, pdisp);
}
0x1000, 0, disp->inst, &disp->ramht);
}
-void *
-nv50_disp_dtor(struct nvkm_disp *disp)
-{
- nvkm_ramht_del(&disp->ramht);
- nvkm_gpuobj_del(&disp->inst);
-
- nvkm_event_fini(&disp->uevent);
- if (disp->super.wq)
- destroy_workqueue(disp->super.wq);
-
- return disp;
-}
-
static const struct nvkm_disp_func
nv50_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = nv50_disp_init,
.fini = nv50_disp_fini,
}
};
-int
-nv50_disp_new_(const struct nvkm_disp_func *func, struct nvkm_device *device,
- enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
-{
- struct nvkm_disp *disp;
- int ret;
-
- if (!(disp = kzalloc(sizeof(*disp), GFP_KERNEL)))
- return -ENOMEM;
- disp->func = func;
- *pdisp = disp;
-
- ret = nvkm_disp_ctor(func, device, type, inst, disp);
- if (ret)
- return ret;
-
- disp->super.wq = create_singlethread_workqueue("nvkm-disp");
- if (!disp->super.wq)
- return -ENOMEM;
-
- INIT_WORK(&disp->super.work, func->super);
-
- return nvkm_event_init(func->uevent, 1, ARRAY_SIZE(disp->chan),
- &disp->uevent);
-}
-
int
nv50_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&nv50_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&nv50_disp, device, type, inst, pdisp);
}
void nvkm_disp_vblank(struct nvkm_disp *, int head);
struct nvkm_disp_func {
- void *(*dtor)(struct nvkm_disp *);
int (*oneinit)(struct nvkm_disp *);
int (*init)(struct nvkm_disp *);
void (*fini)(struct nvkm_disp *);
int nv04_disp_mthd(struct nvkm_object *, u32, void *, u32);
int nv50_disp_root_mthd_(struct nvkm_object *, u32, void *, u32);
-int nv50_disp_new_(const struct nvkm_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
- struct nvkm_disp **);
-void *nv50_disp_dtor(struct nvkm_disp *);
int nv50_disp_oneinit(struct nvkm_disp *);
int nv50_disp_init(struct nvkm_disp *);
void nv50_disp_fini(struct nvkm_disp *);
static const struct nvkm_disp_func
tu102_disp = {
- .dtor = nv50_disp_dtor,
.oneinit = nv50_disp_oneinit,
.init = tu102_disp_init,
.fini = gv100_disp_fini,
tu102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{
- return nv50_disp_new_(&tu102_disp, device, type, inst, pdisp);
+ return nvkm_disp_new_(&tu102_disp, device, type, inst, pdisp);
}