[4/4] drm/amd/powerplay: read power state table from vbios and can't be changed. so allocate memory for request ps and current ps.

Submitted by Rex Zhu on Aug. 31, 2016, 9:05 p.m.

Details

Message ID 1472677542-10605-4-git-send-email-Rex.Zhu@amd.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Rex Zhu Aug. 31, 2016, 9:05 p.m.
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
 drivers/gpu/drm/amd/powerplay/amd_powerplay.c |  2 +-
 drivers/gpu/drm/amd/powerplay/eventmgr/psm.c  |  5 +++--
 drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c   | 15 +++++++++++++--
 3 files changed, 17 insertions(+), 5 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index 2de34a5..a4b0f41 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -538,7 +538,7 @@  int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, void *input,
 		ret = pem_handle_event(pp_handle->eventmgr, event_id, &data);
 		break;
 	case AMD_PP_EVENT_READJUST_POWER_STATE:
-		pp_handle->hwmgr->current_ps = pp_handle->hwmgr->boot_ps;
+		memcpy(pp_handle->hwmgr->current_ps, pp_handle->hwmgr->boot_ps, pp_handle->hwmgr->ps_size);
 		ret = pem_handle_event(pp_handle->eventmgr, event_id, &data);
 		break;
 	default:
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
index a46225c..1d1875a 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
@@ -70,11 +70,12 @@  int psm_set_states(struct pp_eventmgr *eventmgr, unsigned long *state_id)
 	int i;
 
 	table_entries = hwmgr->num_ps;
+
 	state = hwmgr->ps;
 
 	for (i = 0; i < table_entries; i++) {
 		if (state->id == *state_id) {
-			hwmgr->request_ps = state;
+			memcpy(hwmgr->request_ps, state, hwmgr->ps_size);
 			return 0;
 		}
 		state = (struct pp_power_state *)((unsigned long)state + hwmgr->ps_size);
@@ -106,7 +107,7 @@  int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip)
 	if (!equal || phm_check_smc_update_required_for_display_configuration(hwmgr)) {
 		phm_apply_state_adjust_rules(hwmgr, requested, pcurrent);
 		phm_set_power_state(hwmgr, &pcurrent->hardware, &requested->hardware);
-		hwmgr->current_ps = requested;
+		memcpy(hwmgr->current_ps, hwmgr->request_ps, hwmgr->ps_size);
 	}
 	return 0;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index 50d465d..9794f10 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -128,6 +128,8 @@  int hwmgr_fini(struct pp_hwmgr *hwmgr)
 	kfree(hwmgr->set_temperature_range.function_list);
 
 	kfree(hwmgr->ps);
+	kfree(hwmgr->current_ps);
+	kfree(hwmgr->request_ps);
 	kfree(hwmgr);
 	return 0;
 }
@@ -152,10 +154,17 @@  int hw_init_power_state_table(struct pp_hwmgr *hwmgr)
 					  sizeof(struct pp_power_state);
 
 	hwmgr->ps = kzalloc(size * table_entries, GFP_KERNEL);
-
 	if (hwmgr->ps == NULL)
 		return -ENOMEM;
 
+	hwmgr->request_ps = kzalloc(size, GFP_KERNEL);
+	if (hwmgr->request_ps == NULL)
+		return -ENOMEM;
+
+	hwmgr->current_ps = kzalloc(size, GFP_KERNEL);
+	if (hwmgr->current_ps == NULL)
+		return -ENOMEM;
+
 	state = hwmgr->ps;
 
 	for (i = 0; i < table_entries; i++) {
@@ -163,7 +172,8 @@  int hw_init_power_state_table(struct pp_hwmgr *hwmgr)
 
 		if (state->classification.flags & PP_StateClassificationFlag_Boot) {
 			hwmgr->boot_ps = state;
-			hwmgr->current_ps = hwmgr->request_ps = state;
+			memcpy(hwmgr->current_ps, state, size);
+			memcpy(hwmgr->request_ps, state, size);
 		}
 
 		state->id = i + 1; /* assigned unique num for every power state id */
@@ -173,6 +183,7 @@  int hw_init_power_state_table(struct pp_hwmgr *hwmgr)
 		state = (struct pp_power_state *)((unsigned long)state + size);
 	}
 
+
 	return 0;
 }
 

Comments

> -----Original Message-----

> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf

> Of Rex Zhu

> Sent: Wednesday, August 31, 2016 5:06 PM

> To: amd-gfx@lists.freedesktop.org

> Cc: Zhu, Rex

> Subject: [PATCH 4/4] drm/amd/powerplay: read power state table from

> vbios and can't be changed. so allocate memory for request ps and current

> ps.


The subject line is way too long.  Make it shorter and include a description in the commit log.  With that fixed, this series is:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>


> 

> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>

> ---

