aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c6
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h4
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c5
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h12
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c14
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c12
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 */
59struct acr_r352_ls_func { 59struct 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
68struct acr_r352; 70struct 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
150int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, struct ls_ucode_img *); 150int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, int,
151int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, struct ls_ucode_img *); 151 struct ls_ucode_img *);
152int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, struct ls_ucode_img *); 152int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, int,
153 struct ls_ucode_img *);
154int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, int,
155 struct ls_ucode_img *);
153int acr_ls_pmu_post_run(const struct nvkm_acr *, const struct nvkm_secboot *); 156int acr_ls_pmu_post_run(const struct nvkm_acr *, const struct nvkm_secboot *);
154int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, struct ls_ucode_img *); 157int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, int,
158 struct ls_ucode_img *);
155int acr_ls_sec2_post_run(const struct nvkm_acr *, const struct nvkm_secboot *); 159int 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 */
92static int 92static int
93ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img, 93ls_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
148int 148int
149acr_ls_ucode_load_fecs(const struct nvkm_secboot *sb, struct ls_ucode_img *img) 149acr_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
154int 155int
155acr_ls_ucode_load_gpccs(const struct nvkm_secboot *sb, struct ls_ucode_img *img) 156acr_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 */
40static int 40static int
41acr_ls_ucode_load_msgqueue(const struct nvkm_subdev *subdev, const char *name, 41acr_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
101int 101int
102acr_ls_ucode_load_pmu(const struct nvkm_secboot *sb, struct ls_ucode_img *img) 102acr_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
138int 139int
139acr_ls_ucode_load_sec2(const struct nvkm_secboot *sb, struct ls_ucode_img *img) 140acr_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