From f0ad41769fc8caa9be1586f1eeecc3e00cc0839f Mon Sep 17 00:00:00 2001 From: Vijayakumar Date: Tue, 30 Aug 2016 16:45:11 +0530 Subject: 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 Reviewed-on: http://git-master/r/1209841 (cherry picked from commit 8c12599f801decc77bbc1acfd1937dfefb21f35e) Reviewed-on: http://git-master/r/1231839 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/boardobj/boardobjgrp.c | 59 ++++++++++++++++++++++---------- drivers/gpu/nvgpu/boardobj/boardobjgrp.h | 2 +- 2 files changed, 42 insertions(+), 19 deletions(-) (limited to 'drivers/gpu/nvgpu/boardobj') 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, goto boardobjgrp_pmucmd_pmuinithandle_exit; gk20a_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize); + /* we only have got sysmem later this will get copied to vidmem + surface*/ + pcmd->surf.vidmem_desc.size = 0; pcmd->buf = (struct nv_pmu_boardobjgrp_super *)sysmem_desc->cpu_va; @@ -303,7 +306,7 @@ boardobjgrppmudatainit_super_done: u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) { u32 status = 0; - + struct boardobjgrp_pmu_cmd *pcmd = &pboardobjgrp->pmu.set; gk20a_dbg_info(""); if (pboardobjgrp == NULL) @@ -321,9 +324,9 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) return -EINVAL; - if ((pboardobjgrp->pmu.set.hdrsize == 0) || - (pboardobjgrp->pmu.set.entrysize == 0) || - (pboardobjgrp->pmu.set.buf == NULL)) + if ((pcmd->hdrsize == 0) || + (pcmd->entrysize == 0) || + (pcmd->buf == NULL)) return -EINVAL; /* If no objects in the group, return early */ @@ -331,9 +334,9 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) return -EINVAL; /* Initialize PMU buffer with BOARDOBJGRP data. */ - memset(pboardobjgrp->pmu.set.buf, 0x0, pboardobjgrp->pmu.set.fbsize); + memset(pcmd->buf, 0x0, pcmd->fbsize); status = pboardobjgrp->pmudatainit(g, pboardobjgrp, - pboardobjgrp->pmu.set.buf); + pcmd->buf); if (status) { gk20a_err(dev_from_gk20a(g), "could not parse pmu data"); @@ -346,9 +349,19 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) */ pboardobjgrp->pmu.bset = false; + /* + * alloc mem in vidmem & copy constructed pmu boardobjgrp data from + * sysmem to vidmem + */ + if (pcmd->surf.vidmem_desc.size == 0) { + gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, + pcmd->fbsize); + } + gk20a_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize); + /* Send the SET PMU CMD to the PMU */ status = boardobjgrp_pmucmdsend(g, pboardobjgrp, - &pboardobjgrp->pmu.set); + pcmd); if (status) { gk20a_err(dev_from_gk20a(g), "could not send SET CMD to PMU"); goto boardobjgrp_pmuset_exit; @@ -365,6 +378,8 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, struct boardobjgrpmask *mask) { u32 status = 0; + struct boardobjgrp_pmu_cmd *pcmd = &pboardobjgrp->pmu.getstatus; + struct boardobjgrp_pmu_cmd *pset = &pboardobjgrp->pmu.set; gk20a_dbg_info(""); @@ -383,9 +398,9 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, if (pboardobjgrp->pmu.set.id == BOARDOBJGRP_GRP_CMD_ID_INVALID) return -EINVAL; - if ((pboardobjgrp->pmu.set.hdrsize == 0) || - (pboardobjgrp->pmu.set.entrysize == 0) || - (pboardobjgrp->pmu.set.buf == NULL)) + if ((pcmd->hdrsize == 0) || + (pcmd->entrysize == 0) || + (pcmd->buf == NULL)) return -EINVAL; /* If no objects in the group, return early */ @@ -399,20 +414,29 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, if (!pboardobjgrp->pmu.bset) return -EINVAL; + /* + * alloc mem in vidmem & copy constructed pmu boardobjgrp data from + * sysmem to vidmem + */ + if (pcmd->surf.vidmem_desc.size == 0) { + gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, + pcmd->fbsize); + } + /* * Initialize PMU buffer with the mask of BOARDOBJGRPs for which to * retrieve status */ - memset(pboardobjgrp->pmu.getstatus.buf, 0x0, - pboardobjgrp->pmu.getstatus.fbsize); + memset(pcmd->buf, 0x0, pcmd->fbsize); status = pboardobjgrp->pmuhdrdatainit(g, pboardobjgrp, - pboardobjgrp->pmu.getstatus.buf, mask); + pcmd->buf, mask); if (status) { gk20a_err(dev_from_gk20a(g), "could not init PMU HDR data"); goto boardobjgrp_pmugetstatus_exit; } + gk20a_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pset->buf, pset->hdrsize); /* Send the GET_STATUS PMU CMD to the PMU */ status = boardobjgrp_pmucmdsend(g, pboardobjgrp, &pboardobjgrp->pmu.getstatus); @@ -422,6 +446,9 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, goto boardobjgrp_pmugetstatus_exit; } + /*copy the data back to sysmem buffer that belongs to command*/ + gk20a_mem_rd_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize); + boardobjgrp_pmugetstatus_exit: return status; } @@ -651,14 +678,10 @@ static u32 boardobjgrp_pmucmdsend(struct gk20a *g, pgrpcmd->grp.entry_size = pcmd->entrysize; /* - * alloc mem in vidmem & copy constructed pmu boardobjgrp data from - * sysmem to vidmem + * copy vidmem information to boardobj_cmd_grp */ - gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, - pcmd->fbsize); gk20a_pmu_surface_describe(g, &pcmd->surf.vidmem_desc, &pgrpcmd->grp.fb); - gk20a_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize); /* * 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 { \ pboardobjgrp, /* pBoardObjGrp */ \ &((pboardobjgrp)->pmu.getstatus), /* pCmd */ \ NV_PMU_##ENG##_CMD_ID_BOARDOBJ_GRP_GET_STATUS, /* id */ \ - NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_SET, /* msgid */ \ + NV_PMU_##ENG##_MSG_ID_BOARDOBJ_GRP_GET_STATUS, /* msgid */ \ (u32)sizeof(union nv_pmu_##eng##_##class##_boardobjgrp_get_status_header_aligned), \ (u32)sizeof(union nv_pmu_##eng##_##class##_boardobj_get_status_union_aligned), \ (u32)sizeof(struct nv_pmu_##eng##_##class##_boardobj_grp_get_status)) -- cgit v1.2.2