xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/acr/priv.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: priv.h,v 1.2 2021/12/18 23:45:38 riastradh Exp $	*/
2 
3 #ifndef __NVKM_ACR_PRIV_H__
4 #define __NVKM_ACR_PRIV_H__
5 #include <subdev/acr.h>
6 struct lsb_header_tail;
7 
8 struct nvkm_acr_fwif {
9 	int version;
10 	int (*load)(struct nvkm_acr *, int version,
11 		    const struct nvkm_acr_fwif *);
12 	const struct nvkm_acr_func *func;
13 };
14 
15 int gm20b_acr_load(struct nvkm_acr *, int, const struct nvkm_acr_fwif *);
16 int gp102_acr_load(struct nvkm_acr *, int, const struct nvkm_acr_fwif *);
17 
18 struct nvkm_acr_lsf;
19 struct nvkm_acr_func {
20 	const struct nvkm_acr_hsf_fwif *load;
21 	const struct nvkm_acr_hsf_fwif *ahesasc;
22 	const struct nvkm_acr_hsf_fwif *asb;
23 	const struct nvkm_acr_hsf_fwif *unload;
24 	int (*wpr_parse)(struct nvkm_acr *);
25 	u32 (*wpr_layout)(struct nvkm_acr *);
26 	int (*wpr_alloc)(struct nvkm_acr *, u32 wpr_size);
27 	int (*wpr_build)(struct nvkm_acr *, struct nvkm_acr_lsf *rtos);
28 	void (*wpr_patch)(struct nvkm_acr *, s64 adjust);
29 	void (*wpr_check)(struct nvkm_acr *, u64 *start, u64 *limit);
30 	int (*init)(struct nvkm_acr *);
31 	void (*fini)(struct nvkm_acr *);
32 };
33 
34 int gm200_acr_wpr_parse(struct nvkm_acr *);
35 u32 gm200_acr_wpr_layout(struct nvkm_acr *);
36 int gm200_acr_wpr_build(struct nvkm_acr *, struct nvkm_acr_lsf *);
37 void gm200_acr_wpr_patch(struct nvkm_acr *, s64);
38 void gm200_acr_wpr_check(struct nvkm_acr *, u64 *, u64 *);
39 void gm200_acr_wpr_build_lsb_tail(struct nvkm_acr_lsfw *,
40 				  struct lsb_header_tail *);
41 int gm200_acr_init(struct nvkm_acr *);
42 
43 int gm20b_acr_wpr_alloc(struct nvkm_acr *, u32 wpr_size);
44 
45 int gp102_acr_wpr_parse(struct nvkm_acr *);
46 u32 gp102_acr_wpr_layout(struct nvkm_acr *);
47 int gp102_acr_wpr_alloc(struct nvkm_acr *, u32 wpr_size);
48 int gp102_acr_wpr_build(struct nvkm_acr *, struct nvkm_acr_lsf *);
49 int gp102_acr_wpr_build_lsb(struct nvkm_acr *, struct nvkm_acr_lsfw *);
50 void gp102_acr_wpr_patch(struct nvkm_acr *, s64);
51 
52 struct nvkm_acr_hsfw {
53 	const struct nvkm_acr_hsf_func *func;
54 	const char *name;
55 	struct list_head head;
56 
57 	u32 imem_size;
58 	u32 imem_tag;
59 	u32 *imem;
60 
61 	u8 *image;
62 	u32 image_size;
63 	u32 non_sec_addr;
64 	u32 non_sec_size;
65 	u32 sec_addr;
66 	u32 sec_size;
67 	u32 data_addr;
68 	u32 data_size;
69 
70 	struct {
71 		struct {
72 			void *data;
73 			u32 size;
74 		} prod, dbg;
75 		u32 patch_loc;
76 	} sig;
77 };
78 
79 struct nvkm_acr_hsf_fwif {
80 	int version;
81 	int (*load)(struct nvkm_acr *, const char *bl, const char *fw,
82 		    const char *name, int version,
83 		    const struct nvkm_acr_hsf_fwif *);
84 	const struct nvkm_acr_hsf_func *func;
85 };
86 
87 int nvkm_acr_hsfw_load(struct nvkm_acr *, const char *, const char *,
88 		       const char *, int, const struct nvkm_acr_hsf_fwif *);
89 void nvkm_acr_hsfw_del_all(struct nvkm_acr *);
90 
91 struct nvkm_acr_hsf {
92 	const struct nvkm_acr_hsf_func *func;
93 	const char *name;
94 	struct list_head head;
95 
96 	u32 imem_size;
97 	u32 imem_tag;
98 	u32 *imem;
99 
100 	u32 non_sec_addr;
101 	u32 non_sec_size;
102 	u32 sec_addr;
103 	u32 sec_size;
104 	u32 data_addr;
105 	u32 data_size;
106 
107 	struct nvkm_memory *ucode;
108 	struct nvkm_vma *vma;
109 	struct nvkm_falcon *falcon;
110 };
111 
112 struct nvkm_acr_hsf_func {
113 	int (*load)(struct nvkm_acr *, struct nvkm_acr_hsfw *);
114 	int (*boot)(struct nvkm_acr *, struct nvkm_acr_hsf *);
115 	void (*bld)(struct nvkm_acr *, struct nvkm_acr_hsf *);
116 };
117 
118 int gm200_acr_hsfw_load(struct nvkm_acr *, struct nvkm_acr_hsfw *,
119 			struct nvkm_falcon *);
120 int gm200_acr_hsfw_boot(struct nvkm_acr *, struct nvkm_acr_hsf *,
121 			u32 clear_intr, u32 mbox0_ok);
122 
123 int gm200_acr_load_boot(struct nvkm_acr *, struct nvkm_acr_hsf *);
124 
125 extern const struct nvkm_acr_hsf_func gm200_acr_unload_0;
126 int gm200_acr_unload_load(struct nvkm_acr *, struct nvkm_acr_hsfw *);
127 int gm200_acr_unload_boot(struct nvkm_acr *, struct nvkm_acr_hsf *);
128 void gm200_acr_hsfw_bld(struct nvkm_acr *, struct nvkm_acr_hsf *);
129 
130 extern const struct nvkm_acr_hsf_func gm20b_acr_load_0;
131 
132 int gp102_acr_load_load(struct nvkm_acr *, struct nvkm_acr_hsfw *);
133 
134 extern const struct nvkm_acr_hsf_func gp108_acr_unload_0;
135 void gp108_acr_hsfw_bld(struct nvkm_acr *, struct nvkm_acr_hsf *);
136 
137 int nvkm_acr_new_(const struct nvkm_acr_fwif *, struct nvkm_device *, int,
138 		  struct nvkm_acr **);
139 int nvkm_acr_hsf_boot(struct nvkm_acr *, const char *name);
140 
141 struct nvkm_acr_lsf {
142 	const struct nvkm_acr_lsf_func *func;
143 	struct nvkm_falcon *falcon;
144 	enum nvkm_acr_lsf_id id;
145 	struct list_head head;
146 };
147 
148 struct nvkm_acr_lsfw *nvkm_acr_lsfw_add(const struct nvkm_acr_lsf_func *,
149 					struct nvkm_acr *, struct nvkm_falcon *,
150 					enum nvkm_acr_lsf_id);
151 void nvkm_acr_lsfw_del(struct nvkm_acr_lsfw *);
152 void nvkm_acr_lsfw_del_all(struct nvkm_acr *);
153 #endif
154