1 #ifndef __NVKM_FALCON_H__
2 #define __NVKM_FALCON_H__
3 #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
4 #include <core/engine.h>
5 struct nvkm_fifo_chan;
6 
7 struct nvkm_falcon_data {
8 	bool external;
9 };
10 
11 struct nvkm_falcon {
12 	struct nvkm_engine engine;
13 	const struct nvkm_falcon_func *func;
14 
15 	u32 addr;
16 	u8  version;
17 	u8  secret;
18 
19 	struct nvkm_memory *core;
20 	bool external;
21 
22 	struct {
23 		u32 limit;
24 		u32 *data;
25 		u32  size;
26 	} code;
27 
28 	struct {
29 		u32 limit;
30 		u32 *data;
31 		u32  size;
32 	} data;
33 };
34 
35 struct nvkm_falcon_func {
36 	void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *);
37 	struct nvkm_sclass sclass[];
38 };
39 
40 #define nv_falcon(priv) ((struct nvkm_falcon *)priv)
41 
42 #define nvkm_falcon_create(a,p,e,c,b,d,i,f,r)                                 \
43 	nvkm_falcon_create_((a), (p), (e), (c), (b), (d), (i), (f),              \
44 			       sizeof(**r),(void **)r)
45 #define nvkm_falcon_destroy(p)                                              \
46 	nvkm_engine_destroy(&(p)->engine)
47 #define nvkm_falcon_init(p) ({                                              \
48 	struct nvkm_falcon *_falcon = (p);                                   \
49 	_nvkm_falcon_init(nv_object(_falcon));                               \
50 })
51 #define nvkm_falcon_fini(p,s) ({                                            \
52 	struct nvkm_falcon *_falcon = (p);                                   \
53 	_nvkm_falcon_fini(nv_object(_falcon), (s));                          \
54 })
55 
56 int nvkm_falcon_create_(const struct nvkm_falcon_func *,
57 			struct nvkm_object *, struct nvkm_object *,
58 			struct nvkm_oclass *, u32, bool, const char *,
59 			const char *, int, void **);
60 #define _nvkm_falcon_dtor _nvkm_engine_dtor
61 int  _nvkm_falcon_init(struct nvkm_object *);
62 int  _nvkm_falcon_fini(struct nvkm_object *, bool);
63 #endif
64