Skip to content

Commit

Permalink
ARM: provide common method to clear bits in CPU control register
Browse files Browse the repository at this point in the history
Several places open-code this manipulation, let's consolidate this.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Jun 2, 2014
1 parent 4585eaf commit b4b20ad
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 9 deletions.
5 changes: 2 additions & 3 deletions arch/arm/mm/alignment.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <asm/opcodes.h>

#include "fault.h"
#include "mm.h"

/*
* 32-bit misaligned trap handler (c) 1998 San Mehat (CCC) -July 1998
Expand Down Expand Up @@ -968,9 +969,7 @@ static int __init alignment_init(void)

#ifdef CONFIG_CPU_CP15
if (cpu_is_v6_unaligned()) {
cr_alignment &= ~CR_A;
cr_no_alignment &= ~CR_A;
set_cr(cr_alignment);
set_cr(__clear_cr(CR_A));
ai_usermode = safe_usermode(ai_usermode, false);
}
#endif
Expand Down
10 changes: 10 additions & 0 deletions arch/arm/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/dma-contiguous.h>
#include <linux/sizes.h>

#include <asm/cp15.h>
#include <asm/mach-types.h>
#include <asm/memblock.h>
#include <asm/prom.h>
Expand All @@ -36,6 +37,15 @@

#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 unsigned long phys_initrd_size __initdata = 0;

Expand Down
4 changes: 4 additions & 0 deletions arch/arm/mm/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include <linux/list.h>
#include <linux/vmalloc.h>

#include <asm/pgtable.h>

/* the upper-most page table pointer */
extern pmd_t *top_pmd;

Expand Down Expand Up @@ -93,3 +95,5 @@ extern phys_addr_t arm_lowmem_limit;
void __init bootmem_init(void);
void arm_mm_memblock_reserve(void);
void dma_contiguous_remap(void);

unsigned long __clear_cr(unsigned long mask);
10 changes: 4 additions & 6 deletions arch/arm/mm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,15 +125,15 @@ static struct cachepolicy cache_policies[] __initdata = {
*/
static int __init early_cachepolicy(char *p)
{
unsigned long cr = get_cr();
int i;

for (i = 0; i < ARRAY_SIZE(cache_policies); i++) {
int len = strlen(cache_policies[i].policy);

if (memcmp(p, cache_policies[i].policy, len) == 0) {
cachepolicy = i;
cr_alignment &= ~cache_policies[i].cr_mask;
cr_no_alignment &= ~cache_policies[i].cr_mask;
cr = __clear_cr(cache_policies[i].cr_mask);
break;
}
}
Expand All @@ -151,7 +151,7 @@ static int __init early_cachepolicy(char *p)
cachepolicy = CPOLICY_WRITEBACK;
}
flush_cache_all();
set_cr(cr_alignment);
set_cr(cr);
return 0;
}
early_param("cachepolicy", early_cachepolicy);
Expand Down Expand Up @@ -188,9 +188,7 @@ early_param("ecc", early_ecc);

static int __init noalign_setup(char *__unused)
{
cr_alignment &= ~CR_A;
cr_no_alignment &= ~CR_A;
set_cr(cr_alignment);
set_cr(__clear_cr(CR_A));
return 1;
}
__setup("noalign", noalign_setup);
Expand Down

0 comments on commit b4b20ad

Please sign in to comment.