Browse Source

feat(psci): update PSCI_FEATURES

This patch updates the PSCI_FEATURES handler to indicate support for
OS-initiated mode per section 5.15.2 of the PSCI spec (DEN0022D.b) based
on the value of `FF_SUPPORTS_OS_INIT_MODE`, which is conditionally
enabled by the `PSCI_OS_INIT_MODE` build option.

Change-Id: I5da8a989b53419ad2ab55b73ddeee6e882c25554
Signed-off-by: Wing Li <wingers@google.com>
pull/1996/head
Wing Li 2 years ago
parent
commit
9a70e69e05
  1. 4
      include/lib/psci/psci.h
  2. 12
      lib/psci/psci_main.c

4
include/lib/psci/psci.h

@ -143,7 +143,11 @@
/* Features flags for CPU SUSPEND OS Initiated mode support. Bits [0:0] */ /* Features flags for CPU SUSPEND OS Initiated mode support. Bits [0:0] */
#define FF_MODE_SUPPORT_SHIFT U(0) #define FF_MODE_SUPPORT_SHIFT U(0)
#if PSCI_OS_INIT_MODE
#define FF_SUPPORTS_OS_INIT_MODE U(1) #define FF_SUPPORTS_OS_INIT_MODE U(1)
#else
#define FF_SUPPORTS_OS_INIT_MODE U(0)
#endif
/******************************************************************************* /*******************************************************************************
* PSCI version * PSCI version

12
lib/psci/psci_main.c

@ -383,13 +383,9 @@ int psci_features(unsigned int psci_fid)
/* Format the feature flags */ /* Format the feature flags */
if ((psci_fid == PSCI_CPU_SUSPEND_AARCH32) || if ((psci_fid == PSCI_CPU_SUSPEND_AARCH32) ||
(psci_fid == PSCI_CPU_SUSPEND_AARCH64)) { (psci_fid == PSCI_CPU_SUSPEND_AARCH64)) {
/*
* The trusted firmware does not support OS Initiated Mode.
*/
unsigned int ret = ((FF_PSTATE << FF_PSTATE_SHIFT) | unsigned int ret = ((FF_PSTATE << FF_PSTATE_SHIFT) |
(((FF_SUPPORTS_OS_INIT_MODE == 1U) ? 0U : 1U) (FF_SUPPORTS_OS_INIT_MODE << FF_MODE_SUPPORT_SHIFT));
<< FF_MODE_SUPPORT_SHIFT)); return (int)ret;
return (int) ret;
} }
/* Return 0 for all other fid's */ /* Return 0 for all other fid's */
@ -571,6 +567,10 @@ u_register_t psci_smc_handler(uint32_t smc_fid,
ret = psci_migrate_info_up_cpu(); ret = psci_migrate_info_up_cpu();
break; break;
case PSCI_FEATURES:
ret = (u_register_t)psci_features(x1);
break;
case PSCI_NODE_HW_STATE_AARCH64: case PSCI_NODE_HW_STATE_AARCH64:
ret = (u_register_t)psci_node_hw_state( ret = (u_register_t)psci_node_hw_state(
x1, (unsigned int) x2); x1, (unsigned int) x2);

Loading…
Cancel
Save