提交 f9360c3a 编写于 作者: B Ben Skeggs

drm/nouveau/fifo/gk104-: simplify definition of channel classes

Signed-off-by: NBen Skeggs <bskeggs@redhat.com>
上级 a7cf0180
...@@ -31,6 +31,3 @@ nvkm-y += nvkm/engine/fifo/gpfifonv50.o ...@@ -31,6 +31,3 @@ nvkm-y += nvkm/engine/fifo/gpfifonv50.o
nvkm-y += nvkm/engine/fifo/gpfifog84.o nvkm-y += nvkm/engine/fifo/gpfifog84.o
nvkm-y += nvkm/engine/fifo/gpfifogf100.o nvkm-y += nvkm/engine/fifo/gpfifogf100.o
nvkm-y += nvkm/engine/fifo/gpfifogk104.o nvkm-y += nvkm/engine/fifo/gpfifogk104.o
nvkm-y += nvkm/engine/fifo/gpfifogk110.o
nvkm-y += nvkm/engine/fifo/gpfifogm200.o
nvkm-y += nvkm/engine/fifo/gpfifogp100.o
...@@ -215,6 +215,20 @@ nvkm_fifo_uevent(struct nvkm_fifo *fifo) ...@@ -215,6 +215,20 @@ nvkm_fifo_uevent(struct nvkm_fifo *fifo)
nvkm_event_send(&fifo->uevent, 1, 0, &rep, sizeof(rep)); nvkm_event_send(&fifo->uevent, 1, 0, &rep, sizeof(rep));
} }
static int
nvkm_fifo_class_new_(struct nvkm_device *device,
const struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{
struct nvkm_fifo *fifo = nvkm_fifo(oclass->engine);
return fifo->func->class_new(fifo, oclass, data, size, pobject);
}
static const struct nvkm_device_oclass
nvkm_fifo_class_ = {
.ctor = nvkm_fifo_class_new_,
};
static int static int
nvkm_fifo_class_new(struct nvkm_device *device, nvkm_fifo_class_new(struct nvkm_device *device,
const struct nvkm_oclass *oclass, void *data, u32 size, const struct nvkm_oclass *oclass, void *data, u32 size,
...@@ -239,13 +253,9 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index, ...@@ -239,13 +253,9 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
int c = 0; int c = 0;
if (fifo->func->class_get) { if (fifo->func->class_get) {
int ret = fifo->func->class_get(fifo, index, &sclass); int ret = fifo->func->class_get(fifo, index, oclass);
if (ret == 0) { if (ret == 0)
oclass->base = sclass->base; *class = &nvkm_fifo_class_;
oclass->engn = sclass;
*class = &nvkm_fifo_class;
return 0;
}
return ret; return ret;
} }
......
...@@ -19,11 +19,6 @@ struct gk104_fifo_chan { ...@@ -19,11 +19,6 @@ struct gk104_fifo_chan {
} engn[NVKM_SUBDEV_NR]; } engn[NVKM_SUBDEV_NR];
}; };
int gk104_fifo_gpfifo_new(struct nvkm_fifo *, const struct nvkm_oclass *, int gk104_fifo_gpfifo_new(struct gk104_fifo *, const struct nvkm_oclass *,
void *data, u32 size, struct nvkm_object **); void *data, u32 size, struct nvkm_object **);
extern const struct nvkm_fifo_chan_oclass gk104_fifo_gpfifo_oclass;
extern const struct nvkm_fifo_chan_oclass gk110_fifo_gpfifo_oclass;
extern const struct nvkm_fifo_chan_oclass gm200_fifo_gpfifo_oclass;
extern const struct nvkm_fifo_chan_oclass gp100_fifo_gpfifo_oclass;
#endif #endif
...@@ -94,16 +94,30 @@ gk104_fifo_engine_status(struct gk104_fifo *fifo, int engn, ...@@ -94,16 +94,30 @@ gk104_fifo_engine_status(struct gk104_fifo *fifo, int engn,
status->chan == &status->next ? "*" : " "); status->chan == &status->next ? "*" : " ");
} }
static int
gk104_fifo_class_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
void *argv, u32 argc, struct nvkm_object **pobject)
{
struct gk104_fifo *fifo = gk104_fifo(base);
if (oclass->engn == &fifo->func->chan) {
const struct gk104_fifo_chan_user *user = oclass->engn;
return user->ctor(fifo, oclass, argv, argc, pobject);
}
WARN_ON(1);
return -EINVAL;
}
static int static int
gk104_fifo_class_get(struct nvkm_fifo *base, int index, gk104_fifo_class_get(struct nvkm_fifo *base, int index,
const struct nvkm_fifo_chan_oclass **psclass) struct nvkm_oclass *oclass)
{ {
struct gk104_fifo *fifo = gk104_fifo(base); struct gk104_fifo *fifo = gk104_fifo(base);
int c = 0; int c = 0;
while ((*psclass = fifo->func->chan[c])) { if (fifo->func->chan.ctor && c++ == index) {
if (c++ == index) oclass->base = fifo->func->chan.user;
return 0; oclass->engn = &fifo->func->chan;
return 0;
} }
return c; return c;
...@@ -950,6 +964,7 @@ gk104_fifo_ = { ...@@ -950,6 +964,7 @@ gk104_fifo_ = {
.uevent_fini = gk104_fifo_uevent_fini, .uevent_fini = gk104_fifo_uevent_fini,
.recover_chan = gk104_fifo_recover_chan, .recover_chan = gk104_fifo_recover_chan,
.class_get = gk104_fifo_class_get, .class_get = gk104_fifo_class_get,
.class_new = gk104_fifo_class_new,
}; };
int int
...@@ -1096,10 +1111,7 @@ gk104_fifo = { ...@@ -1096,10 +1111,7 @@ gk104_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gk104_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -51,7 +51,11 @@ struct gk104_fifo_func { ...@@ -51,7 +51,11 @@ struct gk104_fifo_func {
const struct nvkm_enum *gpcclient; const struct nvkm_enum *gpcclient;
} fault; } fault;
const struct nvkm_fifo_chan_oclass *chan[]; struct gk104_fifo_chan_user {
struct nvkm_sclass user;
int (*ctor)(struct gk104_fifo *, const struct nvkm_oclass *,
void *, u32, struct nvkm_object **);
} chan;
}; };
int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *, int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *,
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
static const struct gk104_fifo_func static const struct gk104_fifo_func
gk110_fifo = { gk110_fifo = {
.fault.access = gk104_fifo_fault_access, .fault.access = gk104_fifo_fault_access,
...@@ -31,10 +33,7 @@ gk110_fifo = { ...@@ -31,10 +33,7 @@ gk110_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new },
&gk110_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
static const struct gk104_fifo_func static const struct gk104_fifo_func
gk208_fifo = { gk208_fifo = {
.fault.access = gk104_fifo_fault_access, .fault.access = gk104_fifo_fault_access,
...@@ -31,10 +33,7 @@ gk208_fifo = { ...@@ -31,10 +33,7 @@ gk208_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gk104_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
static const struct gk104_fifo_func static const struct gk104_fifo_func
gk20a_fifo = { gk20a_fifo = {
.fault.access = gk104_fifo_fault_access, .fault.access = gk104_fifo_fault_access,
...@@ -29,10 +31,7 @@ gk20a_fifo = { ...@@ -29,10 +31,7 @@ gk20a_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gk104_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
const struct nvkm_enum const struct nvkm_enum
gm107_fifo_fault_engine[] = { gm107_fifo_fault_engine[] = {
{ 0x01, "DISPLAY" }, { 0x01, "DISPLAY" },
...@@ -54,10 +56,7 @@ gm107_fifo = { ...@@ -54,10 +56,7 @@ gm107_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new },
&gk110_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
static const struct gk104_fifo_func static const struct gk104_fifo_func
gm200_fifo = { gm200_fifo = {
.fault.access = gk104_fifo_fault_access, .fault.access = gk104_fifo_fault_access,
...@@ -31,10 +33,7 @@ gm200_fifo = { ...@@ -31,10 +33,7 @@ gm200_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,MAXWELL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gm200_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
static const struct gk104_fifo_func static const struct gk104_fifo_func
gm20b_fifo = { gm20b_fifo = {
.fault.access = gk104_fifo_fault_access, .fault.access = gk104_fifo_fault_access,
...@@ -29,10 +31,7 @@ gm20b_fifo = { ...@@ -29,10 +31,7 @@ gm20b_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,MAXWELL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gm200_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
const struct nvkm_enum const struct nvkm_enum
gp100_fifo_fault_engine[] = { gp100_fifo_fault_engine[] = {
{ 0x01, "DISPLAY" }, { 0x01, "DISPLAY" },
...@@ -55,10 +57,7 @@ gp100_fifo = { ...@@ -55,10 +57,7 @@ gp100_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,PASCAL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gp100_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include "gk104.h" #include "gk104.h"
#include "changk104.h" #include "changk104.h"
#include <nvif/class.h>
static const struct gk104_fifo_func static const struct gk104_fifo_func
gp10b_fifo = { gp10b_fifo = {
.fault.access = gk104_fifo_fault_access, .fault.access = gk104_fifo_fault_access,
...@@ -29,10 +31,7 @@ gp10b_fifo = { ...@@ -29,10 +31,7 @@ gp10b_fifo = {
.fault.reason = gk104_fifo_fault_reason, .fault.reason = gk104_fifo_fault_reason,
.fault.hubclient = gk104_fifo_fault_hubclient, .fault.hubclient = gk104_fifo_fault_hubclient,
.fault.gpcclient = gk104_fifo_fault_gpcclient, .fault.gpcclient = gk104_fifo_fault_gpcclient,
.chan = { .chan = {{0,0,PASCAL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
&gp100_fifo_gpfifo_oclass,
NULL
},
}; };
int int
......
...@@ -296,14 +296,13 @@ gk104_fifo_gpfifo_new_(struct gk104_fifo *fifo, u64 *runlists, u16 *chid, ...@@ -296,14 +296,13 @@ gk104_fifo_gpfifo_new_(struct gk104_fifo *fifo, u64 *runlists, u16 *chid,
} }
int int
gk104_fifo_gpfifo_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass, gk104_fifo_gpfifo_new(struct gk104_fifo *fifo, const struct nvkm_oclass *oclass,
void *data, u32 size, struct nvkm_object **pobject) void *data, u32 size, struct nvkm_object **pobject)
{ {
struct nvkm_object *parent = oclass->parent; struct nvkm_object *parent = oclass->parent;
union { union {
struct kepler_channel_gpfifo_a_v0 v0; struct kepler_channel_gpfifo_a_v0 v0;
} *args = data; } *args = data;
struct gk104_fifo *fifo = gk104_fifo(base);
int ret = -ENOSYS; int ret = -ENOSYS;
nvif_ioctl(parent, "create channel gpfifo size %d\n", size); nvif_ioctl(parent, "create channel gpfifo size %d\n", size);
...@@ -324,11 +323,3 @@ gk104_fifo_gpfifo_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass, ...@@ -324,11 +323,3 @@ gk104_fifo_gpfifo_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
return ret; return ret;
} }
const struct nvkm_fifo_chan_oclass
gk104_fifo_gpfifo_oclass = {
.base.oclass = KEPLER_CHANNEL_GPFIFO_A,
.base.minver = 0,
.base.maxver = 0,
.ctor = gk104_fifo_gpfifo_new,
};
/*
* Copyright 2016 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors: Ben Skeggs
*/
#include "changk104.h"
#include <nvif/class.h>
const struct nvkm_fifo_chan_oclass
gk110_fifo_gpfifo_oclass = {
.base.oclass = KEPLER_CHANNEL_GPFIFO_B,
.base.minver = 0,
.base.maxver = 0,
.ctor = gk104_fifo_gpfifo_new,
};
/*
* Copyright 2015 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors: Ben Skeggs
*/
#include "changk104.h"
#include <nvif/class.h>
const struct nvkm_fifo_chan_oclass
gm200_fifo_gpfifo_oclass = {
.base.oclass = MAXWELL_CHANNEL_GPFIFO_A,
.base.minver = 0,
.base.maxver = 0,
.ctor = gk104_fifo_gpfifo_new,
};
/*
* Copyright 2016 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors: Ben Skeggs
*/
#include "changk104.h"
#include <nvif/class.h>
const struct nvkm_fifo_chan_oclass
gp100_fifo_gpfifo_oclass = {
.base.oclass = PASCAL_CHANNEL_GPFIFO_A,
.base.minver = 0,
.base.maxver = 0,
.ctor = gk104_fifo_gpfifo_new,
};
...@@ -28,8 +28,9 @@ struct nvkm_fifo_func { ...@@ -28,8 +28,9 @@ struct nvkm_fifo_func {
void (*uevent_init)(struct nvkm_fifo *); void (*uevent_init)(struct nvkm_fifo *);
void (*uevent_fini)(struct nvkm_fifo *); void (*uevent_fini)(struct nvkm_fifo *);
void (*recover_chan)(struct nvkm_fifo *, int chid); void (*recover_chan)(struct nvkm_fifo *, int chid);
int (*class_get)(struct nvkm_fifo *, int index, int (*class_get)(struct nvkm_fifo *, int index, struct nvkm_oclass *);
const struct nvkm_fifo_chan_oclass **); int (*class_new)(struct nvkm_fifo *, const struct nvkm_oclass *,
void *, u32, struct nvkm_object **);
const struct nvkm_fifo_chan_oclass *chan[]; const struct nvkm_fifo_chan_oclass *chan[];
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册