gp102.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20. * DEALINGS IN THE SOFTWARE.
  21. */
  22. #include "acr.h"
  23. #include "gm200.h"
  24. #include "ls_ucode.h"
  25. #include "hs_ucode.h"
  26. #include <subdev/mc.h>
  27. #include <subdev/timer.h>
  28. #include <engine/falcon.h>
  29. #include <engine/nvdec.h>
  30. static bool
  31. gp102_secboot_scrub_required(struct nvkm_secboot *sb)
  32. {
  33. struct nvkm_subdev *subdev = &sb->subdev;
  34. struct nvkm_device *device = subdev->device;
  35. u32 reg;
  36. nvkm_wr32(device, 0x100cd0, 0x2);
  37. reg = nvkm_rd32(device, 0x100cd0);
  38. return (reg & BIT(4));
  39. }
  40. static int
  41. gp102_run_secure_scrub(struct nvkm_secboot *sb)
  42. {
  43. struct nvkm_subdev *subdev = &sb->subdev;
  44. struct nvkm_device *device = subdev->device;
  45. struct nvkm_engine *engine;
  46. struct nvkm_falcon *falcon;
  47. void *scrub_image;
  48. struct fw_bin_header *hsbin_hdr;
  49. struct hsf_fw_header *fw_hdr;
  50. struct hsf_load_header *lhdr;
  51. void *scrub_data;
  52. int ret;
  53. nvkm_debug(subdev, "running VPR scrubber binary on NVDEC...\n");
  54. engine = nvkm_engine_ref(&device->nvdec->engine);
  55. if (IS_ERR(engine))
  56. return PTR_ERR(engine);
  57. falcon = device->nvdec->falcon;
  58. nvkm_falcon_get(falcon, &sb->subdev);
  59. scrub_image = hs_ucode_load_blob(subdev, falcon, "nvdec/scrubber");
  60. if (IS_ERR(scrub_image))
  61. return PTR_ERR(scrub_image);
  62. nvkm_falcon_reset(falcon);
  63. nvkm_falcon_bind_context(falcon, NULL);
  64. hsbin_hdr = scrub_image;
  65. fw_hdr = scrub_image + hsbin_hdr->header_offset;
  66. lhdr = scrub_image + fw_hdr->hdr_offset;
  67. scrub_data = scrub_image + hsbin_hdr->data_offset;
  68. nvkm_falcon_load_imem(falcon, scrub_data, lhdr->non_sec_code_off,
  69. lhdr->non_sec_code_size,
  70. lhdr->non_sec_code_off >> 8, 0, false);
  71. nvkm_falcon_load_imem(falcon, scrub_data + lhdr->apps[0],
  72. ALIGN(lhdr->apps[0], 0x100),
  73. lhdr->apps[1],
  74. lhdr->apps[0] >> 8, 0, true);
  75. nvkm_falcon_load_dmem(falcon, scrub_data + lhdr->data_dma_base, 0,
  76. lhdr->data_size, 0);
  77. kfree(scrub_image);
  78. nvkm_falcon_set_start_addr(falcon, 0x0);
  79. nvkm_falcon_start(falcon);
  80. ret = nvkm_falcon_wait_for_halt(falcon, 500);
  81. if (ret < 0) {
  82. nvkm_error(subdev, "failed to run VPR scrubber binary!\n");
  83. ret = -ETIMEDOUT;
  84. goto end;
  85. }
  86. /* put nvdec in clean state - without reset it will remain in HS mode */
  87. nvkm_falcon_reset(falcon);
  88. if (gp102_secboot_scrub_required(sb)) {
  89. nvkm_error(subdev, "VPR scrubber binary failed!\n");
  90. ret = -EINVAL;
  91. goto end;
  92. }
  93. nvkm_debug(subdev, "VPR scrub successfully completed\n");
  94. end:
  95. nvkm_falcon_put(falcon, &sb->subdev);
  96. nvkm_engine_unref(&engine);
  97. return ret;
  98. }
  99. static int
  100. gp102_secboot_run_blob(struct nvkm_secboot *sb, struct nvkm_gpuobj *blob,
  101. struct nvkm_falcon *falcon)
  102. {
  103. int ret;
  104. /* make sure the VPR region is unlocked */
  105. if (gp102_secboot_scrub_required(sb)) {
  106. ret = gp102_run_secure_scrub(sb);
  107. if (ret)
  108. return ret;
  109. }
  110. return gm200_secboot_run_blob(sb, blob, falcon);
  111. }
  112. static const struct nvkm_secboot_func
  113. gp102_secboot = {
  114. .dtor = gm200_secboot_dtor,
  115. .oneinit = gm200_secboot_oneinit,
  116. .fini = gm200_secboot_fini,
  117. .run_blob = gp102_secboot_run_blob,
  118. };
  119. int
  120. gp102_secboot_new(struct nvkm_device *device, int index,
  121. struct nvkm_secboot **psb)
  122. {
  123. int ret;
  124. struct gm200_secboot *gsb;
  125. struct nvkm_acr *acr;
  126. acr = acr_r367_new(NVKM_SECBOOT_FALCON_SEC2,
  127. BIT(NVKM_SECBOOT_FALCON_FECS) |
  128. BIT(NVKM_SECBOOT_FALCON_GPCCS) |
  129. BIT(NVKM_SECBOOT_FALCON_SEC2));
  130. if (IS_ERR(acr))
  131. return PTR_ERR(acr);
  132. gsb = kzalloc(sizeof(*gsb), GFP_KERNEL);
  133. if (!gsb) {
  134. psb = NULL;
  135. return -ENOMEM;
  136. }
  137. *psb = &gsb->base;
  138. ret = nvkm_secboot_ctor(&gp102_secboot, acr, device, index, &gsb->base);
  139. if (ret)
  140. return ret;
  141. return 0;
  142. }
  143. MODULE_FIRMWARE("nvidia/gp102/acr/bl.bin");
  144. MODULE_FIRMWARE("nvidia/gp102/acr/unload_bl.bin");
  145. MODULE_FIRMWARE("nvidia/gp102/acr/ucode_load.bin");
  146. MODULE_FIRMWARE("nvidia/gp102/acr/ucode_unload.bin");
  147. MODULE_FIRMWARE("nvidia/gp102/gr/fecs_bl.bin");
  148. MODULE_FIRMWARE("nvidia/gp102/gr/fecs_inst.bin");
  149. MODULE_FIRMWARE("nvidia/gp102/gr/fecs_data.bin");
  150. MODULE_FIRMWARE("nvidia/gp102/gr/fecs_sig.bin");
  151. MODULE_FIRMWARE("nvidia/gp102/gr/gpccs_bl.bin");
  152. MODULE_FIRMWARE("nvidia/gp102/gr/gpccs_inst.bin");
  153. MODULE_FIRMWARE("nvidia/gp102/gr/gpccs_data.bin");
  154. MODULE_FIRMWARE("nvidia/gp102/gr/gpccs_sig.bin");
  155. MODULE_FIRMWARE("nvidia/gp102/gr/sw_ctx.bin");
  156. MODULE_FIRMWARE("nvidia/gp102/gr/sw_nonctx.bin");
  157. MODULE_FIRMWARE("nvidia/gp102/gr/sw_bundle_init.bin");
  158. MODULE_FIRMWARE("nvidia/gp102/gr/sw_method_init.bin");
  159. MODULE_FIRMWARE("nvidia/gp102/nvdec/scrubber.bin");
  160. MODULE_FIRMWARE("nvidia/gp102/sec2/desc.bin");
  161. MODULE_FIRMWARE("nvidia/gp102/sec2/image.bin");
  162. MODULE_FIRMWARE("nvidia/gp102/sec2/sig.bin");
  163. MODULE_FIRMWARE("nvidia/gp104/acr/bl.bin");
  164. MODULE_FIRMWARE("nvidia/gp104/acr/unload_bl.bin");
  165. MODULE_FIRMWARE("nvidia/gp104/acr/ucode_load.bin");
  166. MODULE_FIRMWARE("nvidia/gp104/acr/ucode_unload.bin");
  167. MODULE_FIRMWARE("nvidia/gp104/gr/fecs_bl.bin");
  168. MODULE_FIRMWARE("nvidia/gp104/gr/fecs_inst.bin");
  169. MODULE_FIRMWARE("nvidia/gp104/gr/fecs_data.bin");
  170. MODULE_FIRMWARE("nvidia/gp104/gr/fecs_sig.bin");
  171. MODULE_FIRMWARE("nvidia/gp104/gr/gpccs_bl.bin");
  172. MODULE_FIRMWARE("nvidia/gp104/gr/gpccs_inst.bin");
  173. MODULE_FIRMWARE("nvidia/gp104/gr/gpccs_data.bin");
  174. MODULE_FIRMWARE("nvidia/gp104/gr/gpccs_sig.bin");
  175. MODULE_FIRMWARE("nvidia/gp104/gr/sw_ctx.bin");
  176. MODULE_FIRMWARE("nvidia/gp104/gr/sw_nonctx.bin");
  177. MODULE_FIRMWARE("nvidia/gp104/gr/sw_bundle_init.bin");
  178. MODULE_FIRMWARE("nvidia/gp104/gr/sw_method_init.bin");
  179. MODULE_FIRMWARE("nvidia/gp104/nvdec/scrubber.bin");
  180. MODULE_FIRMWARE("nvidia/gp104/sec2/desc.bin");
  181. MODULE_FIRMWARE("nvidia/gp104/sec2/image.bin");
  182. MODULE_FIRMWARE("nvidia/gp104/sec2/sig.bin");
  183. MODULE_FIRMWARE("nvidia/gp106/acr/bl.bin");
  184. MODULE_FIRMWARE("nvidia/gp106/acr/unload_bl.bin");
  185. MODULE_FIRMWARE("nvidia/gp106/acr/ucode_load.bin");
  186. MODULE_FIRMWARE("nvidia/gp106/acr/ucode_unload.bin");
  187. MODULE_FIRMWARE("nvidia/gp106/gr/fecs_bl.bin");
  188. MODULE_FIRMWARE("nvidia/gp106/gr/fecs_inst.bin");
  189. MODULE_FIRMWARE("nvidia/gp106/gr/fecs_data.bin");
  190. MODULE_FIRMWARE("nvidia/gp106/gr/fecs_sig.bin");
  191. MODULE_FIRMWARE("nvidia/gp106/gr/gpccs_bl.bin");
  192. MODULE_FIRMWARE("nvidia/gp106/gr/gpccs_inst.bin");
  193. MODULE_FIRMWARE("nvidia/gp106/gr/gpccs_data.bin");
  194. MODULE_FIRMWARE("nvidia/gp106/gr/gpccs_sig.bin");
  195. MODULE_FIRMWARE("nvidia/gp106/gr/sw_ctx.bin");
  196. MODULE_FIRMWARE("nvidia/gp106/gr/sw_nonctx.bin");
  197. MODULE_FIRMWARE("nvidia/gp106/gr/sw_bundle_init.bin");
  198. MODULE_FIRMWARE("nvidia/gp106/gr/sw_method_init.bin");
  199. MODULE_FIRMWARE("nvidia/gp106/nvdec/scrubber.bin");
  200. MODULE_FIRMWARE("nvidia/gp106/sec2/desc.bin");
  201. MODULE_FIRMWARE("nvidia/gp106/sec2/image.bin");
  202. MODULE_FIRMWARE("nvidia/gp106/sec2/sig.bin");
  203. MODULE_FIRMWARE("nvidia/gp107/acr/bl.bin");
  204. MODULE_FIRMWARE("nvidia/gp107/acr/unload_bl.bin");
  205. MODULE_FIRMWARE("nvidia/gp107/acr/ucode_load.bin");
  206. MODULE_FIRMWARE("nvidia/gp107/acr/ucode_unload.bin");
  207. MODULE_FIRMWARE("nvidia/gp107/gr/fecs_bl.bin");
  208. MODULE_FIRMWARE("nvidia/gp107/gr/fecs_inst.bin");
  209. MODULE_FIRMWARE("nvidia/gp107/gr/fecs_data.bin");
  210. MODULE_FIRMWARE("nvidia/gp107/gr/fecs_sig.bin");
  211. MODULE_FIRMWARE("nvidia/gp107/gr/gpccs_bl.bin");
  212. MODULE_FIRMWARE("nvidia/gp107/gr/gpccs_inst.bin");
  213. MODULE_FIRMWARE("nvidia/gp107/gr/gpccs_data.bin");
  214. MODULE_FIRMWARE("nvidia/gp107/gr/gpccs_sig.bin");
  215. MODULE_FIRMWARE("nvidia/gp107/gr/sw_ctx.bin");
  216. MODULE_FIRMWARE("nvidia/gp107/gr/sw_nonctx.bin");
  217. MODULE_FIRMWARE("nvidia/gp107/gr/sw_bundle_init.bin");
  218. MODULE_FIRMWARE("nvidia/gp107/gr/sw_method_init.bin");
  219. MODULE_FIRMWARE("nvidia/gp107/nvdec/scrubber.bin");
  220. MODULE_FIRMWARE("nvidia/gp107/sec2/desc.bin");
  221. MODULE_FIRMWARE("nvidia/gp107/sec2/image.bin");
  222. MODULE_FIRMWARE("nvidia/gp107/sec2/sig.bin");