lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 236/261] powerpc/64s: Save FSCR to init_task.thread.fscr after feature init
    Date
    From: Michael Ellerman <mpe@ellerman.id.au>

    commit 912c0a7f2b5daa3cbb2bc10f303981e493de73bd upstream.

    At boot the FSCR is initialised via one of two paths. On most systems
    it's set to a hard coded value in __init_FSCR().

    On newer skiboot systems we use the device tree CPU features binding,
    where firmware can tell Linux what bits to set in FSCR (and HFSCR).

    In both cases the value that's configured at boot is not propagated
    into the init_task.thread.fscr value prior to the initial fork of init
    (pid 1), which means the value is not used by any processes other than
    swapper (the idle task).

    For the __init_FSCR() case this is OK, because the value in
    init_task.thread.fscr is initialised to something sensible. However it
    does mean that the value set in __init_FSCR() is not used other than
    for swapper, which is odd and confusing.

    The bigger problem is for the device tree CPU features case it
    prevents firmware from setting (or clearing) FSCR bits for use by user
    space. This means all existing kernels can not have features
    enabled/disabled by firmware if those features require
    setting/clearing FSCR bits.

    We can handle both cases by saving the FSCR value into
    init_task.thread.fscr after we have initialised it at boot. This fixes
    the bug for device tree CPU features, and will allow us to simplify
    the initialisation for the __init_FSCR() case in a future patch.

    Fixes: 5a61ef74f269 ("powerpc/64s: Support new device tree binding for discovering CPU features")
    Cc: stable@vger.kernel.org # v4.12+
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200527145843.2761782-3-mpe@ellerman.id.au
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/kernel/prom.c | 19 +++++++++++++++++++
    1 file changed, 19 insertions(+)

    --- a/arch/powerpc/kernel/prom.c
    +++ b/arch/powerpc/kernel/prom.c
    @@ -685,6 +685,23 @@ static void __init tm_init(void)
    static void tm_init(void) { }
    #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */

    +#ifdef CONFIG_PPC64
    +static void __init save_fscr_to_task(void)
    +{
    + /*
    + * Ensure the init_task (pid 0, aka swapper) uses the value of FSCR we
    + * have configured via the device tree features or via __init_FSCR().
    + * That value will then be propagated to pid 1 (init) and all future
    + * processes.
    + */
    + if (early_cpu_has_feature(CPU_FTR_ARCH_207S))
    + init_task.thread.fscr = mfspr(SPRN_FSCR);
    +}
    +#else
    +static inline void save_fscr_to_task(void) {};
    +#endif
    +
    +
    void __init early_init_devtree(void *params)
    {
    phys_addr_t limit;
    @@ -773,6 +790,8 @@ void __init early_init_devtree(void *par
    BUG();
    }

    + save_fscr_to_task();
    +
    #if defined(CONFIG_SMP) && defined(CONFIG_PPC64)
    /* We'll later wait for secondaries to check in; there are
    * NCPUS-1 non-boot CPUs :-)

    \
     
     \ /
      Last update: 2020-06-19 17:23    [W:4.135 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site