diff options
6 files changed, 32 insertions, 21 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c index 1df09ed6fe6d..df666fb03f5f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c | |||
| @@ -243,6 +243,7 @@ acr_r352_ls_ucode_img_load(const struct acr_r352 *acr, | |||
| 243 | enum nvkm_secboot_falcon falcon_id) | 243 | enum nvkm_secboot_falcon falcon_id) |
| 244 | { | 244 | { |
| 245 | const struct nvkm_subdev *subdev = acr->base.subdev; | 245 | const struct nvkm_subdev *subdev = acr->base.subdev; |
| 246 | const struct acr_r352_ls_func *func = acr->func->ls_func[falcon_id]; | ||
| 246 | struct ls_ucode_img_r352 *img; | 247 | struct ls_ucode_img_r352 *img; |
| 247 | int ret; | 248 | int ret; |
| 248 | 249 | ||
| @@ -252,9 +253,8 @@ acr_r352_ls_ucode_img_load(const struct acr_r352 *acr, | |||
| 252 | 253 | ||
| 253 | img->base.falcon_id = falcon_id; | 254 | img->base.falcon_id = falcon_id; |
| 254 | 255 | ||
| 255 | ret = acr->func->ls_func[falcon_id]->load(sb, &img->base); | 256 | ret = func->load(sb, func->version_max, &img->base); |
| 256 | 257 | if (ret < 0) { | |
| 257 | if (ret) { | ||
| 258 | kfree(img->base.ucode_data); | 258 | kfree(img->base.ucode_data); |
| 259 | kfree(img->base.sig); | 259 | kfree(img->base.sig); |
| 260 | kfree(img); | 260 | kfree(img); |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h index 3d58ab871563..f29c2268c026 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h | |||
| @@ -57,12 +57,14 @@ hsf_load_header_app_size(const struct hsf_load_header *hdr, u32 app) | |||
| 57 | * @lhdr_flags: LS flags | 57 | * @lhdr_flags: LS flags |
| 58 | */ | 58 | */ |
| 59 | struct acr_r352_ls_func { | 59 | struct acr_r352_ls_func { |
| 60 | int (*load)(const struct nvkm_secboot *, struct ls_ucode_img *); | 60 | int (*load)(const struct nvkm_secboot *, int maxver, |
| 61 | struct ls_ucode_img *); | ||
| 61 | void (*generate_bl_desc)(const struct nvkm_acr *, | 62 | void (*generate_bl_desc)(const struct nvkm_acr *, |
| 62 | const struct ls_ucode_img *, u64, void *); | 63 | const struct ls_ucode_img *, u64, void *); |
| 63 | u32 bl_desc_size; | 64 | u32 bl_desc_size; |
| 64 | int (*post_run)(const struct nvkm_acr *, const struct nvkm_secboot *); | 65 | int (*post_run)(const struct nvkm_acr *, const struct nvkm_secboot *); |
| 65 | u32 lhdr_flags; | 66 | u32 lhdr_flags; |
| 67 | int version_max; | ||
| 66 | }; | 68 | }; |
| 67 | 69 | ||
| 68 | struct acr_r352; | 70 | struct acr_r352; |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c index 978ad0790367..7c2424d73083 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c | |||
| @@ -111,6 +111,7 @@ acr_r367_ls_ucode_img_load(const struct acr_r352 *acr, | |||
| 111 | enum nvkm_secboot_falcon falcon_id) | 111 | enum nvkm_secboot_falcon falcon_id) |
| 112 | { | 112 | { |
| 113 | const struct nvkm_subdev *subdev = acr->base.subdev; | 113 | const struct nvkm_subdev *subdev = acr->base.subdev; |
| 114 | const struct acr_r352_ls_func *func = acr->func->ls_func[falcon_id]; | ||
| 114 | struct ls_ucode_img_r367 *img; | 115 | struct ls_ucode_img_r367 *img; |
| 115 | int ret; | 116 | int ret; |
| 116 | 117 | ||
| @@ -120,8 +121,8 @@ acr_r367_ls_ucode_img_load(const struct acr_r352 *acr, | |||
| 120 | 121 | ||
| 121 | img->base.falcon_id = falcon_id; | 122 | img->base.falcon_id = falcon_id; |
| 122 | 123 | ||
| 123 | ret = acr->func->ls_func[falcon_id]->load(sb, &img->base); | 124 | ret = func->load(sb, func->version_max, &img->base); |
| 124 | if (ret) { | 125 | if (ret < 0) { |
| 125 | kfree(img->base.ucode_data); | 126 | kfree(img->base.ucode_data); |
| 126 | kfree(img->base.sig); | 127 | kfree(img->base.sig); |
| 127 | kfree(img); | 128 | kfree(img); |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h index 9b7c402594e8..d43f906da3a7 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h | |||
| @@ -147,11 +147,15 @@ struct fw_bl_desc { | |||
| 147 | u32 data_size; | 147 | u32 data_size; |
| 148 | }; | 148 | }; |
| 149 | 149 | ||
| 150 | int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, struct ls_ucode_img *); | 150 | int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, int, |
| 151 | int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, struct ls_ucode_img *); | 151 | struct ls_ucode_img *); |
| 152 | int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, struct ls_ucode_img *); | 152 | int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, int, |
| 153 | struct ls_ucode_img *); | ||
| 154 | int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, int, | ||
| 155 | struct ls_ucode_img *); | ||
| 153 | int acr_ls_pmu_post_run(const struct nvkm_acr *, const struct nvkm_secboot *); | 156 | int acr_ls_pmu_post_run(const struct nvkm_acr *, const struct nvkm_secboot *); |
| 154 | int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, struct ls_ucode_img *); | 157 | int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, int, |
| 158 | struct ls_ucode_img *); | ||
| 155 | int acr_ls_sec2_post_run(const struct nvkm_acr *, const struct nvkm_secboot *); | 159 | int acr_ls_sec2_post_run(const struct nvkm_acr *, const struct nvkm_secboot *); |
| 156 | 160 | ||
| 157 | #endif | 161 | #endif |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c index 0d71a9e40c3e..821d3b2bdb1f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c | |||
| @@ -90,8 +90,8 @@ ls_ucode_img_build(const struct firmware *bl, const struct firmware *code, | |||
| 90 | * blob. Also generate the corresponding ucode descriptor. | 90 | * blob. Also generate the corresponding ucode descriptor. |
| 91 | */ | 91 | */ |
| 92 | static int | 92 | static int |
| 93 | ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img, | 93 | ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, int maxver, |
| 94 | const char *falcon_name) | 94 | struct ls_ucode_img *img, const char *falcon_name) |
| 95 | { | 95 | { |
| 96 | const struct firmware *bl, *code, *data, *sig; | 96 | const struct firmware *bl, *code, *data, *sig; |
| 97 | char f[64]; | 97 | char f[64]; |
| @@ -146,13 +146,15 @@ error: | |||
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | int | 148 | int |
| 149 | acr_ls_ucode_load_fecs(const struct nvkm_secboot *sb, struct ls_ucode_img *img) | 149 | acr_ls_ucode_load_fecs(const struct nvkm_secboot *sb, int maxver, |
| 150 | struct ls_ucode_img *img) | ||
| 150 | { | 151 | { |
| 151 | return ls_ucode_img_load_gr(&sb->subdev, img, "fecs"); | 152 | return ls_ucode_img_load_gr(&sb->subdev, maxver, img, "fecs"); |
| 152 | } | 153 | } |
| 153 | 154 | ||
| 154 | int | 155 | int |
| 155 | acr_ls_ucode_load_gpccs(const struct nvkm_secboot *sb, struct ls_ucode_img *img) | 156 | acr_ls_ucode_load_gpccs(const struct nvkm_secboot *sb, int maxver, |
| 157 | struct ls_ucode_img *img) | ||
| 156 | { | 158 | { |
| 157 | return ls_ucode_img_load_gr(&sb->subdev, img, "gpccs"); | 159 | return ls_ucode_img_load_gr(&sb->subdev, maxver, img, "gpccs"); |
| 158 | } | 160 | } |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c index 5b9874619e53..5a7a55e831a4 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | */ | 39 | */ |
| 40 | static int | 40 | static int |
| 41 | acr_ls_ucode_load_msgqueue(const struct nvkm_subdev *subdev, const char *name, | 41 | acr_ls_ucode_load_msgqueue(const struct nvkm_subdev *subdev, const char *name, |
| 42 | struct ls_ucode_img *img) | 42 | int maxver, struct ls_ucode_img *img) |
| 43 | { | 43 | { |
| 44 | const struct firmware *image, *desc, *sig; | 44 | const struct firmware *image, *desc, *sig; |
| 45 | char f[64]; | 45 | char f[64]; |
| @@ -99,12 +99,13 @@ acr_ls_msgqueue_post_run(struct nvkm_msgqueue *queue, | |||
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | int | 101 | int |
| 102 | acr_ls_ucode_load_pmu(const struct nvkm_secboot *sb, struct ls_ucode_img *img) | 102 | acr_ls_ucode_load_pmu(const struct nvkm_secboot *sb, int maxver, |
| 103 | struct ls_ucode_img *img) | ||
| 103 | { | 104 | { |
| 104 | struct nvkm_pmu *pmu = sb->subdev.device->pmu; | 105 | struct nvkm_pmu *pmu = sb->subdev.device->pmu; |
| 105 | int ret; | 106 | int ret; |
| 106 | 107 | ||
| 107 | ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "pmu", img); | 108 | ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "pmu", maxver, img); |
| 108 | if (ret) | 109 | if (ret) |
| 109 | return ret; | 110 | return ret; |
| 110 | 111 | ||
| @@ -136,12 +137,13 @@ acr_ls_pmu_post_run(const struct nvkm_acr *acr, const struct nvkm_secboot *sb) | |||
| 136 | } | 137 | } |
| 137 | 138 | ||
| 138 | int | 139 | int |
| 139 | acr_ls_ucode_load_sec2(const struct nvkm_secboot *sb, struct ls_ucode_img *img) | 140 | acr_ls_ucode_load_sec2(const struct nvkm_secboot *sb, int maxver, |
| 141 | struct ls_ucode_img *img) | ||
| 140 | { | 142 | { |
| 141 | struct nvkm_sec2 *sec = sb->subdev.device->sec2; | 143 | struct nvkm_sec2 *sec = sb->subdev.device->sec2; |
| 142 | int ret; | 144 | int ret; |
| 143 | 145 | ||
| 144 | ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "sec2", img); | 146 | ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "sec2", maxver, img); |
| 145 | if (ret) | 147 | if (ret) |
| 146 | return ret; | 148 | return ret; |
| 147 | 149 | ||
