Skip to content
  • Lorenzo Pieralisi's avatar
    drivers: psci: make PSCI 1.0 functions initialization version dependent · 79b04beb
    Lorenzo Pieralisi authored
    The PSCI specifications [1] and the SMC calling convention mandate
    that unimplemented functions ids must return NOT_SUPPORTED (0xffffffff)
    if a function id is called but it is not implemented.
    
    Consequently, PSCI 1.0 function ids that require the 1.0 PSCI_FEATURES
    call to be initialized:
    
    CPU_SUSPEND (psci_init_cpu_suspend())
    SYSTEM_SUSPEND (psci_init_system_suspend())
    
    call the PSCI_FEATURES function id independently of the detected
    PSCI firmware version, since, if the PSCI_FEATURES function id is not
    implemented, it must return NOT_SUPPORTED according to the PSCI
    specifications, causing the initialization functions to fail as expected.
    
    Some existing PSCI implementations (ie Qemu PSCI emulation), do not
    comply with the SMC calling convention and fail if function ids that are
    not implemented are called from the OS, causing boot failures.
    
    To solve this issue, this patch adds code that checks the PSCI firmware
    version before calling PSCI 1.0 initialization functions so that the
    OS makes sure that it is calling 1.0 functions only if the firmware
    version detected is 1.0 or greater, therefore avoiding PSCI calls
    that are bound to fail and might cause system boot failures owing
    to non-compliant PSCI firmware implementations.
    
    [1] http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf
    
    
    
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Tested-by: default avatarKevin Hilman <khilman@kernel.org>
    Acked-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
    79b04beb