--- a/sys/dev/drm/amd/powerplay/hwmgr/pp_psm.c +++ b/sys/dev/drm/amd/powerplay/hwmgr/pp_psm.c @@ -72,6 +72,7 @@ int psm_init_power_state_table(struct pp_hwmgr *hwmgr) state = hwmgr->ps; for (i = 0; i < table_entries; i++) { result = hwmgr->hwmgr_func->get_pp_table_entry(hwmgr, i, state); + if (result) + goto err_out; if (state->classification.flags & PP_StateClassificationFlag_Boot) { hwmgr->boot_ps = state; @@ -86,6 +87,15 @@ int psm_init_power_state_table(struct pp_hwmgr *hwmgr) state = (struct pp_power_state *)((unsigned long)state + size); } + return 0; + +err_out: + kfree(hwmgr->current_ps); + kfree(hwmgr->request_ps); + kfree(hwmgr->ps); + hwmgr->current_ps = NULL; + hwmgr->request_ps = NULL; + hwmgr->ps = NULL; + hwmgr->num_ps = 0; + return result; }