diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobjgrp.c | 259 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobjgrp.h | 44 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/pmu/pmu_fw.c | 16 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 15 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifboardobj.h | 28 |
5 files changed, 319 insertions, 43 deletions
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c index caed11e9..f20b4a78 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c +++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c | |||
@@ -35,6 +35,10 @@ static boardobjgrp_pmustatusinstget boardobjgrp_pmustatusinstget_stub; | |||
35 | static u32 boardobjgrp_pmucmdsend(struct gk20a *g, | 35 | static u32 boardobjgrp_pmucmdsend(struct gk20a *g, |
36 | struct boardobjgrp *pboardobjgrp, | 36 | struct boardobjgrp *pboardobjgrp, |
37 | struct boardobjgrp_pmu_cmd *pcmd); | 37 | struct boardobjgrp_pmu_cmd *pcmd); |
38 | static u32 boardobjgrp_pmucmdsend_rpc(struct gk20a *g, | ||
39 | struct boardobjgrp *pboardobjgrp, | ||
40 | struct boardobjgrp_pmu_cmd *pcmd, | ||
41 | bool copy_out); | ||
38 | struct boardobjgrp_pmucmdhandler_params { | 42 | struct boardobjgrp_pmucmdhandler_params { |
39 | /* Pointer to the BOARDOBJGRP associated with this CMD */ | 43 | /* Pointer to the BOARDOBJGRP associated with this CMD */ |
40 | struct boardobjgrp *pboardobjgrp; | 44 | struct boardobjgrp *pboardobjgrp; |
@@ -63,6 +67,8 @@ u32 boardobjgrp_construct_super(struct gk20a *g, struct boardobjgrp *pboardobjgr | |||
63 | pboardobjgrp->classid = 0; | 67 | pboardobjgrp->classid = 0; |
64 | pboardobjgrp->pmu.unitid = BOARDOBJGRP_UNIT_ID_INVALID; | 68 | pboardobjgrp->pmu.unitid = BOARDOBJGRP_UNIT_ID_INVALID; |
65 | pboardobjgrp->pmu.classid = BOARDOBJGRP_GRP_CLASS_ID_INVALID; | 69 | pboardobjgrp->pmu.classid = BOARDOBJGRP_GRP_CLASS_ID_INVALID; |
70 | pboardobjgrp->pmu.bset = false; | ||
71 | pboardobjgrp->pmu.rpc_func_id = BOARDOBJGRP_GRP_RPC_FUNC_ID_INVALID; | ||
66 | pboardobjgrp->pmu.set.id = BOARDOBJGRP_GRP_CMD_ID_INVALID; | 72 | pboardobjgrp->pmu.set.id = BOARDOBJGRP_GRP_CMD_ID_INVALID; |
67 | pboardobjgrp->pmu.getstatus.id = BOARDOBJGRP_GRP_CMD_ID_INVALID; | 73 | pboardobjgrp->pmu.getstatus.id = BOARDOBJGRP_GRP_CMD_ID_INVALID; |
68 | 74 | ||
@@ -77,8 +83,10 @@ u32 boardobjgrp_construct_super(struct gk20a *g, struct boardobjgrp *pboardobjgr | |||
77 | pboardobjgrp->pmuinithandle = boardobjgrp_pmuinithandle_impl; | 83 | pboardobjgrp->pmuinithandle = boardobjgrp_pmuinithandle_impl; |
78 | pboardobjgrp->pmuhdrdatainit = boardobjgrp_pmuhdrdatainit_super; | 84 | pboardobjgrp->pmuhdrdatainit = boardobjgrp_pmuhdrdatainit_super; |
79 | pboardobjgrp->pmudatainit = boardobjgrp_pmudatainit_super; | 85 | pboardobjgrp->pmudatainit = boardobjgrp_pmudatainit_super; |
80 | pboardobjgrp->pmuset = boardobjgrp_pmuset_impl; | 86 | pboardobjgrp->pmuset = |
81 | pboardobjgrp->pmugetstatus = boardobjgrp_pmugetstatus_impl; | 87 | g->ops.pmu_ver.boardobj.boardobjgrp_pmuset_impl; |
88 | pboardobjgrp->pmugetstatus = | ||
89 | g->ops.pmu_ver.boardobj.boardobjgrp_pmugetstatus_impl; | ||
82 | 90 | ||
83 | pboardobjgrp->pmudatainstget = boardobjgrp_pmudatainstget_stub; | 91 | pboardobjgrp->pmudatainstget = boardobjgrp_pmudatainstget_stub; |
84 | pboardobjgrp->pmustatusinstget = boardobjgrp_pmustatusinstget_stub; | 92 | pboardobjgrp->pmustatusinstget = boardobjgrp_pmustatusinstget_stub; |
@@ -155,7 +163,7 @@ u32 boardobjgrp_destruct_super(struct boardobjgrp *pboardobjgrp) | |||
155 | 163 | ||
156 | u32 boardobjgrp_pmucmd_construct_impl(struct gk20a *g, struct boardobjgrp | 164 | u32 boardobjgrp_pmucmd_construct_impl(struct gk20a *g, struct boardobjgrp |
157 | *pboardobjgrp, struct boardobjgrp_pmu_cmd *cmd, u8 id, u8 msgid, | 165 | *pboardobjgrp, struct boardobjgrp_pmu_cmd *cmd, u8 id, u8 msgid, |
158 | u8 hdrsize, u8 entrysize, u16 fbsize) | 166 | u8 hdrsize, u8 entrysize, u16 fbsize, u32 ss_offset, u8 rpc_func_id) |
159 | { | 167 | { |
160 | gk20a_dbg_info(""); | 168 | gk20a_dbg_info(""); |
161 | 169 | ||
@@ -169,6 +177,22 @@ u32 boardobjgrp_pmucmd_construct_impl(struct gk20a *g, struct boardobjgrp | |||
169 | return 0; | 177 | return 0; |
170 | } | 178 | } |
171 | 179 | ||
180 | u32 boardobjgrp_pmucmd_construct_impl_v1(struct gk20a *g, struct boardobjgrp | ||
181 | *pboardobjgrp, struct boardobjgrp_pmu_cmd *cmd, u8 id, u8 msgid, | ||
182 | u8 hdrsize, u8 entrysize, u16 fbsize, u32 ss_offset, u8 rpc_func_id) | ||
183 | { | ||
184 | nvgpu_log_fn(g, " "); | ||
185 | |||
186 | /* Copy the parameters into the CMD*/ | ||
187 | cmd->dmem_buffer_size = ((hdrsize > entrysize) ? hdrsize : entrysize); | ||
188 | cmd->super_surface_offset = ss_offset; | ||
189 | pboardobjgrp->pmu.rpc_func_id = rpc_func_id; | ||
190 | cmd->fbsize = fbsize; | ||
191 | |||
192 | nvgpu_log_fn(g, "DONE"); | ||
193 | return 0; | ||
194 | } | ||
195 | |||
172 | u32 boardobjgrp_pmucmd_destroy_impl(struct gk20a *g, | 196 | u32 boardobjgrp_pmucmd_destroy_impl(struct gk20a *g, |
173 | struct boardobjgrp_pmu_cmd *cmd) | 197 | struct boardobjgrp_pmu_cmd *cmd) |
174 | { | 198 | { |
@@ -178,6 +202,31 @@ u32 boardobjgrp_pmucmd_destroy_impl(struct gk20a *g, | |||
178 | return 0; | 202 | return 0; |
179 | } | 203 | } |
180 | 204 | ||
205 | int is_boardobjgrp_pmucmd_id_valid_v0(struct gk20a *g, | ||
206 | struct boardobjgrp *pboardobjgrp, | ||
207 | struct boardobjgrp_pmu_cmd *pcmd) | ||
208 | { | ||
209 | int err = 0; | ||
210 | |||
211 | if (pcmd->id == BOARDOBJGRP_GRP_CMD_ID_INVALID) | ||
212 | err = -EINVAL; | ||
213 | |||
214 | return err; | ||
215 | } | ||
216 | |||
217 | int is_boardobjgrp_pmucmd_id_valid_v1(struct gk20a *g, | ||
218 | struct boardobjgrp *pboardobjgrp, | ||
219 | struct boardobjgrp_pmu_cmd *cmd) | ||
220 | { | ||
221 | int err = 0; | ||
222 | |||
223 | if (pboardobjgrp->pmu.rpc_func_id == | ||
224 | BOARDOBJGRP_GRP_RPC_FUNC_ID_INVALID) | ||
225 | err = -EINVAL; | ||
226 | |||
227 | return err; | ||
228 | } | ||
229 | |||
181 | u32 boardobjgrp_pmucmd_pmuinithandle_impl(struct gk20a *g, | 230 | u32 boardobjgrp_pmucmd_pmuinithandle_impl(struct gk20a *g, |
182 | struct boardobjgrp *pboardobjgrp, | 231 | struct boardobjgrp *pboardobjgrp, |
183 | struct boardobjgrp_pmu_cmd *pcmd) | 232 | struct boardobjgrp_pmu_cmd *pcmd) |
@@ -187,7 +236,8 @@ u32 boardobjgrp_pmucmd_pmuinithandle_impl(struct gk20a *g, | |||
187 | 236 | ||
188 | gk20a_dbg_info(""); | 237 | gk20a_dbg_info(""); |
189 | 238 | ||
190 | if (pcmd->id == BOARDOBJGRP_GRP_CMD_ID_INVALID) | 239 | if (g->ops.pmu_ver.boardobj.is_boardobjgrp_pmucmd_id_valid(g, |
240 | pboardobjgrp, pcmd)) | ||
191 | goto boardobjgrp_pmucmd_pmuinithandle_exit; | 241 | goto boardobjgrp_pmucmd_pmuinithandle_exit; |
192 | 242 | ||
193 | nvgpu_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize); | 243 | nvgpu_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize); |
@@ -223,7 +273,8 @@ u32 boardobjgrp_pmuinithandle_impl(struct gk20a *g, | |||
223 | } | 273 | } |
224 | 274 | ||
225 | /* If the GRP_SET CMD has not been allocated, nothing left to do. */ | 275 | /* If the GRP_SET CMD has not been allocated, nothing left to do. */ |
226 | if (((pboardobjgrp->pmu.set.id) == BOARDOBJGRP_GRP_CMD_ID_INVALID) || | 276 | if ((g->ops.pmu_ver.boardobj.is_boardobjgrp_pmucmd_id_valid(g, |
277 | pboardobjgrp, &pboardobjgrp->pmu.set))|| | ||
227 | (BOARDOBJGRP_IS_EMPTY(pboardobjgrp))) | 278 | (BOARDOBJGRP_IS_EMPTY(pboardobjgrp))) |
228 | goto boardobjgrp_pmuinithandle_exit; | 279 | goto boardobjgrp_pmuinithandle_exit; |
229 | 280 | ||
@@ -369,12 +420,9 @@ boardobjgrppmudatainit_super_done: | |||
369 | return status; | 420 | return status; |
370 | } | 421 | } |
371 | 422 | ||
372 | u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) | 423 | static int check_boardobjgrp_param(struct gk20a *g, |
424 | struct boardobjgrp *pboardobjgrp) | ||
373 | { | 425 | { |
374 | u32 status = 0; | ||
375 | struct boardobjgrp_pmu_cmd *pcmd = &pboardobjgrp->pmu.set; | ||
376 | gk20a_dbg_info(""); | ||
377 | |||
378 | if (pboardobjgrp == NULL) | 426 | if (pboardobjgrp == NULL) |
379 | return -EINVAL; | 427 | return -EINVAL; |
380 | 428 | ||
@@ -387,6 +435,24 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) | |||
387 | if (pboardobjgrp->pmu.classid == BOARDOBJGRP_GRP_CLASS_ID_INVALID) | 435 | if (pboardobjgrp->pmu.classid == BOARDOBJGRP_GRP_CLASS_ID_INVALID) |
388 | return -EINVAL; | 436 | return -EINVAL; |
389 | 437 | ||
438 | /* If no objects in the group, return early */ | ||
439 | if (BOARDOBJGRP_IS_EMPTY(pboardobjgrp)) | ||
440 | return -EINVAL; | ||
441 | |||
442 | return 0; | ||
443 | } | ||
444 | |||
445 | u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) | ||
446 | { | ||
447 | u32 status = 0; | ||
448 | struct boardobjgrp_pmu_cmd *pcmd = | ||
449 | (struct boardobjgrp_pmu_cmd *)(&pboardobjgrp->pmu.set); | ||
450 | |||
451 | gk20a_dbg_info(""); | ||
452 | |||
453 | if (check_boardobjgrp_param(g, pboardobjgrp)) | ||
454 | return -EINVAL; | ||
455 | |||
390 | if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) | 456 | if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) |
391 | return -EINVAL; | 457 | return -EINVAL; |
392 | 458 | ||
@@ -395,10 +461,6 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) | |||
395 | (pcmd->buf == NULL)) | 461 | (pcmd->buf == NULL)) |
396 | return -EINVAL; | 462 | return -EINVAL; |
397 | 463 | ||
398 | /* If no objects in the group, return early */ | ||
399 | if (BOARDOBJGRP_IS_EMPTY(pboardobjgrp)) | ||
400 | return -EINVAL; | ||
401 | |||
402 | /* Initialize PMU buffer with BOARDOBJGRP data. */ | 464 | /* Initialize PMU buffer with BOARDOBJGRP data. */ |
403 | memset(pcmd->buf, 0x0, pcmd->fbsize); | 465 | memset(pcmd->buf, 0x0, pcmd->fbsize); |
404 | status = pboardobjgrp->pmudatainit(g, pboardobjgrp, | 466 | status = pboardobjgrp->pmudatainit(g, pboardobjgrp, |
@@ -438,29 +500,76 @@ boardobjgrp_pmuset_exit: | |||
438 | return status; | 500 | return status; |
439 | } | 501 | } |
440 | 502 | ||
441 | u32 | 503 | u32 boardobjgrp_pmuset_impl_v1(struct gk20a *g, struct boardobjgrp *pboardobjgrp) |
442 | boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, | ||
443 | struct boardobjgrpmask *mask) | ||
444 | { | 504 | { |
445 | u32 status = 0; | 505 | struct nvgpu_pmu *pmu = &g->pmu; |
446 | struct boardobjgrp_pmu_cmd *pcmd = &pboardobjgrp->pmu.getstatus; | 506 | u32 status = 0; |
447 | struct boardobjgrp_pmu_cmd *pset = &pboardobjgrp->pmu.set; | 507 | struct boardobjgrp_pmu_cmd *pcmd = |
508 | (struct boardobjgrp_pmu_cmd *)(&pboardobjgrp->pmu.set); | ||
448 | 509 | ||
449 | gk20a_dbg_info(""); | 510 | gk20a_dbg_info(""); |
450 | 511 | ||
451 | if (pboardobjgrp == NULL) | 512 | if (check_boardobjgrp_param(g, pboardobjgrp)) |
452 | return -EINVAL; | 513 | return -EINVAL; |
453 | 514 | ||
454 | if (!pboardobjgrp->bconstructed) | 515 | if ((pcmd->buf == NULL) && |
516 | (pboardobjgrp->pmu.rpc_func_id == | ||
517 | BOARDOBJGRP_GRP_RPC_FUNC_ID_INVALID)) | ||
455 | return -EINVAL; | 518 | return -EINVAL; |
456 | 519 | ||
457 | if (pboardobjgrp->pmu.unitid == BOARDOBJGRP_UNIT_ID_INVALID) | 520 | /* Initialize PMU buffer with BOARDOBJGRP data. */ |
458 | return -EINVAL; | 521 | memset(pcmd->buf, 0x0, pcmd->fbsize); |
522 | status = pboardobjgrp->pmudatainit(g, pboardobjgrp, | ||
523 | pcmd->buf); | ||
524 | if (status) { | ||
525 | nvgpu_err(g, "could not parse pmu data"); | ||
526 | goto boardobjgrp_pmuset_exit; | ||
527 | } | ||
459 | 528 | ||
460 | if (pboardobjgrp->pmu.classid == BOARDOBJGRP_GRP_CLASS_ID_INVALID) | 529 | /* |
530 | * Reset the boolean that indicates set status | ||
531 | * for most recent instance of BOARDOBJGRP. | ||
532 | */ | ||
533 | pboardobjgrp->pmu.bset = false; | ||
534 | |||
535 | /* | ||
536 | * copy constructed pmu boardobjgrp data from | ||
537 | * sysmem to pmu super surface present in FB | ||
538 | */ | ||
539 | nvgpu_mem_wr_n(g, &pmu->super_surface_buf, | ||
540 | pcmd->super_surface_offset, pcmd->buf, | ||
541 | pcmd->fbsize); | ||
542 | |||
543 | /* Send the SET PMU CMD to the PMU using RPC*/ | ||
544 | status = boardobjgrp_pmucmdsend_rpc(g, pboardobjgrp, | ||
545 | pcmd, false); | ||
546 | if (status) { | ||
547 | nvgpu_err(g, "could not send SET CMD to PMU"); | ||
548 | goto boardobjgrp_pmuset_exit; | ||
549 | } | ||
550 | |||
551 | pboardobjgrp->pmu.bset = true; | ||
552 | |||
553 | boardobjgrp_pmuset_exit: | ||
554 | return status; | ||
555 | } | ||
556 | |||
557 | u32 | ||
558 | boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, | ||
559 | struct boardobjgrpmask *mask) | ||
560 | { | ||
561 | u32 status = 0; | ||
562 | struct boardobjgrp_pmu_cmd *pcmd = | ||
563 | (struct boardobjgrp_pmu_cmd *)(&pboardobjgrp->pmu.getstatus); | ||
564 | struct boardobjgrp_pmu_cmd *pset = | ||
565 | (struct boardobjgrp_pmu_cmd *)(&pboardobjgrp->pmu.set); | ||
566 | |||
567 | gk20a_dbg_info(""); | ||
568 | |||
569 | if (check_boardobjgrp_param(g, pboardobjgrp)) | ||
461 | return -EINVAL; | 570 | return -EINVAL; |
462 | 571 | ||
463 | if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) | 572 | if (pset->id == BOARDOBJGRP_GRP_CMD_ID_INVALID) |
464 | return -EINVAL; | 573 | return -EINVAL; |
465 | 574 | ||
466 | if ((pcmd->hdrsize == 0) || | 575 | if ((pcmd->hdrsize == 0) || |
@@ -468,10 +577,6 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, | |||
468 | (pcmd->buf == NULL)) | 577 | (pcmd->buf == NULL)) |
469 | return -EINVAL; | 578 | return -EINVAL; |
470 | 579 | ||
471 | /* If no objects in the group, return early */ | ||
472 | if (BOARDOBJGRP_IS_EMPTY(pboardobjgrp)) | ||
473 | return -EINVAL; | ||
474 | |||
475 | /* | 580 | /* |
476 | * Can only GET_STATUS if the BOARDOBJGRP has been previously SET to the | 581 | * Can only GET_STATUS if the BOARDOBJGRP has been previously SET to the |
477 | * PMU | 582 | * PMU |
@@ -517,6 +622,66 @@ boardobjgrp_pmugetstatus_exit: | |||
517 | return status; | 622 | return status; |
518 | } | 623 | } |
519 | 624 | ||
625 | u32 | ||
626 | boardobjgrp_pmugetstatus_impl_v1(struct gk20a *g, struct boardobjgrp *pboardobjgrp, | ||
627 | struct boardobjgrpmask *mask) | ||
628 | { | ||
629 | struct nvgpu_pmu *pmu = &g->pmu; | ||
630 | u32 status = 0; | ||
631 | struct boardobjgrp_pmu_cmd *pcmd = | ||
632 | (struct boardobjgrp_pmu_cmd *)(&pboardobjgrp->pmu.getstatus); | ||
633 | |||
634 | gk20a_dbg_info(""); | ||
635 | |||
636 | if (check_boardobjgrp_param(g, pboardobjgrp)) | ||
637 | return -EINVAL; | ||
638 | |||
639 | if ((pcmd->buf == NULL) && | ||
640 | (pboardobjgrp->pmu.rpc_func_id == | ||
641 | BOARDOBJGRP_GRP_RPC_FUNC_ID_INVALID)) | ||
642 | return -EINVAL; | ||
643 | |||
644 | /* | ||
645 | * Can only GET_STATUS if the BOARDOBJGRP has been | ||
646 | * previously SET to the PMU | ||
647 | */ | ||
648 | if (!pboardobjgrp->pmu.bset) | ||
649 | return -EINVAL; | ||
650 | |||
651 | /* | ||
652 | * Initialize PMU buffer with the mask of | ||
653 | * BOARDOBJGRPs for which to retrieve status | ||
654 | */ | ||
655 | memset(pcmd->buf, 0x0, pcmd->fbsize); | ||
656 | status = pboardobjgrp->pmuhdrdatainit(g, pboardobjgrp, | ||
657 | pcmd->buf, mask); | ||
658 | if (status) { | ||
659 | nvgpu_err(g, "could not init PMU HDR data"); | ||
660 | goto boardobjgrp_pmugetstatus_exit; | ||
661 | } | ||
662 | |||
663 | /* | ||
664 | * copy constructed pmu boardobjgrp data from | ||
665 | * sysmem to pmu super surface present in FB | ||
666 | */ | ||
667 | nvgpu_mem_wr_n(g, &pmu->super_surface_buf, pcmd->super_surface_offset, | ||
668 | pcmd->buf, pcmd->fbsize); | ||
669 | /* Send the GET_STATUS PMU CMD to the PMU */ | ||
670 | status = boardobjgrp_pmucmdsend_rpc(g, pboardobjgrp, | ||
671 | pcmd, true); | ||
672 | if (status) { | ||
673 | nvgpu_err(g, "could not send GET_STATUS cmd to PMU"); | ||
674 | goto boardobjgrp_pmugetstatus_exit; | ||
675 | } | ||
676 | |||
677 | /*copy the data back to sysmem buffer that belongs to command*/ | ||
678 | nvgpu_mem_rd_n(g, &pmu->super_surface_buf,pcmd->super_surface_offset, | ||
679 | pcmd->buf, pcmd->fbsize); | ||
680 | |||
681 | boardobjgrp_pmugetstatus_exit: | ||
682 | return status; | ||
683 | } | ||
684 | |||
520 | static u32 | 685 | static u32 |
521 | boardobjgrp_objinsert_final(struct boardobjgrp *pboardobjgrp, | 686 | boardobjgrp_objinsert_final(struct boardobjgrp *pboardobjgrp, |
522 | struct boardobj *pboardobj, u8 index) | 687 | struct boardobj *pboardobj, u8 index) |
@@ -785,3 +950,37 @@ static u32 boardobjgrp_pmucmdsend(struct gk20a *g, | |||
785 | boardobjgrp_pmucmdsend_exit: | 950 | boardobjgrp_pmucmdsend_exit: |
786 | return status; | 951 | return status; |
787 | } | 952 | } |
953 | |||
954 | static u32 boardobjgrp_pmucmdsend_rpc(struct gk20a *g, | ||
955 | struct boardobjgrp *pboardobjgrp, | ||
956 | struct boardobjgrp_pmu_cmd *pcmd, | ||
957 | bool copy_out) | ||
958 | { | ||
959 | struct nvgpu_pmu *pmu = &g->pmu; | ||
960 | struct nv_pmu_rpc_struct_board_obj_grp_cmd rpc; | ||
961 | int status = 0; | ||
962 | |||
963 | nvgpu_log_fn(g, " "); | ||
964 | |||
965 | memset(&rpc, 0, sizeof(struct nv_pmu_rpc_struct_board_obj_grp_cmd)); | ||
966 | |||
967 | rpc.class_id = pboardobjgrp->pmu.classid; | ||
968 | rpc.command_id = copy_out ? | ||
969 | NV_PMU_BOARDOBJGRP_CMD_GET_STATUS : | ||
970 | NV_PMU_BOARDOBJGRP_CMD_SET; | ||
971 | |||
972 | rpc.hdr.unit_id = pboardobjgrp->pmu.unitid; | ||
973 | rpc.hdr.function = pboardobjgrp->pmu.rpc_func_id; | ||
974 | rpc.hdr.flags = 0x0; | ||
975 | |||
976 | status = nvgpu_pmu_rpc_execute(pmu, &(rpc.hdr), | ||
977 | (sizeof(rpc) - sizeof(rpc.scratch)), | ||
978 | pcmd->dmem_buffer_size, | ||
979 | NULL, NULL); | ||
980 | |||
981 | if (status) { | ||
982 | nvgpu_err(g, "Failed to execute RPC, status=0x%x", status); | ||
983 | } | ||
984 | |||
985 | return status; | ||
986 | } | ||
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h index 32e92ae0..f5701293 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h +++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h | |||
@@ -123,7 +123,9 @@ struct boardobjgrp_pmu_cmd { | |||
123 | u8 msgid; | 123 | u8 msgid; |
124 | u8 hdrsize; | 124 | u8 hdrsize; |
125 | u8 entrysize; | 125 | u8 entrysize; |
126 | u16 fbsize; | 126 | u16 dmem_buffer_size; |
127 | u32 super_surface_offset; | ||
128 | u32 fbsize; | ||
127 | struct nv_pmu_boardobjgrp_super *buf; | 129 | struct nv_pmu_boardobjgrp_super *buf; |
128 | struct pmu_surface surf; | 130 | struct pmu_surface surf; |
129 | }; | 131 | }; |
@@ -136,6 +138,7 @@ struct boardobjgrp_pmu { | |||
136 | u8 unitid; | 138 | u8 unitid; |
137 | u8 classid; | 139 | u8 classid; |
138 | bool bset; | 140 | bool bset; |
141 | u8 rpc_func_id; | ||
139 | struct boardobjgrp_pmu_cmd set; | 142 | struct boardobjgrp_pmu_cmd set; |
140 | struct boardobjgrp_pmu_cmd getstatus; | 143 | struct boardobjgrp_pmu_cmd getstatus; |
141 | }; | 144 | }; |
@@ -148,7 +151,7 @@ struct boardobjgrp_pmu { | |||
148 | typedef u32 boardobjgrp_pmucmd_construct(struct gk20a *g, | 151 | typedef u32 boardobjgrp_pmucmd_construct(struct gk20a *g, |
149 | struct boardobjgrp *pboardobjgrp, | 152 | struct boardobjgrp *pboardobjgrp, |
150 | struct boardobjgrp_pmu_cmd *cmd, u8 id, u8 msgid, | 153 | struct boardobjgrp_pmu_cmd *cmd, u8 id, u8 msgid, |
151 | u8 hdrsize, u8 entrysize, u16 fbsize); | 154 | u8 hdrsize, u8 entrysize, u16 fbsize, u32 ss_offset, u8 rpc_func_id); |
152 | 155 | ||
153 | /* | 156 | /* |
154 | * Destroys BOARDOBJGRP PMU SW state. CMD. | 157 | * Destroys BOARDOBJGRP PMU SW state. CMD. |
@@ -296,6 +299,7 @@ struct boardobjgrp { | |||
296 | * are not supported. | 299 | * are not supported. |
297 | */ | 300 | */ |
298 | #define BOARDOBJGRP_GRP_CMD_ID_INVALID 255 | 301 | #define BOARDOBJGRP_GRP_CMD_ID_INVALID 255 |
302 | #define BOARDOBJGRP_GRP_RPC_FUNC_ID_INVALID 255 | ||
299 | 303 | ||
300 | /*! | 304 | /*! |
301 | * Helper macro to construct a BOARDOBJGRP's PMU SW state. | 305 | * Helper macro to construct a BOARDOBJGRP's PMU SW state. |
@@ -313,29 +317,33 @@ do { \ | |||
313 | NV_PMU_##_ENG##_BOARDOBJGRP_CLASS_ID_##_CLASS; \ | 317 | NV_PMU_##_ENG##_BOARDOBJGRP_CLASS_ID_##_CLASS; \ |
314 | } while (0) | 318 | } while (0) |
315 | 319 | ||
316 | #define BOARDOBJGRP_PMU_CMD_GRP_SET_CONSTRUCT(pgpu, pboardobjgrp, eng, ENG, \ | 320 | #define BOARDOBJGRP_PMU_CMD_GRP_SET_CONSTRUCT(g, pboardobjgrp, eng, ENG, \ |
317 | class, CLASS) \ | 321 | class, CLASS) \ |
318 | boardobjgrp_pmucmd_construct_impl( \ | 322 | g->ops.pmu_ver.boardobj.boardobjgrp_pmucmd_construct_impl( \ |
319 | pgpu, /* pgpu */ \ | 323 | g, /* pgpu */ \ |
320 | pboardobjgrp, /* pboardobjgrp */ \ | 324 | pboardobjgrp, /* pboardobjgrp */ \ |
321 | &((pboardobjgrp)->pmu.set), /* pcmd */ \ | 325 | &((pboardobjgrp)->pmu.set), /* pcmd */ \ |
322 | NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_SET, /* id */ \ | 326 | NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_SET, /* id */ \ |
323 | NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_SET, /* msgid */ \ | 327 | NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_SET, /* msgid */ \ |
324 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_set_header_aligned), \ | 328 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_set_header_aligned), \ |
325 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_set_union_aligned), \ | 329 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_set_union_aligned), \ |
326 | (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_set)) | 330 | (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_set), \ |
327 | 331 | (u32)offsetof(struct nv_pmu_super_surface, eng.class##_grp_set), \ | |
328 | #define BOARDOBJGRP_PMU_CMD_GRP_GET_STATUS_CONSTRUCT(pgpu, pboardobjgrp, \ | 332 | NV_PMU_RPC_ID_##ENG##_BOARD_OBJ_GRP_CMD) |
329 | eng, ENG, class, CLASS) \ | 333 | |
330 | boardobjgrp_pmucmd_construct_impl( \ | 334 | #define BOARDOBJGRP_PMU_CMD_GRP_GET_STATUS_CONSTRUCT(g, pboardobjgrp, \ |
331 | pgpu, /* pGpu */ \ | 335 | eng, ENG, class, CLASS) \ |
336 | g->ops.pmu_ver.boardobj.boardobjgrp_pmucmd_construct_impl( \ | ||
337 | g, /* pGpu */ \ | ||
332 | pboardobjgrp, /* pBoardObjGrp */ \ | 338 | pboardobjgrp, /* pBoardObjGrp */ \ |
333 | &((pboardobjgrp)->pmu.getstatus), /* pCmd */ \ | 339 | &((pboardobjgrp)->pmu.getstatus), /* pCmd */ \ |
334 | NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_GET_STATUS, /* id */ \ | 340 | NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_GET_STATUS, /* id */ \ |
335 | NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_GET_STATUS, /* msgid */ \ | 341 | NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_GET_STATUS, /* msgid */ \ |
336 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_get_status_header_aligned), \ | 342 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_get_status_header_aligned), \ |
337 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_get_status_union_aligned), \ | 343 | (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_get_status_union_aligned), \ |
338 | (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_get_status)) | 344 | (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_get_status), \ |
345 | (u32)offsetof(struct nv_pmu_super_surface, eng.class##_grp_get_status), \ | ||
346 | NV_PMU_RPC_ID_##ENG##_BOARD_OBJ_GRP_CMD) | ||
339 | 347 | ||
340 | /* ------------------------ Function Prototypes ----------------------------- */ | 348 | /* ------------------------ Function Prototypes ----------------------------- */ |
341 | /* Constructor and destructor */ | 349 | /* Constructor and destructor */ |
@@ -348,6 +356,8 @@ boardobjgrp_pmucmd_construct boardobjgrp_pmucmd_construct_impl; | |||
348 | boardobjgrp_pmucmd_destroy boardobjgrp_pmucmd_destroy_impl; | 356 | boardobjgrp_pmucmd_destroy boardobjgrp_pmucmd_destroy_impl; |
349 | boardobjgrp_pmucmd_pmuinithandle boardobjgrp_pmucmd_pmuinithandle_impl; | 357 | boardobjgrp_pmucmd_pmuinithandle boardobjgrp_pmucmd_pmuinithandle_impl; |
350 | 358 | ||
359 | boardobjgrp_pmucmd_construct boardobjgrp_pmucmd_construct_impl_v1; | ||
360 | |||
351 | /* BOARDOBJGRP interfaces */ | 361 | /* BOARDOBJGRP interfaces */ |
352 | boardobjgrp_pmuinithandle boardobjgrp_pmuinithandle_impl; | 362 | boardobjgrp_pmuinithandle boardobjgrp_pmuinithandle_impl; |
353 | boardobjgrp_pmuhdrdatainit boardobjgrp_pmuhdrdatainit_super; | 363 | boardobjgrp_pmuhdrdatainit boardobjgrp_pmuhdrdatainit_super; |
@@ -356,6 +366,8 @@ boardobjgrp_pmudatainit boardobjgrp_pmudatainit_super; | |||
356 | boardobjgrp_pmudatainit boardobjgrp_pmudatainit_legacy; | 366 | boardobjgrp_pmudatainit boardobjgrp_pmudatainit_legacy; |
357 | boardobjgrp_pmuset boardobjgrp_pmuset_impl; | 367 | boardobjgrp_pmuset boardobjgrp_pmuset_impl; |
358 | boardobjgrp_pmugetstatus boardobjgrp_pmugetstatus_impl; | 368 | boardobjgrp_pmugetstatus boardobjgrp_pmugetstatus_impl; |
369 | boardobjgrp_pmuset boardobjgrp_pmuset_impl_v1; | ||
370 | boardobjgrp_pmugetstatus boardobjgrp_pmugetstatus_impl_v1; | ||
359 | 371 | ||
360 | void boardobjgrpe32hdrset(struct nv_pmu_boardobjgrp *hdr, u32 objmask); | 372 | void boardobjgrpe32hdrset(struct nv_pmu_boardobjgrp *hdr, u32 objmask); |
361 | 373 | ||
@@ -413,4 +425,10 @@ boardobjgrp_from_node(struct nvgpu_list_node *node) | |||
413 | ((uintptr_t)node - offsetof(struct boardobjgrp, node)); | 425 | ((uintptr_t)node - offsetof(struct boardobjgrp, node)); |
414 | }; | 426 | }; |
415 | 427 | ||
428 | int is_boardobjgrp_pmucmd_id_valid_v0(struct gk20a *g, | ||
429 | struct boardobjgrp *pboardobjgrp, | ||
430 | struct boardobjgrp_pmu_cmd *cmd); | ||
431 | int is_boardobjgrp_pmucmd_id_valid_v1(struct gk20a *g, | ||
432 | struct boardobjgrp *pboardobjgrp, | ||
433 | struct boardobjgrp_pmu_cmd *cmd); | ||
416 | #endif | 434 | #endif |
diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c index 6b565abb..20120393 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c | |||
@@ -1291,6 +1291,14 @@ static int nvgpu_init_pmu_fw_ver_ops(struct nvgpu_pmu *pmu) | |||
1291 | get_pmu_init_msg_pmu_sw_mg_off_v5; | 1291 | get_pmu_init_msg_pmu_sw_mg_off_v5; |
1292 | g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_size = | 1292 | g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_size = |
1293 | get_pmu_init_msg_pmu_sw_mg_size_v5; | 1293 | get_pmu_init_msg_pmu_sw_mg_size_v5; |
1294 | g->ops.pmu_ver.boardobj.boardobjgrp_pmucmd_construct_impl = | ||
1295 | boardobjgrp_pmucmd_construct_impl_v1; | ||
1296 | g->ops.pmu_ver.boardobj.boardobjgrp_pmuset_impl = | ||
1297 | boardobjgrp_pmuset_impl_v1; | ||
1298 | g->ops.pmu_ver.boardobj.boardobjgrp_pmugetstatus_impl = | ||
1299 | boardobjgrp_pmugetstatus_impl_v1; | ||
1300 | g->ops.pmu_ver.boardobj.is_boardobjgrp_pmucmd_id_valid = | ||
1301 | is_boardobjgrp_pmucmd_id_valid_v1; | ||
1294 | } else { | 1302 | } else { |
1295 | g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params = | 1303 | g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params = |
1296 | get_pmu_init_msg_pmu_queue_params_v4; | 1304 | get_pmu_init_msg_pmu_queue_params_v4; |
@@ -1442,6 +1450,14 @@ static int nvgpu_init_pmu_fw_ver_ops(struct nvgpu_pmu *pmu) | |||
1442 | get_pmu_sequence_in_alloc_ptr_v3; | 1450 | get_pmu_sequence_in_alloc_ptr_v3; |
1443 | g->ops.pmu_ver.get_pmu_seq_out_a_ptr = | 1451 | g->ops.pmu_ver.get_pmu_seq_out_a_ptr = |
1444 | get_pmu_sequence_out_alloc_ptr_v3; | 1452 | get_pmu_sequence_out_alloc_ptr_v3; |
1453 | g->ops.pmu_ver.boardobj.boardobjgrp_pmucmd_construct_impl = | ||
1454 | boardobjgrp_pmucmd_construct_impl; | ||
1455 | g->ops.pmu_ver.boardobj.boardobjgrp_pmuset_impl = | ||
1456 | boardobjgrp_pmuset_impl; | ||
1457 | g->ops.pmu_ver.boardobj.boardobjgrp_pmugetstatus_impl = | ||
1458 | boardobjgrp_pmugetstatus_impl; | ||
1459 | g->ops.pmu_ver.boardobj.is_boardobjgrp_pmucmd_id_valid = | ||
1460 | is_boardobjgrp_pmucmd_id_valid_v0; | ||
1445 | break; | 1461 | break; |
1446 | case APP_VERSION_GM20B: | 1462 | case APP_VERSION_GM20B: |
1447 | g->ops.pmu_ver.pg_cmd_eng_buf_load_size = | 1463 | g->ops.pmu_ver.pg_cmd_eng_buf_load_size = |
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 0e164a72..3442861c 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -731,6 +731,21 @@ struct gpu_ops { | |||
731 | u8 value); | 731 | u8 value); |
732 | void (*pg_cmd_eng_buf_load_set_dma_idx)(struct pmu_pg_cmd *pg, | 732 | void (*pg_cmd_eng_buf_load_set_dma_idx)(struct pmu_pg_cmd *pg, |
733 | u8 value); | 733 | u8 value); |
734 | struct { | ||
735 | u32 (*boardobjgrp_pmucmd_construct_impl)(struct gk20a *g, | ||
736 | struct boardobjgrp *pboardobjgrp, | ||
737 | struct boardobjgrp_pmu_cmd *cmd, u8 id, u8 msgid, | ||
738 | u8 hdrsize, u8 entrysize, u16 fbsize, u32 ss_offset, | ||
739 | u8 rpc_func_id); | ||
740 | u32 (*boardobjgrp_pmuset_impl)(struct gk20a *g, | ||
741 | struct boardobjgrp *pboardobjgrp); | ||
742 | u32 (*boardobjgrp_pmugetstatus_impl)(struct gk20a *g, | ||
743 | struct boardobjgrp *pboardobjgrp, | ||
744 | struct boardobjgrpmask *mask); | ||
745 | int (*is_boardobjgrp_pmucmd_id_valid)(struct gk20a *g, | ||
746 | struct boardobjgrp *pboardobjgrp, | ||
747 | struct boardobjgrp_pmu_cmd *cmd); | ||
748 | } boardobj; | ||
734 | } pmu_ver; | 749 | } pmu_ver; |
735 | struct { | 750 | struct { |
736 | int (*get_netlist_name)(struct gk20a *g, int index, char *name); | 751 | int (*get_netlist_name)(struct gk20a *g, int index, char *name); |
diff --git a/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifboardobj.h b/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifboardobj.h index ee5dfd06..b8c1e394 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifboardobj.h +++ b/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifboardobj.h | |||
@@ -25,6 +25,18 @@ | |||
25 | #include <nvgpu/flcnif_cmn.h> | 25 | #include <nvgpu/flcnif_cmn.h> |
26 | #include "ctrl/ctrlboardobj.h" | 26 | #include "ctrl/ctrlboardobj.h" |
27 | 27 | ||
28 | /* board object group command id's. */ | ||
29 | #define NV_PMU_BOARDOBJGRP_CMD_SET 0x00 | ||
30 | #define NV_PMU_BOARDOBJGRP_CMD_GET_STATUS 0x01 | ||
31 | |||
32 | #define NV_PMU_RPC_ID_CLK_BOARD_OBJ_GRP_CMD 0x00 | ||
33 | #define NV_PMU_RPC_ID_FAN_BOARD_OBJ_GRP_CMD 0x00 | ||
34 | #define NV_PMU_RPC_ID_PERF_BOARD_OBJ_GRP_CMD 0x00 | ||
35 | #define NV_PMU_RPC_ID_PERF_CF_BOARD_OBJ_GRP_CMD 0x00 | ||
36 | #define NV_PMU_RPC_ID_PMGR_BOARD_OBJ_GRP_CMD 0x00 | ||
37 | #define NV_PMU_RPC_ID_THERM_BOARD_OBJ_GRP_CMD 0x00 | ||
38 | #define NV_PMU_RPC_ID_VOLT_BOARD_OBJ_GRP_CMD 0x00 | ||
39 | |||
28 | /* | 40 | /* |
29 | * Base structure describing a BOARDOBJ for communication between Kernel and | 41 | * Base structure describing a BOARDOBJ for communication between Kernel and |
30 | * PMU. | 42 | * PMU. |
@@ -200,5 +212,21 @@ struct nv_pmu_boardobj_msg { | |||
200 | NV_PMU_BOARDOBJ_GRP_GET_STATUS_MAKE(_eng, _class, \ | 212 | NV_PMU_BOARDOBJ_GRP_GET_STATUS_MAKE(_eng, _class, \ |
201 | CTRL_BOARDOBJGRP_E255_MAX_OBJECTS) | 213 | CTRL_BOARDOBJGRP_E255_MAX_OBJECTS) |
202 | 214 | ||
215 | /* RPC */ | ||
216 | |||
217 | /* | ||
218 | * structure that holds data used to | ||
219 | * execute BOARD_OBJ_GRP_CMD RPC. | ||
220 | */ | ||
221 | struct nv_pmu_rpc_struct_board_obj_grp_cmd | ||
222 | { | ||
223 | /* [IN/OUT] Must be first field in RPC structure */ | ||
224 | struct nv_pmu_rpc_header hdr; | ||
225 | /* [IN] BOARDOBJGRP class IDs. */ | ||
226 | u8 class_id; | ||
227 | /* [IN] Requested command ID (@ref NV_PMU_BOARDOBJGRP_CMD_***)*/ | ||
228 | u8 command_id; | ||
229 | u32 scratch[1]; | ||
230 | }; | ||
203 | 231 | ||
204 | #endif /* _GPMUIFBOARDOBJ_H_ */ | 232 | #endif /* _GPMUIFBOARDOBJ_H_ */ |