1 #ifndef __NVKM_FIFO_H__ 2 #define __NVKM_FIFO_H__ 3 #include <core/namedb.h> 4 5 struct nvkm_fifo_chan { 6 struct nvkm_namedb namedb; 7 struct nvkm_dmaobj *pushdma; 8 struct nvkm_gpuobj *pushgpu; 9 void __iomem *user; 10 u64 addr; 11 u32 size; 12 u16 chid; 13 atomic_t refcnt; /* NV04_NVSW_SET_REF */ 14 }; 15 16 static inline struct nvkm_fifo_chan * 17 nvkm_fifo_chan(void *obj) 18 { 19 return (void *)nv_namedb(obj); 20 } 21 22 #define nvkm_fifo_channel_create(p,e,c,b,a,s,n,m,d) \ 23 nvkm_fifo_channel_create_((p), (e), (c), (b), (a), (s), (n), \ 24 (m), sizeof(**d), (void **)d) 25 #define nvkm_fifo_channel_init(p) \ 26 nvkm_namedb_init(&(p)->namedb) 27 #define nvkm_fifo_channel_fini(p,s) \ 28 nvkm_namedb_fini(&(p)->namedb, (s)) 29 30 int nvkm_fifo_channel_create_(struct nvkm_object *, 31 struct nvkm_object *, 32 struct nvkm_oclass *, 33 int bar, u32 addr, u32 size, u32 push, 34 u64 engmask, int len, void **); 35 void nvkm_fifo_channel_destroy(struct nvkm_fifo_chan *); 36 37 #define _nvkm_fifo_channel_init _nvkm_namedb_init 38 #define _nvkm_fifo_channel_fini _nvkm_namedb_fini 39 40 void _nvkm_fifo_channel_dtor(struct nvkm_object *); 41 int _nvkm_fifo_channel_map(struct nvkm_object *, u64 *, u32 *); 42 u32 _nvkm_fifo_channel_rd32(struct nvkm_object *, u64); 43 void _nvkm_fifo_channel_wr32(struct nvkm_object *, u64, u32); 44 int _nvkm_fifo_channel_ntfy(struct nvkm_object *, u32, struct nvkm_event **); 45 46 #include <core/gpuobj.h> 47 48 struct nvkm_fifo_base { 49 struct nvkm_gpuobj gpuobj; 50 }; 51 52 #define nvkm_fifo_context_create(p,e,c,g,s,a,f,d) \ 53 nvkm_gpuobj_create((p), (e), (c), 0, (g), (s), (a), (f), (d)) 54 #define nvkm_fifo_context_destroy(p) \ 55 nvkm_gpuobj_destroy(&(p)->gpuobj) 56 #define nvkm_fifo_context_init(p) \ 57 nvkm_gpuobj_init(&(p)->gpuobj) 58 #define nvkm_fifo_context_fini(p,s) \ 59 nvkm_gpuobj_fini(&(p)->gpuobj, (s)) 60 61 #define _nvkm_fifo_context_dtor _nvkm_gpuobj_dtor 62 #define _nvkm_fifo_context_init _nvkm_gpuobj_init 63 #define _nvkm_fifo_context_fini _nvkm_gpuobj_fini 64 #define _nvkm_fifo_context_rd32 _nvkm_gpuobj_rd32 65 #define _nvkm_fifo_context_wr32 _nvkm_gpuobj_wr32 66 67 #include <core/engine.h> 68 #include <core/event.h> 69 70 struct nvkm_fifo { 71 struct nvkm_engine base; 72 73 struct nvkm_event cevent; /* channel creation event */ 74 struct nvkm_event uevent; /* async user trigger */ 75 76 struct nvkm_object **channel; 77 spinlock_t lock; 78 u16 min; 79 u16 max; 80 81 int (*chid)(struct nvkm_fifo *, struct nvkm_object *); 82 void (*pause)(struct nvkm_fifo *, unsigned long *); 83 void (*start)(struct nvkm_fifo *, unsigned long *); 84 }; 85 86 static inline struct nvkm_fifo * 87 nvkm_fifo(void *obj) 88 { 89 return (void *)nvkm_engine(obj, NVDEV_ENGINE_FIFO); 90 } 91 92 #define nvkm_fifo_create(o,e,c,fc,lc,d) \ 93 nvkm_fifo_create_((o), (e), (c), (fc), (lc), sizeof(**d), (void **)d) 94 #define nvkm_fifo_init(p) \ 95 nvkm_engine_init(&(p)->base) 96 #define nvkm_fifo_fini(p,s) \ 97 nvkm_engine_fini(&(p)->base, (s)) 98 99 int nvkm_fifo_create_(struct nvkm_object *, struct nvkm_object *, 100 struct nvkm_oclass *, int min, int max, 101 int size, void **); 102 void nvkm_fifo_destroy(struct nvkm_fifo *); 103 const char * 104 nvkm_client_name_for_fifo_chid(struct nvkm_fifo *fifo, u32 chid); 105 106 #define _nvkm_fifo_init _nvkm_engine_init 107 #define _nvkm_fifo_fini _nvkm_engine_fini 108 109 extern struct nvkm_oclass *nv04_fifo_oclass; 110 extern struct nvkm_oclass *nv10_fifo_oclass; 111 extern struct nvkm_oclass *nv17_fifo_oclass; 112 extern struct nvkm_oclass *nv40_fifo_oclass; 113 extern struct nvkm_oclass *nv50_fifo_oclass; 114 extern struct nvkm_oclass *g84_fifo_oclass; 115 extern struct nvkm_oclass *gf100_fifo_oclass; 116 extern struct nvkm_oclass *gk104_fifo_oclass; 117 extern struct nvkm_oclass *gk20a_fifo_oclass; 118 extern struct nvkm_oclass *gk208_fifo_oclass; 119 extern struct nvkm_oclass *gm204_fifo_oclass; 120 121 int nvkm_fifo_uevent_ctor(struct nvkm_object *, void *, u32, 122 struct nvkm_notify *); 123 void nvkm_fifo_uevent(struct nvkm_fifo *); 124 125 void nv04_fifo_intr(struct nvkm_subdev *); 126 int nv04_fifo_context_attach(struct nvkm_object *, struct nvkm_object *); 127 #endif 128