• Al Cooper's avatar
    MIPS: Kernel hangs occasionally during boot. · 4f1a1eb5
    Al Cooper authored
    The Kernel hangs occasionally during boot after "Calibrating delay loop..".
    This is caused by the c0_compare_int_usable() routine in cevt-r4k.c
    returning false which causes the system to disable the timer and hang later.
    The false return happens because the routine is using a series of four calls
    to irq_disable_hazard() as a delay while it waits for the timer changes to
    propagate to the cp0 cause register. On newer MIPS cores, like the 74K, the
    series of irq_disable_hazard() calls turn into ehb instructions and can take
    as little as a few clock ticks for all 4 instructions. This is not enough of
    a delay, so the routine thinks the timer is not working.  This fix uses up
    to a max number of cycle counter ticks for the delay and uses
    back_to_back_c0_hazard() instead of irq_disable_hazard() to handle the
    hazard condition between cp0 writes and cp0 reads.
    Signed-off-by: default avatarAl Cooper <alcooperx@gmail.com>
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/2911/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    4f1a1eb5
cevt-r4k.c 5.02 KB