xref: /openbmc/linux/drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h (revision 0e44c21708761977dcbea9b846b51a6fb684907a)
1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NVKM_FLCNEN_H__
3 #define __NVKM_FLCNEN_H__
4 #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
5 #include <core/engine.h>
6 struct nvkm_fifo_chan;
7 
8 enum nvkm_falcon_dmaidx {
9 	FALCON_DMAIDX_UCODE		= 0,
10 	FALCON_DMAIDX_VIRT		= 1,
11 	FALCON_DMAIDX_PHYS_VID		= 2,
12 	FALCON_DMAIDX_PHYS_SYS_COH	= 3,
13 	FALCON_DMAIDX_PHYS_SYS_NCOH	= 4,
14 	FALCON_SEC2_DMAIDX_UCODE	= 6,
15 };
16 
17 struct nvkm_falcon {
18 	const struct nvkm_falcon_func *func;
19 	struct nvkm_subdev *owner;
20 	const char *name;
21 	u32 addr;
22 
23 	struct mutex mutex;
24 	struct mutex dmem_mutex;
25 	bool oneinit;
26 
27 	struct nvkm_subdev *user;
28 
29 	u8 version;
30 	u8 secret;
31 	bool debug;
32 
33 	struct nvkm_memory *core;
34 	bool external;
35 
36 	struct {
37 		u32 limit;
38 		u32 *data;
39 		u32  size;
40 		u8 ports;
41 	} code;
42 
43 	struct {
44 		u32 limit;
45 		u32 *data;
46 		u32  size;
47 		u8 ports;
48 	} data;
49 
50 	struct nvkm_engine engine;
51 };
52 
53 int nvkm_falcon_get(struct nvkm_falcon *, struct nvkm_subdev *);
54 void nvkm_falcon_put(struct nvkm_falcon *, struct nvkm_subdev *);
55 
56 int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
57 		     enum nvkm_subdev_type, int inst, bool enable, u32 addr, struct nvkm_engine **);
58 
59 struct nvkm_falcon_func {
60 	int (*disable)(struct nvkm_falcon *);
61 	int (*enable)(struct nvkm_falcon *);
62 	bool reset_pmc;
63 	int (*reset_eng)(struct nvkm_falcon *);
64 	int (*reset_wait_mem_scrubbing)(struct nvkm_falcon *);
65 
66 	u32 debug;
67 	const struct nvkm_falcon_func_pio *imem_pio;
68 	const struct nvkm_falcon_func_pio *dmem_pio;
69 
70 	struct {
71 		u32 *data;
72 		u32  size;
73 	} code;
74 	struct {
75 		u32 *data;
76 		u32  size;
77 	} data;
78 	void (*init)(struct nvkm_falcon *);
79 	void (*intr)(struct nvkm_falcon *, struct nvkm_chan *);
80 
81 	u32 fbif;
82 
83 	void (*load_imem)(struct nvkm_falcon *, void *, u32, u32, u16, u8, bool);
84 	void (*load_dmem)(struct nvkm_falcon *, void *, u32, u32, u8);
85 	void (*read_dmem)(struct nvkm_falcon *, u32, u32, u8, void *);
86 	u32 emem_addr;
87 	void (*bind_context)(struct nvkm_falcon *, struct nvkm_memory *);
88 	int (*wait_for_halt)(struct nvkm_falcon *, u32);
89 	int (*clear_interrupt)(struct nvkm_falcon *, u32);
90 	void (*set_start_addr)(struct nvkm_falcon *, u32 start_addr);
91 	void (*start)(struct nvkm_falcon *);
92 
93 	struct {
94 		u32 head;
95 		u32 tail;
96 		u32 stride;
97 	} cmdq, msgq;
98 
99 	struct nvkm_sclass sclass[];
100 };
101 
102 static inline u32
103 nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr)
104 {
105 	return nvkm_rd32(falcon->owner->device, falcon->addr + addr);
106 }
107 
108 static inline void
109 nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data)
110 {
111 	nvkm_wr32(falcon->owner->device, falcon->addr + addr, data);
112 }
113 
114 static inline u32
115 nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val)
116 {
117 	struct nvkm_device *device = falcon->owner->device;
118 
119 	return nvkm_mask(device, falcon->addr + addr, mask, val);
120 }
121 
122 void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8,
123 			   bool);
124 void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
125 void nvkm_falcon_read_dmem(struct nvkm_falcon *, u32, u32, u8, void *);
126 void nvkm_falcon_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
127 void nvkm_falcon_set_start_addr(struct nvkm_falcon *, u32);
128 void nvkm_falcon_start(struct nvkm_falcon *);
129 int nvkm_falcon_wait_for_halt(struct nvkm_falcon *, u32);
130 int nvkm_falcon_clear_interrupt(struct nvkm_falcon *, u32);
131 #endif
132