aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
index 64f6b7654a08..c773caf21f6b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
@@ -30,6 +30,7 @@
30#include <subdev/mc.h> 30#include <subdev/mc.h>
31 31
32#include <nvif/event.h> 32#include <nvif/event.h>
33#include <nvif/cl0080.h>
33#include <nvif/unpack.h> 34#include <nvif/unpack.h>
34 35
35void 36void
@@ -56,6 +57,12 @@ nvkm_fifo_start(struct nvkm_fifo *fifo, unsigned long *flags)
56} 57}
57 58
58void 59void
60nvkm_fifo_fault(struct nvkm_fifo *fifo, struct nvkm_fault_data *info)
61{
62 return fifo->func->fault(fifo, info);
63}
64
65void
59nvkm_fifo_chan_put(struct nvkm_fifo *fifo, unsigned long flags, 66nvkm_fifo_chan_put(struct nvkm_fifo *fifo, unsigned long flags,
60 struct nvkm_fifo_chan **pchan) 67 struct nvkm_fifo_chan **pchan)
61{ 68{
@@ -209,6 +216,20 @@ nvkm_fifo_uevent(struct nvkm_fifo *fifo)
209} 216}
210 217
211static int 218static int
219nvkm_fifo_class_new_(struct nvkm_device *device,
220 const struct nvkm_oclass *oclass, void *data, u32 size,
221 struct nvkm_object **pobject)
222{
223 struct nvkm_fifo *fifo = nvkm_fifo(oclass->engine);
224 return fifo->func->class_new(fifo, oclass, data, size, pobject);
225}
226
227static const struct nvkm_device_oclass
228nvkm_fifo_class_ = {
229 .ctor = nvkm_fifo_class_new_,
230};
231
232static int
212nvkm_fifo_class_new(struct nvkm_device *device, 233nvkm_fifo_class_new(struct nvkm_device *device,
213 const struct nvkm_oclass *oclass, void *data, u32 size, 234 const struct nvkm_oclass *oclass, void *data, u32 size,
214 struct nvkm_object **pobject) 235 struct nvkm_object **pobject)
@@ -232,13 +253,9 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
232 int c = 0; 253 int c = 0;
233 254
234 if (fifo->func->class_get) { 255 if (fifo->func->class_get) {
235 int ret = fifo->func->class_get(fifo, index, &sclass); 256 int ret = fifo->func->class_get(fifo, index, oclass);
236 if (ret == 0) { 257 if (ret == 0)
237 oclass->base = sclass->base; 258 *class = &nvkm_fifo_class_;
238 oclass->engn = sclass;
239 *class = &nvkm_fifo_class;
240 return 0;
241 }
242 return ret; 259 return ret;
243 } 260 }
244 261
@@ -271,6 +288,20 @@ nvkm_fifo_fini(struct nvkm_engine *engine, bool suspend)
271} 288}
272 289
273static int 290static int
291nvkm_fifo_info(struct nvkm_engine *engine, u64 mthd, u64 *data)
292{
293 struct nvkm_fifo *fifo = nvkm_fifo(engine);
294 switch (mthd) {
295 case NV_DEVICE_FIFO_CHANNELS: *data = fifo->nr; return 0;
296 default:
297 if (fifo->func->info)
298 return fifo->func->info(fifo, mthd, data);
299 break;
300 }
301 return -ENOSYS;
302}
303
304static int
274nvkm_fifo_oneinit(struct nvkm_engine *engine) 305nvkm_fifo_oneinit(struct nvkm_engine *engine)
275{ 306{
276 struct nvkm_fifo *fifo = nvkm_fifo(engine); 307 struct nvkm_fifo *fifo = nvkm_fifo(engine);
@@ -311,6 +342,7 @@ nvkm_fifo = {
311 .dtor = nvkm_fifo_dtor, 342 .dtor = nvkm_fifo_dtor,
312 .preinit = nvkm_fifo_preinit, 343 .preinit = nvkm_fifo_preinit,
313 .oneinit = nvkm_fifo_oneinit, 344 .oneinit = nvkm_fifo_oneinit,
345 .info = nvkm_fifo_info,
314 .init = nvkm_fifo_init, 346 .init = nvkm_fifo_init,
315 .fini = nvkm_fifo_fini, 347 .fini = nvkm_fifo_fini,
316 .intr = nvkm_fifo_intr, 348 .intr = nvkm_fifo_intr,