|
@@ -32,162 +32,152 @@
|
|
|
#include "eventmanager.h"
|
|
|
|
|
|
|
|
|
-#define PP_CHECK(handle) \
|
|
|
- do { \
|
|
|
- if ((handle) == NULL || (handle)->pp_valid != PP_VALID) \
|
|
|
- return -EINVAL; \
|
|
|
- } while (0)
|
|
|
-
|
|
|
-#define PP_CHECK_HW(hwmgr) \
|
|
|
- do { \
|
|
|
- if ((hwmgr) == NULL || (hwmgr)->hwmgr_func == NULL) \
|
|
|
- return 0; \
|
|
|
- } while (0)
|
|
|
-
|
|
|
-static int pp_early_init(void *handle)
|
|
|
+static inline int pp_check(struct pp_instance *handle)
|
|
|
{
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int pp_sw_init(void *handle)
|
|
|
-{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
- struct pp_hwmgr *hwmgr;
|
|
|
- int ret = 0;
|
|
|
+ if (handle == NULL || handle->pp_valid != PP_VALID)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
+ if (handle->smu_mgr == NULL || handle->smu_mgr->smumgr_funcs == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
- hwmgr = pp_handle->hwmgr;
|
|
|
+ if (handle->pm_en == 0)
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ if (handle->hwmgr == NULL || handle->hwmgr->hwmgr_func == NULL
|
|
|
+ || handle->eventmgr == NULL)
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
|
|
|
- if (hwmgr->pptable_func == NULL ||
|
|
|
- hwmgr->pptable_func->pptable_init == NULL ||
|
|
|
- hwmgr->hwmgr_func->backend_init == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- ret = hwmgr->pptable_func->pptable_init(hwmgr);
|
|
|
- if (ret)
|
|
|
- goto err;
|
|
|
+static int pp_early_init(void *handle)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
|
|
|
- ret = hwmgr->hwmgr_func->backend_init(hwmgr);
|
|
|
+ ret = smum_early_init(pp_handle);
|
|
|
if (ret)
|
|
|
- goto err1;
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if ((pp_handle->pm_en == 0)
|
|
|
+ || cgs_is_virtualization_enabled(pp_handle->device))
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
|
|
|
- if (hwmgr->hwmgr_func->request_firmware) {
|
|
|
- ret = hwmgr->hwmgr_func->request_firmware(hwmgr);
|
|
|
- if (ret)
|
|
|
- goto err2;
|
|
|
+ ret = hwmgr_early_init(pp_handle);
|
|
|
+ if (ret) {
|
|
|
+ pp_handle->pm_en = 0;
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
}
|
|
|
|
|
|
- pr_info("initialized.\n");
|
|
|
+ ret = eventmgr_early_init(pp_handle);
|
|
|
+ if (ret) {
|
|
|
+ kfree(pp_handle->hwmgr);
|
|
|
+ pp_handle->hwmgr = NULL;
|
|
|
+ pp_handle->pm_en = 0;
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
-err2:
|
|
|
- if (hwmgr->hwmgr_func->backend_fini)
|
|
|
- hwmgr->hwmgr_func->backend_fini(hwmgr);
|
|
|
-err1:
|
|
|
- if (hwmgr->pptable_func->pptable_fini)
|
|
|
- hwmgr->pptable_func->pptable_fini(hwmgr);
|
|
|
-err:
|
|
|
- pr_err("initialization failed\n");
|
|
|
- return ret;
|
|
|
}
|
|
|
|
|
|
-static int pp_sw_fini(void *handle)
|
|
|
+static int pp_sw_init(void *handle)
|
|
|
{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
- struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_smumgr *smumgr;
|
|
|
int ret = 0;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
- hwmgr = pp_handle->hwmgr;
|
|
|
+ if (ret == 0 || ret == PP_DPM_DISABLED) {
|
|
|
+ smumgr = pp_handle->smu_mgr;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ if (smumgr->smumgr_funcs->smu_init == NULL)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- if (hwmgr->hwmgr_func->release_firmware)
|
|
|
- ret = hwmgr->hwmgr_func->release_firmware(hwmgr);
|
|
|
+ ret = smumgr->smumgr_funcs->smu_init(smumgr);
|
|
|
|
|
|
- if (hwmgr->hwmgr_func->backend_fini != NULL)
|
|
|
- ret = hwmgr->hwmgr_func->backend_fini(hwmgr);
|
|
|
+ pr_info("amdgpu: powerplay sw initialized\n");
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
|
|
|
- if (hwmgr->pptable_func->pptable_fini)
|
|
|
- hwmgr->pptable_func->pptable_fini(hwmgr);
|
|
|
+static int pp_sw_fini(void *handle)
|
|
|
+{
|
|
|
+ struct pp_smumgr *smumgr;
|
|
|
+ int ret = 0;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
+ if (ret == 0 || ret == PP_DPM_DISABLED) {
|
|
|
+ smumgr = pp_handle->smu_mgr;
|
|
|
|
|
|
+ if (smumgr->smumgr_funcs->smu_fini == NULL)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ret = smumgr->smumgr_funcs->smu_fini(smumgr);
|
|
|
+ }
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
static int pp_hw_init(void *handle)
|
|
|
{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
struct pp_smumgr *smumgr;
|
|
|
struct pp_eventmgr *eventmgr;
|
|
|
- struct pp_hwmgr *hwmgr;
|
|
|
int ret = 0;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
- smumgr = pp_handle->smu_mgr;
|
|
|
- hwmgr = pp_handle->hwmgr;
|
|
|
-
|
|
|
- if (smumgr == NULL || smumgr->smumgr_funcs == NULL ||
|
|
|
- smumgr->smumgr_funcs->smu_init == NULL ||
|
|
|
- smumgr->smumgr_funcs->start_smu == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ if (ret == 0 || ret == PP_DPM_DISABLED) {
|
|
|
+ smumgr = pp_handle->smu_mgr;
|
|
|
|
|
|
- ret = smumgr->smumgr_funcs->smu_init(smumgr);
|
|
|
- if (ret) {
|
|
|
- pr_err("smc initialization failed\n");
|
|
|
- return ret;
|
|
|
- }
|
|
|
+ if (smumgr->smumgr_funcs->start_smu == NULL)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- ret = smumgr->smumgr_funcs->start_smu(smumgr);
|
|
|
- if (ret) {
|
|
|
- pr_err("smc start failed\n");
|
|
|
- smumgr->smumgr_funcs->smu_fini(smumgr);
|
|
|
- return ret;
|
|
|
+ if(smumgr->smumgr_funcs->start_smu(smumgr)) {
|
|
|
+ pr_err("smc start failed\n");
|
|
|
+ smumgr->smumgr_funcs->smu_fini(smumgr);
|
|
|
+ return -EINVAL;;
|
|
|
+ }
|
|
|
+ if (ret == PP_DPM_DISABLED)
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
}
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
-
|
|
|
- hw_init_power_state_table(hwmgr);
|
|
|
+ ret = hwmgr_hw_init(pp_handle);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
|
|
|
eventmgr = pp_handle->eventmgr;
|
|
|
- if (eventmgr == NULL || eventmgr->pp_eventmgr_init == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ if (eventmgr->pp_eventmgr_init == NULL ||
|
|
|
+ eventmgr->pp_eventmgr_init(eventmgr))
|
|
|
+ goto err;
|
|
|
|
|
|
- ret = eventmgr->pp_eventmgr_init(eventmgr);
|
|
|
return 0;
|
|
|
+err:
|
|
|
+ pp_handle->pm_en = 0;
|
|
|
+ kfree(pp_handle->eventmgr);
|
|
|
+ kfree(pp_handle->hwmgr);
|
|
|
+ pp_handle->hwmgr = NULL;
|
|
|
+ pp_handle->eventmgr = NULL;
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
}
|
|
|
|
|
|
static int pp_hw_fini(void *handle)
|
|
|
{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
- struct pp_smumgr *smumgr;
|
|
|
struct pp_eventmgr *eventmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
- eventmgr = pp_handle->eventmgr;
|
|
|
-
|
|
|
- if (eventmgr != NULL && eventmgr->pp_eventmgr_fini != NULL)
|
|
|
- eventmgr->pp_eventmgr_fini(eventmgr);
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- smumgr = pp_handle->smu_mgr;
|
|
|
+ if (ret == 0) {
|
|
|
+ eventmgr = pp_handle->eventmgr;
|
|
|
|
|
|
- if (smumgr != NULL && smumgr->smumgr_funcs != NULL &&
|
|
|
- smumgr->smumgr_funcs->smu_fini != NULL)
|
|
|
- smumgr->smumgr_funcs->smu_fini(smumgr);
|
|
|
+ if (eventmgr->pp_eventmgr_fini != NULL)
|
|
|
+ eventmgr->pp_eventmgr_fini(eventmgr);
|
|
|
|
|
|
+ hwmgr_hw_fini(pp_handle);
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -210,13 +200,15 @@ static int pp_sw_reset(void *handle)
|
|
|
int amd_set_clockgating_by_smu(void *handle, uint32_t msg_id)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->update_clock_gatings == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -230,13 +222,15 @@ static int pp_set_powergating_state(void *handle,
|
|
|
enum amd_powergating_state state)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->enable_per_cu_power_gating == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -250,37 +244,38 @@ static int pp_set_powergating_state(void *handle,
|
|
|
|
|
|
static int pp_suspend(void *handle)
|
|
|
{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
struct pp_eventmgr *eventmgr;
|
|
|
struct pem_event_data event_data = { {0} };
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
+
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
eventmgr = pp_handle->eventmgr;
|
|
|
+ pem_handle_event(eventmgr, AMD_PP_EVENT_SUSPEND, &event_data);
|
|
|
|
|
|
- if (eventmgr != NULL)
|
|
|
- pem_handle_event(eventmgr, AMD_PP_EVENT_SUSPEND, &event_data);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int pp_resume(void *handle)
|
|
|
{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
struct pp_eventmgr *eventmgr;
|
|
|
struct pem_event_data event_data = { {0} };
|
|
|
struct pp_smumgr *smumgr;
|
|
|
- int ret;
|
|
|
+ int ret, ret1;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret1 = pp_check(pp_handle);
|
|
|
+
|
|
|
+ if (ret1 != 0 && ret1 != PP_DPM_DISABLED)
|
|
|
+ return ret1;
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
smumgr = pp_handle->smu_mgr;
|
|
|
|
|
|
- if (smumgr == NULL || smumgr->smumgr_funcs == NULL ||
|
|
|
- smumgr->smumgr_funcs->start_smu == NULL)
|
|
|
+ if (smumgr->smumgr_funcs->start_smu == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
ret = smumgr->smumgr_funcs->start_smu(smumgr);
|
|
@@ -290,9 +285,12 @@ static int pp_resume(void *handle)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ if (ret1 == PP_DPM_DISABLED)
|
|
|
+ return ret1;
|
|
|
+
|
|
|
eventmgr = pp_handle->eventmgr;
|
|
|
- if (eventmgr != NULL)
|
|
|
- pem_handle_event(eventmgr, AMD_PP_EVENT_RESUME, &event_data);
|
|
|
+
|
|
|
+ pem_handle_event(eventmgr, AMD_PP_EVENT_RESUME, &event_data);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -327,18 +325,17 @@ static int pp_dpm_fw_loading_complete(void *handle)
|
|
|
static int pp_dpm_force_performance_level(void *handle,
|
|
|
enum amd_dpm_forced_level level)
|
|
|
{
|
|
|
- struct pp_instance *pp_handle;
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
-
|
|
|
if (hwmgr->hwmgr_func->force_dpm_level == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
|
return 0;
|
|
@@ -353,27 +350,31 @@ static enum amd_dpm_forced_level pp_dpm_get_performance_level(
|
|
|
void *handle)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
- return (((struct pp_instance *)handle)->hwmgr->dpm_level);
|
|
|
+ return hwmgr->dpm_level;
|
|
|
}
|
|
|
|
|
|
static int pp_dpm_get_sclk(void *handle, bool low)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_sclk == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -386,13 +387,15 @@ static int pp_dpm_get_sclk(void *handle, bool low)
|
|
|
static int pp_dpm_get_mclk(void *handle, bool low)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_mclk == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -405,13 +408,15 @@ static int pp_dpm_get_mclk(void *handle, bool low)
|
|
|
static int pp_dpm_powergate_vce(void *handle, bool gate)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->powergate_vce == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -424,13 +429,15 @@ static int pp_dpm_powergate_vce(void *handle, bool gate)
|
|
|
static int pp_dpm_powergate_uvd(void *handle, bool gate)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->powergate_uvd == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -458,16 +465,13 @@ static int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id,
|
|
|
void *input, void *output)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
- struct pp_instance *pp_handle;
|
|
|
struct pem_event_data data = { {0} };
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
|
|
|
- pp_handle = (struct pp_instance *)handle;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- if (pp_handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- if (pp_handle->eventmgr == NULL)
|
|
|
- return 0;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
switch (event_id) {
|
|
|
case AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE:
|
|
@@ -501,13 +505,17 @@ static enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
struct pp_power_state *state;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- if (hwmgr == NULL || hwmgr->current_ps == NULL)
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
+
|
|
|
+ if (hwmgr->current_ps == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
state = hwmgr->current_ps;
|
|
@@ -530,13 +538,15 @@ static enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle)
|
|
|
static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -549,13 +559,15 @@ static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
|
|
|
static int pp_dpm_get_fan_control_mode(void *handle)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -568,13 +580,15 @@ static int pp_dpm_get_fan_control_mode(void *handle)
|
|
|
static int pp_dpm_set_fan_speed_percent(void *handle, uint32_t percent)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->set_fan_speed_percent == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -587,13 +601,15 @@ static int pp_dpm_set_fan_speed_percent(void *handle, uint32_t percent)
|
|
|
static int pp_dpm_get_fan_speed_percent(void *handle, uint32_t *speed)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_fan_speed_percent == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -606,13 +622,15 @@ static int pp_dpm_get_fan_speed_percent(void *handle, uint32_t *speed)
|
|
|
static int pp_dpm_get_fan_speed_rpm(void *handle, uint32_t *rpm)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_fan_speed_rpm == NULL)
|
|
|
return -EINVAL;
|
|
@@ -623,13 +641,15 @@ static int pp_dpm_get_fan_speed_rpm(void *handle, uint32_t *rpm)
|
|
|
static int pp_dpm_get_temperature(void *handle)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_temperature == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -644,13 +664,17 @@ static int pp_dpm_get_pp_num_states(void *handle,
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
int i;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
- if (hwmgr == NULL || hwmgr->ps == NULL)
|
|
|
+ if (hwmgr->ps == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
data->nums = hwmgr->num_ps;
|
|
@@ -682,13 +706,15 @@ static int pp_dpm_get_pp_num_states(void *handle,
|
|
|
static int pp_dpm_get_pp_table(void *handle, char **table)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (!hwmgr->soft_pp_table)
|
|
|
return -EINVAL;
|
|
@@ -701,13 +727,15 @@ static int pp_dpm_get_pp_table(void *handle, char **table)
|
|
|
static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (!hwmgr->hardcode_pp_table) {
|
|
|
hwmgr->hardcode_pp_table = kmemdup(hwmgr->soft_pp_table,
|
|
@@ -729,13 +757,15 @@ static int pp_dpm_force_clock_level(void *handle,
|
|
|
enum pp_clock_type type, uint32_t mask)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->force_clock_level == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -749,13 +779,15 @@ static int pp_dpm_print_clock_levels(void *handle,
|
|
|
enum pp_clock_type type, char *buf)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->print_clock_levels == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -767,13 +799,15 @@ static int pp_dpm_print_clock_levels(void *handle,
|
|
|
static int pp_dpm_get_sclk_od(void *handle)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_sclk_od == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -786,13 +820,15 @@ static int pp_dpm_get_sclk_od(void *handle)
|
|
|
static int pp_dpm_set_sclk_od(void *handle, uint32_t value)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->set_sclk_od == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -805,13 +841,15 @@ static int pp_dpm_set_sclk_od(void *handle, uint32_t value)
|
|
|
static int pp_dpm_get_mclk_od(void *handle)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->get_mclk_od == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -824,13 +862,15 @@ static int pp_dpm_get_mclk_od(void *handle)
|
|
|
static int pp_dpm_set_mclk_od(void *handle, uint32_t value)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->set_mclk_od == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -843,13 +883,15 @@ static int pp_dpm_set_mclk_od(void *handle, uint32_t value)
|
|
|
static int pp_dpm_read_sensor(void *handle, int idx, int32_t *value)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (!handle)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (hwmgr->hwmgr_func->read_sensor == NULL) {
|
|
|
pr_info("%s was not implemented.\n", __func__);
|
|
@@ -863,13 +905,18 @@ static struct amd_vce_state*
|
|
|
pp_dpm_get_vce_clock_state(void *handle, unsigned idx)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- if (handle) {
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- if (hwmgr && idx < hwmgr->num_vce_state_tables)
|
|
|
- return &hwmgr->vce_states[idx];
|
|
|
- }
|
|
|
+ if (ret != 0)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
+
|
|
|
+ if (hwmgr && idx < hwmgr->num_vce_state_tables)
|
|
|
+ return &hwmgr->vce_states[idx];
|
|
|
|
|
|
return NULL;
|
|
|
}
|
|
@@ -904,89 +951,44 @@ const struct amd_powerplay_funcs pp_dpm_funcs = {
|
|
|
.get_vce_clock_state = pp_dpm_get_vce_clock_state,
|
|
|
};
|
|
|
|
|
|
-static int amd_pp_instance_init(struct amd_pp_init *pp_init,
|
|
|
- struct amd_powerplay *amd_pp)
|
|
|
+int amd_powerplay_create(struct amd_pp_init *pp_init,
|
|
|
+ void **handle)
|
|
|
{
|
|
|
- int ret;
|
|
|
- struct pp_instance *handle;
|
|
|
-
|
|
|
- handle = kzalloc(sizeof(struct pp_instance), GFP_KERNEL);
|
|
|
- if (handle == NULL)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- handle->pp_valid = PP_VALID;
|
|
|
-
|
|
|
- ret = smum_init(pp_init, handle);
|
|
|
- if (ret)
|
|
|
- goto fail_smum;
|
|
|
-
|
|
|
-
|
|
|
- amd_pp->pp_handle = handle;
|
|
|
+ struct pp_instance *instance;
|
|
|
|
|
|
- if ((amdgpu_dpm == 0)
|
|
|
- || cgs_is_virtualization_enabled(pp_init->device))
|
|
|
- return 0;
|
|
|
+ if (pp_init == NULL || handle == NULL)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- ret = hwmgr_init(pp_init, handle);
|
|
|
- if (ret)
|
|
|
- goto fail_hwmgr;
|
|
|
+ instance = kzalloc(sizeof(struct pp_instance), GFP_KERNEL);
|
|
|
+ if (instance == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- ret = eventmgr_init(handle);
|
|
|
- if (ret)
|
|
|
- goto fail_eventmgr;
|
|
|
+ instance->pp_valid = PP_VALID;
|
|
|
+ instance->chip_family = pp_init->chip_family;
|
|
|
+ instance->chip_id = pp_init->chip_id;
|
|
|
+ instance->pm_en = pp_init->pm_en;
|
|
|
+ instance->feature_mask = pp_init->feature_mask;
|
|
|
+ instance->device = pp_init->device;
|
|
|
+ *handle = instance;
|
|
|
|
|
|
return 0;
|
|
|
-
|
|
|
-fail_eventmgr:
|
|
|
- hwmgr_fini(handle->hwmgr);
|
|
|
-fail_hwmgr:
|
|
|
- smum_fini(handle->smu_mgr);
|
|
|
-fail_smum:
|
|
|
- kfree(handle);
|
|
|
- return ret;
|
|
|
}
|
|
|
|
|
|
-static int amd_pp_instance_fini(void *handle)
|
|
|
+int amd_powerplay_destroy(void *handle)
|
|
|
{
|
|
|
struct pp_instance *instance = (struct pp_instance *)handle;
|
|
|
|
|
|
- if (instance == NULL)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- if ((amdgpu_dpm != 0)
|
|
|
- && !cgs_is_virtualization_enabled(instance->smu_mgr->device)) {
|
|
|
- eventmgr_fini(instance->eventmgr);
|
|
|
- hwmgr_fini(instance->hwmgr);
|
|
|
+ if (instance->pm_en) {
|
|
|
+ kfree(instance->eventmgr);
|
|
|
+ kfree(instance->hwmgr);
|
|
|
+ instance->hwmgr = NULL;
|
|
|
+ instance->eventmgr = NULL;
|
|
|
}
|
|
|
|
|
|
- smum_fini(instance->smu_mgr);
|
|
|
- kfree(handle);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-int amd_powerplay_init(struct amd_pp_init *pp_init,
|
|
|
- struct amd_powerplay *amd_pp)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (pp_init == NULL || amd_pp == NULL)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- ret = amd_pp_instance_init(pp_init, amd_pp);
|
|
|
-
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
-
|
|
|
- amd_pp->ip_funcs = &pp_ip_funcs;
|
|
|
- amd_pp->pp_funcs = &pp_dpm_funcs;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-int amd_powerplay_fini(void *handle)
|
|
|
-{
|
|
|
- amd_pp_instance_fini(handle);
|
|
|
-
|
|
|
+ kfree(instance->smu_mgr);
|
|
|
+ instance->smu_mgr = NULL;
|
|
|
+ kfree(instance);
|
|
|
+ instance = NULL;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -997,33 +999,25 @@ int amd_powerplay_reset(void *handle)
|
|
|
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);
|
|
|
+ if (cgs_is_virtualization_enabled(instance->smu_mgr->device))
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
|
|
|
- ret = pp_sw_fini(handle);
|
|
|
- if (ret)
|
|
|
+ ret = pp_check(instance);
|
|
|
+ if (ret != 0)
|
|
|
return ret;
|
|
|
|
|
|
- kfree(instance->hwmgr->ps);
|
|
|
-
|
|
|
- ret = pp_sw_init(handle);
|
|
|
+ ret = pp_hw_fini(handle);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- if ((amdgpu_dpm == 0)
|
|
|
- || cgs_is_virtualization_enabled(instance->smu_mgr->device))
|
|
|
- return 0;
|
|
|
+ ret = hwmgr_hw_init(instance);
|
|
|
+ if (ret)
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
|
|
|
- hw_init_power_state_table(instance->hwmgr);
|
|
|
+ eventmgr = instance->eventmgr;
|
|
|
|
|
|
- if (eventmgr == NULL || eventmgr->pp_eventmgr_init == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ if (eventmgr->pp_eventmgr_init == NULL)
|
|
|
+ return PP_DPM_DISABLED;
|
|
|
|
|
|
ret = eventmgr->pp_eventmgr_init(eventmgr);
|
|
|
if (ret)
|
|
@@ -1038,12 +1032,15 @@ int amd_powerplay_display_configuration_change(void *handle,
|
|
|
const struct amd_pp_display_configuration *display_config)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- PP_CHECK((struct pp_instance *)handle);
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
phm_store_dal_configuration_data(hwmgr, display_config);
|
|
|
|
|
@@ -1054,15 +1051,18 @@ int amd_powerplay_get_display_power_level(void *handle,
|
|
|
struct amd_pp_simple_clock_info *output)
|
|
|
{
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- PP_CHECK((struct pp_instance *)handle);
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- if (output == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ if (output == NULL)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
return phm_get_dal_power_level(hwmgr, output);
|
|
|
}
|
|
@@ -1070,18 +1070,18 @@ int amd_powerplay_get_display_power_level(void *handle,
|
|
|
int amd_powerplay_get_current_clocks(void *handle,
|
|
|
struct amd_pp_clock_info *clocks)
|
|
|
{
|
|
|
- struct pp_hwmgr *hwmgr;
|
|
|
struct amd_pp_simple_clock_info simple_clocks;
|
|
|
struct pp_clock_info hw_clocks;
|
|
|
+ struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- PP_CHECK((struct pp_instance *)handle);
|
|
|
-
|
|
|
- if (clocks == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
phm_get_dal_power_level(hwmgr, &simple_clocks);
|
|
|
|
|
@@ -1117,18 +1117,20 @@ int amd_powerplay_get_current_clocks(void *handle,
|
|
|
int amd_powerplay_get_clock_by_type(void *handle, enum amd_pp_clock_type type, struct amd_pp_clocks *clocks)
|
|
|
{
|
|
|
int result = -1;
|
|
|
+ struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- struct pp_hwmgr *hwmgr;
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- PP_CHECK((struct pp_instance *)handle);
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
if (clocks == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
-
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
-
|
|
|
result = phm_get_clock_by_type(hwmgr, type, clocks);
|
|
|
|
|
|
return result;
|
|
@@ -1137,21 +1139,24 @@ int amd_powerplay_get_clock_by_type(void *handle, enum amd_pp_clock_type type, s
|
|
|
int amd_powerplay_get_display_mode_validation_clocks(void *handle,
|
|
|
struct amd_pp_simple_clock_info *clocks)
|
|
|
{
|
|
|
- int result = -1;
|
|
|
struct pp_hwmgr *hwmgr;
|
|
|
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- PP_CHECK((struct pp_instance *)handle);
|
|
|
+ ret = pp_check(pp_handle);
|
|
|
|
|
|
- if (clocks == NULL)
|
|
|
- return -EINVAL;
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ hwmgr = pp_handle->hwmgr;
|
|
|
|
|
|
- hwmgr = ((struct pp_instance *)handle)->hwmgr;
|
|
|
|
|
|
- PP_CHECK_HW(hwmgr);
|
|
|
+ if (clocks == NULL)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_DynamicPatchPowerState))
|
|
|
- result = phm_get_max_high_clocks(hwmgr, clocks);
|
|
|
+ ret = phm_get_max_high_clocks(hwmgr, clocks);
|
|
|
|
|
|
- return result;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|