xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/falcon.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: falcon.h,v 1.2 2021/12/18 23:45:33 riastradh Exp $	*/
2 
3 #ifndef __NVKM_FALCON_H__
4 #define __NVKM_FALCON_H__
5 #include <engine/falcon.h>
6 
7 int nvkm_falcon_ctor(const struct nvkm_falcon_func *, struct nvkm_subdev *owner,
8 		     const char *name, u32 addr, struct nvkm_falcon *);
9 void nvkm_falcon_dtor(struct nvkm_falcon *);
10 
11 void nvkm_falcon_v1_load_imem(struct nvkm_falcon *,
12 			      void *, u32, u32, u16, u8, bool);
13 void nvkm_falcon_v1_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
14 void nvkm_falcon_v1_read_dmem(struct nvkm_falcon *, u32, u32, u8, void *);
15 void nvkm_falcon_v1_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
16 int nvkm_falcon_v1_wait_for_halt(struct nvkm_falcon *, u32);
17 int nvkm_falcon_v1_clear_interrupt(struct nvkm_falcon *, u32);
18 void nvkm_falcon_v1_set_start_addr(struct nvkm_falcon *, u32 start_addr);
19 void nvkm_falcon_v1_start(struct nvkm_falcon *);
20 int nvkm_falcon_v1_enable(struct nvkm_falcon *);
21 void nvkm_falcon_v1_disable(struct nvkm_falcon *);
22 
23 void gp102_sec2_flcn_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
24 int gp102_sec2_flcn_enable(struct nvkm_falcon *);
25 
26 #define FLCN_PRINTK(t,f,fmt,a...) do {                                         \
27 	if (nvkm_subdev_name[(f)->owner->index] != (f)->name)                  \
28 		nvkm_##t((f)->owner, "%s: "fmt"\n", (f)->name, ##a);           \
29 	else                                                                   \
30 		nvkm_##t((f)->owner, fmt"\n", ##a);                            \
31 } while(0)
32 #define FLCN_DBG(f,fmt,a...) FLCN_PRINTK(debug, (f), fmt, ##a)
33 #define FLCN_ERR(f,fmt,a...) FLCN_PRINTK(error, (f), fmt, ##a)
34 
35 /**
36  * struct nv_falcon_msg - header for all messages
37  *
38  * @unit_id:	id of firmware process that sent the message
39  * @size:	total size of message
40  * @ctrl_flags:	control flags
41  * @seq_id:	used to match a message from its corresponding command
42  */
43 struct nv_falcon_msg {
44 	u8 unit_id;
45 	u8 size;
46 	u8 ctrl_flags;
47 	u8 seq_id;
48 };
49 
50 #define nv_falcon_cmd nv_falcon_msg
51 #define NV_FALCON_CMD_UNIT_ID_REWIND                                       0x00
52 
53 struct nvkm_falcon_qmgr;
54 int nvkm_falcon_qmgr_new(struct nvkm_falcon *, struct nvkm_falcon_qmgr **);
55 void nvkm_falcon_qmgr_del(struct nvkm_falcon_qmgr **);
56 
57 typedef int
58 (*nvkm_falcon_qmgr_callback)(void *priv, struct nv_falcon_msg *);
59 
60 struct nvkm_falcon_cmdq;
61 int nvkm_falcon_cmdq_new(struct nvkm_falcon_qmgr *, const char *name,
62 			 struct nvkm_falcon_cmdq **);
63 void nvkm_falcon_cmdq_del(struct nvkm_falcon_cmdq **);
64 void nvkm_falcon_cmdq_init(struct nvkm_falcon_cmdq *,
65 			   u32 index, u32 offset, u32 size);
66 void nvkm_falcon_cmdq_fini(struct nvkm_falcon_cmdq *);
67 int nvkm_falcon_cmdq_send(struct nvkm_falcon_cmdq *, struct nv_falcon_cmd *,
68 			  nvkm_falcon_qmgr_callback, void *priv,
69 			  unsigned long timeout_jiffies);
70 
71 struct nvkm_falcon_msgq;
72 int nvkm_falcon_msgq_new(struct nvkm_falcon_qmgr *, const char *name,
73 			 struct nvkm_falcon_msgq **);
74 void nvkm_falcon_msgq_del(struct nvkm_falcon_msgq **);
75 void nvkm_falcon_msgq_init(struct nvkm_falcon_msgq *,
76 			   u32 index, u32 offset, u32 size);
77 int nvkm_falcon_msgq_recv_initmsg(struct nvkm_falcon_msgq *, void *, u32 size);
78 void nvkm_falcon_msgq_recv(struct nvkm_falcon_msgq *);
79 #endif
80