• Shawn Guo's avatar
    ARM: imx: remove imx_src_prepare_restart() call · b6e23bb6
    Shawn Guo authored
    There is ~10% possibility that the following emergency restart command
    fails to reboot imx6q.
    
    $ echo b > /proc/sysrq-trigger
    
    The IMX restart routine mxc_restart() assumes that it will always run on
    primary core, and will call imx_src_prepare_restart() to disable
    secondary cores in order to get them come to online in the following
    boot.  However, the assumption is only true for normal kernel_restart()
    case where migrate_to_reboot_cpu() will be called to migrate to primary
    core, but not necessarily true for emergency_restart() case.  So when
    emergency_restart() calls into mxc_restart() on any secondary core,
    system will hang immediately once imx_src_prepare_restart() is called
    to disabled secondary cores.  Since emergency_restart() is defined as a
    function that is safe to call in interrupt context, we cannot just call
    migrate_to_reboot_cpu() to fix the issue.
    
    Fortunately, we just found that the issue can be fixed at imx6q platform
    level.  We used to call imx_src_prepare_restart() to disable all
    secondary cores before resetting hardware.  Otherwise, the secondary
    will fail come to online in the reboot.  However, we recently found that
    after commit 6050d181 (ARM: imx: reset core along with enable/disable
    operation) comes to play, we do not need to reset the secondary cores
    any more.  That said, mxc_restart() now can run on any core to reboot
    the system, as long as we remove the imx_src_prepare_restart() call from
    mxc_restart().
    
    So let's simply remove imx_src_prepare_restart() call to fix the above
    emergency restart failure.
    Reported-by: default avatarJiada Wang <jiada_wang@mentor.com>
    Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
    b6e23bb6
system.c 3.6 KB