@@ -259,18 +259,16 @@ nvkm_gsp_fwsec_v3(struct nvkm_gsp *gsp, const char *name,
259259}
260260
261261static int
262- nvkm_gsp_fwsec (struct nvkm_gsp * gsp , const char * name , u32 init_cmd )
262+ nvkm_gsp_fwsec_init (struct nvkm_gsp * gsp , struct nvkm_falcon_fw * fw , const char * name , u32 init_cmd )
263263{
264264 struct nvkm_subdev * subdev = & gsp -> subdev ;
265265 struct nvkm_device * device = subdev -> device ;
266266 struct nvkm_bios * bios = device -> bios ;
267267 const union nvfw_falcon_ucode_desc * desc ;
268268 struct nvbios_pmuE flcn_ucode ;
269- u8 idx , ver , hdr ;
270269 u32 data ;
271270 u16 size , vers ;
272- struct nvkm_falcon_fw fw = {};
273- u32 mbox0 = 0 ;
271+ u8 idx , ver , hdr ;
274272 int ret ;
275273
276274 /* Lookup in VBIOS. */
@@ -291,8 +289,8 @@ nvkm_gsp_fwsec(struct nvkm_gsp *gsp, const char *name, u32 init_cmd)
291289 vers = (desc -> v2 .Hdr & 0x0000ff00 ) >> 8 ;
292290
293291 switch (vers ) {
294- case 2 : ret = nvkm_gsp_fwsec_v2 (gsp , name , & desc -> v2 , size , init_cmd , & fw ); break ;
295- case 3 : ret = nvkm_gsp_fwsec_v3 (gsp , name , & desc -> v3 , size , init_cmd , & fw ); break ;
292+ case 2 : ret = nvkm_gsp_fwsec_v2 (gsp , name , & desc -> v2 , size , init_cmd , fw ); break ;
293+ case 3 : ret = nvkm_gsp_fwsec_v3 (gsp , name , & desc -> v3 , size , init_cmd , fw ); break ;
296294 default :
297295 nvkm_error (subdev , "%s(v%d): version unknown\n" , name , vers );
298296 return - EINVAL ;
@@ -303,15 +301,19 @@ nvkm_gsp_fwsec(struct nvkm_gsp *gsp, const char *name, u32 init_cmd)
303301 return ret ;
304302 }
305303
306- /* Boot. */
307- ret = nvkm_falcon_fw_boot (& fw , subdev , true, & mbox0 , NULL , 0 , 0 );
308- nvkm_falcon_fw_dtor (& fw );
309- if (ret )
310- return ret ;
311-
312304 return 0 ;
313305}
314306
307+ static int
308+ nvkm_gsp_fwsec_boot (struct nvkm_gsp * gsp , struct nvkm_falcon_fw * fw )
309+ {
310+ struct nvkm_subdev * subdev = & gsp -> subdev ;
311+ u32 mbox0 = 0 ;
312+
313+ /* Boot */
314+ return nvkm_falcon_fw_boot (fw , subdev , true, & mbox0 , NULL , 0 , 0 );
315+ }
316+
315317int
316318nvkm_gsp_fwsec_sb (struct nvkm_gsp * gsp )
317319{
@@ -320,7 +322,7 @@ nvkm_gsp_fwsec_sb(struct nvkm_gsp *gsp)
320322 int ret ;
321323 u32 err ;
322324
323- ret = nvkm_gsp_fwsec (gsp , "fwsec-sb" , NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB );
325+ ret = nvkm_gsp_fwsec_boot (gsp , & gsp -> fws . falcon . sb );
324326 if (ret )
325327 return ret ;
326328
@@ -334,27 +336,48 @@ nvkm_gsp_fwsec_sb(struct nvkm_gsp *gsp)
334336 return 0 ;
335337}
336338
339+ int
340+ nvkm_gsp_fwsec_sb_ctor (struct nvkm_gsp * gsp )
341+ {
342+ return nvkm_gsp_fwsec_init (gsp , & gsp -> fws .falcon .sb , "fwsec-sb" ,
343+ NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB );
344+ }
345+
346+ void
347+ nvkm_gsp_fwsec_sb_dtor (struct nvkm_gsp * gsp )
348+ {
349+ nvkm_falcon_fw_dtor (& gsp -> fws .falcon .sb );
350+ }
351+
337352int
338353nvkm_gsp_fwsec_frts (struct nvkm_gsp * gsp )
339354{
340355 struct nvkm_subdev * subdev = & gsp -> subdev ;
341356 struct nvkm_device * device = subdev -> device ;
357+ struct nvkm_falcon_fw fw = {};
342358 int ret ;
343359 u32 err , wpr2_lo , wpr2_hi ;
344360
345- ret = nvkm_gsp_fwsec (gsp , "fwsec-frts" , NVFW_FALCON_APPIF_DMEMMAPPER_CMD_FRTS );
361+ ret = nvkm_gsp_fwsec_init (gsp , & fw , "fwsec-frts" , NVFW_FALCON_APPIF_DMEMMAPPER_CMD_FRTS );
346362 if (ret )
347363 return ret ;
348364
365+ ret = nvkm_gsp_fwsec_boot (gsp , & fw );
366+ if (ret )
367+ goto fwsec_dtor ;
368+
349369 /* Verify. */
350370 err = nvkm_rd32 (device , 0x001400 + (0xe * 4 )) >> 16 ;
351371 if (err ) {
352372 nvkm_error (subdev , "fwsec-frts: 0x%04x\n" , err );
353- return - EIO ;
373+ ret = - EIO ;
374+ } else {
375+ wpr2_lo = nvkm_rd32 (device , 0x1fa824 );
376+ wpr2_hi = nvkm_rd32 (device , 0x1fa828 );
377+ nvkm_debug (subdev , "fwsec-frts: WPR2 @ %08x - %08x\n" , wpr2_lo , wpr2_hi );
354378 }
355379
356- wpr2_lo = nvkm_rd32 (device , 0x1fa824 );
357- wpr2_hi = nvkm_rd32 (device , 0x1fa828 );
358- nvkm_debug (subdev , "fwsec-frts: WPR2 @ %08x - %08x\n" , wpr2_lo , wpr2_hi );
359- return 0 ;
380+ fwsec_dtor :
381+ nvkm_falcon_fw_dtor (& fw );
382+ return ret ;
360383}
0 commit comments