diff options
Diffstat (limited to 'drivers/gpu/nvgpu/boardobj')
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobjgrp.c | 59 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobjgrp.h | 2 |
2 files changed, 42 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: | |||
303 | u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) | 306 | u32 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 | |||
425 | boardobjgrp_pmugetstatus_exit: | 452 | boardobjgrp_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)) |