ARM: provide common method to clear bits in CPU control register
Several places open-code this manipulation, let's consolidate this. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Родитель
4585eaff63
Коммит
b4b20ad881
|
@ -28,6 +28,7 @@
|
||||||
#include <asm/opcodes.h>
|
#include <asm/opcodes.h>
|
||||||
|
|
||||||
#include "fault.h"
|
#include "fault.h"
|
||||||
|
#include "mm.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 32-bit misaligned trap handler (c) 1998 San Mehat (CCC) -July 1998
|
* 32-bit misaligned trap handler (c) 1998 San Mehat (CCC) -July 1998
|
||||||
|
@ -968,9 +969,7 @@ static int __init alignment_init(void)
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_CP15
|
#ifdef CONFIG_CPU_CP15
|
||||||
if (cpu_is_v6_unaligned()) {
|
if (cpu_is_v6_unaligned()) {
|
||||||
cr_alignment &= ~CR_A;
|
set_cr(__clear_cr(CR_A));
|
||||||
cr_no_alignment &= ~CR_A;
|
|
||||||
set_cr(cr_alignment);
|
|
||||||
ai_usermode = safe_usermode(ai_usermode, false);
|
ai_usermode = safe_usermode(ai_usermode, false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <linux/dma-contiguous.h>
|
#include <linux/dma-contiguous.h>
|
||||||
#include <linux/sizes.h>
|
#include <linux/sizes.h>
|
||||||
|
|
||||||
|
#include <asm/cp15.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/memblock.h>
|
#include <asm/memblock.h>
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
|
@ -36,6 +37,15 @@
|
||||||
|
|
||||||
#include "mm.h"
|
#include "mm.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_CP15_MMU
|
||||||
|
unsigned long __init __clear_cr(unsigned long mask)
|
||||||
|
{
|
||||||
|
cr_no_alignment = cr_no_alignment & ~mask;
|
||||||
|
cr_alignment = cr_alignment & ~mask;
|
||||||
|
return cr_alignment;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static phys_addr_t phys_initrd_start __initdata = 0;
|
static phys_addr_t phys_initrd_start __initdata = 0;
|
||||||
static unsigned long phys_initrd_size __initdata = 0;
|
static unsigned long phys_initrd_size __initdata = 0;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
/* the upper-most page table pointer */
|
/* the upper-most page table pointer */
|
||||||
extern pmd_t *top_pmd;
|
extern pmd_t *top_pmd;
|
||||||
|
|
||||||
|
@ -93,3 +95,5 @@ extern phys_addr_t arm_lowmem_limit;
|
||||||
void __init bootmem_init(void);
|
void __init bootmem_init(void);
|
||||||
void arm_mm_memblock_reserve(void);
|
void arm_mm_memblock_reserve(void);
|
||||||
void dma_contiguous_remap(void);
|
void dma_contiguous_remap(void);
|
||||||
|
|
||||||
|
unsigned long __clear_cr(unsigned long mask);
|
||||||
|
|
|
@ -125,6 +125,7 @@ static struct cachepolicy cache_policies[] __initdata = {
|
||||||
*/
|
*/
|
||||||
static int __init early_cachepolicy(char *p)
|
static int __init early_cachepolicy(char *p)
|
||||||
{
|
{
|
||||||
|
unsigned long cr = get_cr();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(cache_policies); i++) {
|
for (i = 0; i < ARRAY_SIZE(cache_policies); i++) {
|
||||||
|
@ -132,8 +133,7 @@ static int __init early_cachepolicy(char *p)
|
||||||
|
|
||||||
if (memcmp(p, cache_policies[i].policy, len) == 0) {
|
if (memcmp(p, cache_policies[i].policy, len) == 0) {
|
||||||
cachepolicy = i;
|
cachepolicy = i;
|
||||||
cr_alignment &= ~cache_policies[i].cr_mask;
|
cr = __clear_cr(cache_policies[i].cr_mask);
|
||||||
cr_no_alignment &= ~cache_policies[i].cr_mask;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ static int __init early_cachepolicy(char *p)
|
||||||
cachepolicy = CPOLICY_WRITEBACK;
|
cachepolicy = CPOLICY_WRITEBACK;
|
||||||
}
|
}
|
||||||
flush_cache_all();
|
flush_cache_all();
|
||||||
set_cr(cr_alignment);
|
set_cr(cr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_param("cachepolicy", early_cachepolicy);
|
early_param("cachepolicy", early_cachepolicy);
|
||||||
|
@ -188,9 +188,7 @@ early_param("ecc", early_ecc);
|
||||||
|
|
||||||
static int __init noalign_setup(char *__unused)
|
static int __init noalign_setup(char *__unused)
|
||||||
{
|
{
|
||||||
cr_alignment &= ~CR_A;
|
set_cr(__clear_cr(CR_A));
|
||||||
cr_no_alignment &= ~CR_A;
|
|
||||||
set_cr(cr_alignment);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
__setup("noalign", noalign_setup);
|
__setup("noalign", noalign_setup);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче