diff options
Diffstat (limited to 'arch/powerpc/kernel/prom_init.c')
| -rw-r--r-- | arch/powerpc/kernel/prom_init.c | 21 | 
1 files changed, 21 insertions, 0 deletions
| diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 12e656ffe60e..5fe2842e8bab 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -196,6 +196,8 @@ static int __initdata mem_reserve_cnt;  static cell_t __initdata regbuf[1024]; +static bool rtas_has_query_cpu_stopped; +  /*   * Error results ... some OF calls will return "-1" on error, some @@ -1574,6 +1576,11 @@ static void __init prom_instantiate_rtas(void)  	prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",  		     &val, sizeof(val)); +	/* Check if it supports "query-cpu-stopped-state" */ +	if (prom_getprop(rtas_node, "query-cpu-stopped-state", +			 &val, sizeof(val)) != PROM_ERROR) +		rtas_has_query_cpu_stopped = true; +  #if defined(CONFIG_PPC_POWERNV) && defined(__BIG_ENDIAN__)  	/* PowerVN takeover hack */  	prom_rtas_data = base; @@ -1815,6 +1822,18 @@ static void __init prom_hold_cpus(void)  		= (void *) LOW_ADDR(__secondary_hold_acknowledge);  	unsigned long secondary_hold = LOW_ADDR(__secondary_hold); +	/* +	 * On pseries, if RTAS supports "query-cpu-stopped-state", +	 * we skip this stage, the CPUs will be started by the +	 * kernel using RTAS. +	 */ +	if ((of_platform == PLATFORM_PSERIES || +	     of_platform == PLATFORM_PSERIES_LPAR) && +	    rtas_has_query_cpu_stopped) { +		prom_printf("prom_hold_cpus: skipped\n"); +		return; +	} +  	prom_debug("prom_hold_cpus: start...\n");  	prom_debug("    1) spinloop       = 0x%x\n", (unsigned long)spinloop);  	prom_debug("    1) *spinloop      = 0x%x\n", *spinloop); @@ -3011,6 +3030,8 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,  	 * On non-powermacs, put all CPUs in spin-loops.  	 *  	 * PowerMacs use a different mechanism to spin CPUs +	 * +	 * (This must be done after instanciating RTAS)  	 */  	if (of_platform != PLATFORM_POWERMAC &&  	    of_platform != PLATFORM_OPAL) | 
