Commit 19fe3c72 authored by Rajan Vaja's avatar Rajan Vaja
Browse files

zynqmp: pm: Update PM version and support PM version check



ATF is not checking PM version. Add version check in such
a way that it is compatible with current and newer version
of PM.
Signed-off-by: default avatarRajan Vaja <rajan.vaja@xilinx.com>
Change-Id: Ia095d118121e6f75e8d320e87d5e2018068fa079
parent a33668bd
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* (PM_VERSION_MAJOR << 16) | PM_VERSION_MINOR * (PM_VERSION_MAJOR << 16) | PM_VERSION_MINOR
*/ */
#define PM_VERSION_MAJOR 1 #define PM_VERSION_MAJOR 1
#define PM_VERSION_MINOR 0 #define PM_VERSION_MINOR 1
#define PM_VERSION ((PM_VERSION_MAJOR << 16) | PM_VERSION_MINOR) #define PM_VERSION ((PM_VERSION_MAJOR << 16) | PM_VERSION_MINOR)
......
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
#define PM_SET_SUSPEND_MODE 0xa02 #define PM_SET_SUSPEND_MODE 0xa02
#define PM_GET_TRUSTZONE_VERSION 0xa03 #define PM_GET_TRUSTZONE_VERSION 0xa03
/* !0 - UP, 0 - DOWN */ /* pm_up = !0 - UP, pm_up = 0 - DOWN */
static int32_t pm_up = 0; static int32_t pm_up, ipi_irq_flag;
#if ZYNQMP_WDT_RESTART #if ZYNQMP_WDT_RESTART
static spinlock_t inc_lock; static spinlock_t inc_lock;
...@@ -210,6 +210,15 @@ int pm_setup(void) ...@@ -210,6 +210,15 @@ int pm_setup(void)
status = pm_ipi_init(primary_proc); status = pm_ipi_init(primary_proc);
ret = pm_get_api_version(&pm_ctx.api_version);
if (pm_ctx.api_version < PM_VERSION) {
ERROR("BL31: Platform Management API version error. Expected: "
"v%d.%d - Found: v%d.%d\n", PM_VERSION_MAJOR,
PM_VERSION_MINOR, pm_ctx.api_version >> 16,
pm_ctx.api_version & 0xFFFF);
return -EINVAL;
}
#if ZYNQMP_WDT_RESTART #if ZYNQMP_WDT_RESTART
status = pm_wdt_restart_setup(); status = pm_wdt_restart_setup();
if (status) if (status)
...@@ -321,12 +330,8 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, ...@@ -321,12 +330,8 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
case PM_GET_API_VERSION: case PM_GET_API_VERSION:
/* Check is PM API version already verified */ /* Check is PM API version already verified */
if (pm_ctx.api_version == PM_VERSION) { if (pm_ctx.api_version >= PM_VERSION) {
SMC_RET1(handle, (uint64_t)PM_RET_SUCCESS | if (!ipi_irq_flag) {
((uint64_t)PM_VERSION << 32));
}
ret = pm_get_api_version(&pm_ctx.api_version);
/* /*
* Enable IPI IRQ * Enable IPI IRQ
* assume the rich OS is OK to handle callback IRQs now. * assume the rich OS is OK to handle callback IRQs now.
...@@ -334,8 +339,11 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, ...@@ -334,8 +339,11 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
* the GIC. * the GIC.
*/ */
pm_ipi_irq_enable(primary_proc); pm_ipi_irq_enable(primary_proc);
SMC_RET1(handle, (uint64_t)ret | ipi_irq_flag = 1;
}
SMC_RET1(handle, (uint64_t)PM_RET_SUCCESS |
((uint64_t)pm_ctx.api_version << 32)); ((uint64_t)pm_ctx.api_version << 32));
}
case PM_SET_CONFIGURATION: case PM_SET_CONFIGURATION:
ret = pm_set_configuration(pm_arg[0]); ret = pm_set_configuration(pm_arg[0]);
......
...@@ -44,9 +44,7 @@ DEFINE_SVC_UUID2(zynqmp_sip_uuid, ...@@ -44,9 +44,7 @@ DEFINE_SVC_UUID2(zynqmp_sip_uuid,
static int32_t sip_svc_setup(void) static int32_t sip_svc_setup(void)
{ {
/* PM implementation as SiP Service */ /* PM implementation as SiP Service */
pm_setup(); return pm_setup();
return 0;
} }
/** /**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment