[PATCH v3] powerpc/powernv: Initialise nest mmu

Alistair Popple alistair at popple.id.au
Fri Dec 16 16:28:44 AEDT 2016


> Michael the skiboot fix to stop this breaking in mambo has been posted
> (see http://patchwork.ozlabs.org/patch/702564/). Will let you know
> when it has gone upstream.

Upstream in skiboot master as of 9418533911728f6d8bb7aa647033c317772ddb97.

Thanks!

> 
>  arch/powerpc/include/asm/opal-api.h            |  3 ++-
>  arch/powerpc/include/asm/opal.h                |  1 +
>  arch/powerpc/mm/pgtable-radix.c                |  8 ++++++--
>  arch/powerpc/platforms/powernv/opal-wrappers.S |  1 +
>  arch/powerpc/platforms/powernv/opal.c          | 11 +++++++++++
>  arch/powerpc/platforms/powernv/powernv.h       |  6 ++++++
>  6 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h
> index 0e2e57b..a0aa285 100644
> --- a/arch/powerpc/include/asm/opal-api.h
> +++ b/arch/powerpc/include/asm/opal-api.h
> @@ -167,7 +167,8 @@
>  #define OPAL_INT_EOI				124
>  #define OPAL_INT_SET_MFRR			125
>  #define OPAL_PCI_TCE_KILL			126
> -#define OPAL_LAST				126
> +#define OPAL_NMMU_SET_PTCR			127
> +#define OPAL_LAST				127
> 
>  /* Device tree flags */
> 
> diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
> index e958b70..b61c3d3 100644
> --- a/arch/powerpc/include/asm/opal.h
> +++ b/arch/powerpc/include/asm/opal.h
> @@ -229,6 +229,7 @@ int64_t opal_pci_tce_kill(uint64_t phb_id, uint32_t kill_type,
>  int64_t opal_rm_pci_tce_kill(uint64_t phb_id, uint32_t kill_type,
>  			     uint32_t pe_num, uint32_t tce_size,
>  			     uint64_t dma_addr, uint32_t npages);
> +int64_t opal_nmmu_set_ptcr(uint64_t chip_id, uint64_t ptcr);
> 
>  /* Internal functions */
>  extern int early_init_dt_scan_opal(unsigned long node, const char *uname,
> diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
> index 688b545..d5e868b 100644
> --- a/arch/powerpc/mm/pgtable-radix.c
> +++ b/arch/powerpc/mm/pgtable-radix.c
> @@ -18,6 +18,7 @@
>  #include <asm/machdep.h>
>  #include <asm/mmu.h>
>  #include <asm/firmware.h>
> +#include <platforms/powernv/powernv.h>
> 
>  #include <trace/events/thp.h>
> 
> @@ -177,7 +178,7 @@ static void __init radix_init_pgtable(void)
> 
>  static void __init radix_init_partition_table(void)
>  {
> -	unsigned long rts_field;
> +	unsigned long rts_field, ptcr;
> 
>  	rts_field = radix__get_tree_size();
> 
> @@ -193,7 +194,9 @@ static void __init radix_init_partition_table(void)
>  	 * update partition table control register,
>  	 * 64 K size.
>  	 */
> -	mtspr(SPRN_PTCR, __pa(partition_tb) | (PATB_SIZE_SHIFT - 12));
> +	ptcr = __pa(partition_tb) | (PATB_SIZE_SHIFT - 12);
> +	mtspr(SPRN_PTCR, ptcr);
> +	powernv_set_nmmu_ptcr(ptcr);
>  }
> 
>  void __init radix_init_native(void)
> @@ -408,6 +411,7 @@ void radix__mmu_cleanup_all(void)
>  		lpcr = mfspr(SPRN_LPCR);
>  		mtspr(SPRN_LPCR, lpcr & ~LPCR_UPRT);
>  		mtspr(SPRN_PTCR, 0);
> +		powernv_set_nmmu_ptcr(0);
>  		radix__flush_tlb_all();
>  	}
>  }
> diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S
> index 44d2d84..894639b 100644
> --- a/arch/powerpc/platforms/powernv/opal-wrappers.S
> +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S
> @@ -308,4 +308,5 @@ OPAL_CALL(opal_int_set_cppr,			OPAL_INT_SET_CPPR);
>  OPAL_CALL(opal_int_eoi,				OPAL_INT_EOI);
>  OPAL_CALL(opal_int_set_mfrr,			OPAL_INT_SET_MFRR);
>  OPAL_CALL(opal_pci_tce_kill,			OPAL_PCI_TCE_KILL);
> +OPAL_CALL(opal_nmmu_set_ptcr,			OPAL_NMMU_SET_PTCR);
>  OPAL_CALL_REAL(opal_rm_pci_tce_kill,		OPAL_PCI_TCE_KILL);
> diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
> index 6c9a65b..773077e 100644
> --- a/arch/powerpc/platforms/powernv/opal.c
> +++ b/arch/powerpc/platforms/powernv/opal.c
> @@ -885,6 +885,17 @@ int opal_error_code(int rc)
>  	}
>  }
> 
> +void powernv_set_nmmu_ptcr(unsigned long ptcr)
> +{
> +	int rc;
> +
> +	if (firmware_has_feature(FW_FEATURE_OPAL)) {
> +		rc = opal_nmmu_set_ptcr(-1UL, ptcr);
> +		if (rc != OPAL_SUCCESS && rc != OPAL_UNSUPPORTED)
> +			pr_warn("%s: Unable to set nest mmu ptcr\n", __func__);
> +	}
> +}
> +
>  EXPORT_SYMBOL_GPL(opal_poll_events);
>  EXPORT_SYMBOL_GPL(opal_rtc_read);
>  EXPORT_SYMBOL_GPL(opal_rtc_write);
> diff --git a/arch/powerpc/platforms/powernv/powernv.h b/arch/powerpc/platforms/powernv/powernv.h
> index da7c843..c49a2b0 100644
> --- a/arch/powerpc/platforms/powernv/powernv.h
> +++ b/arch/powerpc/platforms/powernv/powernv.h
> @@ -9,6 +9,12 @@ static inline void pnv_smp_init(void) { }
> 
>  struct pci_dev;
> 
> +#ifdef CONFIG_PPC_POWERNV
> +extern void powernv_set_nmmu_ptcr(unsigned long ptcr);
> +#else
> +static inline void powernv_set_nmmu_ptcr(unsigned long ptcr) { }
> +#endif
> +
>  #ifdef CONFIG_PCI
>  extern void pnv_pci_init(void);
>  extern void pnv_pci_shutdown(void);
> --
> 2.1.4



More information about the Linuxppc-dev mailing list