summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2018-02-13 02:18:58 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-03-08 02:27:52 -0500
commitb94770dc4d2d96b80b14b9942595d3e7fc2bbf6c (patch)
tree845bbf88392ed4014e6518c1767e9985e1840729
parentcc4b9f540f66abc9f60cf9f8e2217ff17349bc77 (diff)
gpu: nvgpu: boardobj update for gv10x branch
- Created ops for below boardobj methods to support gp10x & gv10x branch boardobj changes, and defined methods for gv10x with postfix _v1 with below names boardobjgrp_pmucmd_construct_impl boardobjgrp_pmuset_impl boardobjgrp_pmugetstatus_impl is_boardobjgrp_pmucmd_id_valid - These ops are assigned based on PMU version to respective chip. - Modified BOARDOBJGRP_PMU_CMD_GRP_SET_CONSTRUCT & BOARDOBJGRP_PMU_CMD_GRP_GET_STATUS_CONSTRUCT to support gp10x & gv10x branch changes - Updated struct boardobjgrp_pmu_cmd to include members needed for gv10x boardobj changes - Created "struct nv_pmu_rpc_struct_board_obj_grp_cmd" to execute BOARD_OBJ_GRP_CMD using RPC. - Defined method boardobjgrp_pmucmdsend_rpc() to send BOARD_OBJ_GRP_CMD to PMU. Change-Id: If2551bdda80e897e7b21d2966881586f3bbc7a9b Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1656511 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/boardobj/boardobjgrp.c259
-rw-r--r--drivers/gpu/nvgpu/boardobj/boardobjgrp.h44
-rw-r--r--drivers/gpu/nvgpu/common/pmu/pmu_fw.c16
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h15
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifboardobj.h28
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;
35static u32 boardobjgrp_pmucmdsend(struct gk20a *g, 35static 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);
38static u32 boardobjgrp_pmucmdsend_rpc(struct gk20a *g,
39 struct boardobjgrp *pboardobjgrp,
40 struct boardobjgrp_pmu_cmd *pcmd,
41 bool copy_out);
38struct boardobjgrp_pmucmdhandler_params { 42struct 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
156u32 boardobjgrp_pmucmd_construct_impl(struct gk20a *g, struct boardobjgrp 164u32 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
180u32 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
172u32 boardobjgrp_pmucmd_destroy_impl(struct gk20a *g, 196u32 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
205int 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
217int 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
181u32 boardobjgrp_pmucmd_pmuinithandle_impl(struct gk20a *g, 230u32 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
372u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) 423static 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
445u32 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
441u32 503u32 boardobjgrp_pmuset_impl_v1(struct gk20a *g, struct boardobjgrp *pboardobjgrp)
442boardobjgrp_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
553boardobjgrp_pmuset_exit:
554 return status;
555}
556
557u32
558boardobjgrp_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
625u32
626boardobjgrp_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
681boardobjgrp_pmugetstatus_exit:
682 return status;
683}
684
520static u32 685static u32
521boardobjgrp_objinsert_final(struct boardobjgrp *pboardobjgrp, 686boardobjgrp_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,
785boardobjgrp_pmucmdsend_exit: 950boardobjgrp_pmucmdsend_exit:
786 return status; 951 return status;
787} 952}
953
954static 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 {
148typedef u32 boardobjgrp_pmucmd_construct(struct gk20a *g, 151typedef 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;
348boardobjgrp_pmucmd_destroy boardobjgrp_pmucmd_destroy_impl; 356boardobjgrp_pmucmd_destroy boardobjgrp_pmucmd_destroy_impl;
349boardobjgrp_pmucmd_pmuinithandle boardobjgrp_pmucmd_pmuinithandle_impl; 357boardobjgrp_pmucmd_pmuinithandle boardobjgrp_pmucmd_pmuinithandle_impl;
350 358
359boardobjgrp_pmucmd_construct boardobjgrp_pmucmd_construct_impl_v1;
360
351/* BOARDOBJGRP interfaces */ 361/* BOARDOBJGRP interfaces */
352boardobjgrp_pmuinithandle boardobjgrp_pmuinithandle_impl; 362boardobjgrp_pmuinithandle boardobjgrp_pmuinithandle_impl;
353boardobjgrp_pmuhdrdatainit boardobjgrp_pmuhdrdatainit_super; 363boardobjgrp_pmuhdrdatainit boardobjgrp_pmuhdrdatainit_super;
@@ -356,6 +366,8 @@ boardobjgrp_pmudatainit boardobjgrp_pmudatainit_super;
356boardobjgrp_pmudatainit boardobjgrp_pmudatainit_legacy; 366boardobjgrp_pmudatainit boardobjgrp_pmudatainit_legacy;
357boardobjgrp_pmuset boardobjgrp_pmuset_impl; 367boardobjgrp_pmuset boardobjgrp_pmuset_impl;
358boardobjgrp_pmugetstatus boardobjgrp_pmugetstatus_impl; 368boardobjgrp_pmugetstatus boardobjgrp_pmugetstatus_impl;
369boardobjgrp_pmuset boardobjgrp_pmuset_impl_v1;
370boardobjgrp_pmugetstatus boardobjgrp_pmugetstatus_impl_v1;
359 371
360void boardobjgrpe32hdrset(struct nv_pmu_boardobjgrp *hdr, u32 objmask); 372void 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
428int is_boardobjgrp_pmucmd_id_valid_v0(struct gk20a *g,
429 struct boardobjgrp *pboardobjgrp,
430 struct boardobjgrp_pmu_cmd *cmd);
431int 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 */
221struct 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_ */