|
@@ -50,10 +50,50 @@ static inline int pp_check(struct pp_instance *handle)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int amd_powerplay_create(struct amd_pp_init *pp_init,
|
|
|
|
+ void **handle)
|
|
|
|
+{
|
|
|
|
+ struct pp_instance *instance;
|
|
|
|
+
|
|
|
|
+ if (pp_init == NULL || handle == NULL)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ instance = kzalloc(sizeof(struct pp_instance), GFP_KERNEL);
|
|
|
|
+ if (instance == NULL)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ 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;
|
|
|
|
+ mutex_init(&instance->pp_lock);
|
|
|
|
+ *handle = instance;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int amd_powerplay_destroy(void *handle)
|
|
|
|
+{
|
|
|
|
+ struct pp_instance *instance = (struct pp_instance *)handle;
|
|
|
|
+
|
|
|
|
+ kfree(instance->hwmgr);
|
|
|
|
+ instance->hwmgr = NULL;
|
|
|
|
+
|
|
|
|
+ kfree(instance);
|
|
|
|
+ instance = NULL;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int pp_early_init(void *handle)
|
|
static int pp_early_init(void *handle)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
- struct pp_instance *pp_handle = (struct pp_instance *)handle;
|
|
|
|
|
|
+ struct pp_instance *pp_handle = NULL;
|
|
|
|
+
|
|
|
|
+ pp_handle = cgs_register_pp_handle(handle, amd_powerplay_create);
|
|
|
|
+
|
|
|
|
+ if (!pp_handle)
|
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
ret = hwmgr_early_init(pp_handle);
|
|
ret = hwmgr_early_init(pp_handle);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -162,6 +202,12 @@ static int pp_late_init(void *handle)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void pp_late_fini(void *handle)
|
|
|
|
+{
|
|
|
|
+ amd_powerplay_destroy(handle);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
static bool pp_is_idle(void *handle)
|
|
static bool pp_is_idle(void *handle)
|
|
{
|
|
{
|
|
return false;
|
|
return false;
|
|
@@ -275,6 +321,7 @@ const struct amd_ip_funcs pp_ip_funcs = {
|
|
.sw_fini = pp_sw_fini,
|
|
.sw_fini = pp_sw_fini,
|
|
.hw_init = pp_hw_init,
|
|
.hw_init = pp_hw_init,
|
|
.hw_fini = pp_hw_fini,
|
|
.hw_fini = pp_hw_fini,
|
|
|
|
+ .late_fini = pp_late_fini,
|
|
.suspend = pp_suspend,
|
|
.suspend = pp_suspend,
|
|
.resume = pp_resume,
|
|
.resume = pp_resume,
|
|
.is_idle = pp_is_idle,
|
|
.is_idle = pp_is_idle,
|
|
@@ -1138,41 +1185,6 @@ const struct amd_pm_funcs pp_dpm_funcs = {
|
|
.switch_power_profile = pp_dpm_switch_power_profile,
|
|
.switch_power_profile = pp_dpm_switch_power_profile,
|
|
};
|
|
};
|
|
|
|
|
|
-int amd_powerplay_create(struct amd_pp_init *pp_init,
|
|
|
|
- void **handle)
|
|
|
|
-{
|
|
|
|
- struct pp_instance *instance;
|
|
|
|
-
|
|
|
|
- if (pp_init == NULL || handle == NULL)
|
|
|
|
- return -EINVAL;
|
|
|
|
-
|
|
|
|
- instance = kzalloc(sizeof(struct pp_instance), GFP_KERNEL);
|
|
|
|
- if (instance == NULL)
|
|
|
|
- return -ENOMEM;
|
|
|
|
-
|
|
|
|
- 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;
|
|
|
|
- mutex_init(&instance->pp_lock);
|
|
|
|
- *handle = instance;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int amd_powerplay_destroy(void *handle)
|
|
|
|
-{
|
|
|
|
- struct pp_instance *instance = (struct pp_instance *)handle;
|
|
|
|
-
|
|
|
|
- kfree(instance->hwmgr);
|
|
|
|
- instance->hwmgr = NULL;
|
|
|
|
-
|
|
|
|
- kfree(instance);
|
|
|
|
- instance = NULL;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
int amd_powerplay_reset(void *handle)
|
|
int amd_powerplay_reset(void *handle)
|
|
{
|
|
{
|
|
struct pp_instance *instance = (struct pp_instance *)handle;
|
|
struct pp_instance *instance = (struct pp_instance *)handle;
|