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>
This commit is contained in:
Vijayakumar
2016-08-30 16:45:11 +05:30
committed by mobile promotions
parent d995dbc14c
commit f0ad41769f
3 changed files with 43 additions and 19 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -25,6 +25,7 @@
#define CTRL_VOLT_VOLT_DEV_VID_VSEL_MAX_ENTRIES (8)
#define CTRL_VOLT_DOMAIN_INVALID 0x00
#define CTRL_VOLT_DOMAIN_LOGIC 0x01
#define CLK_PROG_VFE_ENTRY_LOGIC 0x00
struct ctrl_volt_volt_rail_list_item {
u8 rail_idx;