Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm
Pull late ARM updates from Russell King:
"Here is the late set of ARM updates for this merge window; in here is:
- The ARM parts of the broadcast timer support, core parts merged
through tglx's tree. This was left over from the previous merge to
allow the dependency on tglx's tree to be resolved.
- A fix to the VFP code which shows up on Raspberry Pi's, as well as
fixing the fallout from a previous commit in this area.
- A number of smaller fixes scattered throughout the ARM tree"
* 'for-linus' of git://git.linaro.org/people/rmk/linux-arm:
ARM: Fix broken commit 0cc41e4a21
corrupting kernel messages
ARM: fix scheduling while atomic warning in alignment handling code
ARM: VFP: fix emulation of second VFP instruction
ARM: 7656/1: uImage: Error out on build of multiplatform without LOADADDR
ARM: 7640/1: memory: tegra_ahb_enable_smmu() depends on TEGRA_IOMMU_SMMU
ARM: 7654/1: Preserve L_PTE_VALID in pte_modify()
ARM: 7653/2: do not scale loops_per_jiffy when using a constant delay clock
ARM: 7651/1: remove unused smp_timer_broadcast #define
This commit is contained in:
commit
529e5fbcd8
|
@ -68,8 +68,8 @@ else
|
||||||
endif
|
endif
|
||||||
|
|
||||||
check_for_multiple_loadaddr = \
|
check_for_multiple_loadaddr = \
|
||||||
if [ $(words $(UIMAGE_LOADADDR)) -gt 1 ]; then \
|
if [ $(words $(UIMAGE_LOADADDR)) -ne 1 ]; then \
|
||||||
echo 'multiple load addresses: $(UIMAGE_LOADADDR)'; \
|
echo 'multiple (or no) load addresses: $(UIMAGE_LOADADDR)'; \
|
||||||
echo 'This is incompatible with uImages'; \
|
echo 'This is incompatible with uImages'; \
|
||||||
echo 'Specify LOADADDR on the commandline to build an uImage'; \
|
echo 'Specify LOADADDR on the commandline to build an uImage'; \
|
||||||
false; \
|
false; \
|
||||||
|
|
|
@ -24,6 +24,7 @@ extern struct arm_delay_ops {
|
||||||
void (*delay)(unsigned long);
|
void (*delay)(unsigned long);
|
||||||
void (*const_udelay)(unsigned long);
|
void (*const_udelay)(unsigned long);
|
||||||
void (*udelay)(unsigned long);
|
void (*udelay)(unsigned long);
|
||||||
|
bool const_clock;
|
||||||
} arm_delay_ops;
|
} arm_delay_ops;
|
||||||
|
|
||||||
#define __delay(n) arm_delay_ops.delay(n)
|
#define __delay(n) arm_delay_ops.delay(n)
|
||||||
|
|
|
@ -247,7 +247,8 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
|
||||||
|
|
||||||
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
||||||
{
|
{
|
||||||
const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER | L_PTE_NONE;
|
const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER |
|
||||||
|
L_PTE_NONE | L_PTE_VALID;
|
||||||
pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
|
pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
|
||||||
return pte;
|
return pte;
|
||||||
}
|
}
|
||||||
|
|
|
@ -466,8 +466,6 @@ void tick_broadcast(const struct cpumask *mask)
|
||||||
{
|
{
|
||||||
smp_cross_call(mask, IPI_TIMER);
|
smp_cross_call(mask, IPI_TIMER);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define smp_timer_broadcast NULL
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void broadcast_timer_set_mode(enum clock_event_mode mode,
|
static void broadcast_timer_set_mode(enum clock_event_mode mode,
|
||||||
|
@ -674,6 +672,9 @@ static int cpufreq_callback(struct notifier_block *nb,
|
||||||
if (freq->flags & CPUFREQ_CONST_LOOPS)
|
if (freq->flags & CPUFREQ_CONST_LOOPS)
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
|
||||||
|
if (arm_delay_ops.const_clock)
|
||||||
|
return NOTIFY_OK;
|
||||||
|
|
||||||
if (!per_cpu(l_p_j_ref, cpu)) {
|
if (!per_cpu(l_p_j_ref, cpu)) {
|
||||||
per_cpu(l_p_j_ref, cpu) =
|
per_cpu(l_p_j_ref, cpu) =
|
||||||
per_cpu(cpu_data, cpu).loops_per_jiffy;
|
per_cpu(cpu_data, cpu).loops_per_jiffy;
|
||||||
|
|
|
@ -77,6 +77,7 @@ void __init register_current_timer_delay(const struct delay_timer *timer)
|
||||||
arm_delay_ops.delay = __timer_delay;
|
arm_delay_ops.delay = __timer_delay;
|
||||||
arm_delay_ops.const_udelay = __timer_const_udelay;
|
arm_delay_ops.const_udelay = __timer_const_udelay;
|
||||||
arm_delay_ops.udelay = __timer_udelay;
|
arm_delay_ops.udelay = __timer_udelay;
|
||||||
|
arm_delay_ops.const_clock = true;
|
||||||
delay_calibrated = true;
|
delay_calibrated = true;
|
||||||
} else {
|
} else {
|
||||||
pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");
|
pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");
|
||||||
|
|
|
@ -749,7 +749,6 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
unsigned long instr = 0, instrptr;
|
unsigned long instr = 0, instrptr;
|
||||||
int (*handler)(unsigned long addr, unsigned long instr, struct pt_regs *regs);
|
int (*handler)(unsigned long addr, unsigned long instr, struct pt_regs *regs);
|
||||||
unsigned int type;
|
unsigned int type;
|
||||||
mm_segment_t fs;
|
|
||||||
unsigned int fault;
|
unsigned int fault;
|
||||||
u16 tinstr = 0;
|
u16 tinstr = 0;
|
||||||
int isize = 4;
|
int isize = 4;
|
||||||
|
@ -760,16 +759,15 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
|
|
||||||
instrptr = instruction_pointer(regs);
|
instrptr = instruction_pointer(regs);
|
||||||
|
|
||||||
fs = get_fs();
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
if (thumb_mode(regs)) {
|
if (thumb_mode(regs)) {
|
||||||
fault = __get_user(tinstr, (u16 *)(instrptr & ~1));
|
u16 *ptr = (u16 *)(instrptr & ~1);
|
||||||
|
fault = probe_kernel_address(ptr, tinstr);
|
||||||
if (!fault) {
|
if (!fault) {
|
||||||
if (cpu_architecture() >= CPU_ARCH_ARMv7 &&
|
if (cpu_architecture() >= CPU_ARCH_ARMv7 &&
|
||||||
IS_T32(tinstr)) {
|
IS_T32(tinstr)) {
|
||||||
/* Thumb-2 32-bit */
|
/* Thumb-2 32-bit */
|
||||||
u16 tinst2 = 0;
|
u16 tinst2 = 0;
|
||||||
fault = __get_user(tinst2, (u16 *)(instrptr+2));
|
fault = probe_kernel_address(ptr + 1, tinst2);
|
||||||
instr = (tinstr << 16) | tinst2;
|
instr = (tinstr << 16) | tinst2;
|
||||||
thumb2_32b = 1;
|
thumb2_32b = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -778,8 +776,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
fault = __get_user(instr, (u32 *)instrptr);
|
fault = probe_kernel_address(instrptr, instr);
|
||||||
set_fs(fs);
|
|
||||||
|
|
||||||
if (fault) {
|
if (fault) {
|
||||||
type = TYPE_FAULT;
|
type = TYPE_FAULT;
|
||||||
|
|
|
@ -22,12 +22,14 @@
|
||||||
.macro DBGSTR, str
|
.macro DBGSTR, str
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
stmfd sp!, {r0-r3, ip, lr}
|
stmfd sp!, {r0-r3, ip, lr}
|
||||||
add r0, pc, #4
|
ldr r0, =1f
|
||||||
bl printk
|
bl printk
|
||||||
b 1f
|
ldmfd sp!, {r0-r3, ip, lr}
|
||||||
.asciz KERN_DEBUG "VFP: \str\n"
|
|
||||||
.balign 4
|
.pushsection .rodata, "a"
|
||||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
1: .ascii KERN_DEBUG "VFP: \str\n"
|
||||||
|
.byte 0
|
||||||
|
.previous
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@ -35,12 +37,14 @@
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
stmfd sp!, {r0-r3, ip, lr}
|
stmfd sp!, {r0-r3, ip, lr}
|
||||||
mov r1, \arg
|
mov r1, \arg
|
||||||
add r0, pc, #4
|
ldr r0, =1f
|
||||||
bl printk
|
bl printk
|
||||||
b 1f
|
ldmfd sp!, {r0-r3, ip, lr}
|
||||||
.asciz KERN_DEBUG "VFP: \str\n"
|
|
||||||
.balign 4
|
.pushsection .rodata, "a"
|
||||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
1: .ascii KERN_DEBUG "VFP: \str\n"
|
||||||
|
.byte 0
|
||||||
|
.previous
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@ -50,12 +54,14 @@
|
||||||
mov r3, \arg3
|
mov r3, \arg3
|
||||||
mov r2, \arg2
|
mov r2, \arg2
|
||||||
mov r1, \arg1
|
mov r1, \arg1
|
||||||
add r0, pc, #4
|
ldr r0, =1f
|
||||||
bl printk
|
bl printk
|
||||||
b 1f
|
ldmfd sp!, {r0-r3, ip, lr}
|
||||||
.asciz KERN_DEBUG "VFP: \str\n"
|
|
||||||
.balign 4
|
.pushsection .rodata, "a"
|
||||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
1: .ascii KERN_DEBUG "VFP: \str\n"
|
||||||
|
.byte 0
|
||||||
|
.previous
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
|
@ -413,7 +413,7 @@ void VFP_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs)
|
||||||
* If there isn't a second FP instruction, exit now. Note that
|
* If there isn't a second FP instruction, exit now. Note that
|
||||||
* the FPEXC.FP2V bit is valid only if FPEXC.EX is 1.
|
* the FPEXC.FP2V bit is valid only if FPEXC.EX is 1.
|
||||||
*/
|
*/
|
||||||
if (fpexc ^ (FPEXC_EX | FPEXC_FP2V))
|
if ((fpexc & (FPEXC_EX | FPEXC_FP2V)) != (FPEXC_EX | FPEXC_FP2V))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -130,7 +130,7 @@ static inline void gizmo_writel(struct tegra_ahb *ahb, u32 value, u32 offset)
|
||||||
writel(value, ahb->regs + offset);
|
writel(value, ahb->regs + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_TEGRA_3x_SOC
|
#ifdef CONFIG_TEGRA_IOMMU_SMMU
|
||||||
static int tegra_ahb_match_by_smmu(struct device *dev, void *data)
|
static int tegra_ahb_match_by_smmu(struct device *dev, void *data)
|
||||||
{
|
{
|
||||||
struct tegra_ahb *ahb = dev_get_drvdata(dev);
|
struct tegra_ahb *ahb = dev_get_drvdata(dev);
|
||||||
|
|
Loading…
Reference in New Issue