>  drivers/gpu/drm/amd/powerplay/amd_powerplay.c |  2 +-

>  drivers/gpu/drm/amd/powerplay/eventmgr/psm.c  |  5 +++--

>  drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c   | 15 +++++++++++++--

>  3 files changed, 17 insertions(+), 5 deletions(-)

> 

> diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c

> b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c

> index 2de34a5..a4b0f41 100644

> --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c

> +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c

> @@ -538,7 +538,7 @@ int pp_dpm_dispatch_tasks(void *handle, enum

> amd_pp_event event_id, void *input,

>  		ret = pem_handle_event(pp_handle->eventmgr, event_id,

> &data);

>  		break;

>  	case AMD_PP_EVENT_READJUST_POWER_STATE:

> -		pp_handle->hwmgr->current_ps = pp_handle->hwmgr-

> >boot_ps;

> +		memcpy(pp_handle->hwmgr->current_ps, pp_handle-

> >hwmgr->boot_ps, pp_handle->hwmgr->ps_size);

>  		ret = pem_handle_event(pp_handle->eventmgr, event_id,

> &data);

>  		break;

>  	default:

> diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c

> b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c

> index a46225c..1d1875a 100644

> --- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c

> +++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c

> @@ -70,11 +70,12 @@ int psm_set_states(struct pp_eventmgr *eventmgr,

> unsigned long *state_id)

>  	int i;

> 

>  	table_entries = hwmgr->num_ps;

> +

>  	state = hwmgr->ps;

> 

>  	for (i = 0; i < table_entries; i++) {

>  		if (state->id == *state_id) {

> -			hwmgr->request_ps = state;

> +			memcpy(hwmgr->request_ps, state, hwmgr-

> >ps_size);

>  			return 0;

>  		}

>  		state = (struct pp_power_state *)((unsigned long)state +

> hwmgr->ps_size);

> @@ -106,7 +107,7 @@ int psm_adjust_power_state_dynamic(struct

> pp_eventmgr *eventmgr, bool skip)

>  	if (!equal ||

> phm_check_smc_update_required_for_display_configuration(hwmgr)) {

>  		phm_apply_state_adjust_rules(hwmgr, requested,

> pcurrent);

>  		phm_set_power_state(hwmgr, &pcurrent->hardware,

> &requested->hardware);

> -		hwmgr->current_ps = requested;

> +		memcpy(hwmgr->current_ps, hwmgr->request_ps, hwmgr-

> >ps_size);

>  	}

>  	return 0;

>  }

> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c

> b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c

> index 50d465d..9794f10 100644

> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c

> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c

> @@ -128,6 +128,8 @@ int hwmgr_fini(struct pp_hwmgr *hwmgr)

>  	kfree(hwmgr->set_temperature_range.function_list);

> 

>  	kfree(hwmgr->ps);

> +	kfree(hwmgr->current_ps);

> +	kfree(hwmgr->request_ps);

>  	kfree(hwmgr);

>  	return 0;

>  }

> @@ -152,10 +154,17 @@ int hw_init_power_state_table(struct pp_hwmgr

> *hwmgr)

>  					  sizeof(struct pp_power_state);

> 

>  	hwmgr->ps = kzalloc(size * table_entries, GFP_KERNEL);

> -

>  	if (hwmgr->ps == NULL)

>  		return -ENOMEM;

> 

> +	hwmgr->request_ps = kzalloc(size, GFP_KERNEL);

> +	if (hwmgr->request_ps == NULL)

> +		return -ENOMEM;

> +

> +	hwmgr->current_ps = kzalloc(size, GFP_KERNEL);

> +	if (hwmgr->current_ps == NULL)

> +		return -ENOMEM;

> +

>  	state = hwmgr->ps;

> 

>  	for (i = 0; i < table_entries; i++) {

> @@ -163,7 +172,8 @@ int hw_init_power_state_table(struct pp_hwmgr

> *hwmgr)

> 

>  		if (state->classification.flags &

> PP_StateClassificationFlag_Boot) {

>  			hwmgr->boot_ps = state;

> -			hwmgr->current_ps = hwmgr->request_ps = state;

> +			memcpy(hwmgr->current_ps, state, size);

> +			memcpy(hwmgr->request_ps, state, size);

>  		}

> 

>  		state->id = i + 1; /* assigned unique num for every power

> state id */

> @@ -173,6 +183,7 @@ int hw_init_power_state_table(struct pp_hwmgr

> *hwmgr)

>  		state = (struct pp_power_state *)((unsigned long)state +

> size);

>  	}

> 

> +

>  	return 0;

>  }

> 

> --

> 1.9.1

> 

> _______________________________________________

> amd-gfx mailing list

> amd-gfx@lists.freedesktop.org

> https://lists.freedesktop.org/mailman/listinfo/amd-gfx