diff options
Diffstat (limited to 'arch/sparc/kernel/irq_64.c')
| -rw-r--r-- | arch/sparc/kernel/irq_64.c | 17 | 
1 files changed, 13 insertions, 4 deletions
| diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 4d0248aa0928..99dd133a029f 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -1034,17 +1034,26 @@ static void __init init_cpu_send_mondo_info(struct trap_per_cpu *tb)  {  #ifdef CONFIG_SMP  	unsigned long page; +	void *mondo, *p; -	BUILD_BUG_ON((NR_CPUS * sizeof(u16)) > (PAGE_SIZE - 64)); +	BUILD_BUG_ON((NR_CPUS * sizeof(u16)) > PAGE_SIZE); + +	/* Make sure mondo block is 64byte aligned */ +	p = kzalloc(127, GFP_KERNEL); +	if (!p) { +		prom_printf("SUN4V: Error, cannot allocate mondo block.\n"); +		prom_halt(); +	} +	mondo = (void *)(((unsigned long)p + 63) & ~0x3f); +	tb->cpu_mondo_block_pa = __pa(mondo);  	page = get_zeroed_page(GFP_KERNEL);  	if (!page) { -		prom_printf("SUN4V: Error, cannot allocate cpu mondo page.\n"); +		prom_printf("SUN4V: Error, cannot allocate cpu list page.\n");  		prom_halt();  	} -	tb->cpu_mondo_block_pa = __pa(page); -	tb->cpu_list_pa = __pa(page + 64); +	tb->cpu_list_pa = __pa(page);  #endif  } |