Merge branch 'for-linus-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/mason...
[deliverable/linux.git] / arch / blackfin / mm / init.c
CommitLineData
1394f032 1/*
96f1050d 2 * Copyright 2004-2009 Analog Devices Inc.
1394f032 3 *
96f1050d 4 * Licensed under the GPL-2 or later.
1394f032
BW
5 */
6
5a0e3ad6 7#include <linux/gfp.h>
1394f032
BW
8#include <linux/swap.h>
9#include <linux/bootmem.h>
1f83b8f1 10#include <linux/uaccess.h>
8dc7a9c8 11#include <linux/export.h>
1394f032 12#include <asm/bfin-global.h>
8f65873e
GY
13#include <asm/pda.h>
14#include <asm/cplbinit.h>
837ec2d5 15#include <asm/early_printk.h>
1394f032
BW
16#include "blackfin_sram.h"
17
18/*
f074e48e
MF
19 * ZERO_PAGE is a special page that is used for zero-initialized data and COW.
20 * Let the bss do its zero-init magic so we don't have to do it ourselves.
1394f032 21 */
f074e48e
MF
22char empty_zero_page[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
23EXPORT_SYMBOL(empty_zero_page);
1394f032 24
f82e0a0c
GY
25#ifndef CONFIG_EXCEPTION_L1_SCRATCH
26#if defined CONFIG_SYSCALL_TAB_L1
27__attribute__((l1_data))
28#endif
29static unsigned long exception_stack[NR_CPUS][1024];
30#endif
8f65873e
GY
31
32struct blackfin_pda cpu_pda[NR_CPUS];
33EXPORT_SYMBOL(cpu_pda);
34
1394f032
BW
35/*
36 * paging_init() continues the virtual memory environment setup which
37 * was begun by the code in arch/head.S.
38 * The parameters are pointers to where to stick the starting and ending
39 * addresses of available kernel virtual memory.
40 */
321f6e0f 41void __init paging_init(void)
1394f032
BW
42{
43 /*
d012ce22
MF
44 * make sure start_mem is page aligned, otherwise bootmem and
45 * page_alloc get different views of the world
1394f032
BW
46 */
47 unsigned long end_mem = memory_end & PAGE_MASK;
48
d012ce22
MF
49 unsigned long zones_size[MAX_NR_ZONES] = {
50 [0] = 0,
b5affb01 51 [ZONE_DMA] = (end_mem - CONFIG_PHY_RAM_BASE_ADDRESS) >> PAGE_SHIFT,
d012ce22
MF
52 [ZONE_NORMAL] = 0,
53#ifdef CONFIG_HIGHMEM
54 [ZONE_HIGHMEM] = 0,
55#endif
56 };
1394f032 57
d012ce22 58 /* Set up SFC/DFC registers (user data space) */
1394f032
BW
59 set_fs(KERNEL_DS);
60
d012ce22 61 pr_debug("free_area_init -> start_mem is %#lx virtual_end is %#lx\n",
1394f032 62 PAGE_ALIGN(memory_start), end_mem);
b5affb01
BL
63 free_area_init_node(0, zones_size,
64 CONFIG_PHY_RAM_BASE_ADDRESS >> PAGE_SHIFT, NULL);
1394f032
BW
65}
66
8e2a7694 67asmlinkage void __init init_pda(void)
8f65873e
GY
68{
69 unsigned int cpu = raw_smp_processor_id();
70
837ec2d5
RG
71 early_shadow_stamp();
72
8f65873e
GY
73 /* Initialize the PDA fields holding references to other parts
74 of the memory. The content of such memory is still
75 undefined at the time of the call, we are only setting up
76 valid pointers to it. */
77 memset(&cpu_pda[cpu], 0, sizeof(cpu_pda[cpu]));
78
f82e0a0c
GY
79#ifdef CONFIG_EXCEPTION_L1_SCRATCH
80 cpu_pda[cpu].ex_stack = (unsigned long *)(L1_SCRATCH_START + \
81 L1_SCRATCH_LENGTH);
82#else
8f65873e 83 cpu_pda[cpu].ex_stack = exception_stack[cpu + 1];
f82e0a0c 84#endif
8f65873e 85
8f65873e
GY
86#ifdef CONFIG_SMP
87 cpu_pda[cpu].imask = 0x1f;
88#endif
89}
90
321f6e0f 91void __init mem_init(void)
1394f032 92{
d9d7e769 93 char buf[64];
1394f032 94
d9d7e769
JL
95 high_memory = (void *)(memory_end & PAGE_MASK);
96 max_mapnr = MAP_NR(high_memory);
97 printk(KERN_DEBUG "Kernel managed physical pages: %lu\n", max_mapnr);
1394f032 98
ed8a36f5 99 /* This will put all low memory onto the freelists. */
0c988534 100 free_all_bootmem();
1394f032 101
d9d7e769
JL
102 snprintf(buf, sizeof(buf) - 1, "%uK DMA", DMA_UNCACHED_REGION >> 10);
103 mem_init_print_info(buf);
5d481f49
SZ
104}
105
1d189474
MF
106#ifdef CONFIG_BLK_DEV_INITRD
107void __init free_initrd_mem(unsigned long start, unsigned long end)
108{
b97b8a99 109#ifndef CONFIG_MPU
dbe67df4 110 free_reserved_area((void *)start, (void *)end, -1, "initrd");
b97b8a99 111#endif
1394f032
BW
112}
113#endif
114
bd721ea7 115void __ref free_initmem(void)
1394f032 116{
b97b8a99 117#if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU
dbe67df4 118 free_initmem_default(-1);
46284cd6
SZ
119 if (memory_start == (unsigned long)(&__init_end))
120 memory_start = (unsigned long)(&__init_begin);
1394f032
BW
121#endif
122}
This page took 0.623528 seconds and 5 git commands to generate.