Commit 13de7f46 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/fifo: convert to new-style nvkm_engine

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 70aa8670
#ifndef __NVKM_FIFO_H__ #ifndef __NVKM_FIFO_H__
#define __NVKM_FIFO_H__ #define __NVKM_FIFO_H__
#define nvkm_fifo_chan(p) container_of((p), struct nvkm_fifo_chan, object)
#define nvkm_fifo(p) container_of((p), struct nvkm_fifo, engine)
#include <core/engine.h> #include <core/engine.h>
#include <core/event.h> #include <core/event.h>
...@@ -33,46 +31,21 @@ struct nvkm_fifo_chan { ...@@ -33,46 +31,21 @@ struct nvkm_fifo_chan {
extern const struct nvkm_object_func nvkm_fifo_chan_func; extern const struct nvkm_object_func nvkm_fifo_chan_func;
#include <core/gpuobj.h>
struct nvkm_fifo_base {
struct nvkm_gpuobj gpuobj;
};
#define nvkm_fifo_context_create(p,e,c,g,s,a,f,d) \
nvkm_gpuobj_create((p), (e), (c), NV_ENGCTX_CLASS, (g), (s), (a), (f), (d))
#define nvkm_fifo_context_destroy(p) \
nvkm_gpuobj_destroy(&(p)->gpuobj)
#define nvkm_fifo_context_init(p) \
nvkm_gpuobj_init(&(p)->gpuobj)
#define nvkm_fifo_context_fini(p,s) \
nvkm_gpuobj_fini(&(p)->gpuobj, (s))
#define _nvkm_fifo_context_dtor _nvkm_gpuobj_dtor
#define _nvkm_fifo_context_init _nvkm_gpuobj_init
#define _nvkm_fifo_context_fini _nvkm_gpuobj_fini
#define _nvkm_fifo_context_rd32 _nvkm_gpuobj_rd32
#define _nvkm_fifo_context_wr32 _nvkm_gpuobj_wr32
struct nvkm_fifo { struct nvkm_fifo {
struct nvkm_engine engine;
const struct nvkm_fifo_func *func; const struct nvkm_fifo_func *func;
struct nvkm_engine engine;
struct nvkm_event cevent; /* channel creation event */
struct nvkm_event uevent; /* async user trigger */
DECLARE_BITMAP(mask, NVKM_FIFO_CHID_NR); DECLARE_BITMAP(mask, NVKM_FIFO_CHID_NR);
int nr; int nr;
struct list_head chan; struct list_head chan;
spinlock_t lock; spinlock_t lock;
void (*pause)(struct nvkm_fifo *, unsigned long *); struct nvkm_event uevent; /* async user trigger */
void (*start)(struct nvkm_fifo *, unsigned long *); struct nvkm_event cevent; /* channel creation event */
}; };
struct nvkm_fifo_func { void nvkm_fifo_pause(struct nvkm_fifo *, unsigned long *);
void *(*dtor)(struct nvkm_fifo *); void nvkm_fifo_start(struct nvkm_fifo *, unsigned long *);
const struct nvkm_fifo_chan_oclass *chan[];
};
void nvkm_fifo_chan_put(struct nvkm_fifo *, unsigned long flags, void nvkm_fifo_chan_put(struct nvkm_fifo *, unsigned long flags,
struct nvkm_fifo_chan **); struct nvkm_fifo_chan **);
...@@ -81,38 +54,16 @@ nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags); ...@@ -81,38 +54,16 @@ nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags);
struct nvkm_fifo_chan * struct nvkm_fifo_chan *
nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags); nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags);
#define nvkm_fifo_create(o,e,c,fc,lc,d) \ int nv04_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
nvkm_fifo_create_((o), (e), (c), (fc), (lc), sizeof(**d), (void **)d) int nv10_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
#define nvkm_fifo_init(p) \ int nv17_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
nvkm_engine_init_old(&(p)->engine) int nv40_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
#define nvkm_fifo_fini(p,s) \ int nv50_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
nvkm_engine_fini_old(&(p)->engine, (s)) int g84_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
int gf100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
int nvkm_fifo_create_(struct nvkm_object *, struct nvkm_object *, int gk104_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
struct nvkm_oclass *, int min, int max, int gk208_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
int size, void **); int gk20a_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
void nvkm_fifo_destroy(struct nvkm_fifo *); int gm204_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
int gm20b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
#define _nvkm_fifo_init _nvkm_engine_init
#define _nvkm_fifo_fini _nvkm_engine_fini
extern struct nvkm_oclass *nv04_fifo_oclass;
extern struct nvkm_oclass *nv10_fifo_oclass;
extern struct nvkm_oclass *nv17_fifo_oclass;
extern struct nvkm_oclass *nv40_fifo_oclass;
extern struct nvkm_oclass *nv50_fifo_oclass;
extern struct nvkm_oclass *g84_fifo_oclass;
extern struct nvkm_oclass *gf100_fifo_oclass;
extern struct nvkm_oclass *gk104_fifo_oclass;
extern struct nvkm_oclass *gk20a_fifo_oclass;
extern struct nvkm_oclass *gk208_fifo_oclass;
extern struct nvkm_oclass *gm204_fifo_oclass;
extern struct nvkm_oclass *gm20b_fifo_oclass;
int nvkm_fifo_uevent_ctor(struct nvkm_object *, void *, u32,
struct nvkm_notify *);
void nvkm_fifo_uevent(struct nvkm_fifo *);
void nv04_fifo_intr(struct nvkm_subdev *);
int nv04_fifo_context_attach(struct nvkm_object *, struct nvkm_object *);
#endif #endif
...@@ -231,7 +231,7 @@ nvkm_gpuobj_destroy(struct nvkm_gpuobj *gpuobj) ...@@ -231,7 +231,7 @@ nvkm_gpuobj_destroy(struct nvkm_gpuobj *gpuobj)
nvkm_object_destroy(&gpuobj->object); nvkm_object_destroy(&gpuobj->object);
} }
#include <engine/fifo.h> #include <engine/fifo/chan.h>
int int
nvkm_gpuobj_create_(struct nvkm_object *parent, struct nvkm_object *engine, nvkm_gpuobj_create_(struct nvkm_object *parent, struct nvkm_object *engine,
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <core/client.h> #include <core/client.h>
#include <core/enum.h> #include <core/enum.h>
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <nvif/class.h> #include <nvif/class.h>
......
...@@ -28,55 +28,46 @@ gf100_identify(struct nvkm_device *device) ...@@ -28,55 +28,46 @@ gf100_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0xc0: case 0xc0:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf100_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf100_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass;
break; break;
case 0xc4: case 0xc4:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass;
break; break;
case 0xc3: case 0xc3:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass;
break; break;
case 0xce: case 0xce:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass;
break; break;
case 0xcf: case 0xcf:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass;
break; break;
case 0xc1: case 0xc1:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf108_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf108_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf108_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf108_pm_oclass;
break; break;
case 0xc8: case 0xc8:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf110_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf110_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf100_pm_oclass;
break; break;
case 0xd9: case 0xd9:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf119_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf119_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf117_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf117_pm_oclass;
break; break;
case 0xd7: case 0xd7:
device->oclass[NVDEV_ENGINE_FIFO ] = gf100_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gf117_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gf117_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gf117_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gf117_pm_oclass;
......
...@@ -28,48 +28,40 @@ gk104_identify(struct nvkm_device *device) ...@@ -28,48 +28,40 @@ gk104_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0xe4: case 0xe4:
device->oclass[NVDEV_ENGINE_FIFO ] = gk104_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass;
break; break;
case 0xe7: case 0xe7:
device->oclass[NVDEV_ENGINE_FIFO ] = gk104_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass;
break; break;
case 0xe6: case 0xe6:
device->oclass[NVDEV_ENGINE_FIFO ] = gk104_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk104_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk104_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass;
break; break;
case 0xea: case 0xea:
device->oclass[NVDEV_ENGINE_FIFO ] = gk20a_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk20a_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk20a_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gk104_pm_oclass;
break; break;
case 0xf0: case 0xf0:
device->oclass[NVDEV_ENGINE_FIFO ] = gk104_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk110_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk110_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = &gk110_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = &gk110_pm_oclass;
break; break;
case 0xf1: case 0xf1:
device->oclass[NVDEV_ENGINE_FIFO ] = gk104_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk110b_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk110b_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = &gk110_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = &gk110_pm_oclass;
break; break;
case 0x106: case 0x106:
device->oclass[NVDEV_ENGINE_FIFO ] = gk208_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk208_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk208_gr_oclass;
break; break;
case 0x108: case 0x108:
device->oclass[NVDEV_ENGINE_FIFO ] = gk208_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gk208_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gk208_gr_oclass;
break; break;
......
...@@ -31,7 +31,6 @@ gm100_identify(struct nvkm_device *device) ...@@ -31,7 +31,6 @@ gm100_identify(struct nvkm_device *device)
#if 0 #if 0
#endif #endif
device->oclass[NVDEV_ENGINE_FIFO ] = gk208_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gm107_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gm107_gr_oclass;
#if 0 #if 0
...@@ -46,7 +45,6 @@ gm100_identify(struct nvkm_device *device) ...@@ -46,7 +45,6 @@ gm100_identify(struct nvkm_device *device)
#endif #endif
#if 0 #if 0
#endif #endif
device->oclass[NVDEV_ENGINE_FIFO ] = gm204_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gm204_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gm204_gr_oclass;
#if 0 #if 0
...@@ -59,7 +57,6 @@ gm100_identify(struct nvkm_device *device) ...@@ -59,7 +57,6 @@ gm100_identify(struct nvkm_device *device)
#endif #endif
#if 0 #if 0
#endif #endif
device->oclass[NVDEV_ENGINE_FIFO ] = gm204_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gm206_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gm206_gr_oclass;
#if 0 #if 0
...@@ -67,7 +64,6 @@ gm100_identify(struct nvkm_device *device) ...@@ -67,7 +64,6 @@ gm100_identify(struct nvkm_device *device)
break; break;
case 0x12b: case 0x12b:
device->oclass[NVDEV_ENGINE_FIFO ] = gm20b_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = gm20b_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = gm20b_gr_oclass;
break; break;
......
...@@ -28,12 +28,10 @@ nv04_identify(struct nvkm_device *device) ...@@ -28,12 +28,10 @@ nv04_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0x04: case 0x04:
device->oclass[NVDEV_ENGINE_FIFO ] = nv04_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv04_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv04_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv04_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv04_gr_oclass;
break; break;
case 0x05: case 0x05:
device->oclass[NVDEV_ENGINE_FIFO ] = nv04_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv04_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv04_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv04_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv04_gr_oclass;
break; break;
......
...@@ -31,37 +31,30 @@ nv10_identify(struct nvkm_device *device) ...@@ -31,37 +31,30 @@ nv10_identify(struct nvkm_device *device)
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x15: case 0x15:
device->oclass[NVDEV_ENGINE_FIFO ] = nv10_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x16: case 0x16:
device->oclass[NVDEV_ENGINE_FIFO ] = nv10_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x1a: case 0x1a:
device->oclass[NVDEV_ENGINE_FIFO ] = nv10_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x11: case 0x11:
device->oclass[NVDEV_ENGINE_FIFO ] = nv10_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x17: case 0x17:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x1f: case 0x1f:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
case 0x18: case 0x18:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv10_gr_oclass;
break; break;
......
...@@ -28,22 +28,18 @@ nv20_identify(struct nvkm_device *device) ...@@ -28,22 +28,18 @@ nv20_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0x20: case 0x20:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv20_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv20_gr_oclass;
break; break;
case 0x25: case 0x25:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv25_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv25_gr_oclass;
break; break;
case 0x28: case 0x28:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv25_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv25_gr_oclass;
break; break;
case 0x2a: case 0x2a:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv2a_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv2a_gr_oclass;
break; break;
......
...@@ -28,29 +28,24 @@ nv30_identify(struct nvkm_device *device) ...@@ -28,29 +28,24 @@ nv30_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0x30: case 0x30:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv30_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv30_gr_oclass;
break; break;
case 0x35: case 0x35:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv35_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv35_gr_oclass;
break; break;
case 0x31: case 0x31:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv30_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv30_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv31_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv31_mpeg_oclass;
break; break;
case 0x36: case 0x36:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv35_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv35_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv31_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv31_mpeg_oclass;
break; break;
case 0x34: case 0x34:
device->oclass[NVDEV_ENGINE_FIFO ] = nv17_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv34_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv34_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv31_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv31_mpeg_oclass;
......
...@@ -28,112 +28,96 @@ nv40_identify(struct nvkm_device *device) ...@@ -28,112 +28,96 @@ nv40_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0x40: case 0x40:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x41: case 0x41:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x42: case 0x42:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x43: case 0x43:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv40_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x45: case 0x45:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x47: case 0x47:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x49: case 0x49:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x4b: case 0x4b:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x44: case 0x44:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x46: case 0x46:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x4a: case 0x4a:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x4c: case 0x4c:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x4e: case 0x4e:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x63: case 0x63:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x67: case 0x67:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv40_pm_oclass;
break; break;
case 0x68: case 0x68:
device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv10_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv40_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv44_mpeg_oclass;
......
...@@ -28,93 +28,79 @@ nv50_identify(struct nvkm_device *device) ...@@ -28,93 +28,79 @@ nv50_identify(struct nvkm_device *device)
{ {
switch (device->chipset) { switch (device->chipset) {
case 0x50: case 0x50:
device->oclass[NVDEV_ENGINE_FIFO ] = nv50_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &nv50_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &nv50_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = nv50_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = nv50_pm_oclass;
break; break;
case 0x84: case 0x84:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0x86: case 0x86:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0x92: case 0x92:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0x94: case 0x94:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0x96: case 0x96:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0x98: case 0x98:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0xa0: case 0xa0:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gt200_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gt200_pm_oclass;
break; break;
case 0xaa: case 0xaa:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0xac: case 0xac:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = g84_pm_oclass;
break; break;
case 0xa3: case 0xa3:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass; device->oclass[NVDEV_ENGINE_MPEG ] = &g84_mpeg_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass;
break; break;
case 0xa5: case 0xa5:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass;
break; break;
case 0xa8: case 0xa8:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass;
break; break;
case 0xaf: case 0xaf:
device->oclass[NVDEV_ENGINE_FIFO ] = g84_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass; device->oclass[NVDEV_ENGINE_SW ] = nv50_sw_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass; device->oclass[NVDEV_ENGINE_GR ] = &nv50_gr_oclass;
device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass; device->oclass[NVDEV_ENGINE_PM ] = gt215_pm_oclass;
......
...@@ -20,9 +20,10 @@ ...@@ -20,9 +20,10 @@
* OTHER DEALINGS IN THE SOFTWARE. * OTHER DEALINGS IN THE SOFTWARE.
*/ */
#include <engine/falcon.h> #include <engine/falcon.h>
#include <engine/fifo.h>
#include <core/gpuobj.h>
#include <subdev/timer.h> #include <subdev/timer.h>
#include <engine/fifo.h>
static int static int
nvkm_falcon_oclass_get(struct nvkm_oclass *oclass, int index) nvkm_falcon_oclass_get(struct nvkm_oclass *oclass, int index)
......
...@@ -7,8 +7,8 @@ nvkm-y += nvkm/engine/fifo/nv50.o ...@@ -7,8 +7,8 @@ nvkm-y += nvkm/engine/fifo/nv50.o
nvkm-y += nvkm/engine/fifo/g84.o nvkm-y += nvkm/engine/fifo/g84.o
nvkm-y += nvkm/engine/fifo/gf100.o nvkm-y += nvkm/engine/fifo/gf100.o
nvkm-y += nvkm/engine/fifo/gk104.o nvkm-y += nvkm/engine/fifo/gk104.o
nvkm-y += nvkm/engine/fifo/gk20a.o
nvkm-y += nvkm/engine/fifo/gk208.o nvkm-y += nvkm/engine/fifo/gk208.o
nvkm-y += nvkm/engine/fifo/gk20a.o
nvkm-y += nvkm/engine/fifo/gm204.o nvkm-y += nvkm/engine/fifo/gm204.o
nvkm-y += nvkm/engine/fifo/gm20b.o nvkm-y += nvkm/engine/fifo/gm20b.o
......
...@@ -25,11 +25,24 @@ ...@@ -25,11 +25,24 @@
#include "chan.h" #include "chan.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <core/notify.h> #include <core/notify.h>
#include <nvif/event.h> #include <nvif/event.h>
#include <nvif/unpack.h> #include <nvif/unpack.h>
void
nvkm_fifo_pause(struct nvkm_fifo *fifo, unsigned long *flags)
{
return fifo->func->pause(fifo, flags);
}
void
nvkm_fifo_start(struct nvkm_fifo *fifo, unsigned long *flags)
{
return fifo->func->start(fifo, flags);
}
void void
nvkm_fifo_chan_put(struct nvkm_fifo *fifo, unsigned long flags, nvkm_fifo_chan_put(struct nvkm_fifo *fifo, unsigned long flags,
struct nvkm_fifo_chan **pchan) struct nvkm_fifo_chan **pchan)
...@@ -95,7 +108,21 @@ nvkm_fifo_event_func = { ...@@ -95,7 +108,21 @@ nvkm_fifo_event_func = {
.ctor = nvkm_fifo_event_ctor, .ctor = nvkm_fifo_event_ctor,
}; };
int static void
nvkm_fifo_uevent_fini(struct nvkm_event *event, int type, int index)
{
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
fifo->func->uevent_fini(fifo);
}
static void
nvkm_fifo_uevent_init(struct nvkm_event *event, int type, int index)
{
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
fifo->func->uevent_init(fifo);
}
static int
nvkm_fifo_uevent_ctor(struct nvkm_object *object, void *data, u32 size, nvkm_fifo_uevent_ctor(struct nvkm_object *object, void *data, u32 size,
struct nvkm_notify *notify) struct nvkm_notify *notify)
{ {
...@@ -113,6 +140,13 @@ nvkm_fifo_uevent_ctor(struct nvkm_object *object, void *data, u32 size, ...@@ -113,6 +140,13 @@ nvkm_fifo_uevent_ctor(struct nvkm_object *object, void *data, u32 size,
return ret; return ret;
} }
static const struct nvkm_event_func
nvkm_fifo_uevent_func = {
.ctor = nvkm_fifo_uevent_ctor,
.init = nvkm_fifo_uevent_init,
.fini = nvkm_fifo_uevent_fini,
};
void void
nvkm_fifo_uevent(struct nvkm_fifo *fifo) nvkm_fifo_uevent(struct nvkm_fifo *fifo)
{ {
...@@ -156,50 +190,88 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index, ...@@ -156,50 +190,88 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
return c; return c;
} }
void static void
nvkm_fifo_destroy(struct nvkm_fifo *fifo) nvkm_fifo_intr(struct nvkm_engine *engine)
{ {
nvkm_event_fini(&fifo->uevent); struct nvkm_fifo *fifo = nvkm_fifo(engine);
fifo->func->intr(fifo);
}
static int
nvkm_fifo_fini(struct nvkm_engine *engine, bool suspend)
{
struct nvkm_fifo *fifo = nvkm_fifo(engine);
if (fifo->func->fini)
fifo->func->fini(fifo);
return 0;
}
static int
nvkm_fifo_oneinit(struct nvkm_engine *engine)
{
struct nvkm_fifo *fifo = nvkm_fifo(engine);
if (fifo->func->oneinit)
return fifo->func->oneinit(fifo);
return 0;
}
static int
nvkm_fifo_init(struct nvkm_engine *engine)
{
struct nvkm_fifo *fifo = nvkm_fifo(engine);
fifo->func->init(fifo);
return 0;
}
static void *
nvkm_fifo_dtor(struct nvkm_engine *engine)
{
struct nvkm_fifo *fifo = nvkm_fifo(engine);
void *data = fifo;
if (fifo->func->dtor)
data = fifo->func->dtor(fifo);
nvkm_event_fini(&fifo->cevent); nvkm_event_fini(&fifo->cevent);
nvkm_engine_destroy(&fifo->engine); nvkm_event_fini(&fifo->uevent);
return data;
} }
static const struct nvkm_engine_func static const struct nvkm_engine_func
nvkm_fifo_func = { nvkm_fifo = {
.dtor = nvkm_fifo_dtor,
.oneinit = nvkm_fifo_oneinit,
.init = nvkm_fifo_init,
.fini = nvkm_fifo_fini,
.intr = nvkm_fifo_intr,
.base.sclass = nvkm_fifo_class_get, .base.sclass = nvkm_fifo_class_get,
}; };
int int
nvkm_fifo_create_(struct nvkm_object *parent, struct nvkm_object *engine, nvkm_fifo_ctor(const struct nvkm_fifo_func *func, struct nvkm_device *device,
struct nvkm_oclass *oclass, int index, int nr, struct nvkm_fifo *fifo)
int min, int max, int length, void **pobject)
{ {
struct nvkm_fifo *fifo;
int nr = max + 1;
int cnt = nr - min;
int ret; int ret;
ret = nvkm_engine_create_(parent, engine, oclass, true, "PFIFO", fifo->func = func;
"fifo", length, pobject);
fifo = *pobject;
if (ret)
return ret;
fifo->engine.func = &nvkm_fifo_func;
INIT_LIST_HEAD(&fifo->chan); INIT_LIST_HEAD(&fifo->chan);
spin_lock_init(&fifo->lock);
fifo->nr = nr; if (WARN_ON(fifo->nr > NVKM_FIFO_CHID_NR))
if (WARN_ON(fifo->nr > NVKM_FIFO_CHID_NR)) {
fifo->nr = NVKM_FIFO_CHID_NR; fifo->nr = NVKM_FIFO_CHID_NR;
cnt = fifo->nr - min; else
} fifo->nr = nr;
bitmap_fill(fifo->mask, NVKM_FIFO_CHID_NR); bitmap_clear(fifo->mask, 0, fifo->nr);
bitmap_clear(fifo->mask, min, cnt);
ret = nvkm_event_init(&nvkm_fifo_event_func, 1, 1, &fifo->cevent); ret = nvkm_engine_ctor(&nvkm_fifo, device, index, 0x00000100,
true, &fifo->engine);
if (ret) if (ret)
return ret; return ret;
spin_lock_init(&fifo->lock); if (func->uevent_init) {
return 0; ret = nvkm_event_init(&nvkm_fifo_uevent_func, 1, 1,
&fifo->uevent);
if (ret)
return ret;
}
return nvkm_event_init(&nvkm_fifo_event_func, 1, 1, &fifo->cevent);
} }
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "chan.h" #include "chan.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <core/oproxy.h> #include <core/oproxy.h>
#include <subdev/mmu.h> #include <subdev/mmu.h>
#include <engine/dma.h> #include <engine/dma.h>
......
#ifndef __NVKM_FIFO_CHAN_H__ #ifndef __NVKM_FIFO_CHAN_H__
#define __NVKM_FIFO_CHAN_H__ #define __NVKM_FIFO_CHAN_H__
#define nvkm_fifo_chan(p) container_of((p), struct nvkm_fifo_chan, object)
#include "priv.h" #include "priv.h"
struct nvkm_fifo_chan_func { struct nvkm_fifo_chan_func {
......
...@@ -73,7 +73,7 @@ nv04_fifo_dma_fini(struct nvkm_fifo_chan *base) ...@@ -73,7 +73,7 @@ nv04_fifo_dma_fini(struct nvkm_fifo_chan *base)
struct nv04_fifo *fifo = chan->fifo; struct nv04_fifo *fifo = chan->fifo;
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
struct nvkm_memory *fctx = device->imem->ramfc; struct nvkm_memory *fctx = device->imem->ramfc;
struct ramfc_desc *c; const struct nv04_fifo_ramfc *c;
unsigned long flags; unsigned long flags;
u32 mask = fifo->base.nr - 1; u32 mask = fifo->base.nr - 1;
u32 data = chan->ramfc; u32 data = chan->ramfc;
...@@ -90,7 +90,7 @@ nv04_fifo_dma_fini(struct nvkm_fifo_chan *base) ...@@ -90,7 +90,7 @@ nv04_fifo_dma_fini(struct nvkm_fifo_chan *base)
nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 0); nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 0);
nvkm_mask(device, NV04_PFIFO_CACHE1_PULL0, 0x00000001, 0); nvkm_mask(device, NV04_PFIFO_CACHE1_PULL0, 0x00000001, 0);
c = fifo->ramfc_desc; c = fifo->ramfc;
do { do {
u32 rm = ((1ULL << c->bits) - 1) << c->regs; u32 rm = ((1ULL << c->bits) - 1) << c->regs;
u32 cm = ((1ULL << c->bits) - 1) << c->ctxs; u32 cm = ((1ULL << c->bits) - 1) << c->ctxs;
...@@ -99,7 +99,7 @@ nv04_fifo_dma_fini(struct nvkm_fifo_chan *base) ...@@ -99,7 +99,7 @@ nv04_fifo_dma_fini(struct nvkm_fifo_chan *base)
nvkm_wo32(fctx, c->ctxp + data, cv | (rv << c->ctxs)); nvkm_wo32(fctx, c->ctxp + data, cv | (rv << c->ctxs));
} while ((++c)->bits); } while ((++c)->bits);
c = fifo->ramfc_desc; c = fifo->ramfc;
do { do {
nvkm_wr32(device, c->regp, 0x00000000); nvkm_wr32(device, c->regp, 0x00000000);
} while ((++c)->bits); } while ((++c)->bits);
...@@ -136,7 +136,7 @@ nv04_fifo_dma_dtor(struct nvkm_fifo_chan *base) ...@@ -136,7 +136,7 @@ nv04_fifo_dma_dtor(struct nvkm_fifo_chan *base)
struct nv04_fifo_chan *chan = nv04_fifo_chan(base); struct nv04_fifo_chan *chan = nv04_fifo_chan(base);
struct nv04_fifo *fifo = chan->fifo; struct nv04_fifo *fifo = chan->fifo;
struct nvkm_instmem *imem = fifo->base.engine.subdev.device->imem; struct nvkm_instmem *imem = fifo->base.engine.subdev.device->imem;
struct ramfc_desc *c = fifo->ramfc_desc; const struct nv04_fifo_ramfc *c = fifo->ramfc;
nvkm_kmap(imem->ramfc); nvkm_kmap(imem->ramfc);
do { do {
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "regsnv04.h" #include "regsnv04.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/instmem.h> #include <subdev/instmem.h>
#include <nvif/class.h> #include <nvif/class.h>
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "regsnv04.h" #include "regsnv04.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/instmem.h> #include <subdev/instmem.h>
#include <nvif/class.h> #include <nvif/class.h>
......
...@@ -25,30 +25,29 @@ ...@@ -25,30 +25,29 @@
#include "channv50.h" #include "channv50.h"
static void static void
g84_fifo_uevent_fini(struct nvkm_event *event, int type, int index) g84_fifo_uevent_fini(struct nvkm_fifo *fifo)
{ {
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
nvkm_mask(device, 0x002140, 0x40000000, 0x00000000); nvkm_mask(device, 0x002140, 0x40000000, 0x00000000);
} }
static void static void
g84_fifo_uevent_init(struct nvkm_event *event, int type, int index) g84_fifo_uevent_init(struct nvkm_fifo *fifo)
{ {
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
nvkm_mask(device, 0x002140, 0x40000000, 0x40000000); nvkm_mask(device, 0x002140, 0x40000000, 0x40000000);
} }
static const struct nvkm_event_func
g84_fifo_uevent_func = {
.ctor = nvkm_fifo_uevent_ctor,
.init = g84_fifo_uevent_init,
.fini = g84_fifo_uevent_fini,
};
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
g84_fifo_func = { g84_fifo = {
.dtor = nv50_fifo_dtor,
.oneinit = nv50_fifo_oneinit,
.init = nv50_fifo_init,
.intr = nv04_fifo_intr,
.pause = nv04_fifo_pause,
.start = nv04_fifo_start,
.uevent_init = g84_fifo_uevent_init,
.uevent_fini = g84_fifo_uevent_fini,
.chan = { .chan = {
&g84_fifo_dma_oclass, &g84_fifo_dma_oclass,
&g84_fifo_gpfifo_oclass, &g84_fifo_gpfifo_oclass,
...@@ -56,50 +55,8 @@ g84_fifo_func = { ...@@ -56,50 +55,8 @@ g84_fifo_func = {
}, },
}; };
static int int
g84_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, g84_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nvkm_device *device = (void *)parent; return nv50_fifo_new_(&g84_fifo, device, index, pfifo);
struct nv50_fifo *fifo;
int ret;
ret = nvkm_fifo_create(parent, engine, oclass, 1, 127, &fifo);
*pobject = nv_object(fifo);
if (ret)
return ret;
fifo->base.func = &g84_fifo_func;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000,
false, &fifo->runlist[0]);
if (ret)
return ret;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000,
false, &fifo->runlist[1]);
if (ret)
return ret;
ret = nvkm_event_init(&g84_fifo_uevent_func, 1, 1, &fifo->base.uevent);
if (ret)
return ret;
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = nv04_fifo_intr;
fifo->base.pause = nv04_fifo_pause;
fifo->base.start = nv04_fifo_start;
return 0;
} }
struct nvkm_oclass *
g84_fifo_oclass = &(struct nvkm_oclass) {
.handle = NV_ENGINE(FIFO, 0x84),
.ofuncs = &(struct nvkm_ofuncs) {
.ctor = g84_fifo_ctor,
.dtor = nv50_fifo_dtor,
.init = nv50_fifo_init,
.fini = _nvkm_fifo_fini,
},
};
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <core/client.h> #include <core/client.h>
#include <core/enum.h> #include <core/enum.h>
#include <core/gpuobj.h>
#include <core/handle.h> #include <core/handle.h>
#include <subdev/bar.h> #include <subdev/bar.h>
#include <engine/sw.h> #include <engine/sw.h>
...@@ -33,28 +34,19 @@ ...@@ -33,28 +34,19 @@
#include <nvif/class.h> #include <nvif/class.h>
static void static void
gf100_fifo_uevent_init(struct nvkm_event *event, int type, int index) gf100_fifo_uevent_init(struct nvkm_fifo *fifo)
{ {
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
nvkm_mask(device, 0x002140, 0x80000000, 0x80000000); nvkm_mask(device, 0x002140, 0x80000000, 0x80000000);
} }
static void static void
gf100_fifo_uevent_fini(struct nvkm_event *event, int type, int index) gf100_fifo_uevent_fini(struct nvkm_fifo *fifo)
{ {
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
nvkm_mask(device, 0x002140, 0x80000000, 0x00000000); nvkm_mask(device, 0x002140, 0x80000000, 0x00000000);
} }
static const struct nvkm_event_func
gf100_fifo_uevent_func = {
.ctor = nvkm_fifo_uevent_ctor,
.init = gf100_fifo_uevent_init,
.fini = gf100_fifo_uevent_fini,
};
void void
gf100_fifo_runlist_update(struct gf100_fifo *fifo) gf100_fifo_runlist_update(struct gf100_fifo *fifo)
{ {
...@@ -64,7 +56,7 @@ gf100_fifo_runlist_update(struct gf100_fifo *fifo) ...@@ -64,7 +56,7 @@ gf100_fifo_runlist_update(struct gf100_fifo *fifo)
struct nvkm_memory *cur; struct nvkm_memory *cur;
int nr = 0; int nr = 0;
mutex_lock(&nv_subdev(fifo)->mutex); mutex_lock(&subdev->mutex);
cur = fifo->runlist.mem[fifo->runlist.active]; cur = fifo->runlist.mem[fifo->runlist.active];
fifo->runlist.active = !fifo->runlist.active; fifo->runlist.active = !fifo->runlist.active;
...@@ -83,7 +75,7 @@ gf100_fifo_runlist_update(struct gf100_fifo *fifo) ...@@ -83,7 +75,7 @@ gf100_fifo_runlist_update(struct gf100_fifo *fifo)
!(nvkm_rd32(device, 0x00227c) & 0x00100000), !(nvkm_rd32(device, 0x00227c) & 0x00100000),
msecs_to_jiffies(2000)) == 0) msecs_to_jiffies(2000)) == 0)
nvkm_error(subdev, "runlist update timeout\n"); nvkm_error(subdev, "runlist update timeout\n");
mutex_unlock(&nv_subdev(fifo)->mutex); mutex_unlock(&subdev->mutex);
} }
static inline int static inline int
...@@ -106,6 +98,8 @@ gf100_fifo_engidx(struct gf100_fifo *fifo, u32 engn) ...@@ -106,6 +98,8 @@ gf100_fifo_engidx(struct gf100_fifo *fifo, u32 engn)
static inline struct nvkm_engine * static inline struct nvkm_engine *
gf100_fifo_engine(struct gf100_fifo *fifo, u32 engn) gf100_fifo_engine(struct gf100_fifo *fifo, u32 engn)
{ {
struct nvkm_device *device = fifo->base.engine.subdev.device;
switch (engn) { switch (engn) {
case 0: engn = NVDEV_ENGINE_GR; break; case 0: engn = NVDEV_ENGINE_GR; break;
case 1: engn = NVDEV_ENGINE_MSVLD; break; case 1: engn = NVDEV_ENGINE_MSVLD; break;
...@@ -117,7 +111,7 @@ gf100_fifo_engine(struct gf100_fifo *fifo, u32 engn) ...@@ -117,7 +111,7 @@ gf100_fifo_engine(struct gf100_fifo *fifo, u32 engn)
return NULL; return NULL;
} }
return nvkm_engine(fifo, engn); return nvkm_device_engine(device, engn);
} }
static void static void
...@@ -167,7 +161,7 @@ gf100_fifo_recover(struct gf100_fifo *fifo, struct nvkm_engine *engine, ...@@ -167,7 +161,7 @@ gf100_fifo_recover(struct gf100_fifo *fifo, struct nvkm_engine *engine,
list_del_init(&chan->head); list_del_init(&chan->head);
chan->killed = true; chan->killed = true;
fifo->mask |= 1ULL << nv_engidx(engine); fifo->mask |= 1ULL << engine->subdev.index;
schedule_work(&fifo->fault); schedule_work(&fifo->fault);
} }
...@@ -333,7 +327,7 @@ gf100_fifo_intr_fault(struct gf100_fifo *fifo, int unit) ...@@ -333,7 +327,7 @@ gf100_fifo_intr_fault(struct gf100_fifo *fifo, int unit)
nvkm_mask(device, 0x001718, 0x00000000, 0x00000000); nvkm_mask(device, 0x001718, 0x00000000, 0x00000000);
break; break;
default: default:
engine = nvkm_engine(fifo, eu->data2); engine = nvkm_device_engine(device, eu->data2);
break; break;
} }
} }
...@@ -457,10 +451,11 @@ gf100_fifo_intr_engine(struct gf100_fifo *fifo) ...@@ -457,10 +451,11 @@ gf100_fifo_intr_engine(struct gf100_fifo *fifo)
} }
static void static void
gf100_fifo_intr(struct nvkm_subdev *subdev) gf100_fifo_intr(struct nvkm_fifo *base)
{ {
struct gf100_fifo *fifo = (void *)subdev; struct gf100_fifo *fifo = gf100_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
struct nvkm_device *device = subdev->device;
u32 mask = nvkm_rd32(device, 0x002140); u32 mask = nvkm_rd32(device, 0x002140);
u32 stat = nvkm_rd32(device, 0x002100) & mask; u32 stat = nvkm_rd32(device, 0x002100) & mask;
...@@ -531,17 +526,52 @@ gf100_fifo_intr(struct nvkm_subdev *subdev) ...@@ -531,17 +526,52 @@ gf100_fifo_intr(struct nvkm_subdev *subdev)
} }
static int static int
gf100_fifo_init(struct nvkm_object *object) gf100_fifo_oneinit(struct nvkm_fifo *base)
{ {
struct gf100_fifo *fifo = (void *)object; struct gf100_fifo *fifo = gf100_fifo(base);
struct nvkm_subdev *subdev = &fifo->base.engine.subdev; struct nvkm_device *device = fifo->base.engine.subdev.device;
struct nvkm_device *device = subdev->device; int ret;
int ret, i;
ret = nvkm_fifo_init(&fifo->base); ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 0x1000, 0x1000,
false, &fifo->runlist.mem[0]);
if (ret)
return ret;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 0x1000, 0x1000,
false, &fifo->runlist.mem[1]);
if (ret) if (ret)
return ret; return ret;
init_waitqueue_head(&fifo->runlist.wait);
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 0x1000,
0x1000, false, &fifo->user.mem);
if (ret)
return ret;
ret = nvkm_bar_umap(device->bar, 128 * 0x1000, 12, &fifo->user.bar);
if (ret)
return ret;
nvkm_memory_map(fifo->user.mem, &fifo->user.bar, 0);
return 0;
}
static void
gf100_fifo_fini(struct nvkm_fifo *base)
{
struct gf100_fifo *fifo = gf100_fifo(base);
flush_work(&fifo->fault);
}
static void
gf100_fifo_init(struct nvkm_fifo *base)
{
struct gf100_fifo *fifo = gf100_fifo(base);
struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
struct nvkm_device *device = subdev->device;
int i;
nvkm_wr32(device, 0x000204, 0xffffffff); nvkm_wr32(device, 0x000204, 0xffffffff);
nvkm_wr32(device, 0x002204, 0xffffffff); nvkm_wr32(device, 0x002204, 0xffffffff);
...@@ -571,90 +601,44 @@ gf100_fifo_init(struct nvkm_object *object) ...@@ -571,90 +601,44 @@ gf100_fifo_init(struct nvkm_object *object)
nvkm_wr32(device, 0x002100, 0xffffffff); nvkm_wr32(device, 0x002100, 0xffffffff);
nvkm_wr32(device, 0x002140, 0x7fffffff); nvkm_wr32(device, 0x002140, 0x7fffffff);
nvkm_wr32(device, 0x002628, 0x00000001); /* ENGINE_INTR_EN */ nvkm_wr32(device, 0x002628, 0x00000001); /* ENGINE_INTR_EN */
return 0;
} }
static void static void *
gf100_fifo_dtor(struct nvkm_object *object) gf100_fifo_dtor(struct nvkm_fifo *base)
{ {
struct gf100_fifo *fifo = (void *)object; struct gf100_fifo *fifo = gf100_fifo(base);
nvkm_vm_put(&fifo->user.bar); nvkm_vm_put(&fifo->user.bar);
nvkm_memory_del(&fifo->user.mem); nvkm_memory_del(&fifo->user.mem);
nvkm_memory_del(&fifo->runlist.mem[0]); nvkm_memory_del(&fifo->runlist.mem[0]);
nvkm_memory_del(&fifo->runlist.mem[1]); nvkm_memory_del(&fifo->runlist.mem[1]);
return fifo;
nvkm_fifo_destroy(&fifo->base);
} }
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
gf100_fifo_func = { gf100_fifo = {
.dtor = gf100_fifo_dtor,
.oneinit = gf100_fifo_oneinit,
.init = gf100_fifo_init,
.fini = gf100_fifo_fini,
.intr = gf100_fifo_intr,
.uevent_init = gf100_fifo_uevent_init,
.uevent_fini = gf100_fifo_uevent_fini,
.chan = { .chan = {
&gf100_fifo_gpfifo_oclass, &gf100_fifo_gpfifo_oclass,
NULL NULL
}, },
}; };
static int int
gf100_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, gf100_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nvkm_device *device = (void *)parent;
struct nvkm_bar *bar = device->bar;
struct gf100_fifo *fifo; struct gf100_fifo *fifo;
int ret;
ret = nvkm_fifo_create(parent, engine, oclass, 0, 127, &fifo);
*pobject = nv_object(fifo);
if (ret)
return ret;
fifo->base.func = &gf100_fifo_func;
if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL)))
return -ENOMEM;
INIT_LIST_HEAD(&fifo->chan); INIT_LIST_HEAD(&fifo->chan);
INIT_WORK(&fifo->fault, gf100_fifo_recover_work); INIT_WORK(&fifo->fault, gf100_fifo_recover_work);
*pfifo = &fifo->base;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 0x1000, 0x1000, return nvkm_fifo_ctor(&gf100_fifo, device, index, 128, &fifo->base);
false, &fifo->runlist.mem[0]);
if (ret)
return ret;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 0x1000, 0x1000,
false, &fifo->runlist.mem[1]);
if (ret)
return ret;
init_waitqueue_head(&fifo->runlist.wait);
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 0x1000,
0x1000, false, &fifo->user.mem);
if (ret)
return ret;
ret = nvkm_bar_umap(bar, 128 * 0x1000, 12, &fifo->user.bar);
if (ret)
return ret;
nvkm_memory_map(fifo->user.mem, &fifo->user.bar, 0);
ret = nvkm_event_init(&gf100_fifo_uevent_func, 1, 1, &fifo->base.uevent);
if (ret)
return ret;
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = gf100_fifo_intr;
return 0;
} }
struct nvkm_oclass *
gf100_fifo_oclass = &(struct nvkm_oclass) {
.handle = NV_ENGINE(FIFO, 0xc0),
.ofuncs = &(struct nvkm_ofuncs) {
.ctor = gf100_fifo_ctor,
.dtor = gf100_fifo_dtor,
.init = gf100_fifo_init,
.fini = _nvkm_fifo_fini,
},
};
...@@ -26,35 +26,27 @@ ...@@ -26,35 +26,27 @@
#include <core/client.h> #include <core/client.h>
#include <core/enum.h> #include <core/enum.h>
#include <core/gpuobj.h>
#include <core/handle.h> #include <core/handle.h>
#include <subdev/bar.h> #include <subdev/bar.h>
#include <engine/sw.h> #include <engine/sw.h>
#include <nvif/class.h> #include <nvif/class.h>
static void void
gk104_fifo_uevent_fini(struct nvkm_event *event, int type, int index) gk104_fifo_uevent_fini(struct nvkm_fifo *fifo)
{ {
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
nvkm_mask(device, 0x002140, 0x80000000, 0x00000000); nvkm_mask(device, 0x002140, 0x80000000, 0x00000000);
} }
static void void
gk104_fifo_uevent_init(struct nvkm_event *event, int type, int index) gk104_fifo_uevent_init(struct nvkm_fifo *fifo)
{ {
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), uevent);
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
nvkm_mask(device, 0x002140, 0x80000000, 0x80000000); nvkm_mask(device, 0x002140, 0x80000000, 0x80000000);
} }
static const struct nvkm_event_func
gk104_fifo_uevent_func = {
.ctor = nvkm_fifo_uevent_ctor,
.init = gk104_fifo_uevent_init,
.fini = gk104_fifo_uevent_fini,
};
void void
gk104_fifo_runlist_update(struct gk104_fifo *fifo, u32 engine) gk104_fifo_runlist_update(struct gk104_fifo *fifo, u32 engine)
{ {
...@@ -65,7 +57,7 @@ gk104_fifo_runlist_update(struct gk104_fifo *fifo, u32 engine) ...@@ -65,7 +57,7 @@ gk104_fifo_runlist_update(struct gk104_fifo *fifo, u32 engine)
struct nvkm_memory *cur; struct nvkm_memory *cur;
int nr = 0; int nr = 0;
mutex_lock(&nv_subdev(fifo)->mutex); mutex_lock(&subdev->mutex);
cur = engn->runlist[engn->cur_runlist]; cur = engn->runlist[engn->cur_runlist];
engn->cur_runlist = !engn->cur_runlist; engn->cur_runlist = !engn->cur_runlist;
...@@ -84,15 +76,16 @@ gk104_fifo_runlist_update(struct gk104_fifo *fifo, u32 engine) ...@@ -84,15 +76,16 @@ gk104_fifo_runlist_update(struct gk104_fifo *fifo, u32 engine)
(engine * 0x08)) & 0x00100000), (engine * 0x08)) & 0x00100000),
msecs_to_jiffies(2000)) == 0) msecs_to_jiffies(2000)) == 0)
nvkm_error(subdev, "runlist %d update timeout\n", engine); nvkm_error(subdev, "runlist %d update timeout\n", engine);
mutex_unlock(&nv_subdev(fifo)->mutex); mutex_unlock(&subdev->mutex);
} }
static inline struct nvkm_engine * static inline struct nvkm_engine *
gk104_fifo_engine(struct gk104_fifo *fifo, u32 engn) gk104_fifo_engine(struct gk104_fifo *fifo, u32 engn)
{ {
struct nvkm_device *device = fifo->base.engine.subdev.device;
u64 subdevs = gk104_fifo_engine_subdev(engn); u64 subdevs = gk104_fifo_engine_subdev(engn);
if (subdevs) if (subdevs)
return nvkm_engine(fifo, __ffs(subdevs)); return nvkm_device_engine(device, __ffs(subdevs));
return NULL; return NULL;
} }
...@@ -136,14 +129,14 @@ gk104_fifo_recover(struct gk104_fifo *fifo, struct nvkm_engine *engine, ...@@ -136,14 +129,14 @@ gk104_fifo_recover(struct gk104_fifo *fifo, struct nvkm_engine *engine,
u32 chid = chan->base.chid; u32 chid = chan->base.chid;
nvkm_error(subdev, "%s engine fault on channel %d, recovering...\n", nvkm_error(subdev, "%s engine fault on channel %d, recovering...\n",
nvkm_subdev_name[nv_subdev(engine)->index], chid); nvkm_subdev_name[engine->subdev.index], chid);
assert_spin_locked(&fifo->base.lock); assert_spin_locked(&fifo->base.lock);
nvkm_mask(device, 0x800004 + (chid * 0x08), 0x00000800, 0x00000800); nvkm_mask(device, 0x800004 + (chid * 0x08), 0x00000800, 0x00000800);
list_del_init(&chan->head); list_del_init(&chan->head);
chan->killed = true; chan->killed = true;
fifo->mask |= 1ULL << nv_engidx(engine); fifo->mask |= 1ULL << engine->subdev.index;
schedule_work(&fifo->fault); schedule_work(&fifo->fault);
} }
...@@ -399,7 +392,7 @@ gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit) ...@@ -399,7 +392,7 @@ gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
nvkm_mask(device, 0x001718, 0x00000000, 0x00000000); nvkm_mask(device, 0x001718, 0x00000000, 0x00000000);
break; break;
default: default:
engine = nvkm_engine(fifo, eu->data2); engine = nvkm_device_engine(device, eu->data2);
break; break;
} }
} }
...@@ -542,11 +535,12 @@ gk104_fifo_intr_engine(struct gk104_fifo *fifo) ...@@ -542,11 +535,12 @@ gk104_fifo_intr_engine(struct gk104_fifo *fifo)
nvkm_fifo_uevent(&fifo->base); nvkm_fifo_uevent(&fifo->base);
} }
static void void
gk104_fifo_intr(struct nvkm_subdev *subdev) gk104_fifo_intr(struct nvkm_fifo *base)
{ {
struct gk104_fifo *fifo = (void *)subdev; struct gk104_fifo *fifo = gk104_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
struct nvkm_device *device = subdev->device;
u32 mask = nvkm_rd32(device, 0x002140); u32 mask = nvkm_rd32(device, 0x002140);
u32 stat = nvkm_rd32(device, 0x002100) & mask; u32 stat = nvkm_rd32(device, 0x002100) & mask;
...@@ -633,33 +627,62 @@ gk104_fifo_intr(struct nvkm_subdev *subdev) ...@@ -633,33 +627,62 @@ gk104_fifo_intr(struct nvkm_subdev *subdev)
} }
} }
void
gk104_fifo_fini(struct nvkm_fifo *base)
{
struct gk104_fifo *fifo = gk104_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device;
flush_work(&fifo->fault);
/* allow mmu fault interrupts, even when we're not using fifo */
nvkm_mask(device, 0x002140, 0x10000000, 0x10000000);
}
int int
gk104_fifo_fini(struct nvkm_object *object, bool suspend) gk104_fifo_oneinit(struct nvkm_fifo *base)
{ {
struct gk104_fifo *fifo = (void *)object; struct gk104_fifo *fifo = gk104_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
int ret; int ret, i;
ret = nvkm_fifo_fini(&fifo->base, suspend); for (i = 0; i < ARRAY_SIZE(fifo->engine); i++) {
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
0x8000, 0x1000, false,
&fifo->engine[i].runlist[0]);
if (ret)
return ret;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
0x8000, 0x1000, false,
&fifo->engine[i].runlist[1]);
if (ret)
return ret;
init_waitqueue_head(&fifo->engine[i].wait);
INIT_LIST_HEAD(&fifo->engine[i].chan);
}
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
fifo->base.nr * 0x200, 0x1000, true,
&fifo->user.mem);
if (ret) if (ret)
return ret; return ret;
/* allow mmu fault interrupts, even when we're not using fifo */ ret = nvkm_bar_umap(device->bar, fifo->base.nr * 0x200, 12,
nvkm_mask(device, 0x002140, 0x10000000, 0x10000000); &fifo->user.bar);
if (ret)
return ret;
nvkm_memory_map(fifo->user.mem, &fifo->user.bar, 0);
return 0; return 0;
} }
int void
gk104_fifo_init(struct nvkm_object *object) gk104_fifo_init(struct nvkm_fifo *base)
{ {
struct gk104_fifo *fifo = (void *)object; struct gk104_fifo *fifo = gk104_fifo(base);
struct nvkm_subdev *subdev = &fifo->base.engine.subdev; struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
int ret, i; int i;
ret = nvkm_fifo_init(&fifo->base);
if (ret)
return ret;
/* enable all available PBDMA units */ /* enable all available PBDMA units */
nvkm_wr32(device, 0x000204, 0xffffffff); nvkm_wr32(device, 0x000204, 0xffffffff);
...@@ -683,13 +706,12 @@ gk104_fifo_init(struct nvkm_object *object) ...@@ -683,13 +706,12 @@ gk104_fifo_init(struct nvkm_object *object)
nvkm_wr32(device, 0x002100, 0xffffffff); nvkm_wr32(device, 0x002100, 0xffffffff);
nvkm_wr32(device, 0x002140, 0x7fffffff); nvkm_wr32(device, 0x002140, 0x7fffffff);
return 0;
} }
void void *
gk104_fifo_dtor(struct nvkm_object *object) gk104_fifo_dtor(struct nvkm_fifo *base)
{ {
struct gk104_fifo *fifo = (void *)object; struct gk104_fifo *fifo = gk104_fifo(base);
int i; int i;
nvkm_vm_put(&fifo->user.bar); nvkm_vm_put(&fifo->user.bar);
...@@ -700,11 +722,32 @@ gk104_fifo_dtor(struct nvkm_object *object) ...@@ -700,11 +722,32 @@ gk104_fifo_dtor(struct nvkm_object *object)
nvkm_memory_del(&fifo->engine[i].runlist[0]); nvkm_memory_del(&fifo->engine[i].runlist[0]);
} }
nvkm_fifo_destroy(&fifo->base); return fifo;
}
int
gk104_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
int index, int nr, struct nvkm_fifo **pfifo)
{
struct gk104_fifo *fifo;
if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL)))
return -ENOMEM;
INIT_WORK(&fifo->fault, gk104_fifo_recover_work);
*pfifo = &fifo->base;
return nvkm_fifo_ctor(func, device, index, nr, &fifo->base);
} }
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
gk104_fifo_func = { gk104_fifo = {
.dtor = gk104_fifo_dtor,
.oneinit = gk104_fifo_oneinit,
.init = gk104_fifo_init,
.fini = gk104_fifo_fini,
.intr = gk104_fifo_intr,
.uevent_init = gk104_fifo_uevent_init,
.uevent_fini = gk104_fifo_uevent_fini,
.chan = { .chan = {
&gk104_fifo_gpfifo_oclass, &gk104_fifo_gpfifo_oclass,
NULL NULL
...@@ -712,72 +755,7 @@ gk104_fifo_func = { ...@@ -712,72 +755,7 @@ gk104_fifo_func = {
}; };
int int
gk104_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, gk104_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nvkm_device *device = (void *)parent; return gk104_fifo_new_(&gk104_fifo, device, index, 4096, pfifo);
struct nvkm_bar *bar = device->bar;
struct gk104_fifo_impl *impl = (void *)oclass;
struct gk104_fifo *fifo;
int ret, i;
ret = nvkm_fifo_create(parent, engine, oclass, 0,
impl->channels - 1, &fifo);
*pobject = nv_object(fifo);
if (ret)
return ret;
fifo->base.func = &gk104_fifo_func;
INIT_WORK(&fifo->fault, gk104_fifo_recover_work);
for (i = 0; i < ARRAY_SIZE(fifo->engine); i++) {
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
0x8000, 0x1000, false,
&fifo->engine[i].runlist[0]);
if (ret)
return ret;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
0x8000, 0x1000, false,
&fifo->engine[i].runlist[1]);
if (ret)
return ret;
init_waitqueue_head(&fifo->engine[i].wait);
INIT_LIST_HEAD(&fifo->engine[i].chan);
}
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
impl->channels * 0x200, 0x1000,
true, &fifo->user.mem);
if (ret)
return ret;
ret = nvkm_bar_umap(bar, impl->channels * 0x200, 12, &fifo->user.bar);
if (ret)
return ret;
nvkm_memory_map(fifo->user.mem, &fifo->user.bar, 0);
ret = nvkm_event_init(&gk104_fifo_uevent_func, 1, 1, &fifo->base.uevent);
if (ret)
return ret;
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = gk104_fifo_intr;
return 0;
} }
struct nvkm_oclass *
gk104_fifo_oclass = &(struct gk104_fifo_impl) {
.base.handle = NV_ENGINE(FIFO, 0xe0),
.base.ofuncs = &(struct nvkm_ofuncs) {
.ctor = gk104_fifo_ctor,
.dtor = gk104_fifo_dtor,
.init = gk104_fifo_init,
.fini = gk104_fifo_fini,
},
.channels = 4096,
}.base;
...@@ -26,23 +26,17 @@ struct gk104_fifo { ...@@ -26,23 +26,17 @@ struct gk104_fifo {
int spoon_nr; int spoon_nr;
}; };
struct gk104_fifo_impl { int gk104_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
struct nvkm_oclass base; int index, int nr, struct nvkm_fifo **);
u32 channels; void *gk104_fifo_dtor(struct nvkm_fifo *);
}; int gk104_fifo_oneinit(struct nvkm_fifo *);
void gk104_fifo_init(struct nvkm_fifo *);
int gk104_fifo_ctor(struct nvkm_object *, struct nvkm_object *, void gk104_fifo_fini(struct nvkm_fifo *);
struct nvkm_oclass *, void *, u32, void gk104_fifo_intr(struct nvkm_fifo *);
struct nvkm_object **); void gk104_fifo_uevent_init(struct nvkm_fifo *);
void gk104_fifo_dtor(struct nvkm_object *); void gk104_fifo_uevent_fini(struct nvkm_fifo *);
int gk104_fifo_init(struct nvkm_object *);
int gk104_fifo_fini(struct nvkm_object *, bool);
void gk104_fifo_runlist_update(struct gk104_fifo *, u32 engine); void gk104_fifo_runlist_update(struct gk104_fifo *, u32 engine);
int gm204_fifo_ctor(struct nvkm_object *, struct nvkm_object *,
struct nvkm_oclass *, void *, u32,
struct nvkm_object **);
static inline u64 static inline u64
gk104_fifo_engine_subdev(int engine) gk104_fifo_engine_subdev(int engine)
{ {
......
...@@ -22,15 +22,25 @@ ...@@ -22,15 +22,25 @@
* Authors: Ben Skeggs * Authors: Ben Skeggs
*/ */
#include "gk104.h" #include "gk104.h"
#include "changk104.h"
struct nvkm_oclass * static const struct nvkm_fifo_func
gk208_fifo_oclass = &(struct gk104_fifo_impl) { gk208_fifo = {
.base.handle = NV_ENGINE(FIFO, 0x08), .dtor = gk104_fifo_dtor,
.base.ofuncs = &(struct nvkm_ofuncs) { .oneinit = gk104_fifo_oneinit,
.ctor = gk104_fifo_ctor, .init = gk104_fifo_init,
.dtor = gk104_fifo_dtor, .fini = gk104_fifo_fini,
.init = gk104_fifo_init, .intr = gk104_fifo_intr,
.fini = _nvkm_fifo_fini, .uevent_init = gk104_fifo_uevent_init,
.uevent_fini = gk104_fifo_uevent_fini,
.chan = {
&gk104_fifo_gpfifo_oclass,
NULL
}, },
.channels = 1024, };
}.base;
int
gk208_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
{
return gk104_fifo_new_(&gk208_fifo, device, index, 1024, pfifo);
}
...@@ -20,15 +20,25 @@ ...@@ -20,15 +20,25 @@
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
*/ */
#include "gk104.h" #include "gk104.h"
#include "changk104.h"
struct nvkm_oclass * static const struct nvkm_fifo_func
gk20a_fifo_oclass = &(struct gk104_fifo_impl) { gk20a_fifo = {
.base.handle = NV_ENGINE(FIFO, 0xea), .dtor = gk104_fifo_dtor,
.base.ofuncs = &(struct nvkm_ofuncs) { .oneinit = gk104_fifo_oneinit,
.ctor = gk104_fifo_ctor, .init = gk104_fifo_init,
.dtor = gk104_fifo_dtor, .fini = gk104_fifo_fini,
.init = gk104_fifo_init, .intr = gk104_fifo_intr,
.fini = gk104_fifo_fini, .uevent_init = gk104_fifo_uevent_init,
.uevent_fini = gk104_fifo_uevent_fini,
.chan = {
&gk104_fifo_gpfifo_oclass,
NULL
}, },
.channels = 128, };
}.base;
int
gk20a_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
{
return gk104_fifo_new_(&gk20a_fifo, device, index, 128, pfifo);
}
...@@ -25,7 +25,14 @@ ...@@ -25,7 +25,14 @@
#include "changk104.h" #include "changk104.h"
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
gm204_fifo_func = { gm204_fifo = {
.dtor = gk104_fifo_dtor,
.oneinit = gk104_fifo_oneinit,
.init = gk104_fifo_init,
.fini = gk104_fifo_fini,
.intr = gk104_fifo_intr,
.uevent_init = gk104_fifo_uevent_init,
.uevent_fini = gk104_fifo_uevent_fini,
.chan = { .chan = {
&gm204_fifo_gpfifo_oclass, &gm204_fifo_gpfifo_oclass,
NULL NULL
...@@ -33,26 +40,7 @@ gm204_fifo_func = { ...@@ -33,26 +40,7 @@ gm204_fifo_func = {
}; };
int int
gm204_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, gm204_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
int ret = gk104_fifo_ctor(parent, engine, oclass, data, size, pobject); return gk104_fifo_new_(&gm204_fifo, device, index, 4096, pfifo);
if (ret == 0) {
struct gk104_fifo *fifo = (void *)*pobject;
fifo->base.func = &gm204_fifo_func;
}
return ret;
} }
struct nvkm_oclass *
gm204_fifo_oclass = &(struct gk104_fifo_impl) {
.base.handle = NV_ENGINE(FIFO, 0x24),
.base.ofuncs = &(struct nvkm_ofuncs) {
.ctor = gm204_fifo_ctor,
.dtor = gk104_fifo_dtor,
.init = gk104_fifo_init,
.fini = _nvkm_fifo_fini,
},
.channels = 4096,
}.base;
...@@ -20,15 +20,25 @@ ...@@ -20,15 +20,25 @@
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
*/ */
#include "gk104.h" #include "gk104.h"
#include "changk104.h"
struct nvkm_oclass * static const struct nvkm_fifo_func
gm20b_fifo_oclass = &(struct gk104_fifo_impl) { gm20b_fifo = {
.base.handle = NV_ENGINE(FIFO, 0x2b), .dtor = gk104_fifo_dtor,
.base.ofuncs = &(struct nvkm_ofuncs) { .oneinit = gk104_fifo_oneinit,
.ctor = gm204_fifo_ctor, .init = gk104_fifo_init,
.dtor = gk104_fifo_dtor, .fini = gk104_fifo_fini,
.init = gk104_fifo_init, .intr = gk104_fifo_intr,
.fini = gk104_fifo_fini, .uevent_init = gk104_fifo_uevent_init,
.uevent_fini = gk104_fifo_uevent_fini,
.chan = {
&gm204_fifo_gpfifo_oclass,
NULL
}, },
.channels = 512, };
}.base;
int
gm20b_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
{
return gk104_fifo_new_(&gm20b_fifo, device, index, 512, pfifo);
}
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "changf100.h" #include "changf100.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/fb.h> #include <subdev/fb.h>
#include <subdev/timer.h> #include <subdev/timer.h>
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "changk104.h" #include "changk104.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/fb.h> #include <subdev/fb.h>
#include <subdev/mmu.h> #include <subdev/mmu.h>
#include <subdev/timer.h> #include <subdev/timer.h>
......
...@@ -32,8 +32,8 @@ ...@@ -32,8 +32,8 @@
#include <subdev/timer.h> #include <subdev/timer.h>
#include <engine/sw.h> #include <engine/sw.h>
static struct ramfc_desc static const struct nv04_fifo_ramfc
nv04_ramfc[] = { nv04_fifo_ramfc[] = {
{ 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT }, { 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT },
{ 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET }, { 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET },
{ 16, 0, 0x08, 0, NV04_PFIFO_CACHE1_DMA_INSTANCE }, { 16, 0, 0x08, 0, NV04_PFIFO_CACHE1_DMA_INSTANCE },
...@@ -46,10 +46,10 @@ nv04_ramfc[] = { ...@@ -46,10 +46,10 @@ nv04_ramfc[] = {
}; };
void void
nv04_fifo_pause(struct nvkm_fifo *obj, unsigned long *pflags) nv04_fifo_pause(struct nvkm_fifo *base, unsigned long *pflags)
__acquires(fifo->base.lock) __acquires(fifo->base.lock)
{ {
struct nv04_fifo *fifo = container_of(obj, typeof(*fifo), base); struct nv04_fifo *fifo = nv04_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
unsigned long flags; unsigned long flags;
...@@ -82,10 +82,10 @@ __acquires(fifo->base.lock) ...@@ -82,10 +82,10 @@ __acquires(fifo->base.lock)
} }
void void
nv04_fifo_start(struct nvkm_fifo *obj, unsigned long *pflags) nv04_fifo_start(struct nvkm_fifo *base, unsigned long *pflags)
__releases(fifo->base.lock) __releases(fifo->base.lock)
{ {
struct nv04_fifo *fifo = container_of(obj, typeof(*fifo), base); struct nv04_fifo *fifo = nv04_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
unsigned long flags = *pflags; unsigned long flags = *pflags;
...@@ -236,10 +236,11 @@ nv04_fifo_dma_pusher(struct nv04_fifo *fifo, u32 chid) ...@@ -236,10 +236,11 @@ nv04_fifo_dma_pusher(struct nv04_fifo *fifo, u32 chid)
} }
void void
nv04_fifo_intr(struct nvkm_subdev *subdev) nv04_fifo_intr(struct nvkm_fifo *base)
{ {
struct nv04_fifo *fifo = nv04_fifo(base);
struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
struct nv04_fifo *fifo = (void *)subdev;
u32 mask = nvkm_rd32(device, NV03_PFIFO_INTR_EN_0); u32 mask = nvkm_rd32(device, NV03_PFIFO_INTR_EN_0);
u32 stat = nvkm_rd32(device, NV03_PFIFO_INTR_0) & mask; u32 stat = nvkm_rd32(device, NV03_PFIFO_INTR_0) & mask;
u32 reassign, chid, get, sem; u32 reassign, chid, get, sem;
...@@ -293,20 +294,15 @@ nv04_fifo_intr(struct nvkm_subdev *subdev) ...@@ -293,20 +294,15 @@ nv04_fifo_intr(struct nvkm_subdev *subdev)
nvkm_wr32(device, NV03_PFIFO_CACHES, reassign); nvkm_wr32(device, NV03_PFIFO_CACHES, reassign);
} }
int void
nv04_fifo_init(struct nvkm_object *object) nv04_fifo_init(struct nvkm_fifo *base)
{ {
struct nv04_fifo *fifo = (void *)object; struct nv04_fifo *fifo = nv04_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
struct nvkm_instmem *imem = device->imem; struct nvkm_instmem *imem = device->imem;
struct nvkm_ramht *ramht = imem->ramht; struct nvkm_ramht *ramht = imem->ramht;
struct nvkm_memory *ramro = imem->ramro; struct nvkm_memory *ramro = imem->ramro;
struct nvkm_memory *ramfc = imem->ramfc; struct nvkm_memory *ramfc = imem->ramfc;
int ret;
ret = nvkm_fifo_init(&fifo->base);
if (ret)
return ret;
nvkm_wr32(device, NV04_PFIFO_DELAY_0, 0x000000ff); nvkm_wr32(device, NV04_PFIFO_DELAY_0, 0x000000ff);
nvkm_wr32(device, NV04_PFIFO_DMA_TIMESLICE, 0x0101ffff); nvkm_wr32(device, NV04_PFIFO_DMA_TIMESLICE, 0x0101ffff);
...@@ -325,54 +321,44 @@ nv04_fifo_init(struct nvkm_object *object) ...@@ -325,54 +321,44 @@ nv04_fifo_init(struct nvkm_object *object)
nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 1); nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 1);
nvkm_wr32(device, NV04_PFIFO_CACHE1_PULL0, 1); nvkm_wr32(device, NV04_PFIFO_CACHE1_PULL0, 1);
nvkm_wr32(device, NV03_PFIFO_CACHES, 1); nvkm_wr32(device, NV03_PFIFO_CACHES, 1);
return 0;
} }
void int
nv04_fifo_dtor(struct nvkm_object *object) nv04_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
{ int index, int nr, const struct nv04_fifo_ramfc *ramfc,
struct nv04_fifo *fifo = (void *)object; struct nvkm_fifo **pfifo)
nvkm_fifo_destroy(&fifo->base);
}
static const struct nvkm_fifo_func
nv04_fifo_func = {
.chan = {
&nv04_fifo_dma_oclass,
NULL
},
};
static int
nv04_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nv04_fifo *fifo; struct nv04_fifo *fifo;
int ret; int ret;
ret = nvkm_fifo_create(parent, engine, oclass, 0, 15, &fifo); if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL)))
*pobject = nv_object(fifo); return -ENOMEM;
fifo->ramfc = ramfc;
*pfifo = &fifo->base;
ret = nvkm_fifo_ctor(func, device, index, nr, &fifo->base);
if (ret) if (ret)
return ret; return ret;
fifo->base.func = &nv04_fifo_func; set_bit(nr - 1, fifo->base.mask); /* inactive channel */
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = nv04_fifo_intr;
fifo->base.pause = nv04_fifo_pause;
fifo->base.start = nv04_fifo_start;
fifo->ramfc_desc = nv04_ramfc;
return 0; return 0;
} }
struct nvkm_oclass * static const struct nvkm_fifo_func
nv04_fifo_oclass = &(struct nvkm_oclass) { nv04_fifo = {
.handle = NV_ENGINE(FIFO, 0x04), .init = nv04_fifo_init,
.ofuncs = &(struct nvkm_ofuncs) { .intr = nv04_fifo_intr,
.ctor = nv04_fifo_ctor, .pause = nv04_fifo_pause,
.dtor = nv04_fifo_dtor, .start = nv04_fifo_start,
.init = nv04_fifo_init, .chan = {
.fini = _nvkm_fifo_fini, &nv04_fifo_dma_oclass,
NULL
}, },
}; };
int
nv04_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
{
return nv04_fifo_new_(&nv04_fifo, device, index, 16,
nv04_fifo_ramfc, pfifo);
}
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#define nv04_fifo(p) container_of((p), struct nv04_fifo, base) #define nv04_fifo(p) container_of((p), struct nv04_fifo, base)
#include "priv.h" #include "priv.h"
struct ramfc_desc { struct nv04_fifo_ramfc {
unsigned bits:6; unsigned bits:6;
unsigned ctxs:5; unsigned ctxs:5;
unsigned ctxp:8; unsigned ctxp:8;
...@@ -13,9 +13,11 @@ struct ramfc_desc { ...@@ -13,9 +13,11 @@ struct ramfc_desc {
struct nv04_fifo { struct nv04_fifo {
struct nvkm_fifo base; struct nvkm_fifo base;
struct ramfc_desc *ramfc_desc; const struct nv04_fifo_ramfc *ramfc;
}; };
void nv04_fifo_dtor(struct nvkm_object *); int nv04_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
int nv04_fifo_init(struct nvkm_object *); int index, int nr, const struct nv04_fifo_ramfc *,
struct nvkm_fifo **);
void nv04_fifo_init(struct nvkm_fifo *);
#endif #endif
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
#include "channv04.h" #include "channv04.h"
#include "regsnv04.h" #include "regsnv04.h"
static struct ramfc_desc static const struct nv04_fifo_ramfc
nv10_ramfc[] = { nv10_fifo_ramfc[] = {
{ 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT }, { 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT },
{ 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET }, { 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET },
{ 32, 0, 0x08, 0, NV10_PFIFO_CACHE1_REF_CNT }, { 32, 0, 0x08, 0, NV10_PFIFO_CACHE1_REF_CNT },
...@@ -40,43 +40,20 @@ nv10_ramfc[] = { ...@@ -40,43 +40,20 @@ nv10_ramfc[] = {
}; };
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
nv10_fifo_func = { nv10_fifo = {
.init = nv04_fifo_init,
.intr = nv04_fifo_intr,
.pause = nv04_fifo_pause,
.start = nv04_fifo_start,
.chan = { .chan = {
&nv10_fifo_dma_oclass, &nv10_fifo_dma_oclass,
NULL NULL
}, },
}; };
static int int
nv10_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, nv10_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nv04_fifo *fifo; return nv04_fifo_new_(&nv10_fifo, device, index, 32,
int ret; nv10_fifo_ramfc, pfifo);
ret = nvkm_fifo_create(parent, engine, oclass, 0, 31, &fifo);
*pobject = nv_object(fifo);
if (ret)
return ret;
fifo->base.func = &nv10_fifo_func;
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = nv04_fifo_intr;
fifo->base.pause = nv04_fifo_pause;
fifo->base.start = nv04_fifo_start;
fifo->ramfc_desc = nv10_ramfc;
return 0;
} }
struct nvkm_oclass *
nv10_fifo_oclass = &(struct nvkm_oclass) {
.handle = NV_ENGINE(FIFO, 0x10),
.ofuncs = &(struct nvkm_ofuncs) {
.ctor = nv10_fifo_ctor,
.dtor = nv04_fifo_dtor,
.init = nv04_fifo_init,
.fini = _nvkm_fifo_fini,
},
};
...@@ -28,8 +28,8 @@ ...@@ -28,8 +28,8 @@
#include <core/ramht.h> #include <core/ramht.h>
#include <subdev/instmem.h> #include <subdev/instmem.h>
static struct ramfc_desc static const struct nv04_fifo_ramfc
nv17_ramfc[] = { nv17_fifo_ramfc[] = {
{ 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT }, { 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT },
{ 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET }, { 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET },
{ 32, 0, 0x08, 0, NV10_PFIFO_CACHE1_REF_CNT }, { 32, 0, 0x08, 0, NV10_PFIFO_CACHE1_REF_CNT },
...@@ -47,20 +47,15 @@ nv17_ramfc[] = { ...@@ -47,20 +47,15 @@ nv17_ramfc[] = {
{} {}
}; };
static int static void
nv17_fifo_init(struct nvkm_object *object) nv17_fifo_init(struct nvkm_fifo *base)
{ {
struct nv04_fifo *fifo = (void *)object; struct nv04_fifo *fifo = nv04_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
struct nvkm_instmem *imem = device->imem; struct nvkm_instmem *imem = device->imem;
struct nvkm_ramht *ramht = imem->ramht; struct nvkm_ramht *ramht = imem->ramht;
struct nvkm_memory *ramro = imem->ramro; struct nvkm_memory *ramro = imem->ramro;
struct nvkm_memory *ramfc = imem->ramfc; struct nvkm_memory *ramfc = imem->ramfc;
int ret;
ret = nvkm_fifo_init(&fifo->base);
if (ret)
return ret;
nvkm_wr32(device, NV04_PFIFO_DELAY_0, 0x000000ff); nvkm_wr32(device, NV04_PFIFO_DELAY_0, 0x000000ff);
nvkm_wr32(device, NV04_PFIFO_DMA_TIMESLICE, 0x0101ffff); nvkm_wr32(device, NV04_PFIFO_DMA_TIMESLICE, 0x0101ffff);
...@@ -80,47 +75,23 @@ nv17_fifo_init(struct nvkm_object *object) ...@@ -80,47 +75,23 @@ nv17_fifo_init(struct nvkm_object *object)
nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 1); nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 1);
nvkm_wr32(device, NV04_PFIFO_CACHE1_PULL0, 1); nvkm_wr32(device, NV04_PFIFO_CACHE1_PULL0, 1);
nvkm_wr32(device, NV03_PFIFO_CACHES, 1); nvkm_wr32(device, NV03_PFIFO_CACHES, 1);
return 0;
} }
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
nv17_fifo_func = { nv17_fifo = {
.init = nv17_fifo_init,
.intr = nv04_fifo_intr,
.pause = nv04_fifo_pause,
.start = nv04_fifo_start,
.chan = { .chan = {
&nv17_fifo_dma_oclass, &nv17_fifo_dma_oclass,
NULL NULL
}, },
}; };
static int int
nv17_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, nv17_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nv04_fifo *fifo; return nv04_fifo_new_(&nv17_fifo, device, index, 32,
int ret; nv17_fifo_ramfc, pfifo);
ret = nvkm_fifo_create(parent, engine, oclass, 0, 31, &fifo);
*pobject = nv_object(fifo);
if (ret)
return ret;
fifo->base.func = &nv17_fifo_func;
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = nv04_fifo_intr;
fifo->base.pause = nv04_fifo_pause;
fifo->base.start = nv04_fifo_start;
fifo->ramfc_desc = nv17_ramfc;
return 0;
} }
struct nvkm_oclass *
nv17_fifo_oclass = &(struct nvkm_oclass) {
.handle = NV_ENGINE(FIFO, 0x17),
.ofuncs = &(struct nvkm_ofuncs) {
.ctor = nv17_fifo_ctor,
.dtor = nv04_fifo_dtor,
.init = nv17_fifo_init,
.fini = _nvkm_fifo_fini,
},
};
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
#include <subdev/fb.h> #include <subdev/fb.h>
#include <subdev/instmem.h> #include <subdev/instmem.h>
static struct ramfc_desc static const struct nv04_fifo_ramfc
nv40_ramfc[] = { nv40_fifo_ramfc[] = {
{ 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT }, { 32, 0, 0x00, 0, NV04_PFIFO_CACHE1_DMA_PUT },
{ 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET }, { 32, 0, 0x04, 0, NV04_PFIFO_CACHE1_DMA_GET },
{ 32, 0, 0x08, 0, NV10_PFIFO_CACHE1_REF_CNT }, { 32, 0, 0x08, 0, NV10_PFIFO_CACHE1_REF_CNT },
...@@ -56,21 +56,16 @@ nv40_ramfc[] = { ...@@ -56,21 +56,16 @@ nv40_ramfc[] = {
{} {}
}; };
static int static void
nv40_fifo_init(struct nvkm_object *object) nv40_fifo_init(struct nvkm_fifo *base)
{ {
struct nv04_fifo *fifo = (void *)object; struct nv04_fifo *fifo = nv04_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
struct nvkm_fb *fb = device->fb; struct nvkm_fb *fb = device->fb;
struct nvkm_instmem *imem = device->imem; struct nvkm_instmem *imem = device->imem;
struct nvkm_ramht *ramht = imem->ramht; struct nvkm_ramht *ramht = imem->ramht;
struct nvkm_memory *ramro = imem->ramro; struct nvkm_memory *ramro = imem->ramro;
struct nvkm_memory *ramfc = imem->ramfc; struct nvkm_memory *ramfc = imem->ramfc;
int ret;
ret = nvkm_fifo_init(&fifo->base);
if (ret)
return ret;
nvkm_wr32(device, 0x002040, 0x000000ff); nvkm_wr32(device, 0x002040, 0x000000ff);
nvkm_wr32(device, 0x002044, 0x2101ffff); nvkm_wr32(device, 0x002044, 0x2101ffff);
...@@ -81,7 +76,7 @@ nv40_fifo_init(struct nvkm_object *object) ...@@ -81,7 +76,7 @@ nv40_fifo_init(struct nvkm_object *object)
(ramht->gpuobj->addr >> 8)); (ramht->gpuobj->addr >> 8));
nvkm_wr32(device, NV03_PFIFO_RAMRO, nvkm_memory_addr(ramro) >> 8); nvkm_wr32(device, NV03_PFIFO_RAMRO, nvkm_memory_addr(ramro) >> 8);
switch (nv_device(fifo)->chipset) { switch (device->chipset) {
case 0x47: case 0x47:
case 0x49: case 0x49:
case 0x4b: case 0x4b:
...@@ -110,47 +105,23 @@ nv40_fifo_init(struct nvkm_object *object) ...@@ -110,47 +105,23 @@ nv40_fifo_init(struct nvkm_object *object)
nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 1); nvkm_wr32(device, NV03_PFIFO_CACHE1_PUSH0, 1);
nvkm_wr32(device, NV04_PFIFO_CACHE1_PULL0, 1); nvkm_wr32(device, NV04_PFIFO_CACHE1_PULL0, 1);
nvkm_wr32(device, NV03_PFIFO_CACHES, 1); nvkm_wr32(device, NV03_PFIFO_CACHES, 1);
return 0;
} }
static const struct nvkm_fifo_func static const struct nvkm_fifo_func
nv40_fifo_func = { nv40_fifo = {
.init = nv40_fifo_init,
.intr = nv04_fifo_intr,
.pause = nv04_fifo_pause,
.start = nv04_fifo_start,
.chan = { .chan = {
&nv40_fifo_dma_oclass, &nv40_fifo_dma_oclass,
NULL NULL
}, },
}; };
static int int
nv40_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, nv40_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nv04_fifo *fifo; return nv04_fifo_new_(&nv40_fifo, device, index, 32,
int ret; nv40_fifo_ramfc, pfifo);
ret = nvkm_fifo_create(parent, engine, oclass, 0, 31, &fifo);
*pobject = nv_object(fifo);
if (ret)
return ret;
fifo->base.func = &nv40_fifo_func;
nv_subdev(fifo)->unit = 0x00000100;
nv_subdev(fifo)->intr = nv04_fifo_intr;
fifo->base.pause = nv04_fifo_pause;
fifo->base.start = nv04_fifo_start;
fifo->ramfc_desc = nv40_ramfc;
return 0;
} }
struct nvkm_oclass *
nv40_fifo_oclass = &(struct nvkm_oclass) {
.handle = NV_ENGINE(FIFO, 0x40),
.ofuncs = &(struct nvkm_ofuncs) {
.ctor = nv40_fifo_ctor,
.dtor = nv04_fifo_dtor,
.init = nv40_fifo_init,
.fini = _nvkm_fifo_fini,
},
};
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "nv50.h" #include "nv50.h"
#include "channv50.h" #include "channv50.h"
#include <core/gpuobj.h>
static void static void
nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo) nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo)
{ {
...@@ -49,22 +51,34 @@ nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo) ...@@ -49,22 +51,34 @@ nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo)
void void
nv50_fifo_runlist_update(struct nv50_fifo *fifo) nv50_fifo_runlist_update(struct nv50_fifo *fifo)
{ {
mutex_lock(&nv_subdev(fifo)->mutex); mutex_lock(&fifo->base.engine.subdev.mutex);
nv50_fifo_runlist_update_locked(fifo); nv50_fifo_runlist_update_locked(fifo);
mutex_unlock(&nv_subdev(fifo)->mutex); mutex_unlock(&fifo->base.engine.subdev.mutex);
} }
int int
nv50_fifo_init(struct nvkm_object *object) nv50_fifo_oneinit(struct nvkm_fifo *base)
{ {
struct nv50_fifo *fifo = (void *)object; struct nv50_fifo *fifo = nv50_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device; struct nvkm_device *device = fifo->base.engine.subdev.device;
int ret, i; int ret;
ret = nvkm_fifo_init(&fifo->base); ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000,
false, &fifo->runlist[0]);
if (ret) if (ret)
return ret; return ret;
return nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000,
false, &fifo->runlist[1]);
}
void
nv50_fifo_init(struct nvkm_fifo *base)
{
struct nv50_fifo *fifo = nv50_fifo(base);
struct nvkm_device *device = fifo->base.engine.subdev.device;
int i;
nvkm_mask(device, 0x000200, 0x00000100, 0x00000000); nvkm_mask(device, 0x000200, 0x00000100, 0x00000000);
nvkm_mask(device, 0x000200, 0x00000100, 0x00000100); nvkm_mask(device, 0x000200, 0x00000100, 0x00000100);
nvkm_wr32(device, 0x00250c, 0x6f3cfc34); nvkm_wr32(device, 0x00250c, 0x6f3cfc34);
...@@ -80,69 +94,54 @@ nv50_fifo_init(struct nvkm_object *object) ...@@ -80,69 +94,54 @@ nv50_fifo_init(struct nvkm_object *object)
nvkm_wr32(device, 0x003200, 0x00000001); nvkm_wr32(device, 0x003200, 0x00000001);
nvkm_wr32(device, 0x003250, 0x00000001); nvkm_wr32(device, 0x003250, 0x00000001);
nvkm_wr32(device, 0x002500, 0x00000001); nvkm_wr32(device, 0x002500, 0x00000001);
return 0;
} }
void void *
nv50_fifo_dtor(struct nvkm_object *object) nv50_fifo_dtor(struct nvkm_fifo *base)
{ {
struct nv50_fifo *fifo = (void *)object; struct nv50_fifo *fifo = nv50_fifo(base);
nvkm_memory_del(&fifo->runlist[1]); nvkm_memory_del(&fifo->runlist[1]);
nvkm_memory_del(&fifo->runlist[0]); nvkm_memory_del(&fifo->runlist[0]);
return fifo;
nvkm_fifo_destroy(&fifo->base);
} }
static const struct nvkm_fifo_func int
nv50_fifo_func = { nv50_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
.chan = { int index, struct nvkm_fifo **pfifo)
&nv50_fifo_dma_oclass,
&nv50_fifo_gpfifo_oclass,
NULL
},
};
static int
nv50_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
struct nvkm_oclass *oclass, void *data, u32 size,
struct nvkm_object **pobject)
{ {
struct nvkm_device *device = (void *)parent;
struct nv50_fifo *fifo; struct nv50_fifo *fifo;
int ret; int ret;
ret = nvkm_fifo_create(parent, engine, oclass, 1, 127, &fifo); if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL)))
*pobject = nv_object(fifo); return -ENOMEM;
if (ret) *pfifo = &fifo->base;
return ret;
fifo->base.func = &nv50_fifo_func;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000,
false, &fifo->runlist[0]);
if (ret)
return ret;
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000, ret = nvkm_fifo_ctor(func, device, index, 128, &fifo->base);
false, &fifo->runlist[1]);
if (ret) if (ret)
return ret; return ret;
nv_subdev(fifo)->unit = 0x00000100; set_bit(0, fifo->base.mask); /* PIO channel */
nv_subdev(fifo)->intr = nv04_fifo_intr; set_bit(127, fifo->base.mask); /* inactive channel */
fifo->base.pause = nv04_fifo_pause;
fifo->base.start = nv04_fifo_start;
return 0; return 0;
} }
struct nvkm_oclass * static const struct nvkm_fifo_func
nv50_fifo_oclass = &(struct nvkm_oclass) { nv50_fifo = {
.handle = NV_ENGINE(FIFO, 0x50), .dtor = nv50_fifo_dtor,
.ofuncs = &(struct nvkm_ofuncs) { .oneinit = nv50_fifo_oneinit,
.ctor = nv50_fifo_ctor, .init = nv50_fifo_init,
.dtor = nv50_fifo_dtor, .intr = nv04_fifo_intr,
.init = nv50_fifo_init, .pause = nv04_fifo_pause,
.fini = _nvkm_fifo_fini, .start = nv04_fifo_start,
.chan = {
&nv50_fifo_dma_oclass,
&nv50_fifo_gpfifo_oclass,
NULL
}, },
}; };
int
nv50_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo)
{
return nv50_fifo_new_(&nv50_fifo, device, index, pfifo);
}
...@@ -9,7 +9,11 @@ struct nv50_fifo { ...@@ -9,7 +9,11 @@ struct nv50_fifo {
int cur_runlist; int cur_runlist;
}; };
void nv50_fifo_dtor(struct nvkm_object *); int nv50_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
int nv50_fifo_init(struct nvkm_object *); int index, struct nvkm_fifo **);
void *nv50_fifo_dtor(struct nvkm_fifo *);
int nv50_fifo_oneinit(struct nvkm_fifo *);
void nv50_fifo_init(struct nvkm_fifo *);
void nv50_fifo_runlist_update(struct nv50_fifo *); void nv50_fifo_runlist_update(struct nv50_fifo *);
#endif #endif
#ifndef __NVKM_FIFO_PRIV_H__ #ifndef __NVKM_FIFO_PRIV_H__
#define __NVKM_FIFO_PRIV_H__ #define __NVKM_FIFO_PRIV_H__
#define nvkm_fifo(p) container_of((p), struct nvkm_fifo, engine)
#include <engine/fifo.h> #include <engine/fifo.h>
int nvkm_fifo_ctor(const struct nvkm_fifo_func *, struct nvkm_device *,
int index, int nr, struct nvkm_fifo *);
void nvkm_fifo_uevent(struct nvkm_fifo *);
struct nvkm_fifo_func {
void *(*dtor)(struct nvkm_fifo *);
int (*oneinit)(struct nvkm_fifo *);
void (*init)(struct nvkm_fifo *);
void (*fini)(struct nvkm_fifo *);
void (*intr)(struct nvkm_fifo *);
void (*pause)(struct nvkm_fifo *, unsigned long *);
void (*start)(struct nvkm_fifo *, unsigned long *);
void (*uevent_init)(struct nvkm_fifo *);
void (*uevent_fini)(struct nvkm_fifo *);
const struct nvkm_fifo_chan_oclass *chan[];
};
void nv04_fifo_intr(struct nvkm_fifo *);
void nv04_fifo_pause(struct nvkm_fifo *, unsigned long *); void nv04_fifo_pause(struct nvkm_fifo *, unsigned long *);
void nv04_fifo_start(struct nvkm_fifo *, unsigned long *); void nv04_fifo_start(struct nvkm_fifo *, unsigned long *);
#endif #endif
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "regs.h" #include "regs.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
#include <subdev/instmem.h> #include <subdev/instmem.h>
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "regs.h" #include "regs.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
#include <subdev/fb.h> #include <subdev/fb.h>
...@@ -1055,14 +1056,14 @@ nv10_gr_tile_prog(struct nvkm_engine *engine, int i) ...@@ -1055,14 +1056,14 @@ nv10_gr_tile_prog(struct nvkm_engine *engine, int i)
struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; struct nvkm_fb_tile *tile = &device->fb->tile.region[i];
unsigned long flags; unsigned long flags;
fifo->pause(fifo, &flags); nvkm_fifo_pause(fifo, &flags);
nv04_gr_idle(&gr->base); nv04_gr_idle(&gr->base);
nvkm_wr32(device, NV10_PGRAPH_TLIMIT(i), tile->limit); nvkm_wr32(device, NV10_PGRAPH_TLIMIT(i), tile->limit);
nvkm_wr32(device, NV10_PGRAPH_TSIZE(i), tile->pitch); nvkm_wr32(device, NV10_PGRAPH_TSIZE(i), tile->pitch);
nvkm_wr32(device, NV10_PGRAPH_TILE(i), tile->addr); nvkm_wr32(device, NV10_PGRAPH_TILE(i), tile->addr);
fifo->start(fifo, &flags); nvkm_fifo_start(fifo, &flags);
} }
const struct nvkm_bitfield nv10_gr_intr_name[] = { const struct nvkm_bitfield nv10_gr_intr_name[] = {
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include "regs.h" #include "regs.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
#include <subdev/fb.h> #include <subdev/fb.h>
...@@ -152,7 +153,7 @@ nv20_gr_tile_prog(struct nvkm_engine *engine, int i) ...@@ -152,7 +153,7 @@ nv20_gr_tile_prog(struct nvkm_engine *engine, int i)
struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; struct nvkm_fb_tile *tile = &device->fb->tile.region[i];
unsigned long flags; unsigned long flags;
fifo->pause(fifo, &flags); nvkm_fifo_pause(fifo, &flags);
nv04_gr_idle(&gr->base); nv04_gr_idle(&gr->base);
nvkm_wr32(device, NV20_PGRAPH_TLIMIT(i), tile->limit); nvkm_wr32(device, NV20_PGRAPH_TLIMIT(i), tile->limit);
...@@ -172,7 +173,7 @@ nv20_gr_tile_prog(struct nvkm_engine *engine, int i) ...@@ -172,7 +173,7 @@ nv20_gr_tile_prog(struct nvkm_engine *engine, int i)
nvkm_wr32(device, NV10_PGRAPH_RDI_DATA, tile->zcomp); nvkm_wr32(device, NV10_PGRAPH_RDI_DATA, tile->zcomp);
} }
fifo->start(fifo, &flags); nvkm_fifo_start(fifo, &flags);
} }
void void
......
#include "nv20.h" #include "nv20.h"
#include "regs.h" #include "regs.h"
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
......
#include "nv20.h" #include "nv20.h"
#include "regs.h" #include "regs.h"
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
......
#include "nv20.h" #include "nv20.h"
#include "regs.h" #include "regs.h"
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
#include <subdev/fb.h> #include <subdev/fb.h>
......
#include "nv20.h" #include "nv20.h"
#include "regs.h" #include "regs.h"
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
......
#include "nv20.h" #include "nv20.h"
#include "regs.h" #include "regs.h"
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "regs.h" #include "regs.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/fb.h> #include <subdev/fb.h>
#include <subdev/timer.h> #include <subdev/timer.h>
#include <engine/fifo.h> #include <engine/fifo.h>
...@@ -176,7 +177,7 @@ nv40_gr_tile_prog(struct nvkm_engine *engine, int i) ...@@ -176,7 +177,7 @@ nv40_gr_tile_prog(struct nvkm_engine *engine, int i)
struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; struct nvkm_fb_tile *tile = &device->fb->tile.region[i];
unsigned long flags; unsigned long flags;
fifo->pause(fifo, &flags); nvkm_fifo_pause(fifo, &flags);
nv04_gr_idle(&gr->base); nv04_gr_idle(&gr->base);
switch (nv_device(gr)->chipset) { switch (nv_device(gr)->chipset) {
...@@ -243,7 +244,7 @@ nv40_gr_tile_prog(struct nvkm_engine *engine, int i) ...@@ -243,7 +244,7 @@ nv40_gr_tile_prog(struct nvkm_engine *engine, int i)
break; break;
} }
fifo->start(fifo, &flags); nvkm_fifo_start(fifo, &flags);
} }
static void static void
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "nv50.h" #include "nv50.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/timer.h> #include <subdev/timer.h>
#include <engine/fifo.h> #include <engine/fifo.h>
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "nv31.h" #include "nv31.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <subdev/fb.h> #include <subdev/fb.h>
#include <subdev/timer.h> #include <subdev/timer.h>
#include <engine/fifo.h> #include <engine/fifo.h>
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "priv.h" #include "priv.h"
#include <core/client.h> #include <core/client.h>
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <nvif/class.h> #include <nvif/class.h>
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <core/client.h> #include <core/client.h>
#include <core/enum.h> #include <core/enum.h>
#include <core/gpuobj.h>
#include <nvif/class.h> #include <nvif/class.h>
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
#include "nv50.h" #include "nv50.h"
#include <core/gpuobj.h>
#include <subdev/bar.h> #include <subdev/bar.h>
#include <engine/disp.h> #include <engine/disp.h>
#include <engine/fifo.h> #include <engine/fifo.h>
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
#include "nv50.h" #include "nv50.h"
#include <core/gpuobj.h>
#include <core/handle.h> #include <core/handle.h>
#include <engine/disp.h> #include <engine/disp.h>
#include <engine/fifo/chan.h> #include <engine/fifo/chan.h>
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
* OTHER DEALINGS IN THE SOFTWARE. * OTHER DEALINGS IN THE SOFTWARE.
*/ */
#include <engine/xtensa.h> #include <engine/xtensa.h>
#include <core/gpuobj.h>
#include <engine/fifo.h> #include <engine/fifo.h>
static int static int
......
...@@ -317,7 +317,7 @@ gt215_clk_pre(struct nvkm_clk *clk, unsigned long *flags) ...@@ -317,7 +317,7 @@ gt215_clk_pre(struct nvkm_clk *clk, unsigned long *flags)
return -EBUSY; return -EBUSY;
if (fifo) if (fifo)
fifo->pause(fifo, flags); nvkm_fifo_pause(fifo, flags);
if (nvkm_msec(device, 2000, if (nvkm_msec(device, 2000,
if (nvkm_rd32(device, 0x002504) & 0x00000010) if (nvkm_rd32(device, 0x002504) & 0x00000010)
...@@ -342,7 +342,7 @@ gt215_clk_post(struct nvkm_clk *clk, unsigned long *flags) ...@@ -342,7 +342,7 @@ gt215_clk_post(struct nvkm_clk *clk, unsigned long *flags)
struct nvkm_fifo *fifo = device->fifo; struct nvkm_fifo *fifo = device->fifo;
if (fifo && flags) if (fifo && flags)
fifo->start(fifo, flags); nvkm_fifo_start(fifo, flags);
nvkm_mask(device, 0x002504, 0x00000001, 0x00000000); nvkm_mask(device, 0x002504, 0x00000001, 0x00000000);
nvkm_mask(device, 0x020060, 0x00070000, 0x00040000); nvkm_mask(device, 0x020060, 0x00070000, 0x00040000);
......
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