@@ -254,8 +254,10 @@ static int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev)
254254
255255 header = (struct cookie_header * )(dev -> policy_buf + POLICY_COOKIE_OFFSET );
256256
257- if (header -> sign != POLICY_SIGN_COOKIE || !header -> length )
257+ if (header -> sign != POLICY_SIGN_COOKIE || !header -> length ) {
258+ dev_dbg (dev -> dev , "cookie doesn't match\n" );
258259 return - EINVAL ;
260+ }
259261
260262 if (dev -> policy_sz < header -> length + 512 )
261263 return - EINVAL ;
@@ -265,15 +267,15 @@ static int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev)
265267 res = amd_pmf_invoke_cmd_init (dev );
266268 if (res == TA_PMF_TYPE_SUCCESS ) {
267269 /* Now its safe to announce that smart pc is enabled */
268- dev -> smart_pc_enabled = PMF_SMART_PC_ENABLED ;
270+ dev -> smart_pc_enabled = true ;
269271 /*
270272 * Start collecting the data from TA FW after a small delay
271273 * or else, we might end up getting stale values.
272274 */
273275 schedule_delayed_work (& dev -> pb_work , msecs_to_jiffies (pb_actions_ms * 3 ));
274276 } else {
275277 dev_err (dev -> dev , "ta invoke cmd init failed err: %x\n" , res );
276- dev -> smart_pc_enabled = PMF_SMART_PC_DISABLED ;
278+ dev -> smart_pc_enabled = false ;
277279 return - EIO ;
278280 }
279281
@@ -341,25 +343,6 @@ static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) {}
341343static void amd_pmf_hex_dump_pb (struct amd_pmf_dev * dev ) {}
342344#endif
343345
344- static int amd_pmf_get_bios_buffer (struct amd_pmf_dev * dev )
345- {
346- dev -> policy_buf = kzalloc (dev -> policy_sz , GFP_KERNEL );
347- if (!dev -> policy_buf )
348- return - ENOMEM ;
349-
350- dev -> policy_base = devm_ioremap (dev -> dev , dev -> policy_addr , dev -> policy_sz );
351- if (!dev -> policy_base )
352- return - ENOMEM ;
353-
354- memcpy_fromio (dev -> policy_buf , dev -> policy_base , dev -> policy_sz );
355-
356- amd_pmf_hex_dump_pb (dev );
357- if (pb_side_load )
358- amd_pmf_open_pb (dev , dev -> dbgfs_dir );
359-
360- return amd_pmf_start_policy_engine (dev );
361- }
362-
363346static int amd_pmf_amdtee_ta_match (struct tee_ioctl_version_data * ver , const void * data )
364347{
365348 return ver -> impl_id == TEE_IMPL_ID_AMDTEE ;
@@ -458,22 +441,59 @@ int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)
458441 return ret ;
459442
460443 INIT_DELAYED_WORK (& dev -> pb_work , amd_pmf_invoke_cmd );
461- amd_pmf_set_dram_addr (dev , true);
462- amd_pmf_get_bios_buffer (dev );
444+
445+ ret = amd_pmf_set_dram_addr (dev , true);
446+ if (ret )
447+ goto error ;
448+
449+ dev -> policy_base = devm_ioremap (dev -> dev , dev -> policy_addr , dev -> policy_sz );
450+ if (!dev -> policy_base ) {
451+ ret = - ENOMEM ;
452+ goto error ;
453+ }
454+
455+ dev -> policy_buf = kzalloc (dev -> policy_sz , GFP_KERNEL );
456+ if (!dev -> policy_buf ) {
457+ ret = - ENOMEM ;
458+ goto error ;
459+ }
460+
461+ memcpy_fromio (dev -> policy_buf , dev -> policy_base , dev -> policy_sz );
462+
463+ amd_pmf_hex_dump_pb (dev );
464+
463465 dev -> prev_data = kzalloc (sizeof (* dev -> prev_data ), GFP_KERNEL );
464- if (!dev -> prev_data )
465- return - ENOMEM ;
466+ if (!dev -> prev_data ) {
467+ ret = - ENOMEM ;
468+ goto error ;
469+ }
470+
471+ ret = amd_pmf_start_policy_engine (dev );
472+ if (ret )
473+ goto error ;
474+
475+ if (pb_side_load )
476+ amd_pmf_open_pb (dev , dev -> dbgfs_dir );
477+
478+ return 0 ;
466479
467- return dev -> smart_pc_enabled ;
480+ error :
481+ amd_pmf_deinit_smart_pc (dev );
482+
483+ return ret ;
468484}
469485
470486void amd_pmf_deinit_smart_pc (struct amd_pmf_dev * dev )
471487{
472- if (pb_side_load )
488+ if (pb_side_load && dev -> esbin )
473489 amd_pmf_remove_pb (dev );
474490
491+ cancel_delayed_work_sync (& dev -> pb_work );
475492 kfree (dev -> prev_data );
493+ dev -> prev_data = NULL ;
476494 kfree (dev -> policy_buf );
477- cancel_delayed_work_sync (& dev -> pb_work );
495+ dev -> policy_buf = NULL ;
496+ kfree (dev -> buf );
497+ dev -> buf = NULL ;
478498 amd_pmf_tee_deinit (dev );
479499}
0 commit comments