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