summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/clk/clk_vf_point.c
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2016-08-30 07:18:38 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:56:50 -0500
commite28ef73ec9baea7df631606298f8c210dc8f31a8 (patch)
treeb5b497c96f30f8ae0b81ffd965879e70da8f50da /drivers/gpu/nvgpu/clk/clk_vf_point.c
parentc6e64649bbb30113c4cbd97f4e4217bab9f21429 (diff)
gpu: nvgpu: add support to cache VF table from PMU
JIRA DNVGPU-118 Change-Id: I5c6a919d18e6de077e03180ba70441cfc9791350 Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/1209849 (cherry picked from commit 469f35e3f65964a3402f7e0c49862bd44b68936a) Reviewed-on: http://git-master/r/1233040 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/clk/clk_vf_point.c')
-rw-r--r--drivers/gpu/nvgpu/clk/clk_vf_point.c79
1 files changed, 77 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk_vf_point.c b/drivers/gpu/nvgpu/clk/clk_vf_point.c
index a8cc6403..4fde7226 100644
--- a/drivers/gpu/nvgpu/clk/clk_vf_point.c
+++ b/drivers/gpu/nvgpu/clk/clk_vf_point.c
@@ -243,7 +243,7 @@ static u32 clk_vf_point_construct_volt(struct gk20a *g,
243 if (BOARDOBJ_GET_TYPE(pargs) != CTRL_CLK_CLK_VF_POINT_TYPE_VOLT) 243 if (BOARDOBJ_GET_TYPE(pargs) != CTRL_CLK_CLK_VF_POINT_TYPE_VOLT)
244 return -EINVAL; 244 return -EINVAL;
245 245
246 ptmpobj->type_mask |= BIT(CTRL_CLK_CLK_VF_POINT_TYPE_VOLT); 246 ptmpobj->type_mask = BIT(CTRL_CLK_CLK_VF_POINT_TYPE_VOLT);
247 status = clk_vf_point_construct_super(g, ppboardobj, size, pargs); 247 status = clk_vf_point_construct_super(g, ppboardobj, size, pargs);
248 if (status) 248 if (status)
249 return -EINVAL; 249 return -EINVAL;
@@ -271,7 +271,7 @@ static u32 clk_vf_point_construct_freq(struct gk20a *g,
271 if (BOARDOBJ_GET_TYPE(pargs) != CTRL_CLK_CLK_VF_POINT_TYPE_FREQ) 271 if (BOARDOBJ_GET_TYPE(pargs) != CTRL_CLK_CLK_VF_POINT_TYPE_FREQ)
272 return -EINVAL; 272 return -EINVAL;
273 273
274 ptmpobj->type_mask |= BIT(CTRL_CLK_CLK_VF_POINT_TYPE_FREQ); 274 ptmpobj->type_mask = BIT(CTRL_CLK_CLK_VF_POINT_TYPE_FREQ);
275 status = clk_vf_point_construct_super(g, ppboardobj, size, pargs); 275 status = clk_vf_point_construct_super(g, ppboardobj, size, pargs);
276 if (status) 276 if (status)
277 return -EINVAL; 277 return -EINVAL;
@@ -341,3 +341,78 @@ static u32 _clk_vf_point_pmudatainit_super(struct gk20a *g,
341 pset->volt_rail_idx = pclk_vf_point->volt_rail_idx; 341 pset->volt_rail_idx = pclk_vf_point->volt_rail_idx;
342 return status; 342 return status;
343} 343}
344
345
346static u32 clk_vf_point_update(struct gk20a *g,
347 struct boardobj *board_obj_ptr,
348 struct nv_pmu_boardobj *ppmudata)
349{
350 struct clk_vf_point *pclk_vf_point;
351 struct nv_pmu_clk_clk_vf_point_boardobj_get_status *pstatus;
352
353 gk20a_dbg_info("");
354
355
356 pclk_vf_point =
357 (struct clk_vf_point *)board_obj_ptr;
358
359 pstatus = (struct nv_pmu_clk_clk_vf_point_boardobj_get_status *)
360 ppmudata;
361
362 if (pstatus->super.type != pclk_vf_point->super.type) {
363 gk20a_err(dev_from_gk20a(g),
364 "pmu data and boardobj type not matching");
365 return -EINVAL;
366 }
367 /* now copy VF pair */
368 memcpy(&pclk_vf_point->pair, &pstatus->pair,
369 sizeof(struct ctrl_clk_vf_pair));
370 return 0;
371}
372
373/*get latest vf point data from PMU */
374u32 clk_vf_point_cache(struct gk20a *g)
375{
376
377 struct clk_vf_points *pclk_vf_points;
378 struct boardobjgrp *pboardobjgrp;
379 struct boardobjgrpmask *pboardobjgrpmask;
380 struct nv_pmu_boardobjgrp_super *pboardobjgrppmu;
381 struct boardobj *pboardobj = NULL;
382 struct nv_pmu_boardobj_query *pboardobjpmustatus = NULL;
383 u32 status;
384 u8 index;
385
386 gk20a_dbg_info("");
387 pclk_vf_points = &g->clk_pmu.clk_vf_pointobjs;
388 pboardobjgrp = &pclk_vf_points->super.super;
389 pboardobjgrpmask = &pclk_vf_points->super.mask.super;
390
391 status = pboardobjgrp->pmugetstatus(g, pboardobjgrp, pboardobjgrpmask);
392 if (status) {
393 gk20a_err(dev_from_gk20a(g), "err getting boardobjs from pmu");
394 return status;
395 }
396 pboardobjgrppmu = pboardobjgrp->pmu.getstatus.buf;
397
398 BOARDOBJGRP_FOR_EACH(pboardobjgrp, struct boardobj*, pboardobj, index) {
399 status = pboardobjgrp->pmustatusinstget(g,
400 (struct nv_pmu_boardobjgrp *)pboardobjgrppmu,
401 &pboardobjpmustatus, index);
402 if (status) {
403 gk20a_err(dev_from_gk20a(g),
404 "could not get status object instance");
405 return status;
406 }
407
408 status = clk_vf_point_update(g, pboardobj,
409 (struct nv_pmu_boardobj *)pboardobjpmustatus);
410 if (status) {
411 gk20a_err(dev_from_gk20a(g),
412 "invalid data from pmu at %d", index);
413 return status;
414 }
415 }
416
417 return 0;
418}