OSDN Git Service

drm/nouveau/secboot: add LS firmware post-run hooks
authorAlexandre Courbot <acourbot@nvidia.com>
Wed, 26 Oct 2016 06:15:42 +0000 (15:15 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 7 Mar 2017 07:05:12 +0000 (17:05 +1000)
Add the ability for LS firmwares to declare a post-run hook that is
invoked right after the HS firmware is executed. This allows them to
e.g. write some initialization data into the falcon's DMEM.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h

index e6edde0..0a35d35 100644 (file)
@@ -852,6 +852,8 @@ acr_r352_shutdown(struct acr_r352 *acr, struct nvkm_secboot *sb)
 static int
 acr_r352_bootstrap(struct acr_r352 *acr, struct nvkm_secboot *sb)
 {
+       unsigned long managed_falcons = acr->base.managed_falcons;
+       int falcon_id;
        int ret;
 
        if (sb->wpr_set)
@@ -872,6 +874,15 @@ acr_r352_bootstrap(struct acr_r352 *acr, struct nvkm_secboot *sb)
 
        sb->wpr_set = true;
 
+       /* Run LS firmwares post_run hooks */
+       for_each_set_bit(falcon_id, &managed_falcons, NVKM_SECBOOT_FALCON_END) {
+               const struct acr_r352_ls_func *func =
+                                                 acr->func->ls_func[falcon_id];
+
+               if (func->post_run)
+                       func->post_run(&acr->base, sb);
+       }
+
        return 0;
 }
 
index 3e86d45..9ca23c1 100644 (file)
@@ -78,6 +78,7 @@ hsf_load_header_app_size(const struct hsf_load_header *hdr, u32 app)
  * @generate_bl_desc: function called on a block of bl_desc_size to generate the
  *                   proper bootloader descriptor for this LS firmware
  * @bl_desc_size: size of the bootloader descriptor
+ * @post_run: hook called right after the ACR is executed
  * @lhdr_flags: LS flags
  */
 struct acr_r352_ls_func {
@@ -85,6 +86,7 @@ struct acr_r352_ls_func {
        void (*generate_bl_desc)(const struct nvkm_acr *,
                                 const struct ls_ucode_img *, u64, void *);
        u32 bl_desc_size;
+       void (*post_run)(const struct nvkm_acr *, const struct nvkm_secboot *);
        u32 lhdr_flags;
 };