ACK/cmnt: [PATCH] [Zesty] UBUNTU: SAUCE: powerpc/powernv: Tell OPAL about our MMU mode on POWER9
Stefan Bader
stefan.bader at canonical.com
Tue Jul 11 15:28:24 UTC 2017
On 06.07.2017 16:43, Breno Leitao wrote:
> From: Benjamin Herrenschmidt <benh at kernel.crashing.org>
>
> BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1702159
>
> That will allow OPAL to configure the CPU in an optimal way.
>
> Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> Signed-off-by: Michael Neuling <mikey at neuling.org>
> Signed-off-by: Breno Leitao <leitao at debian.org>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
Bug report still pending SRU justification. Code looks self contained. Will this
go upstream, too?
-Stefan
> arch/powerpc/include/asm/opal-api.h | 9 +++++++++
> arch/powerpc/platforms/powernv/opal.c | 19 +++++++++++++++++--
> arch/powerpc/platforms/powernv/setup.c | 11 ++++++++++-
> 3 files changed, 36 insertions(+), 3 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h
> index cb3e6242a78c..85e6d8817fd1 100644
> --- a/arch/powerpc/include/asm/opal-api.h
> +++ b/arch/powerpc/include/asm/opal-api.h
> @@ -805,6 +805,15 @@ struct OpalIoPhb3ErrorData {
> enum {
> OPAL_REINIT_CPUS_HILE_BE = (1 << 0),
> OPAL_REINIT_CPUS_HILE_LE = (1 << 1),
> +
> + /* These two define the base MMU mode of the host on P9
> + *
> + * On P9 Nimbus DD2.0 and Cumlus (and later), KVM can still
> + * create hash guests in "radix" mode with care (full core
> + * switch only).
> + */
> + OPAL_REINIT_CPUS_MMU_HASH = (1 << 2),
> + OPAL_REINIT_CPUS_MMU_RADIX = (1 << 3),
> };
>
> typedef struct oppanel_line {
> diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
> index e0f856bfbfe8..a3b6de84f49c 100644
> --- a/arch/powerpc/platforms/powernv/opal.c
> +++ b/arch/powerpc/platforms/powernv/opal.c
> @@ -59,6 +59,8 @@ static struct task_struct *kopald_tsk;
>
> void opal_configure_cores(void)
> {
> + uint64_t reinit_flags = 0;
> +
> /* Do the actual re-init, This will clobber all FPRs, VRs, etc...
> *
> * It will preserve non volatile GPRs and HSPRG0/1. It will
> @@ -66,11 +68,24 @@ void opal_configure_cores(void)
> * but it might clobber a bunch.
> */
> #ifdef __BIG_ENDIAN__
> - opal_reinit_cpus(OPAL_REINIT_CPUS_HILE_BE);
> + reinit_flags |= OPAL_REINIT_CPUS_HILE_BE;
> #else
> - opal_reinit_cpus(OPAL_REINIT_CPUS_HILE_LE);
> + reinit_flags |= OPAL_REINIT_CPUS_HILE_LE;
> #endif
>
> + /*
> + * POWER9 always support running hash:
> + * ie. Host hash supports hash guests
> + * Host radix supports hash/radix guests
> + */
> + if (cpu_has_feature(CPU_FTR_ARCH_300)) {
> + reinit_flags |= OPAL_REINIT_CPUS_MMU_HASH;
> + if (early_radix_enabled())
> + reinit_flags |= OPAL_REINIT_CPUS_MMU_RADIX;
> + }
> +
> + opal_reinit_cpus(reinit_flags);
> +
> /* Restore some bits */
> if (cur_cpu_spec->cpu_restore)
> cur_cpu_spec->cpu_restore();
> diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
> index adceac978d18..dfe03d14ec55 100644
> --- a/arch/powerpc/platforms/powernv/setup.c
> +++ b/arch/powerpc/platforms/powernv/setup.c
> @@ -221,6 +221,8 @@ static void pnv_kexec_wait_secondaries_down(void)
>
> static void pnv_kexec_cpu_down(int crash_shutdown, int secondary)
> {
> + uint64_t reinit_flags;
> +
> if (xive_enabled())
> xive_kexec_teardown_cpu(secondary);
> else
> @@ -250,8 +252,15 @@ static void pnv_kexec_cpu_down(int crash_shutdown, int secondary)
> * We might be running as little-endian - now that interrupts
> * are disabled, reset the HILE bit to big-endian so we don't
> * take interrupts in the wrong endian later
> + *
> + * We reinit to enable both radix and hash on P9 to ensure
> + * the mode used by the next kernel is always supported.
> */
> - opal_reinit_cpus(OPAL_REINIT_CPUS_HILE_BE);
> + reinit_flags = OPAL_REINIT_CPUS_HILE_BE;
> + if (cpu_has_feature(CPU_FTR_ARCH_300))
> + reinit_flags |= OPAL_REINIT_CPUS_MMU_RADIX |
> + OPAL_REINIT_CPUS_MMU_HASH;
> + opal_reinit_cpus(reinit_flags);
> }
> }
> #endif /* CONFIG_KEXEC_CORE */
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20170711/0a41aef7/attachment.sig>
More information about the kernel-team
mailing list