Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (44 commits) [ARM] 3541/2: workaround for PXA27x erratum E7 [ARM] nommu: provide a way for correct control register value selection [ARM] 3705/1: add supersection support to ioremap() [ARM] 3707/1: iwmmxt: use the generic thread notifier infrastructure [ARM] 3706/2: ep93xx: add cirrus logic edb9315a support [ARM] 3704/1: format IOP Kconfig with tabs, create more consistency [ARM] 3703/1: Add help description for ARCH_EP80219 [ARM] 3678/1: MMC: Make OMAP MMC work [ARM] 3677/1: OMAP: Update H2 defconfig [ARM] 3676/1: ARM: OMAP: Fix dmtimers and timer32k to compile on OMAP1 [ARM] Add section support to ioremap [ARM] Fix sa11x0 SDRAM selection [ARM] Set bit 4 on section mappings correctly depending on CPU [ARM] 3666/1: TRIZEPS4 [1/5] core ARM: OMAP: Multiplexing for 24xx GPMC wait pin monitoring ARM: OMAP: Fix SRAM to use MT_MEMORY instead of MT_DEVICE ARM: OMAP: Update dmtimers ARM: OMAP: Make clock variables static ARM: OMAP: Fix GPMC compilation when DEBUG is defined ARM: OMAP: Mux updates for external DMA and GPIO ...
This commit is contained in:
@ -25,7 +25,7 @@ obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
|
||||
obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
|
||||
AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312
|
||||
|
||||
obj-$(CONFIG_IWMMXT) += iwmmxt.o
|
||||
obj-$(CONFIG_IWMMXT) += iwmmxt.o iwmmxt-notifier.o
|
||||
AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt
|
||||
|
||||
ifneq ($(CONFIG_ARCH_EBSA110),y)
|
||||
|
@ -105,6 +105,7 @@ int main(void)
|
||||
BLANK();
|
||||
DEFINE(PROC_INFO_SZ, sizeof(struct proc_info_list));
|
||||
DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush));
|
||||
DEFINE(PROCINFO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mmu_flags));
|
||||
DEFINE(PROCINFO_MM_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mm_mmu_flags));
|
||||
DEFINE(PROCINFO_IO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_io_mmu_flags));
|
||||
return 0;
|
||||
}
|
||||
|
@ -589,9 +589,7 @@ ENTRY(__switch_to)
|
||||
#ifdef CONFIG_MMU
|
||||
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
||||
#endif
|
||||
#if defined(CONFIG_IWMMXT)
|
||||
bl iwmmxt_task_switch
|
||||
#elif defined(CONFIG_CPU_XSCALE)
|
||||
#if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT)
|
||||
add r4, r2, #TI_CPU_DOMAIN + 40 @ cpu_context_save->extra
|
||||
ldmib r4, {r4, r5}
|
||||
mar acc0, r4, r5
|
||||
|
@ -220,7 +220,7 @@ __create_page_tables:
|
||||
teq r0, r6
|
||||
bne 1b
|
||||
|
||||
ldr r7, [r10, #PROCINFO_MMUFLAGS] @ mmuflags
|
||||
ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags
|
||||
|
||||
/*
|
||||
* Create identity mapping for first MB of kernel to
|
||||
@ -271,8 +271,7 @@ __create_page_tables:
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_LL
|
||||
bic r7, r7, #0x0c @ turn off cacheable
|
||||
@ and bufferable bits
|
||||
ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
|
||||
/*
|
||||
* Map in IO space for serial debugging.
|
||||
* This allows debug messages to be output
|
||||
|
64
arch/arm/kernel/iwmmxt-notifier.c
Normal file
64
arch/arm/kernel/iwmmxt-notifier.c
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* linux/arch/arm/kernel/iwmmxt-notifier.c
|
||||
*
|
||||
* XScale iWMMXt (Concan) context switching and handling
|
||||
*
|
||||
* Initial code:
|
||||
* Copyright (c) 2003, Intel Corporation
|
||||
*
|
||||
* Full lazy switching support, optimizations and more, by Nicolas Pitre
|
||||
* Copyright (c) 2003-2004, MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/thread_notify.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static int iwmmxt_do(struct notifier_block *self, unsigned long cmd, void *t)
|
||||
{
|
||||
struct thread_info *thread = t;
|
||||
|
||||
switch (cmd) {
|
||||
case THREAD_NOTIFY_FLUSH:
|
||||
/*
|
||||
* flush_thread() zeroes thread->fpstate, so no need
|
||||
* to do anything here.
|
||||
*
|
||||
* FALLTHROUGH: Ensure we don't try to overwrite our newly
|
||||
* initialised state information on the first fault.
|
||||
*/
|
||||
|
||||
case THREAD_NOTIFY_RELEASE:
|
||||
iwmmxt_task_release(thread);
|
||||
break;
|
||||
|
||||
case THREAD_NOTIFY_SWITCH:
|
||||
iwmmxt_task_switch(thread);
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block iwmmxt_notifier_block = {
|
||||
.notifier_call = iwmmxt_do,
|
||||
};
|
||||
|
||||
static int __init iwmmxt_init(void)
|
||||
{
|
||||
thread_register_notifier(&iwmmxt_notifier_block);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(iwmmxt_init);
|
@ -271,30 +271,27 @@ ENTRY(iwmmxt_task_restore)
|
||||
/*
|
||||
* Concan handling on task switch
|
||||
*
|
||||
* r0 = previous task_struct pointer (must be preserved)
|
||||
* r1 = previous thread_info pointer
|
||||
* r2 = next thread_info pointer (must be preserved)
|
||||
* r0 = next thread_info pointer
|
||||
*
|
||||
* Called only from __switch_to with task preemption disabled.
|
||||
* No need to care about preserving r4 and above.
|
||||
* Called only from the iwmmxt notifier with task preemption disabled.
|
||||
*/
|
||||
ENTRY(iwmmxt_task_switch)
|
||||
|
||||
mrc p15, 0, r4, c15, c1, 0
|
||||
tst r4, #0x3 @ CP0 and CP1 accessible?
|
||||
mrc p15, 0, r1, c15, c1, 0
|
||||
tst r1, #0x3 @ CP0 and CP1 accessible?
|
||||
bne 1f @ yes: block them for next task
|
||||
|
||||
ldr r5, =concan_owner
|
||||
add r6, r2, #TI_IWMMXT_STATE @ get next task Concan save area
|
||||
ldr r5, [r5] @ get current Concan owner
|
||||
teq r5, r6 @ next task owns it?
|
||||
ldr r2, =concan_owner
|
||||
add r3, r0, #TI_IWMMXT_STATE @ get next task Concan save area
|
||||
ldr r2, [r2] @ get current Concan owner
|
||||
teq r2, r3 @ next task owns it?
|
||||
movne pc, lr @ no: leave Concan disabled
|
||||
|
||||
1: eor r4, r4, #3 @ flip Concan access
|
||||
mcr p15, 0, r4, c15, c1, 0
|
||||
1: eor r1, r1, #3 @ flip Concan access
|
||||
mcr p15, 0, r1, c15, c1, 0
|
||||
|
||||
mrc p15, 0, r4, c2, c0, 0
|
||||
sub pc, lr, r4, lsr #32 @ cpwait and return
|
||||
mrc p15, 0, r1, c2, c0, 0
|
||||
sub pc, lr, r1, lsr #32 @ cpwait and return
|
||||
|
||||
/*
|
||||
* Remove Concan ownership of given task
|
||||
|
@ -352,9 +352,6 @@ void flush_thread(void)
|
||||
memset(&thread->fpstate, 0, sizeof(union fp_state));
|
||||
|
||||
thread_notify(THREAD_NOTIFY_FLUSH, thread);
|
||||
#if defined(CONFIG_IWMMXT)
|
||||
iwmmxt_task_release(thread);
|
||||
#endif
|
||||
}
|
||||
|
||||
void release_thread(struct task_struct *dead_task)
|
||||
@ -362,9 +359,6 @@ void release_thread(struct task_struct *dead_task)
|
||||
struct thread_info *thread = task_thread_info(dead_task);
|
||||
|
||||
thread_notify(THREAD_NOTIFY_RELEASE, thread);
|
||||
#if defined(CONFIG_IWMMXT)
|
||||
iwmmxt_task_release(thread);
|
||||
#endif
|
||||
}
|
||||
|
||||
asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
|
||||
|
@ -344,9 +344,9 @@ static void __init setup_processor(void)
|
||||
cpu_cache = *list->cache;
|
||||
#endif
|
||||
|
||||
printk("CPU: %s [%08x] revision %d (ARMv%s)\n",
|
||||
printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08x\n",
|
||||
cpu_name, processor_id, (int)processor_id & 15,
|
||||
proc_arch[cpu_architecture()]);
|
||||
proc_arch[cpu_architecture()], cr_alignment);
|
||||
|
||||
sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
|
||||
sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
|
||||
|
Reference in New Issue
Block a user