summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2016-08-30 07:15:11 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-10-07 04:36:19 -0400
commitf0ad41769fc8caa9be1586f1eeecc3e00cc0839f (patch)
tree2fa822d68fa09cd0f50b2bfa9f4a5c5ce646c910
parentd995dbc14c1f8861b7c565d898815e28e499c160 (diff)
gpu: nvgpu: fix getstatus support for boardobjgrp
JIRA DNVGPU-118 move vidmem allocation for pmuboardobj to cmd specific functions and do a copy of data from pmu incase of getstatus. fixes for getstatus boardobjgrp implementation and added one #define for rail id to make getstatus of vf table more meaningful Change-Id: I366a022c13e51e823116ce2354794babc48981a2 Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/1209841 (cherry picked from commit 8c12599f801decc77bbc1acfd1937dfefb21f35e) Reviewed-on: http://git-master/r/1231839 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/boardobj/boardobjgrp.c59
-rw-r--r--drivers/gpu/nvgpu/boardobj/boardobjgrp.h2
-rw-r--r--drivers/gpu/nvgpu/ctrl/ctrlvolt.h1
3 files changed, 43 insertions, 19 deletions
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c
index a3133273..577acda3 100644
--- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c
+++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c
@@ -173,6 +173,9 @@ u32 boardobjgrp_pmucmd_pmuinithandle_impl(struct gk20a *g,
173 goto boardobjgrp_pmucmd_pmuinithandle_exit; 173 goto boardobjgrp_pmucmd_pmuinithandle_exit;
174 174
175 gk20a_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize); 175 gk20a_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize);
176 /* we only have got sysmem later this will get copied to vidmem
177 surface*/
178 pcmd->surf.vidmem_desc.size = 0;
176 179
177 pcmd->buf = (struct nv_pmu_boardobjgrp_super *)sysmem_desc->cpu_va; 180 pcmd->buf = (struct nv_pmu_boardobjgrp_super *)sysmem_desc->cpu_va;
178 181
@@ -303,7 +306,7 @@ boardobjgrppmudatainit_super_done:
303u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) 306u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp)
304{ 307{
305 u32 status = 0; 308 u32 status = 0;
306 309 struct boardobjgrp_pmu_cmd *pcmd = &pboardobjgrp->pmu.set;
307 gk20a_dbg_info(""); 310 gk20a_dbg_info("");
308 311
309 if (pboardobjgrp == NULL) 312 if (pboardobjgrp == NULL)
@@ -321,9 +324,9 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp)
321 if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) 324 if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID)
322 return -EINVAL; 325 return -EINVAL;
323 326
324 if ((pboardobjgrp->pmu.set.hdrsize == 0) || 327 if ((pcmd->hdrsize == 0) ||
325 (pboardobjgrp->pmu.set.entrysize == 0) || 328 (pcmd->entrysize == 0) ||
326 (pboardobjgrp->pmu.set.buf == NULL)) 329 (pcmd->buf == NULL))
327 return -EINVAL; 330 return -EINVAL;
328 331
329 /* If no objects in the group, return early */ 332 /* If no objects in the group, return early */
@@ -331,9 +334,9 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp)
331 return -EINVAL; 334 return -EINVAL;
332 335
333 /* Initialize PMU buffer with BOARDOBJGRP data. */ 336 /* Initialize PMU buffer with BOARDOBJGRP data. */
334 memset(pboardobjgrp->pmu.set.buf, 0x0, pboardobjgrp->pmu.set.fbsize); 337 memset(pcmd->buf, 0x0, pcmd->fbsize);
335 status = pboardobjgrp->pmudatainit(g, pboardobjgrp, 338 status = pboardobjgrp->pmudatainit(g, pboardobjgrp,
336 pboardobjgrp->pmu.set.buf); 339 pcmd->buf);
337 if (status) { 340 if (status) {
338 gk20a_err(dev_from_gk20a(g), 341 gk20a_err(dev_from_gk20a(g),
339 "could not parse pmu data"); 342 "could not parse pmu data");
@@ -346,9 +349,19 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp)
346 */ 349 */
347 pboardobjgrp->pmu.bset = false; 350 pboardobjgrp->pmu.bset = false;
348 351
352 /*
353 * alloc mem in vidmem & copy constructed pmu boardobjgrp data from
354 * sysmem to vidmem
355 */
356 if (pcmd->surf.vidmem_desc.size == 0) {
357 gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc,
358 pcmd->fbsize);
359 }
360 gk20a_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize);
361
349 /* Send the SET PMU CMD to the PMU */ 362 /* Send the SET PMU CMD to the PMU */
350 status = boardobjgrp_pmucmdsend(g, pboardobjgrp, 363 status = boardobjgrp_pmucmdsend(g, pboardobjgrp,
351 &pboardobjgrp->pmu.set); 364 pcmd);
352 if (status) { 365 if (status) {
353 gk20a_err(dev_from_gk20a(g), "could not send SET CMD to PMU"); 366 gk20a_err(dev_from_gk20a(g), "could not send SET CMD to PMU");
354 goto boardobjgrp_pmuset_exit; 367 goto boardobjgrp_pmuset_exit;
@@ -365,6 +378,8 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp,
365 struct boardobjgrpmask *mask) 378 struct boardobjgrpmask *mask)
366{ 379{
367 u32 status = 0; 380 u32 status = 0;
381 struct boardobjgrp_pmu_cmd *pcmd = &pboardobjgrp->pmu.getstatus;
382 struct boardobjgrp_pmu_cmd *pset = &pboardobjgrp->pmu.set;
368 383
369 gk20a_dbg_info(""); 384 gk20a_dbg_info("");
370 385
@@ -383,9 +398,9 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp,
383 if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) 398 if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID)
384 return -EINVAL; 399 return -EINVAL;
385 400
386 if ((pboardobjgrp->pmu.set.hdrsize == 0) || 401 if ((pcmd->hdrsize == 0) ||
387 (pboardobjgrp->pmu.set.entrysize == 0) || 402 (pcmd->entrysize == 0) ||
388 (pboardobjgrp->pmu.set.buf == NULL)) 403 (pcmd->buf == NULL))
389 return -EINVAL; 404 return -EINVAL;
390 405
391 /* If no objects in the group, return early */ 406 /* If no objects in the group, return early */
@@ -400,19 +415,28 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp,
400 return -EINVAL; 415 return -EINVAL;
401 416
402 /* 417 /*
418 * alloc mem in vidmem & copy constructed pmu boardobjgrp data from
419 * sysmem to vidmem
420 */
421 if (pcmd->surf.vidmem_desc.size == 0) {
422 gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc,
423 pcmd->fbsize);
424 }
425
426 /*
403 * Initialize PMU buffer with the mask of BOARDOBJGRPs for which to 427 * Initialize PMU buffer with the mask of BOARDOBJGRPs for which to
404 * retrieve status 428 * retrieve status
405 */ 429 */
406 430
407 memset(pboardobjgrp->pmu.getstatus.buf, 0x0, 431 memset(pcmd->buf, 0x0, pcmd->fbsize);
408 pboardobjgrp->pmu.getstatus.fbsize);
409 status = pboardobjgrp->pmuhdrdatainit(g, pboardobjgrp, 432 status = pboardobjgrp->pmuhdrdatainit(g, pboardobjgrp,
410 pboardobjgrp->pmu.getstatus.buf, mask); 433 pcmd->buf, mask);
411 if (status) { 434 if (status) {
412 gk20a_err(dev_from_gk20a(g), "could not init PMU HDR data"); 435 gk20a_err(dev_from_gk20a(g), "could not init PMU HDR data");
413 goto boardobjgrp_pmugetstatus_exit; 436 goto boardobjgrp_pmugetstatus_exit;
414 } 437 }
415 438
439 gk20a_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pset->buf, pset->hdrsize);
416 /* Send the GET_STATUS PMU CMD to the PMU */ 440 /* Send the GET_STATUS PMU CMD to the PMU */
417 status = boardobjgrp_pmucmdsend(g, pboardobjgrp, 441 status = boardobjgrp_pmucmdsend(g, pboardobjgrp,
418 &pboardobjgrp->pmu.getstatus); 442 &pboardobjgrp->pmu.getstatus);
@@ -422,6 +446,9 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp,
422 goto boardobjgrp_pmugetstatus_exit; 446 goto boardobjgrp_pmugetstatus_exit;
423 } 447 }
424 448
449 /*copy the data back to sysmem buffer that belongs to command*/
450 gk20a_mem_rd_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize);
451
425boardobjgrp_pmugetstatus_exit: 452boardobjgrp_pmugetstatus_exit:
426 return status; 453 return status;
427} 454}
@@ -651,14 +678,10 @@ static u32 boardobjgrp_pmucmdsend(struct gk20a *g,
651 pgrpcmd->grp.entry_size = pcmd->entrysize; 678 pgrpcmd->grp.entry_size = pcmd->entrysize;
652 679
653 /* 680 /*
654 * alloc mem in vidmem & copy constructed pmu boardobjgrp data from 681 * copy vidmem information to boardobj_cmd_grp
655 * sysmem to vidmem
656 */ 682 */
657 gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc,
658 pcmd->fbsize);
659 gk20a_pmu_surface_describe(g, &pcmd->surf.vidmem_desc, 683 gk20a_pmu_surface_describe(g, &pcmd->surf.vidmem_desc,
660 &pgrpcmd->grp.fb); 684 &pgrpcmd->grp.fb);
661 gk20a_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize);
662 685
663 /* 686 /*
664 * PMU reads command from sysmem so assigned 687 * PMU reads command from sysmem so assigned
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h
index e98a6cdb..6527bbdc 100644
--- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h
+++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h
@@ -310,7 +310,7 @@ do { \
310 pboardobjgrp, /* pBoardObjGrp */ \ 310 pboardobjgrp, /* pBoardObjGrp */ \
311 &((pboardobjgrp)->pmu.getstatus), /* pCmd */ \ 311 &((pboardobjgrp)->pmu.getstatus), /* pCmd */ \
312 NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_GET_STATUS, /* id */ \ 312 NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_GET_STATUS, /* id */ \
313 NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_SET, /* msgid */ \ 313 NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_GET_STATUS, /* msgid */ \
314 (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_get_status_header_aligned), \ 314 (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_get_status_header_aligned), \
315 (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_get_status_union_aligned), \ 315 (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_get_status_union_aligned), \
316 (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_get_status)) 316 (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_get_status))
diff --git a/drivers/gpu/nvgpu/ctrl/ctrlvolt.h b/drivers/gpu/nvgpu/ctrl/ctrlvolt.h
index b4769a18..90a3bd89 100644
--- a/drivers/gpu/nvgpu/ctrl/ctrlvolt.h
+++ b/drivers/gpu/nvgpu/ctrl/ctrlvolt.h
@@ -25,6 +25,7 @@
25#define CTRL_VOLT_VOLT_DEV_VID_VSEL_MAX_ENTRIES (8) 25#define CTRL_VOLT_VOLT_DEV_VID_VSEL_MAX_ENTRIES (8)
26#define CTRL_VOLT_DOMAIN_INVALID 0x00 26#define CTRL_VOLT_DOMAIN_INVALID 0x00
27#define CTRL_VOLT_DOMAIN_LOGIC 0x01 27#define CTRL_VOLT_DOMAIN_LOGIC 0x01
28#define CLK_PROG_VFE_ENTRY_LOGIC 0x00
28 29
29struct ctrl_volt_volt_rail_list_item { 30struct ctrl_volt_volt_rail_list_item {
30 u8 rail_idx; 31 u8 rail_idx;