1#ifndef __NVKM_FIFO_H__ 2#define __NVKM_FIFO_H__ 3#include <core/namedb.h> 4 5struct 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 16static inline struct nvkm_fifo_chan * 17nvkm_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 30int 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 **); 35void 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 40void _nvkm_fifo_channel_dtor(struct nvkm_object *); 41int _nvkm_fifo_channel_map(struct nvkm_object *, u64 *, u32 *); 42u32 _nvkm_fifo_channel_rd32(struct nvkm_object *, u64); 43void _nvkm_fifo_channel_wr32(struct nvkm_object *, u64, u32); 44int _nvkm_fifo_channel_ntfy(struct nvkm_object *, u32, struct nvkm_event **); 45 46#include <core/gpuobj.h> 47 48struct 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 70struct 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 86static inline struct nvkm_fifo * 87nvkm_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 99int nvkm_fifo_create_(struct nvkm_object *, struct nvkm_object *, 100 struct nvkm_oclass *, int min, int max, 101 int size, void **); 102void nvkm_fifo_destroy(struct nvkm_fifo *); 103const char * 104nvkm_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 109extern struct nvkm_oclass *nv04_fifo_oclass; 110extern struct nvkm_oclass *nv10_fifo_oclass; 111extern struct nvkm_oclass *nv17_fifo_oclass; 112extern struct nvkm_oclass *nv40_fifo_oclass; 113extern struct nvkm_oclass *nv50_fifo_oclass; 114extern struct nvkm_oclass *g84_fifo_oclass; 115extern struct nvkm_oclass *gf100_fifo_oclass; 116extern struct nvkm_oclass *gk104_fifo_oclass; 117extern struct nvkm_oclass *gk20a_fifo_oclass; 118extern struct nvkm_oclass *gk208_fifo_oclass; 119extern struct nvkm_oclass *gm204_fifo_oclass; 120 121int nvkm_fifo_uevent_ctor(struct nvkm_object *, void *, u32, 122 struct nvkm_notify *); 123void nvkm_fifo_uevent(struct nvkm_fifo *); 124 125void nv04_fifo_intr(struct nvkm_subdev *); 126int nv04_fifo_context_attach(struct nvkm_object *, struct nvkm_object *); 127#endif 128