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