.. | .. |
---|
24 | 24 | #include "gf100.h" |
---|
25 | 25 | #include "ctxgf100.h" |
---|
26 | 26 | |
---|
| 27 | +#include <core/firmware.h> |
---|
| 28 | +#include <subdev/acr.h> |
---|
27 | 29 | #include <subdev/secboot.h> |
---|
28 | 30 | |
---|
| 31 | +#include <nvfw/flcn.h> |
---|
| 32 | + |
---|
29 | 33 | #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 | +} |
---|
30 | 41 | |
---|
31 | 42 | /******************************************************************************* |
---|
32 | 43 | * PGRAPH engine/subdev functions |
---|
33 | 44 | ******************************************************************************/ |
---|
| 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 | +}; |
---|
34 | 91 | |
---|
35 | 92 | int |
---|
36 | 93 | gm200_gr_rops(struct gf100_gr *gr) |
---|
.. | .. |
---|
124 | 181 | } |
---|
125 | 182 | } |
---|
126 | 183 | |
---|
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 | | - |
---|
165 | 184 | static const struct gf100_gr_func |
---|
166 | 185 | gm200_gr = { |
---|
167 | 186 | .oneinit_tiles = gm200_gr_oneinit_tiles, |
---|
.. | .. |
---|
198 | 217 | }; |
---|
199 | 218 | |
---|
200 | 219 | 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 |
---|
201 | 291 | gm200_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr) |
---|
202 | 292 | { |
---|
203 | | - return gm200_gr_new_(&gm200_gr, device, index, pgr); |
---|
| 293 | + return gf100_gr_new_(gm200_gr_fwif, device, index, pgr); |
---|
204 | 294 | } |
---|