[PATCH 4/4] powerpc: Replace platform_is_lpar() with a firmware feature

Michael Ellerman michael at ellerman.id.au
Thu Jan 12 18:30:15 EST 2006


And as Stephen points out, this was is broken too - we should be setting 
ISERIES_ALWAYS to include LPAR.

cheers

On Thu, 12 Jan 2006 17:10, Michael Ellerman wrote:
> It has been decreed that platform numbers are evil, so as a step in that
> direction, replace platform_is_lpar() with a FW_FEATURE_LPAR bit.
>
> Signed-off-by: Michael Ellerman <michael at ellerman.id.au>
> ---
>
>  arch/powerpc/mm/hash_utils_64.c         |    4 ++--
>  arch/powerpc/oprofile/op_model_power4.c |    3 ++-
>  arch/powerpc/platforms/iseries/setup.c  |   10 +++++++---
>  arch/powerpc/platforms/pseries/iommu.c  |    2 +-
>  arch/powerpc/platforms/pseries/setup.c  |   11 +++++++----
>  arch/powerpc/platforms/pseries/smp.c    |    2 +-
>  arch/powerpc/platforms/pseries/xics.c   |    3 ++-
>  include/asm-powerpc/firmware.h          |    5 +++--
>  include/asm-powerpc/processor.h         |    1 -
>  9 files changed, 25 insertions(+), 16 deletions(-)
>
> Index: linux/include/asm-powerpc/firmware.h
> ===================================================================
> --- linux.orig/include/asm-powerpc/firmware.h
> +++ linux/include/asm-powerpc/firmware.h
> @@ -41,6 +41,7 @@
>  #define FW_FEATURE_MULTITCE	(1UL<<19)
>  #define FW_FEATURE_SPLPAR	(1UL<<20)
>  #define FW_FEATURE_ISERIES	(1UL<<21)
> +#define FW_FEATURE_LPAR		(1UL<<22)
>
>  enum {
>  #ifdef CONFIG_PPC64
> @@ -51,9 +52,9 @@ enum {
>  		FW_FEATURE_MIGRATE | FW_FEATURE_PERFMON | FW_FEATURE_CRQ |
>  		FW_FEATURE_VIO | FW_FEATURE_RDMA | FW_FEATURE_LLAN |
>  		FW_FEATURE_BULK | FW_FEATURE_XDABR | FW_FEATURE_MULTITCE |
> -		FW_FEATURE_SPLPAR,
> +		FW_FEATURE_SPLPAR | FW_FEATURE_LPAR,
>  	FW_FEATURE_PSERIES_ALWAYS = 0,
> -	FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES,
> +	FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
>  	FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES,
>  	FW_FEATURE_POSSIBLE =
>  #ifdef CONFIG_PPC_PSERIES
> Index: linux/arch/powerpc/mm/hash_utils_64.c
> ===================================================================
> --- linux.orig/arch/powerpc/mm/hash_utils_64.c
> +++ linux/arch/powerpc/mm/hash_utils_64.c
> @@ -421,7 +421,7 @@ void __init htab_initialize(void)
>
>  	htab_hash_mask = pteg_count - 1;
>
> -	if (platform_is_lpar()) {
> +	if (firmware_has_feature(FW_FEATURE_LPAR)) {
>  		/* Using a hypervisor which owns the htab */
>  		htab_address = NULL;
>  		_SDR1 = 0;
> @@ -516,7 +516,7 @@ void __init htab_initialize(void)
>
>  void htab_initialize_secondary(void)
>  {
> -	if (!platform_is_lpar())
> +	if (!firmware_has_feature(FW_FEATURE_LPAR))
>  		mtspr(SPRN_SDR1, _SDR1);
>  }
>
> Index: linux/arch/powerpc/oprofile/op_model_power4.c
> ===================================================================
> --- linux.orig/arch/powerpc/oprofile/op_model_power4.c
> +++ linux/arch/powerpc/oprofile/op_model_power4.c
> @@ -10,6 +10,7 @@
>  #include <linux/oprofile.h>
>  #include <linux/init.h>
>  #include <linux/smp.h>
> +#include <asm/firmware.h>
>  #include <asm/ptrace.h>
>  #include <asm/system.h>
>  #include <asm/processor.h>
> @@ -232,7 +233,7 @@ static unsigned long get_pc(struct pt_re
>  	mmcra = mfspr(SPRN_MMCRA);
>
>  	/* Were we in the hypervisor? */
> -	if (platform_is_lpar() && (mmcra & MMCRA_SIHV))
> +	if (firmware_has_feature(FW_FEATURE_LPAR) && (mmcra & MMCRA_SIHV))
>  		/* function descriptor madness */
>  		return *((unsigned long *)hypervisor_bucket);
>
> Index: linux/arch/powerpc/platforms/pseries/iommu.c
> ===================================================================
> --- linux.orig/arch/powerpc/platforms/pseries/iommu.c
> +++ linux/arch/powerpc/platforms/pseries/iommu.c
> @@ -584,7 +584,7 @@ void iommu_init_early_pSeries(void)
>  		return;
>  	}
>
> -	if (platform_is_lpar()) {
> +	if (firmware_has_feature(FW_FEATURE_LPAR)) {
>  		if (firmware_has_feature(FW_FEATURE_MULTITCE)) {
>  			ppc_md.tce_build = tce_buildmulti_pSeriesLP;
>  			ppc_md.tce_free	 = tce_freemulti_pSeriesLP;
> Index: linux/arch/powerpc/platforms/pseries/setup.c
> ===================================================================
> --- linux.orig/arch/powerpc/platforms/pseries/setup.c
> +++ linux/arch/powerpc/platforms/pseries/setup.c
> @@ -246,7 +246,7 @@ static void __init pSeries_setup_arch(vo
>  		ppc_md.idle_loop = default_idle;
>  	}
>
> -	if (platform_is_lpar())
> +	if (firmware_has_feature(FW_FEATURE_LPAR))
>  		ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
>  	else
>  		ppc_md.enable_pmcs = power4_enable_pmcs;
> @@ -326,7 +326,7 @@ static void __init pSeries_init_early(vo
>
>  	fw_feature_init();
>
> -	if (platform_is_lpar())
> +	if (firmware_has_feature(FW_FEATURE_LPAR))
>  		hpte_init_lpar();
>  	else {
>  		hpte_init_native();
> @@ -334,7 +334,7 @@ static void __init pSeries_init_early(vo
>  			     get_property(of_chosen, "linux,iommu-off", NULL));
>  	}
>
> -	if (platform_is_lpar())
> +	if (firmware_has_feature(FW_FEATURE_LPAR))
>  		find_udbg_vterm();
>
>  	if (firmware_has_feature(FW_FEATURE_DABR))
> @@ -390,6 +390,9 @@ static int __init pSeries_probe(int plat
>  	 * it here ...
>  	 */
>
> +	if (platform == PLATFORM_PSERIES_LPAR)
> +		firmware_set_feature(FW_FEATURE_LPAR);
> +
>  	return 1;
>  }
>
> @@ -531,7 +534,7 @@ static void pseries_shared_idle(void)
>
>  static int pSeries_pci_probe_mode(struct pci_bus *bus)
>  {
> -	if (platform_is_lpar())
> +	if (firmware_has_feature(FW_FEATURE_LPAR))
>  		return PCI_PROBE_DEVTREE;
>  	return PCI_PROBE_NORMAL;
>  }
> Index: linux/arch/powerpc/platforms/pseries/smp.c
> ===================================================================
> --- linux.orig/arch/powerpc/platforms/pseries/smp.c
> +++ linux/arch/powerpc/platforms/pseries/smp.c
> @@ -443,7 +443,7 @@ void __init smp_init_pSeries(void)
>  	smp_ops->cpu_die = pSeries_cpu_die;
>
>  	/* Processors can be added/removed only on LPAR */
> -	if (platform_is_lpar())
> +	if (firmware_has_feature(FW_FEATURE_LPAR))
>  		pSeries_reconfig_notifier_register(&pSeries_smp_nb);
>  #endif
>
> Index: linux/arch/powerpc/platforms/pseries/xics.c
> ===================================================================
> --- linux.orig/arch/powerpc/platforms/pseries/xics.c
> +++ linux/arch/powerpc/platforms/pseries/xics.c
> @@ -20,6 +20,7 @@
>  #include <linux/gfp.h>
>  #include <linux/radix-tree.h>
>  #include <linux/cpu.h>
> +#include <asm/firmware.h>
>  #include <asm/prom.h>
>  #include <asm/io.h>
>  #include <asm/pgtable.h>
> @@ -536,7 +537,7 @@ nextnode:
>  		of_node_put(np);
>  	}
>
> -	if (platform_is_lpar())
> +	if (firmware_has_feature(FW_FEATURE_LPAR))
>  		ops = &pSeriesLP_ops;
>  	else {
>  #ifdef CONFIG_SMP
> Index: linux/arch/powerpc/platforms/iseries/setup.c
> ===================================================================
> --- linux.orig/arch/powerpc/platforms/iseries/setup.c
> +++ linux/arch/powerpc/platforms/iseries/setup.c
> @@ -303,8 +303,6 @@ static void __init iSeries_init_early(vo
>  {
>  	DBG(" -> iSeries_init_early()\n");
>
> -	firmware_set_feature(FW_FEATURE_ISERIES);
> -
>  	ppc64_interrupt_controller = IC_ISERIES;
>
>  #if defined(CONFIG_BLK_DEV_INITRD)
> @@ -710,7 +708,13 @@ void __init iSeries_init_IRQ(void) { }
>
>  static int __init iseries_probe(int platform)
>  {
> -	return PLATFORM_ISERIES_LPAR == platform;
> +	if (PLATFORM_ISERIES_LPAR != platform)
> +		return 0;
> +
> +	firmware_set_feature(FW_FEATURE_ISERIES);
> +	firmware_set_feature(FW_FEATURE_LPAR);
> +
> +	return 1;
>  }
>
>  struct machdep_calls __initdata iseries_md = {
> Index: linux/include/asm-powerpc/processor.h
> ===================================================================
> --- linux.orig/include/asm-powerpc/processor.h
> +++ linux/include/asm-powerpc/processor.h
> @@ -52,7 +52,6 @@
>  #ifdef __KERNEL__
>  #define platform_is_pseries()	(_machine == PLATFORM_PSERIES || \
>  				 _machine == PLATFORM_PSERIES_LPAR)
> -#define platform_is_lpar()	(!!(_machine & PLATFORM_LPAR))
>
>  #if defined(CONFIG_PPC_MULTIPLATFORM)
>  extern int _machine;
> _______________________________________________
> Linuxppc64-dev mailing list
> Linuxppc64-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc64-dev

-- 
Michael Ellerman
IBM OzLabs

email: michael:ellerman.id.au
inmsg: mpe:jabber.org
wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://ozlabs.org/pipermail/linuxppc64-dev/attachments/20060112/f80f822e/attachment.pgp 


More information about the Linuxppc64-dev mailing list