This source file includes following definitions.
- nlm_linux_exit
- nlm_fixup_mem
- xlp_init_mem_from_bars
- plat_mem_setup
- get_system_type
- prom_free_prom_memory
- xlp_mmu_init
- nlm_percpu_init
- prom_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #include <linux/kernel.h>
36 #include <linux/of_fdt.h>
37 #include <linux/memblock.h>
38
39 #include <asm/idle.h>
40 #include <asm/reboot.h>
41 #include <asm/time.h>
42 #include <asm/bootinfo.h>
43
44 #include <asm/netlogic/haldefs.h>
45 #include <asm/netlogic/common.h>
46
47 #include <asm/netlogic/xlp-hal/iomap.h>
48 #include <asm/netlogic/xlp-hal/xlp.h>
49 #include <asm/netlogic/xlp-hal/sys.h>
50
51 uint64_t nlm_io_base;
52 struct nlm_soc_info nlm_nodes[NLM_NR_NODES];
53 cpumask_t nlm_cpumask = CPU_MASK_CPU0;
54 unsigned int nlm_threads_per_core;
55
56 static void nlm_linux_exit(void)
57 {
58 uint64_t sysbase = nlm_get_node(0)->sysbase;
59
60 if (cpu_is_xlp9xx())
61 nlm_write_sys_reg(sysbase, SYS_9XX_CHIP_RESET, 1);
62 else
63 nlm_write_sys_reg(sysbase, SYS_CHIP_RESET, 1);
64 for ( ; ; )
65 cpu_wait();
66 }
67
68 static void nlm_fixup_mem(void)
69 {
70 const int pref_backup = 512;
71 struct memblock_region *mem;
72
73 for_each_memblock(memory, mem) {
74 memblock_remove(mem->base + mem->size - pref_backup,
75 pref_backup);
76 }
77 }
78
79 static void __init xlp_init_mem_from_bars(void)
80 {
81 uint64_t map[16];
82 int i, n;
83
84 n = nlm_get_dram_map(-1, map, ARRAY_SIZE(map));
85 for (i = 0; i < n; i += 2) {
86
87 if (map[i] <= 0x10000000 && map[i+1] > 0x10000000)
88 map[i+1] = 0x10000000;
89 if (map[i] > 0x10000000 && map[i] < 0x20000000)
90 map[i] = 0x20000000;
91
92 add_memory_region(map[i], map[i+1] - map[i], BOOT_MEM_RAM);
93 }
94 }
95
96 void __init plat_mem_setup(void)
97 {
98 #ifdef CONFIG_SMP
99 nlm_wakeup_secondary_cpus();
100
101
102 current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1;
103
104 register_smp_ops(&nlm_smp_ops);
105 #endif
106 _machine_restart = (void (*)(char *))nlm_linux_exit;
107 _machine_halt = nlm_linux_exit;
108 pm_power_off = nlm_linux_exit;
109
110
111 xlp_early_init_devtree();
112
113 if (memblock_end_of_DRAM() == 0) {
114 pr_info("Using DRAM BARs for memory map.\n");
115 xlp_init_mem_from_bars();
116 }
117
118 nlm_fixup_mem();
119 }
120
121 const char *get_system_type(void)
122 {
123 switch (read_c0_prid() & PRID_IMP_MASK) {
124 case PRID_IMP_NETLOGIC_XLP9XX:
125 case PRID_IMP_NETLOGIC_XLP5XX:
126 case PRID_IMP_NETLOGIC_XLP2XX:
127 return "Broadcom XLPII Series";
128 default:
129 return "Netlogic XLP Series";
130 }
131 }
132
133 void __init prom_free_prom_memory(void)
134 {
135
136 }
137
138 void xlp_mmu_init(void)
139 {
140 u32 conf4;
141
142 if (cpu_is_xlpii()) {
143
144 conf4 = read_c0_config4() & ~0x1f00u;
145 write_c0_config4(conf4 | ((PAGE_SHIFT - 10) / 2 << 8));
146 } else {
147
148 write_c0_config6(read_c0_config6() | 0x24);
149
150
151 write_c0_config7(PM_DEFAULT_MASK >>
152 (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2)));
153 }
154 }
155
156 void nlm_percpu_init(int hwcpuid)
157 {
158 }
159
160 void __init prom_init(void)
161 {
162 void *reset_vec;
163
164 nlm_io_base = CKSEG1ADDR(XLP_DEFAULT_IO_BASE);
165 nlm_init_boot_cpu();
166 xlp_mmu_init();
167 nlm_node_init(0);
168 xlp_dt_init((void *)(long)fw_arg0);
169
170
171 reset_vec = (void *)CKSEG1ADDR(RESET_VEC_PHYS);
172 memset(reset_vec, 0, RESET_VEC_SIZE);
173 memcpy(reset_vec, (void *)nlm_reset_entry,
174 (nlm_reset_entry_end - nlm_reset_entry));
175
176 #ifdef CONFIG_SMP
177 cpumask_setall(&nlm_cpumask);
178 #endif
179 }