xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/falcon.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: falcon.h,v 1.3 2021/12/18 23:45:33 riastradh Exp $	*/
2 
3 /* SPDX-License-Identifier: MIT */
4 #ifndef __NVKM_FLCNEN_H__
5 #define __NVKM_FLCNEN_H__
6 #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
7 #include <core/engine.h>
8 struct nvkm_fifo_chan;
9 struct nvkm_gpuobj;
10 
11 enum nvkm_falcon_dmaidx {
12 	FALCON_DMAIDX_UCODE		= 0,
13 	FALCON_DMAIDX_VIRT		= 1,
14 	FALCON_DMAIDX_PHYS_VID		= 2,
15 	FALCON_DMAIDX_PHYS_SYS_COH	= 3,
16 	FALCON_DMAIDX_PHYS_SYS_NCOH	= 4,
17 	FALCON_SEC2_DMAIDX_UCODE	= 6,
18 };
19 
20 struct nvkm_falcon {
21 	const struct nvkm_falcon_func *func;
22 	const struct nvkm_subdev *owner;
23 	const char *name;
24 	u32 addr;
25 
26 	struct mutex mutex;
27 	struct mutex dmem_mutex;
28 	bool oneinit;
29 
30 	const struct nvkm_subdev *user;
31 
32 	u8 version;
33 	u8 secret;
34 	bool debug;
35 
36 	struct nvkm_memory *core;
37 	bool external;
38 
39 	struct {
40 		u32 limit;
41 		u32 *data;
42 		u32  size;
43 		u8 ports;
44 	} code;
45 
46 	struct {
47 		u32 limit;
48 		u32 *data;
49 		u32  size;
50 		u8 ports;
51 	} data;
52 
53 	struct nvkm_engine engine;
54 };
55 
56 /* This constructor must be called from the owner's oneinit() hook and
57  * *not* its constructor.  This is to ensure that DEVINIT has been
58  * completed, and that the device is correctly enabled before we touch
59  * falcon registers.
60  */
61 int nvkm_falcon_v1_new(struct nvkm_subdev *owner, const char *name, u32 addr,
62 		       struct nvkm_falcon **);
63 
64 void nvkm_falcon_del(struct nvkm_falcon **);
65 int nvkm_falcon_get(struct nvkm_falcon *, const struct nvkm_subdev *);
66 void nvkm_falcon_put(struct nvkm_falcon *, const struct nvkm_subdev *);
67 
68 int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
69 		     int index, bool enable, u32 addr, struct nvkm_engine **);
70 
71 struct nvkm_falcon_func {
72 	struct {
73 		u32 *data;
74 		u32  size;
75 	} code;
76 	struct {
77 		u32 *data;
78 		u32  size;
79 	} data;
80 	void (*init)(struct nvkm_falcon *);
81 	void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *);
82 
83 	u32 debug;
84 	u32 fbif;
85 
86 	void (*load_imem)(struct nvkm_falcon *, void *, u32, u32, u16, u8, bool);
87 	void (*load_dmem)(struct nvkm_falcon *, void *, u32, u32, u8);
88 	void (*read_dmem)(struct nvkm_falcon *, u32, u32, u8, void *);
89 	u32 emem_addr;
90 	void (*bind_context)(struct nvkm_falcon *, struct nvkm_memory *);
91 	int (*wait_for_halt)(struct nvkm_falcon *, u32);
92 	int (*clear_interrupt)(struct nvkm_falcon *, u32);
93 	void (*set_start_addr)(struct nvkm_falcon *, u32 start_addr);
94 	void (*start)(struct nvkm_falcon *);
95 	int (*enable)(struct nvkm_falcon *falcon);
96 	void (*disable)(struct nvkm_falcon *falcon);
97 	int (*reset)(struct nvkm_falcon *);
98 
99 	struct {
100 		u32 head;
101 		u32 tail;
102 		u32 stride;
103 	} cmdq, msgq;
104 
105 	struct nvkm_sclass sclass[];
106 };
107 
108 static inline u32
nvkm_falcon_rd32(struct nvkm_falcon * falcon,u32 addr)109 nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr)
110 {
111 	return nvkm_rd32(falcon->owner->device, falcon->addr + addr);
112 }
113 
114 static inline void
nvkm_falcon_wr32(struct nvkm_falcon * falcon,u32 addr,u32 data)115 nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data)
116 {
117 	nvkm_wr32(falcon->owner->device, falcon->addr + addr, data);
118 }
119 
120 static inline u32
nvkm_falcon_mask(struct nvkm_falcon * falcon,u32 addr,u32 mask,u32 val)121 nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val)
122 {
123 	struct nvkm_device *device = falcon->owner->device;
124 
125 	return nvkm_mask(device, falcon->addr + addr, mask, val);
126 }
127 
128 void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8,
129 			   bool);
130 void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
131 void nvkm_falcon_read_dmem(struct nvkm_falcon *, u32, u32, u8, void *);
132 void nvkm_falcon_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
133 void nvkm_falcon_set_start_addr(struct nvkm_falcon *, u32);
134 void nvkm_falcon_start(struct nvkm_falcon *);
135 int nvkm_falcon_wait_for_halt(struct nvkm_falcon *, u32);
136 int nvkm_falcon_clear_interrupt(struct nvkm_falcon *, u32);
137 int nvkm_falcon_enable(struct nvkm_falcon *);
138 void nvkm_falcon_disable(struct nvkm_falcon *);
139 int nvkm_falcon_reset(struct nvkm_falcon *);
140 #endif
141