diff options
Diffstat (limited to 'arch/metag/kernel')
| -rw-r--r-- | arch/metag/kernel/devtree.c | 83 | ||||
| -rw-r--r-- | arch/metag/kernel/dma.c | 9 | ||||
| -rw-r--r-- | arch/metag/kernel/ftrace.c | 5 | ||||
| -rw-r--r-- | arch/metag/kernel/irq.c | 74 | ||||
| -rw-r--r-- | arch/metag/kernel/setup.c | 17 | ||||
| -rw-r--r-- | arch/metag/kernel/signal.c | 48 | ||||
| -rw-r--r-- | arch/metag/kernel/smp.c | 15 | ||||
| -rw-r--r-- | arch/metag/kernel/topology.c | 1 | ||||
| -rw-r--r-- | arch/metag/kernel/traps.c | 5 | 
9 files changed, 75 insertions, 182 deletions
diff --git a/arch/metag/kernel/devtree.c b/arch/metag/kernel/devtree.c index 7cd02529636..18dd7aea9fd 100644 --- a/arch/metag/kernel/devtree.c +++ b/arch/metag/kernel/devtree.c @@ -34,6 +34,19 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)  	return alloc_bootmem_align(size, align);  } +static const void * __init arch_get_next_mach(const char *const **match) +{ +	static const struct machine_desc *mdesc = __arch_info_begin; +	const struct machine_desc *m = mdesc; + +	if (m >= __arch_info_end) +		return NULL; + +	mdesc++; +	*match = m->dt_compat; +	return m; +} +  /**   * setup_machine_fdt - Machine setup when an dtb was passed to the kernel   * @dt:		virtual address pointer to dt blob @@ -41,74 +54,18 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)   * If a dtb was passed to the kernel, then use it to choose the correct   * machine_desc and to setup the system.   */ -struct machine_desc * __init setup_machine_fdt(void *dt) +const struct machine_desc * __init setup_machine_fdt(void *dt)  { -	struct boot_param_header *devtree = dt; -	struct machine_desc *mdesc, *mdesc_best = NULL; -	unsigned int score, mdesc_score = ~1; -	unsigned long dt_root; -	const char *model; +	const struct machine_desc *mdesc;  	/* check device tree validity */ -	if (be32_to_cpu(devtree->magic) != OF_DT_HEADER) +	if (!early_init_dt_scan(dt))  		return NULL; -	/* Search the mdescs for the 'best' compatible value match */ -	initial_boot_params = devtree; -	dt_root = of_get_flat_dt_root(); - -	for_each_machine_desc(mdesc) { -		score = of_flat_dt_match(dt_root, mdesc->dt_compat); -		if (score > 0 && score < mdesc_score) { -			mdesc_best = mdesc; -			mdesc_score = score; -		} -	} -	if (!mdesc_best) { -		const char *prop; -		long size; - -		pr_err("\nError: unrecognized/unsupported device tree compatible list:\n[ "); - -		prop = of_get_flat_dt_prop(dt_root, "compatible", &size); -		if (prop) { -			while (size > 0) { -				printk("'%s' ", prop); -				size -= strlen(prop) + 1; -				prop += strlen(prop) + 1; -			} -		} -		printk("]\n\n"); - +	mdesc = of_flat_dt_match_machine(NULL, arch_get_next_mach); +	if (!mdesc)  		dump_machine_table(); /* does not return */ -	} - -	model = of_get_flat_dt_prop(dt_root, "model", NULL); -	if (!model) -		model = of_get_flat_dt_prop(dt_root, "compatible", NULL); -	if (!model) -		model = "<unknown>"; -	pr_info("Machine: %s, model: %s\n", mdesc_best->name, model); - -	/* Retrieve various information from the /chosen node */ -	of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); - -	return mdesc_best; -} +	pr_info("Machine name: %s\n", mdesc->name); -/** - * copy_fdt - Copy device tree into non-init memory. - * - * We must copy the flattened device tree blob into non-init memory because the - * unflattened device tree will reference the strings in it directly. - */ -void __init copy_fdt(void) -{ -	void *alloc = early_init_dt_alloc_memory_arch( -			be32_to_cpu(initial_boot_params->totalsize), 0x40); -	if (alloc) { -		memcpy(alloc, initial_boot_params, -		       be32_to_cpu(initial_boot_params->totalsize)); -		initial_boot_params = alloc; -	} +	return mdesc;  } diff --git a/arch/metag/kernel/dma.c b/arch/metag/kernel/dma.c index 8c00dedadc5..c700d625067 100644 --- a/arch/metag/kernel/dma.c +++ b/arch/metag/kernel/dma.c @@ -305,9 +305,7 @@ void dma_free_coherent(struct device *dev, size_t size,  			if (pfn_valid(pfn)) {  				struct page *page = pfn_to_page(pfn); -				ClearPageReserved(page); - -				__free_page(page); +				__free_reserved_page(page);  				continue;  			}  		} @@ -401,11 +399,6 @@ static int __init dma_alloc_init(void)  		pgd = pgd_offset(&init_mm, CONSISTENT_START);  		pud = pud_alloc(&init_mm, pgd, CONSISTENT_START);  		pmd = pmd_alloc(&init_mm, pud, CONSISTENT_START); -		if (!pmd) { -			pr_err("%s: no pmd tables\n", __func__); -			ret = -ENOMEM; -			break; -		}  		WARN_ON(!pmd_none(*pmd));  		pte = pte_alloc_kernel(pmd, CONSISTENT_START); diff --git a/arch/metag/kernel/ftrace.c b/arch/metag/kernel/ftrace.c index a774f321643..ed1d685157c 100644 --- a/arch/metag/kernel/ftrace.c +++ b/arch/metag/kernel/ftrace.c @@ -117,10 +117,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)  }  /* run from kstop_machine */ -int __init ftrace_dyn_arch_init(void *data) +int __init ftrace_dyn_arch_init(void)  { -	/* The return code is returned via data */ -	writel(0, data); -  	return 0;  } diff --git a/arch/metag/kernel/irq.c b/arch/metag/kernel/irq.c index 2a2c9d55187..5385dd1216b 100644 --- a/arch/metag/kernel/irq.c +++ b/arch/metag/kernel/irq.c @@ -159,44 +159,30 @@ void irq_ctx_exit(int cpu)  extern asmlinkage void __do_softirq(void); -asmlinkage void do_softirq(void) +void do_softirq_own_stack(void)  { -	unsigned long flags;  	struct thread_info *curctx;  	union irq_ctx *irqctx;  	u32 *isp; -	if (in_interrupt()) -		return; - -	local_irq_save(flags); - -	if (local_softirq_pending()) { -		curctx = current_thread_info(); -		irqctx = softirq_ctx[smp_processor_id()]; -		irqctx->tinfo.task = curctx->task; - -		/* build the stack frame on the softirq stack */ -		isp = (u32 *) ((char *)irqctx + sizeof(struct thread_info)); - -		asm volatile ( -			"MOV   D0.5,%0\n" -			"SWAP  A0StP,D0.5\n" -			"CALLR D1RtP,___do_softirq\n" -			"MOV   A0StP,D0.5\n" -			: -			: "r" (isp) -			: "memory", "cc", "D1Ar1", "D0Ar2", "D1Ar3", "D0Ar4", -			  "D1Ar5", "D0Ar6", "D0Re0", "D1Re0", "D0.4", "D1RtP", -			  "D0.5" -			); -		/* -		 * Shouldn't happen, we returned above if in_interrupt(): -		 */ -		WARN_ON_ONCE(softirq_count()); -	} - -	local_irq_restore(flags); +	curctx = current_thread_info(); +	irqctx = softirq_ctx[smp_processor_id()]; +	irqctx->tinfo.task = curctx->task; + +	/* build the stack frame on the softirq stack */ +	isp = (u32 *) ((char *)irqctx + sizeof(struct thread_info)); + +	asm volatile ( +		"MOV   D0.5,%0\n" +		"SWAP  A0StP,D0.5\n" +		"CALLR D1RtP,___do_softirq\n" +		"MOV   A0StP,D0.5\n" +		: +		: "r" (isp) +		: "memory", "cc", "D1Ar1", "D0Ar2", "D1Ar3", "D0Ar4", +		  "D1Ar5", "D0Ar6", "D0Re0", "D1Re0", "D0.4", "D1RtP", +		  "D0.5" +		);  }  #endif @@ -275,18 +261,6 @@ int __init arch_probe_nr_irqs(void)  }  #ifdef CONFIG_HOTPLUG_CPU -static void route_irq(struct irq_data *data, unsigned int irq, unsigned int cpu) -{ -	struct irq_desc *desc = irq_to_desc(irq); -	struct irq_chip *chip = irq_data_get_irq_chip(data); -	unsigned long flags; - -	raw_spin_lock_irqsave(&desc->lock, flags); -	if (chip->irq_set_affinity) -		chip->irq_set_affinity(data, cpumask_of(cpu), false); -	raw_spin_unlock_irqrestore(&desc->lock, flags); -} -  /*   * The CPU has been marked offline.  Migrate IRQs off this CPU.  If   * the affinity settings do not allow other CPUs, force them onto any @@ -295,10 +269,9 @@ static void route_irq(struct irq_data *data, unsigned int irq, unsigned int cpu)  void migrate_irqs(void)  {  	unsigned int i, cpu = smp_processor_id(); -	struct irq_desc *desc; -	for_each_irq_desc(i, desc) { -		struct irq_data *data = irq_desc_get_irq_data(desc); +	for_each_active_irq(i) { +		struct irq_data *data = irq_get_irq_data(i);  		unsigned int newcpu;  		if (irqd_is_per_cpu(data)) @@ -314,11 +287,8 @@ void migrate_irqs(void)  					    i, cpu);  			cpumask_setall(data->affinity); -			newcpu = cpumask_any_and(data->affinity, -						 cpu_online_mask);  		} - -		route_irq(data, i, newcpu); +		irq_set_affinity(i, data->affinity);  	}  }  #endif /* CONFIG_HOTPLUG_CPU */ diff --git a/arch/metag/kernel/setup.c b/arch/metag/kernel/setup.c index c396cd0b425..31cf53d0eba 100644 --- a/arch/metag/kernel/setup.c +++ b/arch/metag/kernel/setup.c @@ -42,7 +42,6 @@  #include <asm/mmu.h>  #include <asm/mmzone.h>  #include <asm/processor.h> -#include <asm/prom.h>  #include <asm/sections.h>  #include <asm/setup.h>  #include <asm/traps.h> @@ -106,16 +105,12 @@  extern char _heap_start[]; -#ifdef CONFIG_METAG_BUILTIN_DTB -extern u32 __dtb_start[]; -#endif -  #ifdef CONFIG_DA_CONSOLE  /* Our early channel based console driver */  extern struct console dash_console;  #endif -struct machine_desc *machine_desc __initdata; +const struct machine_desc *machine_desc __initdata;  /*   * Map a Linux CPU number to a hardware thread ID @@ -302,13 +297,9 @@ void __init setup_arch(char **cmdline_p)  	 * rather than the version from the bootloader. This makes call  	 * stacks easier to understand and may allow us to unmap the  	 * bootloader at some point. -	 * -	 * We need to keep the LWK handler that TBI installed in order to -	 * be able to do inter-thread comms.  	 */  	for (i = 0; i <= TBID_SIGNUM_MAX; i++) -		if (i != TBID_SIGNUM_LWK) -			_pTBI->fnSigs[i] = __TBIUnExpXXX; +		_pTBI->fnSigs[i] = __TBIUnExpXXX;  	/* A Meta requirement is that the kernel is loaded (virtually)  	 * at the PAGE_OFFSET. @@ -408,9 +399,7 @@ void __init setup_arch(char **cmdline_p)  	cpu_2_hwthread_id[smp_processor_id()] = hard_processor_id();  	hwthread_id_2_cpu[hard_processor_id()] = smp_processor_id(); -	/* Copy device tree blob into non-init memory before unflattening */ -	copy_fdt(); -	unflatten_device_tree(); +	unflatten_and_copy_device_tree();  #ifdef CONFIG_SMP  	smp_init_cpus(); diff --git a/arch/metag/kernel/signal.c b/arch/metag/kernel/signal.c index 3be61cf0b14..b9e4a82d2bd 100644 --- a/arch/metag/kernel/signal.c +++ b/arch/metag/kernel/signal.c @@ -152,18 +152,18 @@ static void __user *get_sigframe(struct k_sigaction *ka, unsigned long sp,  	return (void __user *)sp;  } -static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, -			  sigset_t *set, struct pt_regs *regs) +static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, +			  struct pt_regs *regs)  {  	struct rt_sigframe __user *frame; -	int err = -EFAULT; +	int err;  	unsigned long code; -	frame = get_sigframe(ka, regs->REG_SP, sizeof(*frame)); +	frame = get_sigframe(&ksig->ka, regs->REG_SP, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) -		goto out; +		return -EFAULT; -	err = copy_siginfo_to_user(&frame->info, info); +	err = copy_siginfo_to_user(&frame->info, &ksig->info);  	/* Create the ucontext.  */  	err |= __put_user(0, &frame->uc.uc_flags); @@ -174,7 +174,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));  	if (err) -		goto out; +		return -EFAULT;  	/* Set up to return from userspace.  */ @@ -187,15 +187,15 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	err |= __put_user(code, (unsigned long __user *)(&frame->retcode[1]));  	if (err) -		goto out; +		return -EFAULT;  	/* Set up registers for signal handler */  	regs->REG_RTP = (unsigned long) frame->retcode;  	regs->REG_SP = (unsigned long) frame + sizeof(*frame); -	regs->REG_ARG1 = sig; +	regs->REG_ARG1 = ksig->sig;  	regs->REG_ARG2 = (unsigned long) &frame->info;  	regs->REG_ARG3 = (unsigned long) &frame->uc; -	regs->REG_PC = (unsigned long) ka->sa.sa_handler; +	regs->REG_PC = (unsigned long) ksig->ka.sa.sa_handler;  	pr_debug("SIG deliver (%s:%d): sp=%p pc=%08x pr=%08x\n",  		 current->comm, current->pid, frame, regs->REG_PC, @@ -205,24 +205,19 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	 * effective cache flush - directed rather than 'full flush'.  	 */  	flush_cache_sigtramp(regs->REG_RTP, sizeof(frame->retcode)); -out: -	if (err) { -		force_sigsegv(sig, current); -		return -EFAULT; -	} +  	return 0;  } -static void handle_signal(unsigned long sig, siginfo_t *info, -			  struct k_sigaction *ka, struct pt_regs *regs) +static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)  {  	sigset_t *oldset = sigmask_to_save(); +	int ret;  	/* Set up the stack frame */ -	if (setup_rt_frame(sig, ka, info, oldset, regs)) -		return; +	ret = setup_rt_frame(ksig, oldset, regs); -	signal_delivered(sig, info, ka, regs, test_thread_flag(TIF_SINGLESTEP)); +	signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));  }   /* @@ -235,10 +230,8 @@ static void handle_signal(unsigned long sig, siginfo_t *info,  static int do_signal(struct pt_regs *regs, int syscall)  {  	unsigned int retval = 0, continue_addr = 0, restart_addr = 0; -	struct k_sigaction ka; -	siginfo_t info; -	int signr;  	int restart = 0; +	struct ksignal ksig;  	/*  	 * By the end of rt_sigreturn the context describes the point that the @@ -275,7 +268,8 @@ static int do_signal(struct pt_regs *regs, int syscall)  	 * Get the signal to deliver. When running under ptrace, at this point  	 * the debugger may change all our registers ...  	 */ -	signr = get_signal_to_deliver(&info, &ka, regs, NULL); +	get_signal(&ksig); +  	/*  	 * Depending on the signal settings we may need to revert the decision  	 * to restart the system call. But skip this if a debugger has chosen to @@ -283,19 +277,19 @@ static int do_signal(struct pt_regs *regs, int syscall)  	 */  	if (regs->REG_PC != restart_addr)  		restart = 0; -	if (signr > 0) { +	if (ksig.sig > 0) {  		if (unlikely(restart)) {  			if (retval == -ERESTARTNOHAND  			    || retval == -ERESTART_RESTARTBLOCK  			    || (retval == -ERESTARTSYS -				&& !(ka.sa.sa_flags & SA_RESTART))) { +				&& !(ksig.ka.sa.sa_flags & SA_RESTART))) {  				regs->REG_RETVAL = -EINTR;  				regs->REG_PC = continue_addr;  			}  		}  		/* Whee! Actually deliver the signal.  */ -		handle_signal(signr, &info, &ka, regs); +		handle_signal(&ksig, regs);  		return 0;  	} diff --git a/arch/metag/kernel/smp.c b/arch/metag/kernel/smp.c index 7c011314298..f006d2276f4 100644 --- a/arch/metag/kernel/smp.c +++ b/arch/metag/kernel/smp.c @@ -68,7 +68,7 @@ static DECLARE_COMPLETION(cpu_running);  /*   * "thread" is assumed to be a valid Meta hardware thread ID.   */ -int boot_secondary(unsigned int thread, struct task_struct *idle) +static int boot_secondary(unsigned int thread, struct task_struct *idle)  {  	u32 val; @@ -491,7 +491,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)  void arch_send_call_function_single_ipi(int cpu)  { -	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE); +	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC);  }  void show_ipi_list(struct seq_file *p) @@ -517,11 +517,10 @@ static DEFINE_SPINLOCK(stop_lock);   *   *  Bit 0 - Inter-processor function call   */ -static int do_IPI(struct pt_regs *regs) +static int do_IPI(void)  {  	unsigned int cpu = smp_processor_id();  	struct ipi_data *ipi = &per_cpu(ipi_data, cpu); -	struct pt_regs *old_regs = set_irq_regs(regs);  	unsigned long msgs, nextmsg;  	int handled = 0; @@ -546,10 +545,6 @@ static int do_IPI(struct pt_regs *regs)  			generic_smp_call_function_interrupt();  			break; -		case IPI_CALL_FUNC_SINGLE: -			generic_smp_call_function_single_interrupt(); -			break; -  		default:  			pr_crit("CPU%u: Unknown IPI message 0x%lx\n",  				cpu, nextmsg); @@ -557,8 +552,6 @@ static int do_IPI(struct pt_regs *regs)  		}  	} -	set_irq_regs(old_regs); -  	return handled;  } @@ -624,7 +617,7 @@ static void kick_raise_softirq(cpumask_t callmap, unsigned int irq)  static TBIRES ipi_handler(TBIRES State, int SigNum, int Triggers,  		   int Inst, PTBI pTBI, int *handled)  { -	*handled = do_IPI((struct pt_regs *)State.Sig.pCtx); +	*handled = do_IPI();  	return State;  } diff --git a/arch/metag/kernel/topology.c b/arch/metag/kernel/topology.c index bec3dec4922..4ba595701f7 100644 --- a/arch/metag/kernel/topology.c +++ b/arch/metag/kernel/topology.c @@ -19,6 +19,7 @@  DEFINE_PER_CPU(struct cpuinfo_metag, cpu_data);  cpumask_t cpu_core_map[NR_CPUS]; +EXPORT_SYMBOL(cpu_core_map);  static cpumask_t cpu_coregroup_map(unsigned int cpu)  { diff --git a/arch/metag/kernel/traps.c b/arch/metag/kernel/traps.c index 25f9d1c2ffe..17b2e2e38d5 100644 --- a/arch/metag/kernel/traps.c +++ b/arch/metag/kernel/traps.c @@ -819,8 +819,7 @@ void per_cpu_trap_init(unsigned long cpu)  	set_trigger_mask(TBI_INTS_INIT(thread) | /* interrupts */  			 TBI_TRIG_BIT(TBID_SIGNUM_LWK) | /* low level kick */ -			 TBI_TRIG_BIT(TBID_SIGNUM_SW1) | -			 TBI_TRIG_BIT(TBID_SIGNUM_SWS)); +			 TBI_TRIG_BIT(TBID_SIGNUM_SW1));  	/* non-priv - use current stack */  	int_context.Sig.pCtx = NULL; @@ -842,7 +841,7 @@ void __init trap_init(void)  	_pTBI->fnSigs[TBID_SIGNUM_SW1] = switch1_handler;  	_pTBI->fnSigs[TBID_SIGNUM_SW2] = switchx_handler;  	_pTBI->fnSigs[TBID_SIGNUM_SW3] = switchx_handler; -	_pTBI->fnSigs[TBID_SIGNUM_SWK] = kick_handler; +	_pTBI->fnSigs[TBID_SIGNUM_LWK] = kick_handler;  #ifdef CONFIG_METAG_META21  	_pTBI->fnSigs[TBID_SIGNUM_DFR] = __TBIHandleDFR;  | 
