diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk_vf_point.c | 79 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk_vf_point.h | 1 |
2 files changed, 78 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 | |||
346 | static 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 */ | ||
374 | u32 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 | } | ||
diff --git a/drivers/gpu/nvgpu/clk/clk_vf_point.h b/drivers/gpu/nvgpu/clk/clk_vf_point.h index b05ab818..306bec41 100644 --- a/drivers/gpu/nvgpu/clk/clk_vf_point.h +++ b/drivers/gpu/nvgpu/clk/clk_vf_point.h | |||
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | u32 clk_vf_point_sw_setup(struct gk20a *g); | 22 | u32 clk_vf_point_sw_setup(struct gk20a *g); |
23 | u32 clk_vf_point_pmu_setup(struct gk20a *g); | 23 | u32 clk_vf_point_pmu_setup(struct gk20a *g); |
24 | u32 clk_vf_point_cache(struct gk20a *g); | ||
24 | 25 | ||
25 | struct clk_vf_points { | 26 | struct clk_vf_points { |
26 | struct boardobjgrp_e255 super; | 27 | struct boardobjgrp_e255 super; |