diff --git a/lib/sw_apps/zynqmp_pmufw/src/pm_common.h b/lib/sw_apps/zynqmp_pmufw/src/pm_common.h index 0936a9c1..30dd0c60 100644 --- a/lib/sw_apps/zynqmp_pmufw/src/pm_common.h +++ b/lib/sw_apps/zynqmp_pmufw/src/pm_common.h @@ -114,6 +114,9 @@ typedef u32 (*const PmTranHandler)(void); #define ENABLE_WAKE(mask) XPfw_RMW32(PMU_LOCAL_GPI1_ENABLE, mask, mask); #define DISABLE_WAKE(mask) XPfw_RMW32(PMU_LOCAL_GPI1_ENABLE, mask, ~(mask)); +/* PMU internal capabilities used in definition of slaves' states */ +#define PM_CAP_POWER 0x8U + /********************************************************************* * Function declarations ********************************************************************/ diff --git a/lib/sw_apps/zynqmp_pmufw/src/pm_defs.h b/lib/sw_apps/zynqmp_pmufw/src/pm_defs.h index 2deed285..0f9a8b2e 100644 --- a/lib/sw_apps/zynqmp_pmufw/src/pm_defs.h +++ b/lib/sw_apps/zynqmp_pmufw/src/pm_defs.h @@ -49,7 +49,10 @@ #define PM_VERSION ((PM_VERSION_MAJOR << 16) | PM_VERSION_MINOR) -/* Capabilities common for all slave nodes */ +/* + * Capabilities common for all slave nodes (common capabilities should take + * lower 16 bits, specific capabilities of each slave take higher 16 bits) + */ #define PM_CAP_ACCESS 0x1U #define PM_CAP_CONTEXT 0x2U #define PM_CAP_WAKEUP 0x4U diff --git a/lib/sw_apps/zynqmp_pmufw/src/pm_periph.c b/lib/sw_apps/zynqmp_pmufw/src/pm_periph.c index 88508eda..809d729e 100644 --- a/lib/sw_apps/zynqmp_pmufw/src/pm_periph.c +++ b/lib/sw_apps/zynqmp_pmufw/src/pm_periph.c @@ -83,7 +83,8 @@ PmSlaveTtc pmSlaveTtc0_g = { */ static const u32 pmStdStates[] = { [PM_STD_SLAVE_STATE_OFF] = 0U, - [PM_STD_SLAVE_STATE_ON] = PM_CAP_WAKEUP | PM_CAP_ACCESS | PM_CAP_CONTEXT, + [PM_STD_SLAVE_STATE_ON] = PM_CAP_WAKEUP | PM_CAP_ACCESS | + PM_CAP_CONTEXT | PM_CAP_POWER, }; /* Standard slave transitions (from which to which state Std slave transits) */ diff --git a/lib/sw_apps/zynqmp_pmufw/src/pm_slave.c b/lib/sw_apps/zynqmp_pmufw/src/pm_slave.c index 6dc710ea..b57e9199 100644 --- a/lib/sw_apps/zynqmp_pmufw/src/pm_slave.c +++ b/lib/sw_apps/zynqmp_pmufw/src/pm_slave.c @@ -191,6 +191,16 @@ static int PmSlaveChangeState(PmSlave* const slave, const PmStateId state) continue; } + if ((0U != (slave->slvFsm->states[state] & PM_CAP_POWER)) && + (NULL != slave->node.parent) && + (true == IS_OFF(&slave->node.parent->node))) { + /* Next state requires powering up power parent */ + status = PmTriggerPowerUp(slave->node.parent); + if (XST_SUCCESS != status) { + goto done; + } + } + if (NULL != slave->slvFsm->enterState) { /* Execute transition action of slave's FSM */ status = slave->slvFsm->enterState(slave, state); @@ -213,6 +223,7 @@ static int PmSlaveChangeState(PmSlave* const slave, const PmStateId state) } #endif +done: return status; } diff --git a/lib/sw_apps/zynqmp_pmufw/src/xpfw_version.h b/lib/sw_apps/zynqmp_pmufw/src/xpfw_version.h index b6aa7d60..7e3a7937 100644 --- a/lib/sw_apps/zynqmp_pmufw/src/xpfw_version.h +++ b/lib/sw_apps/zynqmp_pmufw/src/xpfw_version.h @@ -1,4 +1,4 @@ #ifndef ZYNQMP_XPFW_VERSION__H_ #define ZYNQMP_XPFW_VERSION__H_ - #define ZYNQMP_XPFW_VERSION "2015.1-swbeta2-37-g79629747082f" + #define ZYNQMP_XPFW_VERSION "2015.1-swbeta2-39-g8cd4c95b44ef" #endif