summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/volt/volt_policy.c
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2018-02-19 01:40:37 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-03-15 02:47:02 -0400
commit8a1d51fe49da0d2351ee5ece472c8cdf399f0f6a (patch)
tree1c028329993ce384accef50f10dd4054fdb85fee /drivers/gpu/nvgpu/volt/volt_policy.c
parentd3f96dfa96a8aafe6f5035e2ed24425141e4202e (diff)
gpu: nvgpu: gv10x volt policy boardobj changes
- Added support for single rail multi step volt policy & below are the list of define & struct added/updated to support same. CTRL_VOLT_POLICY_TYPE_SINGLE_RAIL_MULTI_STEP 0x04, NV_VBIOS_VOLTAGE_POLICY_1X_ENTRY_TYPE_SINGLE_RAIL_MULTI_STEP 0x04, Updated struct vbios_voltage_policy_table_1x_entry, struct nv_pmu_volt_volt_policy_sr_multi_step_boardobj_set, this holds members which help to config single rail multi step like delay between switch step, ramp up & ramp down step size in uv. - Added case to support SINGLE_RAIL_MULTI_STEP in volt_volt_policy_construct() based on boardobj type. - Added case to support SINGLE_RAIL_MULTI_STEP in volt_get_volt_policy_table() to read data from VBIOS table vbios_voltage_policy_table_1x_entry & extract to voltage_policy_single_rail_multi_step. - Added methods to forward single rail multi step data to PMU using below methods by assigning data read from VBIOS voltage_policy_single_rail_multi_step to nv_pmu_volt_volt_policy_sr_multi_step_boardobj_set interface. volt_construct_volt_policy_single_rail_multi_step() volt_policy_pmu_data_init_sr_multi_step() volt_policy_pmu_data_init_single_rail() construct_volt_policy_single_rail() Change-Id: I17bc8c320777191611365ee63274c38ffe5ecbf7 Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1660687 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/volt/volt_policy.c')
-rw-r--r--drivers/gpu/nvgpu/volt/volt_policy.c154
1 files changed, 149 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/volt/volt_policy.c b/drivers/gpu/nvgpu/volt/volt_policy.c
index 1e34b54f..6f53c721 100644
--- a/drivers/gpu/nvgpu/volt/volt_policy.c
+++ b/drivers/gpu/nvgpu/volt/volt_policy.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"), 5 * copy of this software and associated documentation files (the "Software"),
@@ -77,6 +77,97 @@ static u32 construct_volt_policy_split_rail(struct gk20a *g,
77 return status; 77 return status;
78} 78}
79 79
80static u32 construct_volt_policy_single_rail(struct gk20a *g,
81 struct boardobj **ppboardobj, u16 size, void *pArgs)
82{
83 struct voltage_policy_single_rail *ptmp_policy =
84 (struct voltage_policy_single_rail *)pArgs;
85 struct voltage_policy_single_rail *pvolt_policy = NULL;
86 u32 status = 0;
87
88 status = construct_volt_policy(g, ppboardobj, size, pArgs);
89 if (status)
90 return status;
91
92 pvolt_policy = (struct voltage_policy_single_rail *)*ppboardobj;
93
94 pvolt_policy->rail_idx = ptmp_policy->rail_idx;
95
96 return status;
97}
98
99static u32 volt_policy_pmu_data_init_single_rail(struct gk20a *g,
100 struct boardobj *pboardobj, struct nv_pmu_boardobj *ppmudata)
101{
102 u32 status = 0;
103 struct voltage_policy_single_rail *ppolicy;
104 struct nv_pmu_volt_volt_policy_sr_boardobj_set *pset;
105
106 status = volt_policy_pmu_data_init_super(g, pboardobj, ppmudata);
107 if (status)
108 goto done;
109
110 ppolicy = (struct voltage_policy_single_rail *)pboardobj;
111 pset = (struct nv_pmu_volt_volt_policy_sr_boardobj_set *)
112 ppmudata;
113 pset->rail_idx = ppolicy->rail_idx;
114
115done:
116 return status;
117}
118
119static u32 volt_policy_pmu_data_init_sr_multi_step(struct gk20a *g,
120 struct boardobj *pboardobj, struct nv_pmu_boardobj *ppmudata)
121{
122 u32 status = 0;
123 struct voltage_policy_single_rail_multi_step *ppolicy;
124 struct nv_pmu_volt_volt_policy_sr_multi_step_boardobj_set *pset;
125
126 status = volt_policy_pmu_data_init_single_rail(g, pboardobj, ppmudata);
127 if (status)
128 goto done;
129
130 ppolicy = (struct voltage_policy_single_rail_multi_step *)pboardobj;
131 pset = (struct nv_pmu_volt_volt_policy_sr_multi_step_boardobj_set *)
132 ppmudata;
133
134 pset->ramp_up_step_size_uv = ppolicy->ramp_up_step_size_uv;
135 pset->ramp_down_step_size_uv = ppolicy->ramp_down_step_size_uv;
136 pset->inter_switch_delay_us = ppolicy->inter_switch_delay_us;
137
138done:
139 return status;
140}
141
142static u32 volt_construct_volt_policy_single_rail_multi_step(struct gk20a *g,
143 struct boardobj **ppboardobj, u16 size, void *pargs)
144{
145 struct boardobj *pboardobj = NULL;
146 struct voltage_policy_single_rail_multi_step *p_volt_policy = NULL;
147 struct voltage_policy_single_rail_multi_step *tmp_policy =
148 (struct voltage_policy_single_rail_multi_step *)pargs;
149 u32 status = 0;
150
151 status = construct_volt_policy_single_rail(g, ppboardobj, size, pargs);
152 if (status)
153 return status;
154
155 pboardobj = (*ppboardobj);
156 p_volt_policy = (struct voltage_policy_single_rail_multi_step *)
157 *ppboardobj;
158
159 pboardobj->pmudatainit = volt_policy_pmu_data_init_sr_multi_step;
160
161 p_volt_policy->ramp_up_step_size_uv =
162 tmp_policy->ramp_up_step_size_uv;
163 p_volt_policy->ramp_down_step_size_uv =
164 tmp_policy->ramp_down_step_size_uv;
165 p_volt_policy->inter_switch_delay_us =
166 tmp_policy->inter_switch_delay_us;
167
168 return status;
169}
170
80static u32 volt_policy_pmu_data_init_split_rail(struct gk20a *g, 171static u32 volt_policy_pmu_data_init_split_rail(struct gk20a *g,
81 struct boardobj *pboardobj, struct nv_pmu_boardobj *ppmudata) 172 struct boardobj *pboardobj, struct nv_pmu_boardobj *ppmudata)
82{ 173{
@@ -128,8 +219,8 @@ static struct voltage_policy *volt_volt_policy_construct(struct gk20a *g, void *
128 struct boardobj *pboard_obj = NULL; 219 struct boardobj *pboard_obj = NULL;
129 u32 status = 0; 220 u32 status = 0;
130 221
131 if (BOARDOBJ_GET_TYPE(pargs) == 222 switch (BOARDOBJ_GET_TYPE(pargs)) {
132 CTRL_VOLT_POLICY_TYPE_SR_SINGLE_STEP) { 223 case CTRL_VOLT_POLICY_TYPE_SR_SINGLE_STEP:
133 status = volt_construct_volt_policy_split_rail_single_step(g, 224 status = volt_construct_volt_policy_split_rail_single_step(g,
134 &pboard_obj, 225 &pboard_obj,
135 sizeof(struct voltage_policy_split_rail_single_step), 226 sizeof(struct voltage_policy_split_rail_single_step),
@@ -137,8 +228,20 @@ static struct voltage_policy *volt_volt_policy_construct(struct gk20a *g, void *
137 if (status) { 228 if (status) {
138 nvgpu_err(g, 229 nvgpu_err(g,
139 "Could not allocate memory for voltage_policy"); 230 "Could not allocate memory for voltage_policy");
140 pboard_obj = NULL; 231 pboard_obj = NULL;
141 } 232 }
233 break;
234 case CTRL_VOLT_POLICY_TYPE_SINGLE_RAIL_MULTI_STEP:
235 status = volt_construct_volt_policy_single_rail_multi_step(g,
236 &pboard_obj,
237 sizeof(struct voltage_policy_single_rail_multi_step),
238 pargs);
239 if (status) {
240 nvgpu_err(g,
241 "Could not allocate memory for voltage_policy");
242 pboard_obj = NULL;
243 }
244 break;
142 } 245 }
143 246
144 return (struct voltage_policy *)pboard_obj; 247 return (struct voltage_policy *)pboard_obj;
@@ -155,6 +258,8 @@ static u8 volt_policy_type_convert(u8 vbios_type)
155 258
156 case NV_VBIOS_VOLTAGE_POLICY_1X_ENTRY_TYPE_SR_SINGLE_STEP: 259 case NV_VBIOS_VOLTAGE_POLICY_1X_ENTRY_TYPE_SR_SINGLE_STEP:
157 return CTRL_VOLT_POLICY_TYPE_SR_SINGLE_STEP; 260 return CTRL_VOLT_POLICY_TYPE_SR_SINGLE_STEP;
261 case NV_VBIOS_VOLTAGE_POLICY_1X_ENTRY_TYPE_SINGLE_RAIL_MULTI_STEP:
262 return CTRL_VOLT_POLICY_TYPE_SINGLE_RAIL_MULTI_STEP;
158 } 263 }
159 264
160 return CTRL_VOLT_POLICY_TYPE_INVALID; 265 return CTRL_VOLT_POLICY_TYPE_INVALID;
@@ -175,6 +280,7 @@ static u32 volt_get_volt_policy_table(struct gk20a *g,
175 struct boardobj board_obj; 280 struct boardobj board_obj;
176 struct voltage_policy volt_policy; 281 struct voltage_policy volt_policy;
177 struct voltage_policy_split_rail split_rail; 282 struct voltage_policy_split_rail split_rail;
283 struct voltage_policy_single_rail_multi_step single_rail_ms;
178 } policy_type_data; 284 } policy_type_data;
179 285
180 voltage_policy_table_ptr = 286 voltage_policy_table_ptr =
@@ -204,7 +310,8 @@ static u32 volt_get_volt_policy_table(struct gk20a *g,
204 310
205 policy_type = volt_policy_type_convert((u8)entry.type); 311 policy_type = volt_policy_type_convert((u8)entry.type);
206 312
207 if (policy_type == CTRL_VOLT_POLICY_TYPE_SR_SINGLE_STEP) { 313 switch (policy_type) {
314 case CTRL_VOLT_POLICY_TYPE_SR_SINGLE_STEP:
208 policy_type_data.split_rail.rail_idx_master = 315 policy_type_data.split_rail.rail_idx_master =
209 (u8)BIOS_GET_FIELD(entry.param0, 316 (u8)BIOS_GET_FIELD(entry.param0,
210 NV_VBIOS_VPT_ENTRY_PARAM0_SR_VD_MASTER); 317 NV_VBIOS_VPT_ENTRY_PARAM0_SR_VD_MASTER);
@@ -220,6 +327,18 @@ static u32 volt_get_volt_policy_table(struct gk20a *g,
220 policy_type_data.split_rail.delta_max_vfe_equ_idx = 327 policy_type_data.split_rail.delta_max_vfe_equ_idx =
221 (u8)BIOS_GET_FIELD(entry.param0, 328 (u8)BIOS_GET_FIELD(entry.param0,
222 NV_VBIOS_VPT_ENTRY_PARAM0_SR_DELTA_SM_MAX); 329 NV_VBIOS_VPT_ENTRY_PARAM0_SR_DELTA_SM_MAX);
330 break;
331 case CTRL_VOLT_POLICY_TYPE_SINGLE_RAIL_MULTI_STEP:
332 policy_type_data.single_rail_ms.inter_switch_delay_us =
333 (u16)BIOS_GET_FIELD(entry.param1,
334 NV_VBIOS_VPT_ENTRY_PARAM1_SR_SETTLE_TIME_INTERMEDIATE);
335 policy_type_data.single_rail_ms.ramp_up_step_size_uv =
336 (u32)BIOS_GET_FIELD(entry.param2,
337 NV_VBIOS_VPT_ENTRY_PARAM2_SR_RAMP_UP_STEP_SIZE_UV);
338 policy_type_data.single_rail_ms.ramp_down_step_size_uv =
339 (u32)BIOS_GET_FIELD(entry.param3,
340 NV_VBIOS_VPT_ENTRY_PARAM3_SR_RAMP_DOWN_STEP_SIZE_UV);
341 break;
223 } 342 }
224 343
225 policy_type_data.board_obj.type = policy_type; 344 policy_type_data.board_obj.type = policy_type;
@@ -286,6 +405,30 @@ static u32 _volt_policy_devgrp_pmustatus_instget(struct gk20a *g,
286 return 0; 405 return 0;
287} 406}
288 407
408static u32 _volt_policy_grp_pmudatainit_super(struct gk20a *g,
409 struct boardobjgrp *pboardobjgrp,
410 struct nv_pmu_boardobjgrp_super *pboardobjgrppmu)
411{
412 struct nv_pmu_volt_volt_policy_boardobjgrp_set_header *pset =
413 (struct nv_pmu_volt_volt_policy_boardobjgrp_set_header *)
414 pboardobjgrppmu;
415 struct obj_volt *volt = (struct obj_volt *)pboardobjgrp;
416 u32 status = 0;
417
418 status = boardobjgrp_pmudatainit_e32(g, pboardobjgrp, pboardobjgrppmu);
419 if (status) {
420 nvgpu_err(g,
421 "error updating pmu boardobjgrp for volt policy 0x%x",
422 status);
423 goto done;
424 }
425 pset->perf_core_vf_seq_policy_idx =
426 volt->volt_policy_metadata.perf_core_vf_seq_policy_idx;
427
428done:
429 return status;
430}
431
289u32 volt_policy_pmu_setup(struct gk20a *g) 432u32 volt_policy_pmu_setup(struct gk20a *g)
290{ 433{
291 u32 status; 434 u32 status;
@@ -326,6 +469,7 @@ u32 volt_policy_sw_setup(struct gk20a *g)
326 469
327 pboardobjgrp->pmudatainstget = _volt_policy_devgrp_pmudata_instget; 470 pboardobjgrp->pmudatainstget = _volt_policy_devgrp_pmudata_instget;
328 pboardobjgrp->pmustatusinstget = _volt_policy_devgrp_pmustatus_instget; 471 pboardobjgrp->pmustatusinstget = _volt_policy_devgrp_pmustatus_instget;
472 pboardobjgrp->pmudatainit = _volt_policy_grp_pmudatainit_super;
329 473
330 /* Obtain Voltage Rail Table from VBIOS */ 474 /* Obtain Voltage Rail Table from VBIOS */
331 status = volt_get_volt_policy_table(g, &g->perf_pmu.volt. 475 status = volt_get_volt_policy_table(g, &g->perf_pmu.volt.