PMUFW: PM: Added missing power up/down behavior for GpuPPs

-GpuPP now has its own PmSlave derived structure and the FSM
 (new structure is added because there is no peripheral with
 exactly the same behavior - Usbs have also their own power island,
 but compared to them GpuPPs do not have wake-up capabilities
 through GIC Proxy, and GpuPPs depend on FPD while LPD is
 considered always-on)

Signed-off-by: Mirela Simonovic <mirela.simonovic@aggios.com>
Tested-by: Rohit Fule <rohitf@xilinx.com>
Acked-by: Jyotheeswar Reddy Mutthareddyvari <jyothee@xilinx.com>
This commit is contained in:
Mirela Simonovic 2015-07-13 16:30:58 -07:00 committed by Nava kishore Manne
parent 3283e01d23
commit c064d50c14
7 changed files with 132 additions and 35 deletions

View file

@ -184,7 +184,7 @@ PmRequirement pmApuReq_g[PM_MASTER_APU_SLAVE_MAX] = {
.nextReq = 0U,
},
[PM_MASTER_APU_SLAVE_GPUPP0] = {
.slave = &pmSlaveGpuPP0_g,
.slave = &pmSlaveGpuPP0_g.slv,
.requestor = &pmMasterApu_g,
.info = 0U,
.defaultReq = 0U,
@ -192,7 +192,7 @@ PmRequirement pmApuReq_g[PM_MASTER_APU_SLAVE_MAX] = {
.nextReq = 0U,
},
[PM_MASTER_APU_SLAVE_GPUPP1] = {
.slave = &pmSlaveGpuPP1_g,
.slave = &pmSlaveGpuPP1_g.slv,
.requestor = &pmMasterApu_g,
.info = 0U,
.defaultReq = 0U,

View file

@ -72,8 +72,8 @@ static PmNode* const pmNodes[NODE_MAX] = {
&pmSlaveDpll_g.slv.node,
&pmSlaveRpll_g.slv.node,
&pmSlaveIOpll_g.slv.node,
&pmSlaveGpuPP0_g.node,
&pmSlaveGpuPP1_g.node,
&pmSlaveGpuPP0_g.slv.node,
&pmSlaveGpuPP1_g.slv.node,
&pmSlaveUart0_g.node,
&pmSlaveUart1_g.node,
&pmSlaveSpi0_g.node,

View file

@ -32,6 +32,7 @@
#include "pm_common.h"
#include "pm_node.h"
#include "pm_master.h"
#include "xpfw_rom_interface.h"
/*
* Without clock/reset control, from PM perspective ttc has only one state.
@ -638,42 +639,118 @@ PmSlaveSata pmSlaveSata_g = {
},
};
/*
* States of a GPP slave (GPPs have its own power island (PI) and dependencies
* to the power parent (FPD)
*/
static const u32 PmGppStates[] = {
[PM_GPP_SLAVE_STATE_OFF] = 0U,
[PM_GPP_SLAVE_STATE_ON] = PM_CAP_ACCESS | PM_CAP_CONTEXT | PM_CAP_POWER,
};
/* GPP slave transitions (from which to which state slave can transits) */
static const PmStateTran PmGppTransitions[] = {
{
.fromState = PM_GPP_SLAVE_STATE_ON,
.toState = PM_GPP_SLAVE_STATE_OFF,
}, {
.fromState = PM_GPP_SLAVE_STATE_OFF,
.toState = PM_GPP_SLAVE_STATE_ON,
},
};
/**
* PmGppFsmHandler() - FSM handler of a GPP slave
* @slave Slave whose state should be changed
* @nextState State the slave should enter
*
* @return Status of performing transition action
*/
static int PmGppFsmHandler(PmSlave* const slave, const PmStateId nextState)
{
int status = XST_PM_INTERNAL;
PmSlaveGpp* gpp = (PmSlaveGpp*)slave->node.derived;
switch (slave->node.currState) {
case PM_GPP_SLAVE_STATE_ON:
if (PM_GPP_SLAVE_STATE_OFF == nextState) {
/* ON -> OFF*/
status = gpp->PwrDn();
} else {
status = XST_NO_FEATURE;
}
break;
case PM_GPP_SLAVE_STATE_OFF:
if (PM_GPP_SLAVE_STATE_ON == nextState) {
/* OFF -> ON */
status = gpp->PwrUp();
} else {
status = XST_NO_FEATURE;
}
break;
default:
PmDbg("ERROR: Unknown state #%d\n", slave->node.currState);
break;
}
if (XST_SUCCESS == status) {
slave->node.currState = nextState;
}
return status;
}
static const PmSlaveFsm slaveGPPFsm = {
.states = PmGppStates,
.statesCnt = ARRAY_SIZE(PmGppStates),
.trans = PmGppTransitions,
.transCnt = ARRAY_SIZE(PmGppTransitions),
.enterState = PmGppFsmHandler,
};
static PmRequirement* const pmGpuPP0Reqs[] = {
&pmApuReq_g[PM_MASTER_APU_SLAVE_GPUPP0],
};
PmSlave pmSlaveGpuPP0_g = {
.node = {
.derived = &pmSlaveGpuPP0_g,
.nodeId = NODE_GPU_PP_0,
.typeId = PM_TYPE_SLAVE,
.parent = &pmPowerDomainFpd_g,
.currState = PM_STD_SLAVE_STATE_ON,
.ops = NULL,
PmSlaveGpp pmSlaveGpuPP0_g = {
.slv = {
.node = {
.derived = &pmSlaveGpuPP0_g,
.nodeId = NODE_GPU_PP_0,
.typeId = PM_TYPE_SLAVE,
.parent = &pmPowerDomainFpd_g,
.currState = PM_STD_SLAVE_STATE_ON,
.ops = NULL,
},
.reqs = pmGpuPP0Reqs,
.reqsCnt = ARRAY_SIZE(pmGpuPP0Reqs),
.wake = NULL,
.slvFsm = &slaveGPPFsm,
},
.reqs = pmGpuPP0Reqs,
.reqsCnt = ARRAY_SIZE(pmGpuPP0Reqs),
.wake = NULL,
.slvFsm = &slaveStdFsm,
.PwrDn = XpbrPwrDnPp0Handler,
.PwrUp = XpbrPwrUpPp0Handler,
};
static PmRequirement* const pmGpuPP1Reqs[] = {
&pmApuReq_g[PM_MASTER_APU_SLAVE_GPUPP1],
};
PmSlave pmSlaveGpuPP1_g = {
.node = {
.derived = &pmSlaveGpuPP1_g,
.nodeId = NODE_GPU_PP_1,
.typeId = PM_TYPE_SLAVE,
.parent = &pmPowerDomainFpd_g,
.currState = PM_STD_SLAVE_STATE_ON,
.ops = NULL,
PmSlaveGpp pmSlaveGpuPP1_g = {
.slv = {
.node = {
.derived = &pmSlaveGpuPP1_g,
.nodeId = NODE_GPU_PP_1,
.typeId = PM_TYPE_SLAVE,
.parent = &pmPowerDomainFpd_g,
.currState = PM_STD_SLAVE_STATE_ON,
.ops = NULL,
},
.reqs = pmGpuPP1Reqs,
.reqsCnt = ARRAY_SIZE(pmGpuPP1Reqs),
.wake = NULL,
.slvFsm = &slaveGPPFsm,
},
.reqs = pmGpuPP1Reqs,
.reqsCnt = ARRAY_SIZE(pmGpuPP1Reqs),
.wake = NULL,
.slvFsm = &slaveStdFsm,
.PwrDn = XpbrPwrDnPp1Handler,
.PwrUp = XpbrPwrUpPp1Handler,
};
static PmRequirement* const pmGdmaReqs[] = {

View file

@ -43,6 +43,14 @@
#define PM_STD_SLAVE_STATE_OFF 0U
#define PM_STD_SLAVE_STATE_ON 1U
/*
* States of a slave with its own power island (PI), who has dependencies to the
* power parent (power domain) and have no wake-up capability through GIC Proxy.
* In this case, those are graphics processors
*/
#define PM_GPP_SLAVE_STATE_OFF 0U
#define PM_GPP_SLAVE_STATE_ON 1U
/* Always-on slaves, have only one state */
#define PM_AON_SLAVE_STATE 0U
@ -65,6 +73,18 @@ typedef struct PmSlaveSata {
PmSlave slv;
} PmSlaveSata;
/**
* PmSlaveGpp - Structure used for GPP
* @slv Base slave structure
* @PwrDn Pointer to a power down pmu-rom handler
* @PwrUp Pointer to a power up pmu-rom handler
*/
typedef struct PmSlaveGpp {
PmSlave slv;
PmTranHandler PwrDn;
PmTranHandler PwrUp;
} PmSlaveGpp;
/*********************************************************************
* Global data declarations
********************************************************************/
@ -73,8 +93,8 @@ extern PmSlaveTtc pmSlaveTtc1_g;
extern PmSlaveTtc pmSlaveTtc2_g;
extern PmSlaveTtc pmSlaveTtc3_g;
extern PmSlaveSata pmSlaveSata_g;
extern PmSlave pmSlaveGpuPP0_g;
extern PmSlave pmSlaveGpuPP1_g;
extern PmSlaveGpp pmSlaveGpuPP0_g;
extern PmSlaveGpp pmSlaveGpuPP1_g;
extern PmSlave pmSlaveUart0_g;
extern PmSlave pmSlaveUart1_g;
extern PmSlave pmSlaveSpi0_g;

View file

@ -232,8 +232,8 @@ static PmNode* pmFpdChildren[] = {
&pmSlaveApll_g.slv.node,
&pmSlaveVpll_g.slv.node,
&pmSlaveDpll_g.slv.node,
&pmSlaveGpuPP0_g.node,
&pmSlaveGpuPP1_g.node,
&pmSlaveGpuPP0_g.slv.node,
&pmSlaveGpuPP1_g.slv.node,
&pmSlaveGdma_g.node,
&pmSlaveDP_g.node,
&pmSlaveAFI_g.node,

View file

@ -91,8 +91,8 @@ static PmSlave* const pmSlaves[] = {
&pmSlaveDpll_g.slv,
&pmSlaveRpll_g.slv,
&pmSlaveIOpll_g.slv,
&pmSlaveGpuPP0_g,
&pmSlaveGpuPP1_g,
&pmSlaveGpuPP0_g.slv,
&pmSlaveGpuPP1_g.slv,
&pmSlaveUart0_g,
&pmSlaveUart1_g,
&pmSlaveSpi0_g,

View file

@ -1,4 +1,4 @@
#ifndef ZYNQMP_XPFW_VERSION__H_
#define ZYNQMP_XPFW_VERSION__H_
#define ZYNQMP_XPFW_VERSION "2015.1-swbeta2-50-g58d27503a2e0"
#define ZYNQMP_XPFW_VERSION "2015.1-swbeta2-51-g520e2f4d096c"
#endif