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>
This commit is contained in:
parent
b12a2b493e
commit
5486a9653b
|
@ -220,4 +220,7 @@ int plat_arm_get_alt_image_source(
|
|||
unsigned int plat_arm_calc_core_pos(u_register_t mpidr);
|
||||
const mmap_region_t *plat_arm_get_mmap(void);
|
||||
|
||||
/* Allow platform to override psci_pm_ops during runtime */
|
||||
const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops);
|
||||
|
||||
#endif /* __PLAT_ARM_H__ */
|
||||
|
|
|
@ -327,7 +327,7 @@ static int fvp_node_hw_state(u_register_t target_cpu,
|
|||
* Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
|
||||
* platform layer will take care of registering the handlers with PSCI.
|
||||
******************************************************************************/
|
||||
const plat_psci_ops_t plat_arm_psci_pm_ops = {
|
||||
plat_psci_ops_t plat_arm_psci_pm_ops = {
|
||||
.cpu_standby = fvp_cpu_standby,
|
||||
.pwr_domain_on = fvp_pwr_domain_on,
|
||||
.pwr_domain_off = fvp_pwr_domain_off,
|
||||
|
|
|
@ -76,7 +76,7 @@ static int juno_translate_power_state_by_mpidr(u_register_t mpidr,
|
|||
* Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
|
||||
* platform will take care of registering the handlers with PSCI.
|
||||
******************************************************************************/
|
||||
const plat_psci_ops_t plat_arm_psci_pm_ops = {
|
||||
plat_psci_ops_t plat_arm_psci_pm_ops = {
|
||||
.pwr_domain_on = css_pwr_domain_on,
|
||||
.pwr_domain_on_finish = css_pwr_domain_on_finish,
|
||||
.pwr_domain_off = css_pwr_domain_off,
|
||||
|
|
|
@ -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[];
|
||||
|
@ -150,6 +153,14 @@ int arm_validate_ns_entrypoint(uintptr_t entrypoint)
|
|||
return PSCI_E_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 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.
|
||||
|
@ -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);
|
||||
|
|
|
@ -261,7 +261,7 @@ int css_node_hw_state(u_register_t mpidr, unsigned int power_level)
|
|||
* Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
|
||||
* platform will take care of registering the handlers with PSCI.
|
||||
******************************************************************************/
|
||||
const plat_psci_ops_t plat_arm_psci_pm_ops = {
|
||||
plat_psci_ops_t plat_arm_psci_pm_ops = {
|
||||
.pwr_domain_on = css_pwr_domain_on,
|
||||
.pwr_domain_on_finish = css_pwr_domain_on_finish,
|
||||
.pwr_domain_off = css_pwr_domain_off,
|
||||
|
|
Loading…
Reference in New Issue