[PATCH 3/3] drm/amdgpu: unify amd_pm_funcitons in dpm and powerplay

Deucher, Alexander Alexander.Deucher at amd.com
Wed Sep 6 16:56:53 UTC 2017


> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Rex Zhu
> Sent: Wednesday, September 06, 2017 7:37 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Zhu, Rex
> Subject: [PATCH 3/3] drm/amdgpu: unify amd_pm_funcitons in dpm and
> powerplay
> 
> delete amd_pm_funcs in amdgpu_pm,
> put pm function table in struct powerplay for all
> asics.
> 
> Change-Id: I6248c4bd4cf23ae406a540bb5225c991fb9aca6e
> Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>

Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

Is it worth merging the ci_dpm code into the powerplay smu7 code at some point?  Not sure if it's worth the effort or not.

Alex

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |   5 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h       | 120 ++++++-------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c        | 234 +++++++++++-------
> --------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c |   3 +
>  drivers/gpu/drm/amd/amdgpu/ci_dpm.c           |  10 +-
>  drivers/gpu/drm/amd/amdgpu/cik_dpm.h          |   3 +-
>  drivers/gpu/drm/amd/amdgpu/kv_dpm.c           |  10 +-
>  drivers/gpu/drm/amd/amdgpu/si_dpm.c           |  10 +-
>  drivers/gpu/drm/amd/amdgpu/si_dpm.h           |   1 +
>  9 files changed, 159 insertions(+), 237 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 3467179..773a0bc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -3574,10 +3574,7 @@ static ssize_t
> amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
> 
>  	valuesize = sizeof(values);
>  	if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs-
> >read_sensor)
> -		r = adev->powerplay.pp_funcs->read_sensor(adev-
> >powerplay.pp_handle, idx, &values[0], &valuesize);
> -	else if (adev->pm.funcs && adev->pm.funcs->read_sensor)
> -		r = adev->pm.funcs->read_sensor(adev, idx, &values[0],
> -						&valuesize);
> +		r = amdgpu_dpm_read_sensor(adev, idx, &values[0],
> &valuesize);
>  	else
>  		return -EINVAL;
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
> index 5b2b724..0d22259 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
> @@ -241,134 +241,119 @@ enum amdgpu_pcie_gen {
>  	AMDGPU_PCIE_GEN_INVALID = 0xffff
>  };
> 
> -#define amdgpu_dpm_pre_set_power_state(adev) (adev)->pm.funcs-
> >pre_set_power_state((adev))
> -#define amdgpu_dpm_set_power_state(adev) (adev)->pm.funcs-
> >set_power_state((adev))
> -#define amdgpu_dpm_post_set_power_state(adev) (adev)->pm.funcs-
> >post_set_power_state((adev))
> -#define amdgpu_dpm_display_configuration_changed(adev) (adev)-
> >pm.funcs->display_configuration_changed((adev))
> -#define amdgpu_dpm_print_power_state(adev, ps) (adev)->pm.funcs-
> >print_power_state((adev), (ps))
> -#define amdgpu_dpm_vblank_too_short(adev) (adev)->pm.funcs-
> >vblank_too_short((adev))
> -#define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs-
> >enable_bapm((adev), (e))
> +#define amdgpu_dpm_pre_set_power_state(adev) \
> +		((adev)->powerplay.pp_funcs-
> >pre_set_power_state((adev)->powerplay.pp_handle))
> +
> +#define amdgpu_dpm_set_power_state(adev) \
> +		((adev)->powerplay.pp_funcs->set_power_state((adev)-
> >powerplay.pp_handle))
> +
> +#define amdgpu_dpm_post_set_power_state(adev) \
> +		((adev)->powerplay.pp_funcs-
> >post_set_power_state((adev)->powerplay.pp_handle))
> +
> +#define amdgpu_dpm_display_configuration_changed(adev) \
> +		((adev)->powerplay.pp_funcs-
> >display_configuration_changed((adev)->powerplay.pp_handle))
> +
> +#define amdgpu_dpm_print_power_state(adev, ps) \
> +		((adev)->powerplay.pp_funcs->print_power_state((adev)-
> >powerplay.pp_handle, (ps)))
> +
> +#define amdgpu_dpm_vblank_too_short(adev) \
> +		((adev)->powerplay.pp_funcs->vblank_too_short((adev)-
> >powerplay.pp_handle))
> +
> +#define amdgpu_dpm_enable_bapm(adev, e) \
> +		((adev)->powerplay.pp_funcs->enable_bapm((adev)-
> >powerplay.pp_handle, (e)))
> 
>  #define amdgpu_dpm_read_sensor(adev, idx, value, size) \
> -	((adev)->pp_enabled ? \
> -		(adev)->powerplay.pp_funcs->read_sensor(adev-
> >powerplay.pp_handle, (idx), (value), (size)) : \
> -		(adev)->pm.funcs->read_sensor((adev), (idx), (value),
> (size)))
> +		((adev)->powerplay.pp_funcs->read_sensor((adev)-
> >powerplay.pp_handle, (idx), (value), (size)))
> 
>  #define amdgpu_dpm_get_temperature(adev) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->get_temperature((adev)-
> >powerplay.pp_handle) : \
> -	      (adev)->pm.funcs->get_temperature((adev)))
> +		((adev)->powerplay.pp_funcs->get_temperature((adev)-
> >powerplay.pp_handle))
> 
>  #define amdgpu_dpm_set_fan_control_mode(adev, m) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)-
> >powerplay.pp_handle, (m)) : \
> -	      (adev)->pm.funcs->set_fan_control_mode((adev), (m)))
> +		((adev)->powerplay.pp_funcs-
> >set_fan_control_mode((adev)->powerplay.pp_handle, (m)))
> 
>  #define amdgpu_dpm_get_fan_control_mode(adev) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)-
> >powerplay.pp_handle) : \
> -	      (adev)->pm.funcs->get_fan_control_mode((adev)))
> +		((adev)->powerplay.pp_funcs-
> >get_fan_control_mode((adev)->powerplay.pp_handle))
> 
>  #define amdgpu_dpm_set_fan_speed_percent(adev, s) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)-
> >powerplay.pp_handle, (s)) : \
> -	      (adev)->pm.funcs->set_fan_speed_percent((adev), (s)))
> +		((adev)->powerplay.pp_funcs-
> >set_fan_speed_percent((adev)->powerplay.pp_handle, (s)))
> 
>  #define amdgpu_dpm_get_fan_speed_percent(adev, s) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)-
> >powerplay.pp_handle, (s)) : \
> -	      (adev)->pm.funcs->get_fan_speed_percent((adev), (s)))
> +		((adev)->powerplay.pp_funcs-
> >get_fan_speed_percent((adev)->powerplay.pp_handle, (s)))
> 
>  #define amdgpu_dpm_get_fan_speed_rpm(adev, s) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->get_fan_speed_rpm((adev)-
> >powerplay.pp_handle, (s)) : \
> -	      -EINVAL)
> +		((adev)->powerplay.pp_funcs-
> >get_fan_speed_rpm)((adev)->powerplay.pp_handle, (s))
> 
>  #define amdgpu_dpm_get_sclk(adev, l) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->get_sclk((adev)-
> >powerplay.pp_handle, (l)) : \
> -		(adev)->pm.funcs->get_sclk((adev), (l)))
> +		((adev)->powerplay.pp_funcs->get_sclk((adev)-
> >powerplay.pp_handle, (l)))
> 
>  #define amdgpu_dpm_get_mclk(adev, l)  \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->get_mclk((adev)-
> >powerplay.pp_handle, (l)) : \
> -	      (adev)->pm.funcs->get_mclk((adev), (l)))
> -
> +		((adev)->powerplay.pp_funcs->get_mclk((adev)-
> >powerplay.pp_handle, (l)))
> 
>  #define amdgpu_dpm_force_performance_level(adev, l) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->force_performance_level((adev)-
> >powerplay.pp_handle, (l)) : \
> -	      (adev)->pm.funcs->force_performance_level((adev), (l)))
> +		((adev)->powerplay.pp_funcs-
> >force_performance_level((adev)->powerplay.pp_handle, (l)))
> 
>  #define amdgpu_dpm_powergate_uvd(adev, g) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->powergate_uvd((adev)-
> >powerplay.pp_handle, (g)) : \
> -	      (adev)->pm.funcs->powergate_uvd((adev), (g)))
> +		((adev)->powerplay.pp_funcs->powergate_uvd((adev)-
> >powerplay.pp_handle, (g)))
> 
>  #define amdgpu_dpm_powergate_vce(adev, g) \
> -	((adev)->pp_enabled ?						\
> -	      (adev)->powerplay.pp_funcs->powergate_vce((adev)-
> >powerplay.pp_handle, (g)) : \
> -	      (adev)->pm.funcs->powergate_vce((adev), (g)))
> +		((adev)->powerplay.pp_funcs->powergate_vce((adev)-
> >powerplay.pp_handle, (g)))
> 
>  #define amdgpu_dpm_get_current_power_state(adev) \
> -	(adev)->powerplay.pp_funcs->get_current_power_state((adev)-
> >powerplay.pp_handle)
> +		((adev)->powerplay.pp_funcs-
> >get_current_power_state((adev)->powerplay.pp_handle))
> 
>  #define amdgpu_dpm_get_pp_num_states(adev, data) \
> -	(adev)->powerplay.pp_funcs->get_pp_num_states((adev)-
> >powerplay.pp_handle, data)
> +		((adev)->powerplay.pp_funcs->get_pp_num_states((adev)-
> >powerplay.pp_handle, data))
> 
>  #define amdgpu_dpm_get_pp_table(adev, table) \
> -	(adev)->powerplay.pp_funcs->get_pp_table((adev)-
> >powerplay.pp_handle, table)
> +		((adev)->powerplay.pp_funcs->get_pp_table((adev)-
> >powerplay.pp_handle, table))
> 
>  #define amdgpu_dpm_set_pp_table(adev, buf, size) \
> -	(adev)->powerplay.pp_funcs->set_pp_table((adev)-
> >powerplay.pp_handle, buf, size)
> +		((adev)->powerplay.pp_funcs->set_pp_table((adev)-
> >powerplay.pp_handle, buf, size))
> 
>  #define amdgpu_dpm_print_clock_levels(adev, type, buf) \
> -	(adev)->powerplay.pp_funcs->print_clock_levels((adev)-
> >powerplay.pp_handle, type, buf)
> +		((adev)->powerplay.pp_funcs->print_clock_levels((adev)-
> >powerplay.pp_handle, type, buf))
> 
>  #define amdgpu_dpm_force_clock_level(adev, type, level) \
> -		(adev)->powerplay.pp_funcs->force_clock_level((adev)-
> >powerplay.pp_handle, type, level)
> +		((adev)->powerplay.pp_funcs->force_clock_level((adev)-
> >powerplay.pp_handle, type, level))
> 
>  #define amdgpu_dpm_get_sclk_od(adev) \
> -	(adev)->powerplay.pp_funcs->get_sclk_od((adev)-
> >powerplay.pp_handle)
> +		((adev)->powerplay.pp_funcs->get_sclk_od((adev)-
> >powerplay.pp_handle))
> 
>  #define amdgpu_dpm_set_sclk_od(adev, value) \
> -	(adev)->powerplay.pp_funcs->set_sclk_od((adev)-
> >powerplay.pp_handle, value)
> +		((adev)->powerplay.pp_funcs->set_sclk_od((adev)-
> >powerplay.pp_handle, value))
> 
>  #define amdgpu_dpm_get_mclk_od(adev) \
> -	((adev)->powerplay.pp_funcs->get_mclk_od((adev)-
> >powerplay.pp_handle))
> +		((adev)->powerplay.pp_funcs->get_mclk_od((adev)-
> >powerplay.pp_handle))
> 
>  #define amdgpu_dpm_set_mclk_od(adev, value) \
> -	((adev)->powerplay.pp_funcs->set_mclk_od((adev)-
> >powerplay.pp_handle, value))
> +		((adev)->powerplay.pp_funcs->set_mclk_od((adev)-
> >powerplay.pp_handle, value))
> 
>  #define amdgpu_dpm_dispatch_task(adev, task_id, input, output)
> 	\
> -	((adev)->powerplay.pp_funcs->dispatch_tasks)((adev)-
> >powerplay.pp_handle, (task_id), (input), (output))
> +		((adev)->powerplay.pp_funcs->dispatch_tasks)((adev)-
> >powerplay.pp_handle, (task_id), (input), (output))
> 
> -#define amgdpu_dpm_check_state_equal(adev, cps, rps, equal) (adev)-
> >pm.funcs->check_state_equal((adev), (cps),(rps),(equal))
> +#define amdgpu_dpm_check_state_equal(adev, cps, rps, equal) \
> +		((adev)->powerplay.pp_funcs->check_state_equal((adev)-
> >powerplay.pp_handle, (cps), (rps), (equal)))
> 
>  #define amdgpu_dpm_get_vce_clock_state(adev, i)
> 	\
> -	((adev)->pp_enabled ?						\
> -	 (adev)->powerplay.pp_funcs->get_vce_clock_state((adev)-
> >powerplay.pp_handle, (i)) : \
> -	 (adev)->pm.funcs->get_vce_clock_state((adev), (i)))
> +		((adev)->powerplay.pp_funcs->get_vce_clock_state((adev)-
> >powerplay.pp_handle, (i)))
> 
> -#define amdgpu_dpm_get_performance_level(adev) \
> -	((adev)->pp_enabled ?						\
> -	(adev)->powerplay.pp_funcs->get_performance_level((adev)-
> >powerplay.pp_handle) : \
> -	(adev)->pm.dpm.forced_level)
> +#define amdgpu_dpm_get_performance_level(adev)
> 		\
> +		((adev)->powerplay.pp_funcs-
> >get_performance_level((adev)->powerplay.pp_handle))
> 
>  #define amdgpu_dpm_reset_power_profile_state(adev, request) \
> -	((adev)->powerplay.pp_funcs->reset_power_profile_state(\
> +		((adev)->powerplay.pp_funcs-
> >reset_power_profile_state(\
>  			(adev)->powerplay.pp_handle, request))
> 
>  #define amdgpu_dpm_get_power_profile_state(adev, query) \
> -	((adev)->powerplay.pp_funcs->get_power_profile_state(\
> +		((adev)->powerplay.pp_funcs->get_power_profile_state(\
>  			(adev)->powerplay.pp_handle, query))
> 
>  #define amdgpu_dpm_set_power_profile_state(adev, request) \
> -	((adev)->powerplay.pp_funcs->set_power_profile_state(\
> +		((adev)->powerplay.pp_funcs->set_power_profile_state(\
>  			(adev)->powerplay.pp_handle, request))
> 
>  #define amdgpu_dpm_switch_power_profile(adev, type) \
> -	((adev)->powerplay.pp_funcs->switch_power_profile(\
> +		((adev)->powerplay.pp_funcs->switch_power_profile(\
>  			(adev)->powerplay.pp_handle, type))
> 
>  struct amdgpu_dpm {
> @@ -442,7 +427,6 @@ struct amdgpu_pm {
>  	struct amdgpu_dpm       dpm;
>  	const struct firmware	*fw;	/* SMC firmware */
>  	uint32_t                fw_version;
> -	const struct amd_pm_funcs *funcs;
>  	uint32_t                pcie_gen_mask;
>  	uint32_t                pcie_mlw_mask;
>  	struct amd_pp_display_configuration pm_display_cfg;/* set by dc */
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> index e78395a..58a9db4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> @@ -74,7 +74,7 @@ void amdgpu_pm_acpi_event_handler(struct
> amdgpu_device *adev)
>  			adev->pm.dpm.ac_power = true;
>  		else
>  			adev->pm.dpm.ac_power = false;
> -		if (adev->pm.funcs->enable_bapm)
> +		if (adev->powerplay.pp_funcs->enable_bapm)
>  			amdgpu_dpm_enable_bapm(adev, adev-
> >pm.dpm.ac_power);
>  		mutex_unlock(&adev->pm.mutex);
>  	}
> @@ -88,9 +88,9 @@ static ssize_t amdgpu_get_dpm_state(struct device
> *dev,
>  	struct amdgpu_device *adev = ddev->dev_private;
>  	enum amd_pm_state_type pm;
> 
> -	if (adev->pp_enabled) {
> +	if (adev->powerplay.pp_funcs->get_current_power_state)
>  		pm = amdgpu_dpm_get_current_power_state(adev);
> -	} else
> +	else
>  		pm = adev->pm.dpm.user_state;
> 
>  	return snprintf(buf, PAGE_SIZE, "%s\n",
> @@ -140,13 +140,15 @@ static ssize_t
> amdgpu_get_dpm_forced_performance_level(struct device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> -	enum amd_dpm_forced_level level;
> +	enum amd_dpm_forced_level level = 0xff;
> 
>  	if  ((adev->flags & AMD_IS_PX) &&
>  	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
>  		return snprintf(buf, PAGE_SIZE, "off\n");
> 
> -	level = amdgpu_dpm_get_performance_level(adev);
> +	if (adev->powerplay.pp_funcs->get_performance_level)
> +		level = amdgpu_dpm_get_performance_level(adev);
> +
>  	return snprintf(buf, PAGE_SIZE, "%s\n",
>  			(level == AMD_DPM_FORCED_LEVEL_AUTO) ?
> "auto" :
>  			(level == AMD_DPM_FORCED_LEVEL_LOW) ? "low" :
> @@ -167,7 +169,7 @@ static ssize_t
> amdgpu_set_dpm_forced_performance_level(struct device *dev,
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
>  	enum amd_dpm_forced_level level;
> -	enum amd_dpm_forced_level current_level;
> +	enum amd_dpm_forced_level current_level = 0xff;
>  	int ret = 0;
> 
>  	/* Can't force performance level when the card is off */
> @@ -175,7 +177,8 @@ static ssize_t
> amdgpu_set_dpm_forced_performance_level(struct device *dev,
>  	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
>  		return -EINVAL;
> 
> -	current_level = amdgpu_dpm_get_performance_level(adev);
> +	if (adev->powerplay.pp_funcs->get_performance_level)
> +		current_level =
> amdgpu_dpm_get_performance_level(adev);
> 
>  	if (strncmp("low", buf, strlen("low")) == 0) {
>  		level = AMD_DPM_FORCED_LEVEL_LOW;
> @@ -203,9 +206,7 @@ static ssize_t
> amdgpu_set_dpm_forced_performance_level(struct device *dev,
>  	if (current_level == level)
>  		return count;
> 
> -	if (adev->pp_enabled)
> -		amdgpu_dpm_force_performance_level(adev, level);
> -	else {
> +	if (adev->powerplay.pp_funcs->force_performance_level) {
>  		mutex_lock(&adev->pm.mutex);
>  		if (adev->pm.dpm.thermal_active) {
>  			count = -EINVAL;
> @@ -233,7 +234,7 @@ static ssize_t amdgpu_get_pp_num_states(struct
> device *dev,
>  	struct pp_states_info data;
>  	int i, buf_len;
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->get_pp_num_states)
>  		amdgpu_dpm_get_pp_num_states(adev, &data);
> 
>  	buf_len = snprintf(buf, PAGE_SIZE, "states: %d\n", data.nums);
> @@ -257,8 +258,8 @@ static ssize_t amdgpu_get_pp_cur_state(struct
> device *dev,
>  	enum amd_pm_state_type pm = 0;
>  	int i = 0;
> 
> -	if (adev->pp_enabled) {
> -
> +	if (adev->powerplay.pp_funcs->get_current_power_state
> +		 && adev->powerplay.pp_funcs->get_pp_num_states) {
>  		pm = amdgpu_dpm_get_current_power_state(adev);
>  		amdgpu_dpm_get_pp_num_states(adev, &data);
> 
> @@ -280,25 +281,10 @@ static ssize_t amdgpu_get_pp_force_state(struct
> device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> -	struct pp_states_info data;
> -	enum amd_pm_state_type pm = 0;
> -	int i;
> -
> -	if (adev->pp_force_state_enabled && adev->pp_enabled) {
> -		pm = amdgpu_dpm_get_current_power_state(adev);
> -		amdgpu_dpm_get_pp_num_states(adev, &data);
> -
> -		for (i = 0; i < data.nums; i++) {
> -			if (pm == data.states[i])
> -				break;
> -		}
> 
> -		if (i == data.nums)
> -			i = -EINVAL;
> -
> -		return snprintf(buf, PAGE_SIZE, "%d\n", i);
> -
> -	} else
> +	if (adev->pp_force_state_enabled)
> +		return amdgpu_get_pp_cur_state(dev, attr, buf);
> +	else
>  		return snprintf(buf, PAGE_SIZE, "\n");
>  }
> 
> @@ -347,7 +333,7 @@ static ssize_t amdgpu_get_pp_table(struct device
> *dev,
>  	char *table = NULL;
>  	int size;
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->get_pp_table)
>  		size = amdgpu_dpm_get_pp_table(adev, &table);
>  	else
>  		return 0;
> @@ -368,7 +354,7 @@ static ssize_t amdgpu_set_pp_table(struct device
> *dev,
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->set_pp_table)
>  		amdgpu_dpm_set_pp_table(adev, buf, count);
> 
>  	return count;
> @@ -380,14 +366,11 @@ static ssize_t amdgpu_get_pp_dpm_sclk(struct
> device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> -	ssize_t size = 0;
> -
> -	if (adev->pp_enabled)
> -		size = amdgpu_dpm_print_clock_levels(adev, PP_SCLK, buf);
> -	else if (adev->pm.funcs->print_clock_levels)
> -		size = adev->pm.funcs->print_clock_levels(adev, PP_SCLK,
> buf);
> 
> -	return size;
> +	if (adev->powerplay.pp_funcs->print_clock_levels)
> +		return amdgpu_dpm_print_clock_levels(adev, PP_SCLK,
> buf);
> +	else
> +		return snprintf(buf, PAGE_SIZE, "\n");
>  }
> 
>  static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,
> @@ -416,10 +399,9 @@ static ssize_t amdgpu_set_pp_dpm_sclk(struct
> device *dev,
>  		mask |= 1 << level;
>  	}
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->force_clock_level)
>  		amdgpu_dpm_force_clock_level(adev, PP_SCLK, mask);
> -	else if (adev->pm.funcs->force_clock_level)
> -		adev->pm.funcs->force_clock_level(adev, PP_SCLK, mask);
> +
>  fail:
>  	return count;
>  }
> @@ -430,14 +412,11 @@ static ssize_t amdgpu_get_pp_dpm_mclk(struct
> device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> -	ssize_t size = 0;
> -
> -	if (adev->pp_enabled)
> -		size = amdgpu_dpm_print_clock_levels(adev, PP_MCLK,
> buf);
> -	else if (adev->pm.funcs->print_clock_levels)
> -		size = adev->pm.funcs->print_clock_levels(adev, PP_MCLK,
> buf);
> 
> -	return size;
> +	if (adev->powerplay.pp_funcs->print_clock_levels)
> +		return amdgpu_dpm_print_clock_levels(adev, PP_MCLK,
> buf);
> +	else
> +		return snprintf(buf, PAGE_SIZE, "\n");
>  }
> 
>  static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,
> @@ -465,11 +444,9 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct
> device *dev,
>  		}
>  		mask |= 1 << level;
>  	}
> -
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->force_clock_level)
>  		amdgpu_dpm_force_clock_level(adev, PP_MCLK, mask);
> -	else if (adev->pm.funcs->force_clock_level)
> -		adev->pm.funcs->force_clock_level(adev, PP_MCLK, mask);
> +
>  fail:
>  	return count;
>  }
> @@ -480,14 +457,11 @@ static ssize_t amdgpu_get_pp_dpm_pcie(struct
> device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> -	ssize_t size = 0;
> -
> -	if (adev->pp_enabled)
> -		size = amdgpu_dpm_print_clock_levels(adev, PP_PCIE, buf);
> -	else if (adev->pm.funcs->print_clock_levels)
> -		size = adev->pm.funcs->print_clock_levels(adev, PP_PCIE,
> buf);
> 
> -	return size;
> +	if (adev->powerplay.pp_funcs->print_clock_levels)
> +		return amdgpu_dpm_print_clock_levels(adev, PP_PCIE,
> buf);
> +	else
> +		return snprintf(buf, PAGE_SIZE, "\n");
>  }
> 
>  static ssize_t amdgpu_set_pp_dpm_pcie(struct device *dev,
> @@ -515,11 +489,9 @@ static ssize_t amdgpu_set_pp_dpm_pcie(struct
> device *dev,
>  		}
>  		mask |= 1 << level;
>  	}
> -
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->force_clock_level)
>  		amdgpu_dpm_force_clock_level(adev, PP_PCIE, mask);
> -	else if (adev->pm.funcs->force_clock_level)
> -		adev->pm.funcs->force_clock_level(adev, PP_PCIE, mask);
> +
>  fail:
>  	return count;
>  }
> @@ -532,10 +504,8 @@ static ssize_t amdgpu_get_pp_sclk_od(struct device
> *dev,
>  	struct amdgpu_device *adev = ddev->dev_private;
>  	uint32_t value = 0;
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->get_sclk_od)
>  		value = amdgpu_dpm_get_sclk_od(adev);
> -	else if (adev->pm.funcs->get_sclk_od)
> -		value = adev->pm.funcs->get_sclk_od(adev);
> 
>  	return snprintf(buf, PAGE_SIZE, "%d\n", value);
>  }
> @@ -556,12 +526,12 @@ static ssize_t amdgpu_set_pp_sclk_od(struct
> device *dev,
>  		count = -EINVAL;
>  		goto fail;
>  	}
> +	if (adev->powerplay.pp_funcs->set_sclk_od)
> +		amdgpu_dpm_set_sclk_od(adev, (uint32_t)value);
> 
>  	if (adev->pp_enabled) {
> -		amdgpu_dpm_set_sclk_od(adev, (uint32_t)value);
>  		amdgpu_dpm_dispatch_task(adev,
> AMD_PP_TASK_READJUST_POWER_STATE, NULL, NULL);
> -	} else if (adev->pm.funcs->set_sclk_od) {
> -		adev->pm.funcs->set_sclk_od(adev, (uint32_t)value);
> +	} else {
>  		adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps;
>  		amdgpu_pm_compute_clocks(adev);
>  	}
> @@ -578,10 +548,8 @@ static ssize_t amdgpu_get_pp_mclk_od(struct
> device *dev,
>  	struct amdgpu_device *adev = ddev->dev_private;
>  	uint32_t value = 0;
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->get_mclk_od)
>  		value = amdgpu_dpm_get_mclk_od(adev);
> -	else if (adev->pm.funcs->get_mclk_od)
> -		value = adev->pm.funcs->get_mclk_od(adev);
> 
>  	return snprintf(buf, PAGE_SIZE, "%d\n", value);
>  }
> @@ -602,12 +570,12 @@ static ssize_t amdgpu_set_pp_mclk_od(struct
> device *dev,
>  		count = -EINVAL;
>  		goto fail;
>  	}
> +	if (adev->powerplay.pp_funcs->set_mclk_od)
> +		amdgpu_dpm_set_mclk_od(adev, (uint32_t)value);
> 
>  	if (adev->pp_enabled) {
> -		amdgpu_dpm_set_mclk_od(adev, (uint32_t)value);
>  		amdgpu_dpm_dispatch_task(adev,
> AMD_PP_TASK_READJUST_POWER_STATE, NULL, NULL);
> -	} else if (adev->pm.funcs->set_mclk_od) {
> -		adev->pm.funcs->set_mclk_od(adev, (uint32_t)value);
> +	} else {
>  		adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps;
>  		amdgpu_pm_compute_clocks(adev);
>  	}
> @@ -621,14 +589,11 @@ static ssize_t
> amdgpu_get_pp_power_profile(struct device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = ddev->dev_private;
> -	int ret = 0;
> +	int ret = 0xff;
> 
> -	if (adev->pp_enabled)
> +	if (adev->powerplay.pp_funcs->get_power_profile_state)
>  		ret = amdgpu_dpm_get_power_profile_state(
>  				adev, query);
> -	else if (adev->pm.funcs->get_power_profile_state)
> -		ret = adev->pm.funcs->get_power_profile_state(
> -				adev, query);
> 
>  	if (ret)
>  		return ret;
> @@ -675,15 +640,12 @@ static ssize_t
> amdgpu_set_pp_power_profile(struct device *dev,
>  	char *sub_str, buf_cpy[128], *tmp_str;
>  	const char delimiter[3] = {' ', '\n', '\0'};
>  	long int value;
> -	int ret = 0;
> +	int ret = 0xff;
> 
>  	if (strncmp("reset", buf, strlen("reset")) == 0) {
> -		if (adev->pp_enabled)
> +		if (adev->powerplay.pp_funcs->reset_power_profile_state)
>  			ret = amdgpu_dpm_reset_power_profile_state(
>  					adev, request);
> -		else if (adev->pm.funcs->reset_power_profile_state)
> -			ret = adev->pm.funcs->reset_power_profile_state(
> -					adev, request);
>  		if (ret) {
>  			count = -EINVAL;
>  			goto fail;
> @@ -692,12 +654,10 @@ static ssize_t
> amdgpu_set_pp_power_profile(struct device *dev,
>  	}
> 
>  	if (strncmp("set", buf, strlen("set")) == 0) {
> -		if (adev->pp_enabled)
> +		if (adev->powerplay.pp_funcs->set_power_profile_state)
>  			ret = amdgpu_dpm_set_power_profile_state(
>  					adev, request);
> -		else if (adev->pm.funcs->set_power_profile_state)
> -			ret = adev->pm.funcs->set_power_profile_state(
> -					adev, request);
> +
>  		if (ret) {
>  			count = -EINVAL;
>  			goto fail;
> @@ -745,13 +705,8 @@ static ssize_t amdgpu_set_pp_power_profile(struct
> device *dev,
> 
>  		loop++;
>  	}
> -
> -	if (adev->pp_enabled)
> -		ret = amdgpu_dpm_set_power_profile_state(
> -				adev, request);
> -	else if (adev->pm.funcs->set_power_profile_state)
> -		ret = adev->pm.funcs->set_power_profile_state(
> -				adev, request);
> +	if (adev->powerplay.pp_funcs->set_power_profile_state)
> +		ret = amdgpu_dpm_set_power_profile_state(adev,
> request);
> 
>  	if (ret)
>  		count = -EINVAL;
> @@ -831,7 +786,7 @@ static ssize_t amdgpu_hwmon_show_temp(struct
> device *dev,
>  	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
>  		return -EINVAL;
> 
> -	if (!adev->pp_enabled && !adev->pm.funcs->get_temperature)
> +	if (!adev->powerplay.pp_funcs->get_temperature)
>  		temp = 0;
>  	else
>  		temp = amdgpu_dpm_get_temperature(adev);
> @@ -862,7 +817,7 @@ static ssize_t
> amdgpu_hwmon_get_pwm1_enable(struct device *dev,
>  	struct amdgpu_device *adev = dev_get_drvdata(dev);
>  	u32 pwm_mode = 0;
> 
> -	if (!adev->pp_enabled && !adev->pm.funcs-
> >get_fan_control_mode)
> +	if (!adev->powerplay.pp_funcs->get_fan_control_mode)
>  		return -EINVAL;
> 
>  	pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
> @@ -879,7 +834,7 @@ static ssize_t
> amdgpu_hwmon_set_pwm1_enable(struct device *dev,
>  	int err;
>  	int value;
> 
> -	if (!adev->pp_enabled && !adev->pm.funcs-
> >set_fan_control_mode)
> +	if (!adev->powerplay.pp_funcs->set_fan_control_mode)
>  		return -EINVAL;
> 
>  	err = kstrtoint(buf, 10, &value);
> @@ -919,9 +874,11 @@ static ssize_t amdgpu_hwmon_set_pwm1(struct
> device *dev,
> 
>  	value = (value * 100) / 255;
> 
> -	err = amdgpu_dpm_set_fan_speed_percent(adev, value);
> -	if (err)
> -		return err;
> +	if (adev->powerplay.pp_funcs->set_fan_speed_percent) {
> +		err = amdgpu_dpm_set_fan_speed_percent(adev, value);
> +		if (err)
> +			return err;
> +	}
> 
>  	return count;
>  }
> @@ -932,11 +889,13 @@ static ssize_t amdgpu_hwmon_get_pwm1(struct
> device *dev,
>  {
>  	struct amdgpu_device *adev = dev_get_drvdata(dev);
>  	int err;
> -	u32 speed;
> +	u32 speed = 0;
> 
> -	err = amdgpu_dpm_get_fan_speed_percent(adev, &speed);
> -	if (err)
> -		return err;
> +	if (adev->powerplay.pp_funcs->get_fan_speed_percent) {
> +		err = amdgpu_dpm_get_fan_speed_percent(adev,
> &speed);
> +		if (err)
> +			return err;
> +	}
> 
>  	speed = (speed * 255) / 100;
> 
> @@ -949,11 +908,13 @@ static ssize_t
> amdgpu_hwmon_get_fan1_input(struct device *dev,
>  {
>  	struct amdgpu_device *adev = dev_get_drvdata(dev);
>  	int err;
> -	u32 speed;
> +	u32 speed = 0;
> 
> -	err = amdgpu_dpm_get_fan_speed_rpm(adev, &speed);
> -	if (err)
> -		return err;
> +	if (adev->powerplay.pp_funcs->get_fan_speed_rpm) {
> +		err = amdgpu_dpm_get_fan_speed_rpm(adev, &speed);
> +		if (err)
> +			return err;
> +	}
> 
>  	return sprintf(buf, "%i\n", speed);
>  }
> @@ -1008,21 +969,21 @@ static umode_t hwmon_attributes_visible(struct
> kobject *kobj,
>  		return 0;
> 
>  	/* mask fan attributes if we have no bindings for this asic to expose
> */
> -	if ((!adev->pm.funcs->get_fan_speed_percent &&
> +	if ((!adev->powerplay.pp_funcs->get_fan_speed_percent &&
>  	     attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't query
> fan */
> -	    (!adev->pm.funcs->get_fan_control_mode &&
> +	    (!adev->powerplay.pp_funcs->get_fan_control_mode &&
>  	     attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't
> query state */
>  		effective_mode &= ~S_IRUGO;
> 
> -	if ((!adev->pm.funcs->set_fan_speed_percent &&
> +	if ((!adev->powerplay.pp_funcs->set_fan_speed_percent &&
>  	     attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't
> manage fan */
> -	    (!adev->pm.funcs->set_fan_control_mode &&
> +	    (!adev->powerplay.pp_funcs->set_fan_control_mode &&
>  	     attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't
> manage state */
>  		effective_mode &= ~S_IWUSR;
> 
>  	/* hide max/min values if we can't both query and manage the fan */
> -	if ((!adev->pm.funcs->set_fan_speed_percent &&
> -	     !adev->pm.funcs->get_fan_speed_percent) &&
> +	if ((!adev->powerplay.pp_funcs->set_fan_speed_percent &&
> +	     !adev->powerplay.pp_funcs->get_fan_speed_percent) &&
>  	    (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
>  	     attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
>  		return 0;
> @@ -1055,7 +1016,7 @@ void amdgpu_dpm_thermal_work_handler(struct
> work_struct *work)
>  	if (!adev->pm.dpm_enabled)
>  		return;
> 
> -	if (adev->pm.funcs->get_temperature) {
> +	if (adev->powerplay.pp_funcs->get_temperature) {
>  		int temp = amdgpu_dpm_get_temperature(adev);
> 
>  		if (temp < adev->pm.dpm.thermal.min_temp)
> @@ -1087,7 +1048,7 @@ static struct amdgpu_ps
> *amdgpu_dpm_pick_power_state(struct amdgpu_device *adev,
>  		true : false;
> 
>  	/* check if the vblank period is too short to adjust the mclk */
> -	if (single_display && adev->pm.funcs->vblank_too_short) {
> +	if (single_display && adev->powerplay.pp_funcs-
> >vblank_too_short) {
>  		if (amdgpu_dpm_vblank_too_short(adev))
>  			single_display = false;
>  	}
> @@ -1216,7 +1177,7 @@ static void
> amdgpu_dpm_change_power_state_locked(struct amdgpu_device *adev)
>  	struct amdgpu_ps *ps;
>  	enum amd_pm_state_type dpm_state;
>  	int ret;
> -	bool equal;
> +	bool equal = false;
> 
>  	/* if dpm init failed */
>  	if (!adev->pm.dpm_enabled)
> @@ -1236,7 +1197,7 @@ static void
> amdgpu_dpm_change_power_state_locked(struct amdgpu_device *adev)
>  	else
>  		return;
> 
> -	if (amdgpu_dpm == 1) {
> +	if (amdgpu_dpm == 1 && adev->powerplay.pp_funcs-
> >print_power_state) {
>  		printk("switching from power state:\n");
>  		amdgpu_dpm_print_power_state(adev, adev-
> >pm.dpm.current_ps);
>  		printk("switching to power state:\n");
> @@ -1244,15 +1205,17 @@ static void
> amdgpu_dpm_change_power_state_locked(struct amdgpu_device *adev)
>  	}
>  	/* update whether vce is active */
>  	ps->vce_active = adev->pm.dpm.vce_active;
> -
> -	amdgpu_dpm_display_configuration_changed(adev);
> +	if (adev->powerplay.pp_funcs->display_configuration_changed)
> +		amdgpu_dpm_display_configuration_changed(adev);
> 
>  	ret = amdgpu_dpm_pre_set_power_state(adev);
>  	if (ret)
>  		return;
> 
> -	if ((0 != amgdpu_dpm_check_state_equal(adev, adev-
> >pm.dpm.current_ps, adev->pm.dpm.requested_ps, &equal)))
> -		equal = false;
> +	if (adev->powerplay.pp_funcs->check_state_equal) {
> +		if (0 != amdgpu_dpm_check_state_equal(adev, adev-
> >pm.dpm.current_ps, adev->pm.dpm.requested_ps, &equal))
> +			equal = false;
> +	}
> 
>  	if (equal)
>  		return;
> @@ -1263,7 +1226,7 @@ static void
> amdgpu_dpm_change_power_state_locked(struct amdgpu_device *adev)
>  	adev->pm.dpm.current_active_crtcs = adev-
> >pm.dpm.new_active_crtcs;
>  	adev->pm.dpm.current_active_crtc_count = adev-
> >pm.dpm.new_active_crtc_count;
> 
> -	if (adev->pm.funcs->force_performance_level) {
> +	if (adev->powerplay.pp_funcs->force_performance_level) {
>  		if (adev->pm.dpm.thermal_active) {
>  			enum amd_dpm_forced_level level = adev-
> >pm.dpm.forced_level;
>  			/* force low perf level for thermal */
> @@ -1279,7 +1242,7 @@ static void
> amdgpu_dpm_change_power_state_locked(struct amdgpu_device *adev)
> 
>  void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable)
>  {
> -	if (adev->pp_enabled || adev->pm.funcs->powergate_uvd) {
> +	if (adev->powerplay.pp_funcs->powergate_uvd) {
>  		/* enable/disable UVD */
>  		mutex_lock(&adev->pm.mutex);
>  		amdgpu_dpm_powergate_uvd(adev, !enable);
> @@ -1301,7 +1264,7 @@ void amdgpu_dpm_enable_uvd(struct
> amdgpu_device *adev, bool enable)
> 
>  void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
>  {
> -	if (adev->pp_enabled || adev->pm.funcs->powergate_vce) {
> +	if (adev->powerplay.pp_funcs->powergate_vce) {
>  		/* enable/disable VCE */
>  		mutex_lock(&adev->pm.mutex);
>  		amdgpu_dpm_powergate_vce(adev, !enable);
> @@ -1336,8 +1299,7 @@ void amdgpu_pm_print_power_states(struct
> amdgpu_device *adev)
>  {
>  	int i;
> 
> -	if (adev->pp_enabled)
> -		/* TO DO */
> +	if (adev->powerplay.pp_funcs->print_power_state == NULL)
>  		return;
> 
>  	for (i = 0; i < adev->pm.dpm.num_ps; i++)
> @@ -1352,10 +1314,8 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device
> *adev)
>  	if (adev->pm.sysfs_initialized)
>  		return 0;
> 
> -	if (!adev->pp_enabled) {
> -		if (adev->pm.funcs->get_temperature == NULL)
> -			return 0;
> -	}
> +	if (adev->powerplay.pp_funcs->get_temperature == NULL)
> +		return 0;
> 
>  	adev->pm.int_hwmon_dev =
> hwmon_device_register_with_groups(adev->dev,
> 
> DRIVER_NAME, adev,
> @@ -1633,8 +1593,8 @@ static int amdgpu_debugfs_pm_info(struct seq_file
> *m, void *data)
>  		return amdgpu_debugfs_pm_info_pp(m, adev);
>  	} else {
>  		mutex_lock(&adev->pm.mutex);
> -		if (adev->pm.funcs-
> >debugfs_print_current_performance_level)
> -			adev->pm.funcs-
> >debugfs_print_current_performance_level(adev, m);
> +		if (adev->powerplay.pp_funcs-
> >debugfs_print_current_performance_level)
> +			adev->powerplay.pp_funcs-
> >debugfs_print_current_performance_level(adev, m);
>  		else
>  			seq_printf(m, "Debugfs support not implemented
> for this asic\n");
>  		mutex_unlock(&adev->pm.mutex);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
> index b0c4db8..5cd5b8e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
> @@ -87,17 +87,20 @@ static int amdgpu_pp_early_init(void *handle)
>  	case CHIP_OLAND:
>  	case CHIP_HAINAN:
>  		amd_pp->ip_funcs = &si_dpm_ip_funcs;
> +		amd_pp->pp_funcs = &si_dpm_funcs;
>  	break;
>  #endif
>  #ifdef CONFIG_DRM_AMDGPU_CIK
>  	case CHIP_BONAIRE:
>  	case CHIP_HAWAII:
>  		amd_pp->ip_funcs = &ci_dpm_ip_funcs;
> +		amd_pp->pp_funcs = &ci_dpm_funcs;
>  		break;
>  	case CHIP_KABINI:
>  	case CHIP_MULLINS:
>  	case CHIP_KAVERI:
>  		amd_pp->ip_funcs = &kv_dpm_ip_funcs;
> +		amd_pp->pp_funcs = &kv_dpm_funcs;
>  		break;
>  #endif
>  	default:
> diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> index 95a3717..bce6db7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
> @@ -307,7 +307,6 @@ static int ci_get_std_voltage_value_sidd(struct
> amdgpu_device *adev,
>  static int ci_set_overdrive_target_tdp(struct amdgpu_device *adev,
>  				       u32 target_tdp);
>  static int ci_update_uvd_dpm(struct amdgpu_device *adev, bool gate);
> -static void ci_dpm_set_dpm_funcs(struct amdgpu_device *adev);
>  static void ci_dpm_set_irq_funcs(struct amdgpu_device *adev);
> 
>  static PPSMC_Result amdgpu_ci_send_msg_to_smc_with_parameter(struct
> amdgpu_device *adev,
> @@ -6282,7 +6281,6 @@ static int ci_dpm_early_init(void *handle)
>  {
>  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> 
> -	ci_dpm_set_dpm_funcs(adev);
>  	ci_dpm_set_irq_funcs(adev);
> 
>  	return 0;
> @@ -7035,7 +7033,7 @@ static int ci_dpm_read_sensor(void *handle, int
> idx,
>  	.set_powergating_state = ci_dpm_set_powergating_state,
>  };
> 
> -static const struct amd_pm_funcs ci_dpm_funcs = {
> +const struct amd_pm_funcs ci_dpm_funcs = {
>  	.get_temperature = &ci_dpm_get_temp,
>  	.pre_set_power_state = &ci_dpm_pre_set_power_state,
>  	.set_power_state = &ci_dpm_set_power_state,
> @@ -7067,12 +7065,6 @@ static int ci_dpm_read_sensor(void *handle, int
> idx,
>  	.read_sensor = ci_dpm_read_sensor,
>  };
> 
> -static void ci_dpm_set_dpm_funcs(struct amdgpu_device *adev)
> -{
> -	if (adev->pm.funcs == NULL)
> -		adev->pm.funcs = &ci_dpm_funcs;
> -}
> -
>  static const struct amdgpu_irq_src_funcs ci_dpm_irq_funcs = {
>  	.set = ci_dpm_set_interrupt_state,
>  	.process = ci_dpm_process_interrupt,
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_dpm.h
> b/drivers/gpu/drm/amd/amdgpu/cik_dpm.h
> index b1c8e7b..c7b4349 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_dpm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_dpm.h
> @@ -26,5 +26,6 @@
> 
>  extern const struct amd_ip_funcs ci_dpm_ip_funcs;
>  extern const struct amd_ip_funcs kv_dpm_ip_funcs;
> -
> +extern const struct amd_pm_funcs ci_dpm_funcs;
> +extern const struct amd_pm_funcs kv_dpm_funcs;
>  #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
> b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
> index 9ea251a..db560ef 100644
> --- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
> @@ -42,7 +42,6 @@
>  #define KV_MINIMUM_ENGINE_CLOCK         800
>  #define SMC_RAM_END                     0x40000
> 
> -static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev);
>  static void kv_dpm_set_irq_funcs(struct amdgpu_device *adev);
>  static int kv_enable_nb_dpm(struct amdgpu_device *adev,
>  			    bool enable);
> @@ -2961,7 +2960,6 @@ static int kv_dpm_early_init(void *handle)
>  {
>  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> 
> -	kv_dpm_set_dpm_funcs(adev);
>  	kv_dpm_set_irq_funcs(adev);
> 
>  	return 0;
> @@ -3327,7 +3325,7 @@ static int kv_dpm_read_sensor(void *handle, int
> idx,
>  	.set_powergating_state = kv_dpm_set_powergating_state,
>  };
> 
> -static const struct amd_pm_funcs kv_dpm_funcs = {
> +const struct amd_pm_funcs kv_dpm_funcs = {
>  	.get_temperature = &kv_dpm_get_temp,
>  	.pre_set_power_state = &kv_dpm_pre_set_power_state,
>  	.set_power_state = &kv_dpm_set_power_state,
> @@ -3345,12 +3343,6 @@ static int kv_dpm_read_sensor(void *handle, int
> idx,
>  	.read_sensor = &kv_dpm_read_sensor,
>  };
> 
> -static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev)
> -{
> -	if (adev->pm.funcs == NULL)
> -		adev->pm.funcs = &kv_dpm_funcs;
> -}
> -
>  static const struct amdgpu_irq_src_funcs kv_dpm_irq_funcs = {
>  	.set = kv_dpm_set_interrupt_state,
>  	.process = kv_dpm_process_interrupt,
> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> index 6f3ab62..7d7a414 100644
> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
> @@ -1847,7 +1847,6 @@ static int si_calculate_sclk_params(struct
> amdgpu_device *adev,
> 
>  static void si_thermal_start_smc_fan_control(struct amdgpu_device *adev);
>  static void si_fan_ctrl_set_default_mode(struct amdgpu_device *adev);
> -static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev);
>  static void si_dpm_set_irq_funcs(struct amdgpu_device *adev);
> 
>  static struct si_power_info *si_get_pi(struct amdgpu_device *adev)
> @@ -7944,7 +7943,6 @@ static int si_dpm_early_init(void *handle)
> 
>  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> 
> -	si_dpm_set_dpm_funcs(adev);
>  	si_dpm_set_irq_funcs(adev);
>  	return 0;
>  }
> @@ -8062,7 +8060,7 @@ static int si_dpm_read_sensor(void *handle, int
> idx,
>  	.set_powergating_state = si_dpm_set_powergating_state,
>  };
> 
> -static const struct amd_pm_funcs si_dpm_funcs = {
> +const struct amd_pm_funcs si_dpm_funcs = {
>  	.get_temperature = &si_dpm_get_temp,
>  	.pre_set_power_state = &si_dpm_pre_set_power_state,
>  	.set_power_state = &si_dpm_set_power_state,
> @@ -8083,12 +8081,6 @@ static int si_dpm_read_sensor(void *handle, int
> idx,
>  	.read_sensor = &si_dpm_read_sensor,
>  };
> 
> -static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev)
> -{
> -	if (adev->pm.funcs == NULL)
> -		adev->pm.funcs = &si_dpm_funcs;
> -}
> -
>  static const struct amdgpu_irq_src_funcs si_dpm_irq_funcs = {
>  	.set = si_dpm_set_interrupt_state,
>  	.process = si_dpm_process_interrupt,
> diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.h
> b/drivers/gpu/drm/amd/amdgpu/si_dpm.h
> index 51ce21c..9fe343d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.h
> @@ -246,6 +246,7 @@ enum si_display_gap
>  };
> 
>  extern const struct amd_ip_funcs si_dpm_ip_funcs;
> +extern const struct amd_pm_funcs si_dpm_funcs;
> 
>  struct ni_leakage_coeffients
>  {
> --
> 1.9.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list