|
@@ -744,12 +744,12 @@ static int pp_dpm_get_pp_table(void *handle, char **table)
|
|
|
|
|
|
PP_CHECK_HW(hwmgr);
|
|
|
|
|
|
- if (hwmgr->hwmgr_func->get_pp_table == NULL) {
|
|
|
- printk(KERN_INFO "%s was not implemented.\n", __func__);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ if (!hwmgr->soft_pp_table)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ *table = (char *)hwmgr->soft_pp_table;
|
|
|
|
|
|
- return hwmgr->hwmgr_func->get_pp_table(hwmgr, table);
|
|
|
+ return hwmgr->soft_pp_table_size;
|
|
|
}
|
|
|
|
|
|
static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
|
|
@@ -763,12 +763,23 @@ static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
|
|
|
|
|
|
PP_CHECK_HW(hwmgr);
|
|
|
|
|
|
- if (hwmgr->hwmgr_func->set_pp_table == NULL) {
|
|
|
- printk(KERN_INFO "%s was not implemented.\n", __func__);
|
|
|
- return 0;
|
|
|
+ if (!hwmgr->hardcode_pp_table) {
|
|
|
+ hwmgr->hardcode_pp_table =
|
|
|
+ kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
|
|
|
+
|
|
|
+ if (!hwmgr->hardcode_pp_table)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ /* to avoid powerplay crash when hardcode pptable is empty */
|
|
|
+ memcpy(hwmgr->hardcode_pp_table, hwmgr->soft_pp_table,
|
|
|
+ hwmgr->soft_pp_table_size);
|
|
|
}
|
|
|
|
|
|
- return hwmgr->hwmgr_func->set_pp_table(hwmgr, buf, size);
|
|
|
+ memcpy(hwmgr->hardcode_pp_table, buf, size);
|
|
|
+
|
|
|
+ hwmgr->soft_pp_table = hwmgr->hardcode_pp_table;
|
|
|
+
|
|
|
+ return amd_powerplay_reset(handle);
|
|
|
}
|
|
|
|
|
|
static int pp_dpm_force_clock_level(void *handle,
|
|
@@ -993,6 +1004,44 @@ int amd_powerplay_fini(void *handle)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int amd_powerplay_reset(void *handle)
|
|
|
+{
|
|
|
+ struct pp_instance *instance = (struct pp_instance *)handle;
|
|
|
+ struct pp_eventmgr *eventmgr;
|
|
|
+ struct pem_event_data event_data = { {0} };
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (instance == NULL)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ eventmgr = instance->eventmgr;
|
|
|
+ if (!eventmgr || !eventmgr->pp_eventmgr_fini)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ eventmgr->pp_eventmgr_fini(eventmgr);
|
|
|
+
|
|
|
+ ret = pp_sw_fini(handle);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ kfree(instance->hwmgr->ps);
|
|
|
+
|
|
|
+ ret = pp_sw_init(handle);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ hw_init_power_state_table(instance->hwmgr);
|
|
|
+
|
|
|
+ if (eventmgr == NULL || eventmgr->pp_eventmgr_init == NULL)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ret = eventmgr->pp_eventmgr_init(eventmgr);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ return pem_handle_event(eventmgr, AMD_PP_EVENT_COMPLETE_INIT, &event_data);
|
|
|
+}
|
|
|
+
|
|
|
/* export this function to DAL */
|
|
|
|
|
|
int amd_powerplay_display_configuration_change(void *handle,
|