hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c
....@@ -24,13 +24,70 @@
2424 #include "gf100.h"
2525 #include "ctxgf100.h"
2626
27
+#include <core/firmware.h>
28
+#include <subdev/acr.h>
2729 #include <subdev/secboot.h>
2830
31
+#include <nvfw/flcn.h>
32
+
2933 #include <nvif/class.h>
34
+
35
+int
36
+gm200_gr_nofw(struct gf100_gr *gr, int ver, const struct gf100_gr_fwif *fwif)
37
+{
38
+ nvkm_warn(&gr->base.engine.subdev, "firmware unavailable\n");
39
+ return -ENODEV;
40
+}
3041
3142 /*******************************************************************************
3243 * PGRAPH engine/subdev functions
3344 ******************************************************************************/
45
+
46
+static void
47
+gm200_gr_acr_bld_patch(struct nvkm_acr *acr, u32 bld, s64 adjust)
48
+{
49
+ struct flcn_bl_dmem_desc_v1 hdr;
50
+ nvkm_robj(acr->wpr, bld, &hdr, sizeof(hdr));
51
+ hdr.code_dma_base = hdr.code_dma_base + adjust;
52
+ hdr.data_dma_base = hdr.data_dma_base + adjust;
53
+ nvkm_wobj(acr->wpr, bld, &hdr, sizeof(hdr));
54
+ flcn_bl_dmem_desc_v1_dump(&acr->subdev, &hdr);
55
+}
56
+
57
+static void
58
+gm200_gr_acr_bld_write(struct nvkm_acr *acr, u32 bld,
59
+ struct nvkm_acr_lsfw *lsfw)
60
+{
61
+ const u64 base = lsfw->offset.img + lsfw->app_start_offset;
62
+ const u64 code = base + lsfw->app_resident_code_offset;
63
+ const u64 data = base + lsfw->app_resident_data_offset;
64
+ const struct flcn_bl_dmem_desc_v1 hdr = {
65
+ .ctx_dma = FALCON_DMAIDX_UCODE,
66
+ .code_dma_base = code,
67
+ .non_sec_code_off = lsfw->app_resident_code_offset,
68
+ .non_sec_code_size = lsfw->app_resident_code_size,
69
+ .code_entry_point = lsfw->app_imem_entry,
70
+ .data_dma_base = data,
71
+ .data_size = lsfw->app_resident_data_size,
72
+ };
73
+
74
+ nvkm_wobj(acr->wpr, bld, &hdr, sizeof(hdr));
75
+}
76
+
77
+const struct nvkm_acr_lsf_func
78
+gm200_gr_gpccs_acr = {
79
+ .flags = NVKM_ACR_LSF_FORCE_PRIV_LOAD,
80
+ .bld_size = sizeof(struct flcn_bl_dmem_desc_v1),
81
+ .bld_write = gm200_gr_acr_bld_write,
82
+ .bld_patch = gm200_gr_acr_bld_patch,
83
+};
84
+
85
+const struct nvkm_acr_lsf_func
86
+gm200_gr_fecs_acr = {
87
+ .bld_size = sizeof(struct flcn_bl_dmem_desc_v1),
88
+ .bld_write = gm200_gr_acr_bld_write,
89
+ .bld_patch = gm200_gr_acr_bld_patch,
90
+};
3491
3592 int
3693 gm200_gr_rops(struct gf100_gr *gr)
....@@ -124,44 +181,6 @@
124181 }
125182 }
126183
127
-int
128
-gm200_gr_new_(const struct gf100_gr_func *func, struct nvkm_device *device,
129
- int index, struct nvkm_gr **pgr)
130
-{
131
- struct gf100_gr *gr;
132
- int ret;
133
-
134
- if (!(gr = kzalloc(sizeof(*gr), GFP_KERNEL)))
135
- return -ENOMEM;
136
- *pgr = &gr->base;
137
-
138
- ret = gf100_gr_ctor(func, device, index, gr);
139
- if (ret)
140
- return ret;
141
-
142
- /* Load firmwares for non-secure falcons */
143
- if (!nvkm_secboot_is_managed(device->secboot,
144
- NVKM_SECBOOT_FALCON_FECS)) {
145
- if ((ret = gf100_gr_ctor_fw(gr, "gr/fecs_inst", &gr->fuc409c)) ||
146
- (ret = gf100_gr_ctor_fw(gr, "gr/fecs_data", &gr->fuc409d)))
147
- return ret;
148
- }
149
- if (!nvkm_secboot_is_managed(device->secboot,
150
- NVKM_SECBOOT_FALCON_GPCCS)) {
151
- if ((ret = gf100_gr_ctor_fw(gr, "gr/gpccs_inst", &gr->fuc41ac)) ||
152
- (ret = gf100_gr_ctor_fw(gr, "gr/gpccs_data", &gr->fuc41ad)))
153
- return ret;
154
- }
155
-
156
- if ((ret = gk20a_gr_av_to_init(gr, "gr/sw_nonctx", &gr->fuc_sw_nonctx)) ||
157
- (ret = gk20a_gr_aiv_to_init(gr, "gr/sw_ctx", &gr->fuc_sw_ctx)) ||
158
- (ret = gk20a_gr_av_to_init(gr, "gr/sw_bundle_init", &gr->fuc_bundle)) ||
159
- (ret = gk20a_gr_av_to_method(gr, "gr/sw_method_init", &gr->fuc_method)))
160
- return ret;
161
-
162
- return 0;
163
-}
164
-
165184 static const struct gf100_gr_func
166185 gm200_gr = {
167186 .oneinit_tiles = gm200_gr_oneinit_tiles,
....@@ -198,7 +217,78 @@
198217 };
199218
200219 int
220
+gm200_gr_load(struct gf100_gr *gr, int ver, const struct gf100_gr_fwif *fwif)
221
+{
222
+ int ret;
223
+
224
+ ret = nvkm_acr_lsfw_load_bl_inst_data_sig(&gr->base.engine.subdev,
225
+ &gr->fecs.falcon,
226
+ NVKM_ACR_LSF_FECS,
227
+ "gr/fecs_", ver, fwif->fecs);
228
+ if (ret)
229
+ return ret;
230
+
231
+ ret = nvkm_acr_lsfw_load_bl_inst_data_sig(&gr->base.engine.subdev,
232
+ &gr->gpccs.falcon,
233
+ NVKM_ACR_LSF_GPCCS,
234
+ "gr/gpccs_", ver,
235
+ fwif->gpccs);
236
+ if (ret)
237
+ return ret;
238
+
239
+ gr->firmware = true;
240
+
241
+ return gk20a_gr_load_sw(gr, "gr/", ver);
242
+}
243
+
244
+MODULE_FIRMWARE("nvidia/gm200/gr/fecs_bl.bin");
245
+MODULE_FIRMWARE("nvidia/gm200/gr/fecs_inst.bin");
246
+MODULE_FIRMWARE("nvidia/gm200/gr/fecs_data.bin");
247
+MODULE_FIRMWARE("nvidia/gm200/gr/fecs_sig.bin");
248
+MODULE_FIRMWARE("nvidia/gm200/gr/gpccs_bl.bin");
249
+MODULE_FIRMWARE("nvidia/gm200/gr/gpccs_inst.bin");
250
+MODULE_FIRMWARE("nvidia/gm200/gr/gpccs_data.bin");
251
+MODULE_FIRMWARE("nvidia/gm200/gr/gpccs_sig.bin");
252
+MODULE_FIRMWARE("nvidia/gm200/gr/sw_ctx.bin");
253
+MODULE_FIRMWARE("nvidia/gm200/gr/sw_nonctx.bin");
254
+MODULE_FIRMWARE("nvidia/gm200/gr/sw_bundle_init.bin");
255
+MODULE_FIRMWARE("nvidia/gm200/gr/sw_method_init.bin");
256
+
257
+MODULE_FIRMWARE("nvidia/gm204/gr/fecs_bl.bin");
258
+MODULE_FIRMWARE("nvidia/gm204/gr/fecs_inst.bin");
259
+MODULE_FIRMWARE("nvidia/gm204/gr/fecs_data.bin");
260
+MODULE_FIRMWARE("nvidia/gm204/gr/fecs_sig.bin");
261
+MODULE_FIRMWARE("nvidia/gm204/gr/gpccs_bl.bin");
262
+MODULE_FIRMWARE("nvidia/gm204/gr/gpccs_inst.bin");
263
+MODULE_FIRMWARE("nvidia/gm204/gr/gpccs_data.bin");
264
+MODULE_FIRMWARE("nvidia/gm204/gr/gpccs_sig.bin");
265
+MODULE_FIRMWARE("nvidia/gm204/gr/sw_ctx.bin");
266
+MODULE_FIRMWARE("nvidia/gm204/gr/sw_nonctx.bin");
267
+MODULE_FIRMWARE("nvidia/gm204/gr/sw_bundle_init.bin");
268
+MODULE_FIRMWARE("nvidia/gm204/gr/sw_method_init.bin");
269
+
270
+MODULE_FIRMWARE("nvidia/gm206/gr/fecs_bl.bin");
271
+MODULE_FIRMWARE("nvidia/gm206/gr/fecs_inst.bin");
272
+MODULE_FIRMWARE("nvidia/gm206/gr/fecs_data.bin");
273
+MODULE_FIRMWARE("nvidia/gm206/gr/fecs_sig.bin");
274
+MODULE_FIRMWARE("nvidia/gm206/gr/gpccs_bl.bin");
275
+MODULE_FIRMWARE("nvidia/gm206/gr/gpccs_inst.bin");
276
+MODULE_FIRMWARE("nvidia/gm206/gr/gpccs_data.bin");
277
+MODULE_FIRMWARE("nvidia/gm206/gr/gpccs_sig.bin");
278
+MODULE_FIRMWARE("nvidia/gm206/gr/sw_ctx.bin");
279
+MODULE_FIRMWARE("nvidia/gm206/gr/sw_nonctx.bin");
280
+MODULE_FIRMWARE("nvidia/gm206/gr/sw_bundle_init.bin");
281
+MODULE_FIRMWARE("nvidia/gm206/gr/sw_method_init.bin");
282
+
283
+static const struct gf100_gr_fwif
284
+gm200_gr_fwif[] = {
285
+ { 0, gm200_gr_load, &gm200_gr, &gm200_gr_fecs_acr, &gm200_gr_gpccs_acr },
286
+ { -1, gm200_gr_nofw },
287
+ {}
288
+};
289
+
290
+int
201291 gm200_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
202292 {
203
- return gm200_gr_new_(&gm200_gr, device, index, pgr);
293
+ return gf100_gr_new_(gm200_gr_fwif, device, index, pgr);
204294 }