diff options
author | Soby Mathew <soby.mathew@arm.com> | 2016-10-21 17:51:22 +0100 |
---|---|---|
committer | Soby Mathew <soby.mathew@arm.com> | 2016-12-07 12:45:55 +0000 |
commit | 5486a9653bb7608ce4d39da44e73f40d82a3dbfb (patch) | |
tree | 6620d120bbf2a7e4b15bedf9ea8883ab9bc90032 /plat/arm/common/arm_pm.c | |
parent | b12a2b493e4dc162ab8bf8fc2353cf6a403a19b3 (diff) |
Allow ARM Standard platforms to dynamically define PSCI capability
The capabilities exposed by the PSCI generic layer depends on the hooks
populated by the platform in `plat_arm_psci_pm_ops`. Currently ARM
Standard platforms statically define this structure. However, some
platforms may want to modify the hooks at runtime before registering
them with the generic layer.
This patch introduces a new ARM platform layer API
`plat_arm_psci_override_pm_ops` which allows the platform to probe
the power controller and modify `plat_arm_psci_pm_ops` if required.
Consequently, 'plat_arm_psci_pm_ops' is no longer qualified as
`const` on ARM Standard platforms.
Change-Id: I7dbb44b7bd36c20ec14ded5ee45a96816ca2ab9d
Signed-off-by: Soby Mathew <soby.mathew@arm.com>
Diffstat (limited to 'plat/arm/common/arm_pm.c')
-rw-r--r-- | plat/arm/common/arm_pm.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/plat/arm/common/arm_pm.c b/plat/arm/common/arm_pm.c index 1e756a9e..d2e682d4 100644 --- a/plat/arm/common/arm_pm.c +++ b/plat/arm/common/arm_pm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -38,8 +38,11 @@ #include <platform_def.h> #include <psci.h> +/* Allow ARM Standard platforms to override this function */ +#pragma weak plat_arm_psci_override_pm_ops + /* Standard ARM platforms are expected to export plat_arm_psci_pm_ops */ -extern const plat_psci_ops_t plat_arm_psci_pm_ops; +extern plat_psci_ops_t plat_arm_psci_pm_ops; #if ARM_RECOM_STATE_ID_ENC extern unsigned int arm_pm_idle_states[]; @@ -151,6 +154,14 @@ int arm_validate_ns_entrypoint(uintptr_t entrypoint) } /****************************************************************************** + * Default definition on ARM standard platforms to override the plat_psci_ops. + *****************************************************************************/ +const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops) +{ + return ops; +} + +/****************************************************************************** * Helper function to resume the platform from system suspend. Reinitialize * the system components which are not in the Always ON power domain. * TODO: Unify the platform setup when waking up from cold boot and system @@ -201,7 +212,7 @@ void arm_program_trusted_mailbox(uintptr_t address) int plat_setup_psci_ops(uintptr_t sec_entrypoint, const plat_psci_ops_t **psci_ops) { - *psci_ops = &plat_arm_psci_pm_ops; + *psci_ops = plat_arm_psci_override_pm_ops(&plat_arm_psci_pm_ops); /* Setup mailbox with entry point. */ arm_program_trusted_mailbox(sec_entrypoint); |