Merge branch 'dt/gic' into highbank/soc
Conflicts: arch/arm/Kconfig
This commit is contained in:
@@ -18,12 +18,14 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/memory.h>
|
||||
#include <asm/highmem.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "mm.h"
|
||||
|
||||
@@ -117,26 +119,37 @@ static void __dma_free_buffer(struct page *page, size_t size)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/* Sanity check size */
|
||||
#if (CONSISTENT_DMA_SIZE % SZ_2M)
|
||||
#error "CONSISTENT_DMA_SIZE must be multiple of 2MiB"
|
||||
#endif
|
||||
|
||||
#define CONSISTENT_OFFSET(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
|
||||
#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT)
|
||||
#define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT)
|
||||
|
||||
#define CONSISTENT_OFFSET(x) (((unsigned long)(x) - consistent_base) >> PAGE_SHIFT)
|
||||
#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - consistent_base) >> PGDIR_SHIFT)
|
||||
|
||||
/*
|
||||
* These are the page tables (2MB each) covering uncached, DMA consistent allocations
|
||||
*/
|
||||
static pte_t *consistent_pte[NUM_CONSISTENT_PTES];
|
||||
static pte_t **consistent_pte;
|
||||
|
||||
#define DEFAULT_CONSISTENT_DMA_SIZE SZ_2M
|
||||
|
||||
unsigned long consistent_base = CONSISTENT_END - DEFAULT_CONSISTENT_DMA_SIZE;
|
||||
|
||||
void __init init_consistent_dma_size(unsigned long size)
|
||||
{
|
||||
unsigned long base = CONSISTENT_END - ALIGN(size, SZ_2M);
|
||||
|
||||
BUG_ON(consistent_pte); /* Check we're called before DMA region init */
|
||||
BUG_ON(base < VMALLOC_END);
|
||||
|
||||
/* Grow region to accommodate specified size */
|
||||
if (base < consistent_base)
|
||||
consistent_base = base;
|
||||
}
|
||||
|
||||
#include "vmregion.h"
|
||||
|
||||
static struct arm_vmregion_head consistent_head = {
|
||||
.vm_lock = __SPIN_LOCK_UNLOCKED(&consistent_head.vm_lock),
|
||||
.vm_list = LIST_HEAD_INIT(consistent_head.vm_list),
|
||||
.vm_start = CONSISTENT_BASE,
|
||||
.vm_end = CONSISTENT_END,
|
||||
};
|
||||
|
||||
@@ -155,7 +168,17 @@ static int __init consistent_init(void)
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
int i = 0;
|
||||
u32 base = CONSISTENT_BASE;
|
||||
unsigned long base = consistent_base;
|
||||
unsigned long num_ptes = (CONSISTENT_END - base) >> PGDIR_SHIFT;
|
||||
|
||||
consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL);
|
||||
if (!consistent_pte) {
|
||||
pr_err("%s: no memory\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pr_debug("DMA memory: 0x%08lx - 0x%08lx:\n", base, CONSISTENT_END);
|
||||
consistent_head.vm_start = base;
|
||||
|
||||
do {
|
||||
pgd = pgd_offset(&init_mm, base);
|
||||
@@ -198,7 +221,7 @@ __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot)
|
||||
size_t align;
|
||||
int bit;
|
||||
|
||||
if (!consistent_pte[0]) {
|
||||
if (!consistent_pte) {
|
||||
printk(KERN_ERR "%s: not initialised\n", __func__);
|
||||
dump_stack();
|
||||
return NULL;
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include <asm/exception.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
@@ -653,9 +653,6 @@ void __init mem_init(void)
|
||||
" ITCM : 0x%08lx - 0x%08lx (%4ld kB)\n"
|
||||
#endif
|
||||
" fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n"
|
||||
#ifdef CONFIG_MMU
|
||||
" DMA : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
||||
#endif
|
||||
" vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
||||
" lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
@@ -674,9 +671,6 @@ void __init mem_init(void)
|
||||
MLK(ITCM_OFFSET, (unsigned long) itcm_end),
|
||||
#endif
|
||||
MLK(FIXADDR_START, FIXADDR_TOP),
|
||||
#ifdef CONFIG_MMU
|
||||
MLM(CONSISTENT_BASE, CONSISTENT_END),
|
||||
#endif
|
||||
MLM(VMALLOC_START, VMALLOC_END),
|
||||
MLM(PAGE_OFFSET, (unsigned long)high_memory),
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
@@ -699,9 +693,6 @@ void __init mem_init(void)
|
||||
* be detected at build time already.
|
||||
*/
|
||||
#ifdef CONFIG_MMU
|
||||
BUILD_BUG_ON(VMALLOC_END > CONSISTENT_BASE);
|
||||
BUG_ON(VMALLOC_END > CONSISTENT_BASE);
|
||||
|
||||
BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR);
|
||||
BUG_ON(TASK_SIZE > MODULES_VADDR);
|
||||
#endif
|
||||
|
@@ -273,6 +273,14 @@ static struct mem_type mem_types[] = {
|
||||
.prot_l1 = PMD_TYPE_TABLE,
|
||||
.domain = DOMAIN_KERNEL,
|
||||
},
|
||||
[MT_MEMORY_SO] = {
|
||||
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
||||
L_PTE_MT_UNCACHED,
|
||||
.prot_l1 = PMD_TYPE_TABLE,
|
||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_S |
|
||||
PMD_SECT_UNCACHED | PMD_SECT_XN,
|
||||
.domain = DOMAIN_KERNEL,
|
||||
},
|
||||
};
|
||||
|
||||
const struct mem_type *get_mem_type(unsigned int type)
|
||||
|
@@ -379,31 +379,26 @@ ENTRY(cpu_arm920_set_pte_ext)
|
||||
|
||||
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
||||
.globl cpu_arm920_suspend_size
|
||||
.equ cpu_arm920_suspend_size, 4 * 4
|
||||
.equ cpu_arm920_suspend_size, 4 * 3
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_arm920_do_suspend)
|
||||
stmfd sp!, {r4 - r7, lr}
|
||||
stmfd sp!, {r4 - r6, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r5, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r6, c2, c0, 0 @ TTB address
|
||||
mrc p15, 0, r7, c1, c0, 0 @ Control register
|
||||
stmia r0, {r4 - r7}
|
||||
ldmfd sp!, {r4 - r7, pc}
|
||||
mrc p15, 0, r6, c1, c0, 0 @ Control register
|
||||
stmia r0, {r4 - r6}
|
||||
ldmfd sp!, {r4 - r6, pc}
|
||||
ENDPROC(cpu_arm920_do_suspend)
|
||||
|
||||
ENTRY(cpu_arm920_do_resume)
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs
|
||||
mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches
|
||||
ldmia r0, {r4 - r7}
|
||||
ldmia r0, {r4 - r6}
|
||||
mcr p15, 0, r4, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r5, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r6, c2, c0, 0 @ TTB address
|
||||
mov r0, r7 @ control register
|
||||
mov r2, r6, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | PMD_BIT4 | PMD_SECT_AP_WRITE
|
||||
mcr p15, 0, r1, c2, c0, 0 @ TTB address
|
||||
mov r0, r6 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_arm920_do_resume)
|
||||
#endif
|
||||
|
@@ -394,31 +394,26 @@ ENTRY(cpu_arm926_set_pte_ext)
|
||||
|
||||
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
||||
.globl cpu_arm926_suspend_size
|
||||
.equ cpu_arm926_suspend_size, 4 * 4
|
||||
.equ cpu_arm926_suspend_size, 4 * 3
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_arm926_do_suspend)
|
||||
stmfd sp!, {r4 - r7, lr}
|
||||
stmfd sp!, {r4 - r6, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r5, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r6, c2, c0, 0 @ TTB address
|
||||
mrc p15, 0, r7, c1, c0, 0 @ Control register
|
||||
stmia r0, {r4 - r7}
|
||||
ldmfd sp!, {r4 - r7, pc}
|
||||
mrc p15, 0, r6, c1, c0, 0 @ Control register
|
||||
stmia r0, {r4 - r6}
|
||||
ldmfd sp!, {r4 - r6, pc}
|
||||
ENDPROC(cpu_arm926_do_suspend)
|
||||
|
||||
ENTRY(cpu_arm926_do_resume)
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs
|
||||
mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches
|
||||
ldmia r0, {r4 - r7}
|
||||
ldmia r0, {r4 - r6}
|
||||
mcr p15, 0, r4, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r5, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r6, c2, c0, 0 @ TTB address
|
||||
mov r0, r7 @ control register
|
||||
mov r2, r6, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | PMD_BIT4 | PMD_SECT_AP_WRITE
|
||||
mcr p15, 0, r1, c2, c0, 0 @ TTB address
|
||||
mov r0, r6 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_arm926_do_resume)
|
||||
#endif
|
||||
|
@@ -168,20 +168,19 @@ ENTRY(cpu_sa1100_set_pte_ext)
|
||||
mov pc, lr
|
||||
|
||||
.globl cpu_sa1100_suspend_size
|
||||
.equ cpu_sa1100_suspend_size, 4*4
|
||||
.equ cpu_sa1100_suspend_size, 4 * 3
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_sa1100_do_suspend)
|
||||
stmfd sp!, {r4 - r7, lr}
|
||||
stmfd sp!, {r4 - r6, lr}
|
||||
mrc p15, 0, r4, c3, c0, 0 @ domain ID
|
||||
mrc p15, 0, r5, c2, c0, 0 @ translation table base addr
|
||||
mrc p15, 0, r6, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r7, c1, c0, 0 @ control reg
|
||||
stmia r0, {r4 - r7} @ store cp regs
|
||||
ldmfd sp!, {r4 - r7, pc}
|
||||
mrc p15, 0, r5, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r6, c1, c0, 0 @ control reg
|
||||
stmia r0, {r4 - r6} @ store cp regs
|
||||
ldmfd sp!, {r4 - r6, pc}
|
||||
ENDPROC(cpu_sa1100_do_suspend)
|
||||
|
||||
ENTRY(cpu_sa1100_do_resume)
|
||||
ldmia r0, {r4 - r7} @ load cp regs
|
||||
ldmia r0, {r4 - r6} @ load cp regs
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c8, c7, 0 @ flush I+D TLBs
|
||||
mcr p15, 0, ip, c7, c7, 0 @ flush I&D cache
|
||||
@@ -189,13 +188,9 @@ ENTRY(cpu_sa1100_do_resume)
|
||||
mcr p15, 0, ip, c9, c0, 5 @ allow user space to use RB
|
||||
|
||||
mcr p15, 0, r4, c3, c0, 0 @ domain ID
|
||||
mcr p15, 0, r5, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r6, c13, c0, 0 @ PID
|
||||
mov r0, r7 @ control register
|
||||
mov r2, r5, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | PMD_SECT_AP_WRITE
|
||||
mcr p15, 0, r1, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r5, c13, c0, 0 @ PID
|
||||
mov r0, r6 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_sa1100_do_resume)
|
||||
#endif
|
||||
|
@@ -128,20 +128,18 @@ ENTRY(cpu_v6_set_pte_ext)
|
||||
|
||||
/* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */
|
||||
.globl cpu_v6_suspend_size
|
||||
.equ cpu_v6_suspend_size, 4 * 8
|
||||
.equ cpu_v6_suspend_size, 4 * 6
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_v6_do_suspend)
|
||||
stmfd sp!, {r4 - r11, lr}
|
||||
stmfd sp!, {r4 - r9, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
mrc p15, 0, r5, c13, c0, 1 @ Context ID
|
||||
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r7, c2, c0, 0 @ Translation table base 0
|
||||
mrc p15, 0, r8, c2, c0, 1 @ Translation table base 1
|
||||
mrc p15, 0, r9, c1, c0, 1 @ auxiliary control register
|
||||
mrc p15, 0, r10, c1, c0, 2 @ co-processor access control
|
||||
mrc p15, 0, r11, c1, c0, 0 @ control register
|
||||
stmia r0, {r4 - r11}
|
||||
ldmfd sp!, {r4- r11, pc}
|
||||
mrc p15, 0, r5, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r6, c2, c0, 1 @ Translation table base 1
|
||||
mrc p15, 0, r7, c1, c0, 1 @ auxiliary control register
|
||||
mrc p15, 0, r8, c1, c0, 2 @ co-processor access control
|
||||
mrc p15, 0, r9, c1, c0, 0 @ control register
|
||||
stmia r0, {r4 - r9}
|
||||
ldmfd sp!, {r4- r9, pc}
|
||||
ENDPROC(cpu_v6_do_suspend)
|
||||
|
||||
ENTRY(cpu_v6_do_resume)
|
||||
@@ -150,25 +148,21 @@ ENTRY(cpu_v6_do_resume)
|
||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
mcr p15, 0, ip, c7, c15, 0 @ clean+invalidate cache
|
||||
mcr p15, 0, ip, c7, c10, 4 @ drain write buffer
|
||||
ldmia r0, {r4 - r11}
|
||||
mcr p15, 0, ip, c13, c0, 1 @ set reserved context ID
|
||||
ldmia r0, {r4 - r9}
|
||||
mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
mcr p15, 0, r5, c13, c0, 1 @ Context ID
|
||||
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r7, c2, c0, 0 @ Translation table base 0
|
||||
mcr p15, 0, r8, c2, c0, 1 @ Translation table base 1
|
||||
mcr p15, 0, r9, c1, c0, 1 @ auxiliary control register
|
||||
mcr p15, 0, r10, c1, c0, 2 @ co-processor access control
|
||||
mcr p15, 0, r5, c3, c0, 0 @ Domain ID
|
||||
ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP)
|
||||
ALT_UP(orr r1, r1, #TTB_FLAGS_UP)
|
||||
mcr p15, 0, r1, c2, c0, 0 @ Translation table base 0
|
||||
mcr p15, 0, r6, c2, c0, 1 @ Translation table base 1
|
||||
mcr p15, 0, r7, c1, c0, 1 @ auxiliary control register
|
||||
mcr p15, 0, r8, c1, c0, 2 @ co-processor access control
|
||||
mcr p15, 0, ip, c2, c0, 2 @ TTB control register
|
||||
mcr p15, 0, ip, c7, c5, 4 @ ISB
|
||||
mov r0, r11 @ control register
|
||||
mov r2, r7, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, cpu_resume_l1_flags
|
||||
mov r0, r9 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_v6_do_resume)
|
||||
cpu_resume_l1_flags:
|
||||
ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP)
|
||||
ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP)
|
||||
#endif
|
||||
|
||||
string cpu_v6_name, "ARMv6-compatible processor"
|
||||
|
@@ -217,56 +217,50 @@ ENDPROC(cpu_v7_set_pte_ext)
|
||||
|
||||
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
|
||||
.globl cpu_v7_suspend_size
|
||||
.equ cpu_v7_suspend_size, 4 * 9
|
||||
.equ cpu_v7_suspend_size, 4 * 7
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_v7_do_suspend)
|
||||
stmfd sp!, {r4 - r11, lr}
|
||||
stmfd sp!, {r4 - r10, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
mrc p15, 0, r5, c13, c0, 1 @ Context ID
|
||||
mrc p15, 0, r6, c13, c0, 3 @ User r/o thread ID
|
||||
stmia r0!, {r4 - r6}
|
||||
mrc p15, 0, r5, c13, c0, 3 @ User r/o thread ID
|
||||
stmia r0!, {r4 - r5}
|
||||
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r7, c2, c0, 0 @ TTB 0
|
||||
mrc p15, 0, r8, c2, c0, 1 @ TTB 1
|
||||
mrc p15, 0, r9, c1, c0, 0 @ Control register
|
||||
mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register
|
||||
mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control
|
||||
stmia r0, {r6 - r11}
|
||||
ldmfd sp!, {r4 - r11, pc}
|
||||
mrc p15, 0, r7, c2, c0, 1 @ TTB 1
|
||||
mrc p15, 0, r8, c1, c0, 0 @ Control register
|
||||
mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register
|
||||
mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control
|
||||
stmia r0, {r6 - r10}
|
||||
ldmfd sp!, {r4 - r10, pc}
|
||||
ENDPROC(cpu_v7_do_suspend)
|
||||
|
||||
ENTRY(cpu_v7_do_resume)
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs
|
||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
ldmia r0!, {r4 - r6}
|
||||
mcr p15, 0, ip, c13, c0, 1 @ set reserved context ID
|
||||
ldmia r0!, {r4 - r5}
|
||||
mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
mcr p15, 0, r5, c13, c0, 1 @ Context ID
|
||||
mcr p15, 0, r6, c13, c0, 3 @ User r/o thread ID
|
||||
ldmia r0, {r6 - r11}
|
||||
mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID
|
||||
ldmia r0, {r6 - r10}
|
||||
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r7, c2, c0, 0 @ TTB 0
|
||||
mcr p15, 0, r8, c2, c0, 1 @ TTB 1
|
||||
ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP)
|
||||
ALT_UP(orr r1, r1, #TTB_FLAGS_UP)
|
||||
mcr p15, 0, r1, c2, c0, 0 @ TTB 0
|
||||
mcr p15, 0, r7, c2, c0, 1 @ TTB 1
|
||||
mcr p15, 0, ip, c2, c0, 2 @ TTB control register
|
||||
mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register
|
||||
teq r4, r10 @ Is it already set?
|
||||
mcrne p15, 0, r10, c1, c0, 1 @ No, so write it
|
||||
mcr p15, 0, r11, c1, c0, 2 @ Co-processor access control
|
||||
teq r4, r9 @ Is it already set?
|
||||
mcrne p15, 0, r9, c1, c0, 1 @ No, so write it
|
||||
mcr p15, 0, r10, c1, c0, 2 @ Co-processor access control
|
||||
ldr r4, =PRRR @ PRRR
|
||||
ldr r5, =NMRR @ NMRR
|
||||
mcr p15, 0, r4, c10, c2, 0 @ write PRRR
|
||||
mcr p15, 0, r5, c10, c2, 1 @ write NMRR
|
||||
isb
|
||||
dsb
|
||||
mov r0, r9 @ control register
|
||||
mov r2, r7, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, cpu_resume_l1_flags
|
||||
mov r0, r8 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_v7_do_resume)
|
||||
cpu_resume_l1_flags:
|
||||
ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP)
|
||||
ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP)
|
||||
#endif
|
||||
|
||||
__CPUINIT
|
||||
|
@@ -406,24 +406,23 @@ ENTRY(cpu_xsc3_set_pte_ext)
|
||||
.align
|
||||
|
||||
.globl cpu_xsc3_suspend_size
|
||||
.equ cpu_xsc3_suspend_size, 4 * 7
|
||||
.equ cpu_xsc3_suspend_size, 4 * 6
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_xsc3_do_suspend)
|
||||
stmfd sp!, {r4 - r10, lr}
|
||||
stmfd sp!, {r4 - r9, lr}
|
||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||
mrc p15, 0, r5, c15, c1, 0 @ CP access reg
|
||||
mrc p15, 0, r6, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r7, c3, c0, 0 @ domain ID
|
||||
mrc p15, 0, r8, c2, c0, 0 @ translation table base addr
|
||||
mrc p15, 0, r9, c1, c0, 1 @ auxiliary control reg
|
||||
mrc p15, 0, r10, c1, c0, 0 @ control reg
|
||||
mrc p15, 0, r8, c1, c0, 1 @ auxiliary control reg
|
||||
mrc p15, 0, r9, c1, c0, 0 @ control reg
|
||||
bic r4, r4, #2 @ clear frequency change bit
|
||||
stmia r0, {r4 - r10} @ store cp regs
|
||||
ldmia sp!, {r4 - r10, pc}
|
||||
stmia r0, {r4 - r9} @ store cp regs
|
||||
ldmia sp!, {r4 - r9, pc}
|
||||
ENDPROC(cpu_xsc3_do_suspend)
|
||||
|
||||
ENTRY(cpu_xsc3_do_resume)
|
||||
ldmia r0, {r4 - r10} @ load cp regs
|
||||
ldmia r0, {r4 - r9} @ load cp regs
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c7, c7, 0 @ invalidate I & D caches, BTB
|
||||
mcr p15, 0, ip, c7, c10, 4 @ drain write (&fill) buffer
|
||||
@@ -433,15 +432,10 @@ ENTRY(cpu_xsc3_do_resume)
|
||||
mcr p15, 0, r5, c15, c1, 0 @ CP access reg
|
||||
mcr p15, 0, r6, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r7, c3, c0, 0 @ domain ID
|
||||
mcr p15, 0, r8, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r9, c1, c0, 1 @ auxiliary control reg
|
||||
|
||||
@ temporarily map resume_turn_on_mmu into the page table,
|
||||
@ otherwise prefetch abort occurs after MMU is turned on
|
||||
mov r0, r10 @ control register
|
||||
mov r2, r8, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, =0x542e @ section flags
|
||||
orr r1, r1, #0x18 @ cache the page table in L2
|
||||
mcr p15, 0, r1, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r8, c1, c0, 1 @ auxiliary control reg
|
||||
mov r0, r9 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_xsc3_do_resume)
|
||||
#endif
|
||||
|
@@ -520,24 +520,23 @@ ENTRY(cpu_xscale_set_pte_ext)
|
||||
.align
|
||||
|
||||
.globl cpu_xscale_suspend_size
|
||||
.equ cpu_xscale_suspend_size, 4 * 7
|
||||
.equ cpu_xscale_suspend_size, 4 * 6
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_xscale_do_suspend)
|
||||
stmfd sp!, {r4 - r10, lr}
|
||||
stmfd sp!, {r4 - r9, lr}
|
||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||
mrc p15, 0, r5, c15, c1, 0 @ CP access reg
|
||||
mrc p15, 0, r6, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r7, c3, c0, 0 @ domain ID
|
||||
mrc p15, 0, r8, c2, c0, 0 @ translation table base addr
|
||||
mrc p15, 0, r9, c1, c1, 0 @ auxiliary control reg
|
||||
mrc p15, 0, r10, c1, c0, 0 @ control reg
|
||||
mrc p15, 0, r8, c1, c1, 0 @ auxiliary control reg
|
||||
mrc p15, 0, r9, c1, c0, 0 @ control reg
|
||||
bic r4, r4, #2 @ clear frequency change bit
|
||||
stmia r0, {r4 - r10} @ store cp regs
|
||||
ldmfd sp!, {r4 - r10, pc}
|
||||
stmia r0, {r4 - r9} @ store cp regs
|
||||
ldmfd sp!, {r4 - r9, pc}
|
||||
ENDPROC(cpu_xscale_do_suspend)
|
||||
|
||||
ENTRY(cpu_xscale_do_resume)
|
||||
ldmia r0, {r4 - r10} @ load cp regs
|
||||
ldmia r0, {r4 - r9} @ load cp regs
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
|
||||
mcr p15, 0, ip, c7, c7, 0 @ invalidate I & D caches, BTB
|
||||
@@ -545,13 +544,9 @@ ENTRY(cpu_xscale_do_resume)
|
||||
mcr p15, 0, r5, c15, c1, 0 @ CP access reg
|
||||
mcr p15, 0, r6, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r7, c3, c0, 0 @ domain ID
|
||||
mcr p15, 0, r8, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r9, c1, c1, 0 @ auxiliary control reg
|
||||
mov r0, r10 @ control register
|
||||
mov r2, r8, lsr #14 @ get TTB0 base
|
||||
mov r2, r2, lsl #14
|
||||
ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | PMD_SECT_AP_WRITE
|
||||
mcr p15, 0, r1, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r8, c1, c1, 0 @ auxiliary control reg
|
||||
mov r0, r9 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_xscale_do_resume)
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user