enum nvkm_secboot_falcon falcon_id)
 {
        const struct nvkm_subdev *subdev = acr->base.subdev;
+       const struct acr_r352_ls_func *func = acr->func->ls_func[falcon_id];
        struct ls_ucode_img_r352 *img;
        int ret;
 
 
        img->base.falcon_id = falcon_id;
 
-       ret = acr->func->ls_func[falcon_id]->load(sb, &img->base);
-
-       if (ret) {
+       ret = func->load(sb, func->version_max, &img->base);
+       if (ret < 0) {
                kfree(img->base.ucode_data);
                kfree(img->base.sig);
                kfree(img);
 
  * @lhdr_flags: LS flags
  */
 struct acr_r352_ls_func {
-       int (*load)(const struct nvkm_secboot *, struct ls_ucode_img *);
+       int (*load)(const struct nvkm_secboot *, int maxver,
+                   struct ls_ucode_img *);
        void (*generate_bl_desc)(const struct nvkm_acr *,
                                 const struct ls_ucode_img *, u64, void *);
        u32 bl_desc_size;
        int (*post_run)(const struct nvkm_acr *, const struct nvkm_secboot *);
        u32 lhdr_flags;
+       int version_max;
 };
 
 struct acr_r352;
 
                           enum nvkm_secboot_falcon falcon_id)
 {
        const struct nvkm_subdev *subdev = acr->base.subdev;
+       const struct acr_r352_ls_func *func = acr->func->ls_func[falcon_id];
        struct ls_ucode_img_r367 *img;
        int ret;
 
 
        img->base.falcon_id = falcon_id;
 
-       ret = acr->func->ls_func[falcon_id]->load(sb, &img->base);
-       if (ret) {
+       ret = func->load(sb, func->version_max, &img->base);
+       if (ret < 0) {
                kfree(img->base.ucode_data);
                kfree(img->base.sig);
                kfree(img);
 
        u32 data_size;
 };
 
-int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, struct ls_ucode_img *);
-int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, struct ls_ucode_img *);
-int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, struct ls_ucode_img *);
+int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, int,
+                          struct ls_ucode_img *);
+int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, int,
+                           struct ls_ucode_img *);
+int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, int,
+                         struct ls_ucode_img *);
 int acr_ls_pmu_post_run(const struct nvkm_acr *, const struct nvkm_secboot *);
-int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, struct ls_ucode_img *);
+int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, int,
+                          struct ls_ucode_img *);
 int acr_ls_sec2_post_run(const struct nvkm_acr *, const struct nvkm_secboot *);
 
 #endif
 
  * blob. Also generate the corresponding ucode descriptor.
  */
 static int
-ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img,
-                    const char *falcon_name)
+ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, int maxver,
+                    struct ls_ucode_img *img, const char *falcon_name)
 {
        const struct firmware *bl, *code, *data, *sig;
        char f[64];
 }
 
 int
-acr_ls_ucode_load_fecs(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
+acr_ls_ucode_load_fecs(const struct nvkm_secboot *sb, int maxver,
+                      struct ls_ucode_img *img)
 {
-       return ls_ucode_img_load_gr(&sb->subdev, img, "fecs");
+       return ls_ucode_img_load_gr(&sb->subdev, maxver, img, "fecs");
 }
 
 int
-acr_ls_ucode_load_gpccs(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
+acr_ls_ucode_load_gpccs(const struct nvkm_secboot *sb, int maxver,
+                       struct ls_ucode_img *img)
 {
-       return ls_ucode_img_load_gr(&sb->subdev, img, "gpccs");
+       return ls_ucode_img_load_gr(&sb->subdev, maxver, img, "gpccs");
 }
 
  */
 static int
 acr_ls_ucode_load_msgqueue(const struct nvkm_subdev *subdev, const char *name,
-                          struct ls_ucode_img *img)
+                          int maxver, struct ls_ucode_img *img)
 {
        const struct firmware *image, *desc, *sig;
        char f[64];
 }
 
 int
-acr_ls_ucode_load_pmu(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
+acr_ls_ucode_load_pmu(const struct nvkm_secboot *sb, int maxver,
+                     struct ls_ucode_img *img)
 {
        struct nvkm_pmu *pmu = sb->subdev.device->pmu;
        int ret;
 
-       ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "pmu", img);
+       ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "pmu", maxver, img);
        if (ret)
                return ret;
 
 }
 
 int
-acr_ls_ucode_load_sec2(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
+acr_ls_ucode_load_sec2(const struct nvkm_secboot *sb, int maxver,
+                      struct ls_ucode_img *img)
 {
        struct nvkm_sec2 *sec = sb->subdev.device->sec2;
        int ret;
 
-       ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "sec2", img);
+       ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "sec2", maxver, img);
        if (ret)
                return ret;