diff options
Diffstat (limited to 'arch/powerpc/kernel')
| -rw-r--r-- | arch/powerpc/kernel/Makefile | 6 | ||||
| -rw-r--r-- | arch/powerpc/kernel/btext.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/kernel/cputable.c | 53 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_44x.S | 16 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_64.S | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/init_task.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/kernel/irq.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/isa-bridge.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/legacy_serial.c | 10 | ||||
| -rw-r--r-- | arch/powerpc/kernel/of_platform.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/pci_64.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/ppc_ksyms.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/prom_init_check.sh | 16 | ||||
| -rw-r--r-- | arch/powerpc/kernel/setup_64.c | 10 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal_64.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/smp.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/syscalls.c | 17 | ||||
| -rw-r--r-- | arch/powerpc/kernel/vdso.c | 2 | 
18 files changed, 104 insertions, 49 deletions
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index d14cebf62bb..2346d271fbf 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -105,6 +105,9 @@ PHONY += systbl_chk  systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i  	$(call cmd,systbl_chk) + +ifeq ($(CONFIG_PPC_MERGE),y) +  $(obj)/built-in.o:		prom_init_check  quiet_cmd_prom_init_check = CALL    $< @@ -114,4 +117,7 @@ PHONY += prom_init_check  prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o  	$(call cmd,prom_init_check) +endif + +  clean-files := vmlinux.lds diff --git a/arch/powerpc/kernel/btext.c b/arch/powerpc/kernel/btext.c index 9f937774549..d8f0329b134 100644 --- a/arch/powerpc/kernel/btext.c +++ b/arch/powerpc/kernel/btext.c @@ -16,7 +16,6 @@  #include <asm/mmu.h>  #include <asm/pgtable.h>  #include <asm/io.h> -#include <asm/prom.h>  #include <asm/processor.h>  #include <asm/udbg.h> diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 36080d4d192..e44d5530f0a 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -1208,6 +1208,18 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.machine_check		= machine_check_4xx,  		.platform		= "ppc405",  	}, +	{	/* default match */ +		.pvr_mask		= 0x00000000, +		.pvr_value		= 0x00000000, +		.cpu_name		= "(generic 40x PPC)", +		.cpu_features		= CPU_FTRS_40X, +		.cpu_user_features	= PPC_FEATURE_32 | +			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, +		.icache_bsize		= 32, +		.dcache_bsize		= 32, +		.machine_check		= machine_check_4xx, +		.platform		= "ppc405", +	}  #endif /* CONFIG_40x */  #ifdef CONFIG_44x @@ -1421,8 +1433,18 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.machine_check		= machine_check_440A,  		.platform		= "ppc440",  	}, +	{	/* default match */ +		.pvr_mask		= 0x00000000, +		.pvr_value		= 0x00000000, +		.cpu_name		= "(generic 44x PPC)", +		.cpu_features		= CPU_FTRS_44X, +		.cpu_user_features	= COMMON_USER_BOOKE, +		.icache_bsize		= 32, +		.dcache_bsize		= 32, +		.machine_check		= machine_check_4xx, +		.platform		= "ppc440", +	}  #endif /* CONFIG_44x */ -#ifdef CONFIG_FSL_BOOKE  #ifdef CONFIG_E200  	{	/* e200z5 */  		.pvr_mask		= 0xfff00000, @@ -1451,7 +1473,20 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.machine_check		= machine_check_e200,  		.platform		= "ppc5554",  	}, -#elif defined(CONFIG_E500) +	{	/* default match */ +		.pvr_mask		= 0x00000000, +		.pvr_value		= 0x00000000, +		.cpu_name		= "(generic E200 PPC)", +		.cpu_features		= CPU_FTRS_E200, +		.cpu_user_features	= COMMON_USER_BOOKE | +			PPC_FEATURE_HAS_EFP_SINGLE | +			PPC_FEATURE_UNIFIED_CACHE, +		.dcache_bsize		= 32, +		.machine_check		= machine_check_e200, +		.platform		= "ppc5554", +	} +#endif /* CONFIG_E200 */ +#ifdef CONFIG_E500  	{	/* e500 */  		.pvr_mask		= 0xffff0000,  		.pvr_value		= 0x80200000, @@ -1487,20 +1522,20 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.machine_check		= machine_check_e500,  		.platform		= "ppc8548",  	}, -#endif -#endif -#if !CLASSIC_PPC  	{	/* default match */  		.pvr_mask		= 0x00000000,  		.pvr_value		= 0x00000000, -		.cpu_name		= "(generic PPC)", -		.cpu_features		= CPU_FTRS_GENERIC_32, -		.cpu_user_features	= PPC_FEATURE_32, +		.cpu_name		= "(generic E500 PPC)", +		.cpu_features		= CPU_FTRS_E500, +		.cpu_user_features	= COMMON_USER_BOOKE | +			PPC_FEATURE_HAS_SPE_COMP | +			PPC_FEATURE_HAS_EFP_SINGLE_COMP,  		.icache_bsize		= 32,  		.dcache_bsize		= 32, +		.machine_check		= machine_check_e500,  		.platform		= "powerpc",  	} -#endif /* !CLASSIC_PPC */ +#endif /* CONFIG_E500 */  #endif /* CONFIG_PPC32 */  }; diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index b84ec6a2fc9..22b5d2c459a 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S @@ -368,7 +368,12 @@ interrupt_base:  	rlwimi	r11,r13,0,26,31		/* Insert static perms */ -	rlwinm	r11,r11,0,20,15		/* Clear U0-U3 */ +	/* +	 * Clear U0-U3 and WL1 IL1I IL1D IL2I IL2D bits which are added +	 * on newer 440 cores like the 440x6 used on AMCC 460EX/460GT (see +	 * include/asm-powerpc/pgtable-ppc32.h for details). +	 */ +	rlwinm	r11,r11,0,20,10  	/* find the TLB index that caused the fault.  It has to be here. */  	tlbsx	r10, 0, r10 @@ -653,7 +658,14 @@ finish_tlb_load:  	rlwimi	r10, r11, 0, 26, 26		/* UX = HWEXEC & USER */  	rlwimi	r12, r10, 0, 26, 31		/* Insert static perms */ -	rlwinm	r12, r12, 0, 20, 15		/* Clear U0-U3 */ + +	/* +	 * Clear U0-U3 and WL1 IL1I IL1D IL2I IL2D bits which are added +	 * on newer 440 cores like the 440x6 used on AMCC 460EX/460GT (see +	 * include/asm-powerpc/pgtable-ppc32.h for details). +	 */ +	rlwinm	r12, r12, 0, 20, 10 +  	tlbwe	r12, r13, PPC44x_TLB_ATTRIB	/* Write ATTRIB */  	/* Done...restore registers and get out of here. diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 024805e1747..25e84c0e116 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -1517,10 +1517,6 @@ _INIT_STATIC(start_here_multiplatform)  	addi	r2,r2,0x4000  	add	r2,r2,r26 -	/* Set initial ptr to current */ -	LOAD_REG_IMMEDIATE(r4, init_task) -	std	r4,PACACURRENT(r13) -  	/* Do very early kernel initializations, including initial hash table,  	 * stab and slb setup before we turn on relocation.	*/ diff --git a/arch/powerpc/kernel/init_task.c b/arch/powerpc/kernel/init_task.c index 941043ae040..4c85b8d5647 100644 --- a/arch/powerpc/kernel/init_task.c +++ b/arch/powerpc/kernel/init_task.c @@ -8,7 +8,6 @@  #include <asm/uaccess.h>  static struct fs_struct init_fs = INIT_FS; -static struct files_struct init_files = INIT_FILES;  static struct signal_struct init_signals = INIT_SIGNALS(init_signals);  static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);  struct mm_struct init_mm = INIT_MM(init_mm); diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 2f73f705d56..bcc249d90c4 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -1073,7 +1073,7 @@ static const struct file_operations virq_debug_fops = {  static int __init irq_debugfs_init(void)  {  	if (debugfs_create_file("virq_mapping", S_IRUGO, powerpc_debugfs_root, -				 NULL, &virq_debug_fops)) +				 NULL, &virq_debug_fops) == NULL)  		return -ENOMEM;  	return 0; diff --git a/arch/powerpc/kernel/isa-bridge.c b/arch/powerpc/kernel/isa-bridge.c index 289af348978..4d5731b2429 100644 --- a/arch/powerpc/kernel/isa-bridge.c +++ b/arch/powerpc/kernel/isa-bridge.c @@ -108,9 +108,6 @@ static void __devinit pci_process_ISA_OF_ranges(struct device_node *isa_node,  	if (size > 0x10000)  		size = 0x10000; -	printk(KERN_ERR "no ISA IO ranges or unexpected isa range, " -	       "mapping 64k\n"); -  	__ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,  		     size, _PAGE_NO_CACHE|_PAGE_GUARDED);  	return; diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 61dd17449dd..4d96e1db55e 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c @@ -33,13 +33,14 @@ static struct legacy_serial_info {  	phys_addr_t			taddr;  } legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS]; -static struct __initdata of_device_id parents[] = { +static struct __initdata of_device_id legacy_serial_parents[] = {  	{.type = "soc",},  	{.type = "tsi-bridge",},  	{.type = "opb", },  	{.compatible = "ibm,opb",},  	{.compatible = "simple-bus",},  	{.compatible = "wrs,epld-localbus",}, +	{},  };  static unsigned int legacy_serial_count; @@ -136,6 +137,11 @@ static int __init add_legacy_soc_port(struct device_node *np,  	if (of_get_property(np, "clock-frequency", NULL) == NULL)  		return -1; +	/* if reg-shift or offset, don't try to use it */ +	if ((of_get_property(np, "reg-shift", NULL) != NULL) || +		(of_get_property(np, "reg-offset", NULL) != NULL)) +		return -1; +  	/* if rtas uses this device, don't try to use it as well */  	if (of_get_property(np, "used-by-rtas", NULL) != NULL)  		return -1; @@ -322,7 +328,7 @@ void __init find_legacy_serial_ports(void)  		struct device_node *parent = of_get_parent(np);  		if (!parent)  			continue; -		if (of_match_node(parents, parent) != NULL) { +		if (of_match_node(legacy_serial_parents, parent) != NULL) {  			index = add_legacy_soc_port(np, np);  			if (index >= 0 && np == stdout)  				legacy_serial_console = index; diff --git a/arch/powerpc/kernel/of_platform.c b/arch/powerpc/kernel/of_platform.c index e79ad8afda0..3f37a6e6277 100644 --- a/arch/powerpc/kernel/of_platform.c +++ b/arch/powerpc/kernel/of_platform.c @@ -76,6 +76,8 @@ struct of_device* of_platform_device_create(struct device_node *np,  		return NULL;  	dev->dma_mask = 0xffffffffUL; +	dev->dev.coherent_dma_mask = DMA_32BIT_MASK; +  	dev->dev.bus = &of_platform_bus_type;  	/* We do not fill the DMA ops for platform devices by default. diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 52750745edf..30eedfc5a56 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c @@ -189,7 +189,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,  	dev->cfg_size = pci_cfg_space_size(dev); -	sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), +	dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(bus),  		dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));  	dev->class = get_int_prop(node, "class-code", 0);  	dev->revision = get_int_prop(node, "revision-id", 0); diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index cf6b5a7d8b3..d3ac631cbd2 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c @@ -8,7 +8,6 @@  #include <linux/screen_info.h>  #include <linux/vt_kern.h>  #include <linux/nvram.h> -#include <linux/console.h>  #include <linux/irq.h>  #include <linux/pci.h>  #include <linux/delay.h> @@ -160,7 +159,6 @@ EXPORT_SYMBOL(screen_info);  EXPORT_SYMBOL(timer_interrupt);  EXPORT_SYMBOL(irq_desc);  EXPORT_SYMBOL(tb_ticks_per_jiffy); -EXPORT_SYMBOL(console_drivers);  EXPORT_SYMBOL(cacheable_memcpy);  #endif diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh index 8e24fc1821e..2c7e8e87f77 100644 --- a/arch/powerpc/kernel/prom_init_check.sh +++ b/arch/powerpc/kernel/prom_init_check.sh @@ -20,7 +20,7 @@ WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush  _end enter_prom memcpy memset reloc_offset __secondary_hold  __secondary_hold_acknowledge __secondary_hold_spinloop __start  strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 -reloc_got2" +reloc_got2 kernstart_addr"  NM="$1"  OBJ="$2" @@ -48,6 +48,20 @@ do  		fi  	done +	# ignore register save/restore funcitons +	if [ "${UNDEF:0:9}" = "_restgpr_" ]; then +		OK=1 +	fi +	if [ "${UNDEF:0:11}" = "_rest32gpr_" ]; then +		OK=1 +	fi +	if [ "${UNDEF:0:9}" = "_savegpr_" ]; then +		OK=1 +	fi +	if [ "${UNDEF:0:11}" = "_save32gpr_" ]; then +		OK=1 +	fi +  	if [ $OK -eq 0 ]; then  		ERROR=1  		echo "Error: External symbol '$UNDEF' referenced" \ diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 25e3fd8606a..098fd96a394 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c @@ -170,6 +170,8 @@ void __init setup_paca(int cpu)  void __init early_setup(unsigned long dt_ptr)  { +	/* -------- printk is _NOT_ safe to use here ! ------- */ +  	/* Fill in any unititialised pacas */  	initialise_pacas(); @@ -179,12 +181,14 @@ void __init early_setup(unsigned long dt_ptr)  	/* Assume we're on cpu 0 for now. Don't write to the paca yet! */  	setup_paca(0); -	/* Enable early debugging if any specified (see udbg.h) */ -	udbg_early_init(); -  	/* Initialize lockdep early or else spinlocks will blow */  	lockdep_init(); +	/* -------- printk is now safe to use ------- */ + +	/* Enable early debugging if any specified (see udbg.h) */ +	udbg_early_init(); +   	DBG(" -> early_setup(), dt_ptr: 0x%lx\n", dt_ptr);  	/* diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index faeb8f207ea..da7c058e373 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -87,6 +87,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,  #ifdef CONFIG_ALTIVEC  	elf_vrreg_t __user *v_regs = (elf_vrreg_t __user *)(((unsigned long)sc->vmx_reserve + 15) & ~0xful);  #endif +	unsigned long msr = regs->msr;  	long err = 0;  	flush_fp_to_thread(current); @@ -102,7 +103,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,  		/* set MSR_VEC in the MSR value in the frame to indicate that sc->v_reg)  		 * contains valid data.  		 */ -		regs->msr |= MSR_VEC; +		msr |= MSR_VEC;  	}  	/* We always copy to/from vrsave, it's 0 if we don't have or don't  	 * use altivec. @@ -114,6 +115,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,  	err |= __put_user(&sc->gp_regs, &sc->regs);  	WARN_ON(!FULL_REGS(regs));  	err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE); +	err |= __put_user(msr, &sc->gp_regs[PT_MSR]);  	err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);  	err |= __put_user(signr, &sc->signal);  	err |= __put_user(handler, &sc->handler); diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index be35ffae10f..1457aa0a08f 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -386,6 +386,8 @@ static void __init smp_create_idle(unsigned int cpu)  		panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));  #ifdef CONFIG_PPC64  	paca[cpu].__current = p; +	paca[cpu].kstack = (unsigned long) task_thread_info(p) +		+ THREAD_SIZE - STACK_FRAME_OVERHEAD;  #endif  	current_set[cpu] = task_thread_info(p);  	task_thread_info(p)->cpu = cpu; diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c index e722a4eeb5d..4fe69ca2448 100644 --- a/arch/powerpc/kernel/syscalls.c +++ b/arch/powerpc/kernel/syscalls.c @@ -136,23 +136,6 @@ int sys_ipc(uint call, int first, unsigned long second, long third,  	return ret;  } -/* - * sys_pipe() is the normal C calling standard for creating - * a pipe. It's not the way unix traditionally does this, though. - */ -int sys_pipe(int __user *fildes) -{ -	int fd[2]; -	int error; - -	error = do_pipe(fd); -	if (!error) { -		if (copy_to_user(fildes, fd, 2*sizeof(int))) -			error = -EFAULT; -	} -	return error; -} -  static inline unsigned long do_mmap2(unsigned long addr, size_t len,  			unsigned long prot, unsigned long flags,  			unsigned long fd, unsigned long off, int shift) diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index c21a626af67..ce245a850db 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c @@ -142,7 +142,7 @@ static void dump_one_vdso_page(struct page *pg, struct page *upg)  	printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT),  	       page_count(pg),  	       pg->flags); -	if (upg/* && pg != upg*/) { +	if (upg && !IS_ERR(upg) /* && pg != upg*/) {  		printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg)  						       << PAGE_SHIFT),  		       page_count(upg),  |