Blame view
arch/arm/plat-omap/sram.c
9.85 KB
92105bb70 [ARM] 2887/1: OMA... |
1 2 3 4 5 6 7 8 |
/* * linux/arch/arm/plat-omap/sram.c * * OMAP SRAM detection and management * * Copyright (C) 2005 Nokia Corporation * Written by Tony Lindgren <tony@atomide.com> * |
44169075e ARM: OMAP4: Add m... |
9 10 11 |
* Copyright (C) 2009 Texas Instruments * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> * |
92105bb70 [ARM] 2887/1: OMA... |
12 13 14 15 |
* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ |
c2d43e39c ARM: OMAP: SRAM: ... |
16 |
#undef DEBUG |
92105bb70 [ARM] 2887/1: OMA... |
17 |
|
92105bb70 [ARM] 2887/1: OMA... |
18 19 20 |
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> |
fced80c73 [ARM] Convert asm... |
21 |
#include <linux/io.h> |
92105bb70 [ARM] 2887/1: OMA... |
22 |
|
53d9cc739 [ARM] 3279/1: OMA... |
23 |
#include <asm/tlb.h> |
92105bb70 [ARM] 2887/1: OMA... |
24 |
#include <asm/cacheflush.h> |
670c104ae [ARM] 3430/1: ARM... |
25 |
#include <asm/mach/map.h> |
ce491cf85 omap: headers: Mo... |
26 27 28 |
#include <plat/sram.h> #include <plat/board.h> #include <plat/cpu.h> |
1a8bfa1eb [ARM] 3142/1: OMA... |
29 |
|
b0a330dc5 OMAP: plat-omap: ... |
30 |
#include "sram.h" |
59fb659b0 OMAP2/3: PRCM: sp... |
31 32 |
/* XXX These "sideways" includes are a sign that something is wrong */ |
c2d43e39c ARM: OMAP: SRAM: ... |
33 |
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) |
59fb659b0 OMAP2/3: PRCM: sp... |
34 |
# include "../mach-omap2/prm2xxx_3xxx.h" |
c2d43e39c ARM: OMAP: SRAM: ... |
35 36 |
# include "../mach-omap2/sdrc.h" #endif |
1a8bfa1eb [ARM] 3142/1: OMA... |
37 |
#define OMAP1_SRAM_PA 0x20000000 |
b4b36fd94 OMAP2+: use globa... |
38 |
#define OMAP2_SRAM_PUB_PA (OMAP2_SRAM_PA + 0xf800) |
b4b36fd94 OMAP2+: use globa... |
39 |
#define OMAP3_SRAM_PUB_PA (OMAP3_SRAM_PA + 0x8000) |
a7c3ae2cb OMAP4: Fix SRAM b... |
40 |
#define OMAP4_SRAM_PUB_PA (OMAP4_SRAM_PA + 0x4000) |
c2d43e39c ARM: OMAP: SRAM: ... |
41 |
|
f47d8c694 omap4: sram: Fix ... |
42 |
#if defined(CONFIG_ARCH_OMAP2PLUS) |
670c104ae [ARM] 3430/1: ARM... |
43 44 |
#define SRAM_BOOTLOADER_SZ 0x00 #else |
92105bb70 [ARM] 2887/1: OMA... |
45 |
#define SRAM_BOOTLOADER_SZ 0x80 |
670c104ae [ARM] 3430/1: ARM... |
46 |
#endif |
233fd64e7 omap: Split OMAP2... |
47 48 49 |
#define OMAP24XX_VA_REQINFOPERM0 OMAP2_L3_IO_ADDRESS(0x68005048) #define OMAP24XX_VA_READPERM0 OMAP2_L3_IO_ADDRESS(0x68005050) #define OMAP24XX_VA_WRITEPERM0 OMAP2_L3_IO_ADDRESS(0x68005058) |
c2d43e39c ARM: OMAP: SRAM: ... |
50 |
|
233fd64e7 omap: Split OMAP2... |
51 52 53 54 55 |
#define OMAP34XX_VA_REQINFOPERM0 OMAP2_L3_IO_ADDRESS(0x68012848) #define OMAP34XX_VA_READPERM0 OMAP2_L3_IO_ADDRESS(0x68012850) #define OMAP34XX_VA_WRITEPERM0 OMAP2_L3_IO_ADDRESS(0x68012858) #define OMAP34XX_VA_ADDR_MATCH2 OMAP2_L3_IO_ADDRESS(0x68012880) #define OMAP34XX_VA_SMS_RG_ATT0 OMAP2_L3_IO_ADDRESS(0x6C000048) |
c2d43e39c ARM: OMAP: SRAM: ... |
56 |
|
670c104ae [ARM] 3430/1: ARM... |
57 |
#define GP_DEVICE 0x300 |
670c104ae [ARM] 3430/1: ARM... |
58 59 |
#define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1))) |
92105bb70 [ARM] 2887/1: OMA... |
60 |
|
c40fae952 ARM: OMAP: Sync c... |
61 |
static unsigned long omap_sram_start; |
56849c743 ARM: OMAP: Map SR... |
62 |
static void __iomem *omap_sram_base; |
92105bb70 [ARM] 2887/1: OMA... |
63 |
static unsigned long omap_sram_size; |
92105bb70 [ARM] 2887/1: OMA... |
64 |
|
b7cc6d46b ARM: OMAP: FB syn... |
65 66 |
/* * Depending on the target RAMFS firewall setup, the public usable amount of |
6cbdc8c53 [ARM] spelling fixes |
67 68 |
* SRAM varies. The default accessible size for all device types is 2k. A GP * device allows ARM11 but not other initiators for full size. This |
670c104ae [ARM] 3430/1: ARM... |
69 70 71 72 |
* functionality seems ok until some nice security API happens. */ static int is_sram_locked(void) { |
2a27753fd omap: sram: fix i... |
73 |
if (OMAP2_DEVICE_TYPE_GP == omap_type()) { |
6cbdc8c53 [ARM] spelling fixes |
74 |
/* RAMFW: R/W access to all initiators for all qualifier sets */ |
670c104ae [ARM] 3430/1: ARM... |
75 |
if (cpu_is_omap242x()) { |
c2d43e39c ARM: OMAP: SRAM: ... |
76 77 78 79 80 81 82 83 84 85 |
__raw_writel(0xFF, OMAP24XX_VA_REQINFOPERM0); /* all q-vects */ __raw_writel(0xCFDE, OMAP24XX_VA_READPERM0); /* all i-read */ __raw_writel(0xCFDE, OMAP24XX_VA_WRITEPERM0); /* all i-write */ } if (cpu_is_omap34xx()) { __raw_writel(0xFFFF, OMAP34XX_VA_REQINFOPERM0); /* all q-vects */ __raw_writel(0xFFFF, OMAP34XX_VA_READPERM0); /* all i-read */ __raw_writel(0xFFFF, OMAP34XX_VA_WRITEPERM0); /* all i-write */ __raw_writel(0x0, OMAP34XX_VA_ADDR_MATCH2); __raw_writel(0xFFFFFFFF, OMAP34XX_VA_SMS_RG_ATT0); |
670c104ae [ARM] 3430/1: ARM... |
86 87 88 89 90 |
} return 0; } else return 1; /* assume locked with no PPA or security driver */ } |
5961d0446 Consolidate SRAM ... |
91 |
struct gen_pool *omap_gen_pool; |
3feb24e03 arm:omap:am335x: ... |
92 |
EXPORT_SYMBOL_GPL(omap_gen_pool); |
5961d0446 Consolidate SRAM ... |
93 |
|
92105bb70 [ARM] 2887/1: OMA... |
94 |
/* |
1a8bfa1eb [ARM] 3142/1: OMA... |
95 |
* The amount of SRAM depends on the core type. |
92105bb70 [ARM] 2887/1: OMA... |
96 97 98 99 |
* Note that we cannot try to test for SRAM here because writes * to secure SRAM will hang the system. Also the SRAM is not * yet mapped at this point. */ |
b0a330dc5 OMAP: plat-omap: ... |
100 |
static void __init omap_detect_sram(void) |
92105bb70 [ARM] 2887/1: OMA... |
101 |
{ |
c2d43e39c ARM: OMAP: SRAM: ... |
102 |
if (cpu_class_is_omap2()) { |
670c104ae [ARM] 3430/1: ARM... |
103 |
if (is_sram_locked()) { |
c2d43e39c ARM: OMAP: SRAM: ... |
104 |
if (cpu_is_omap34xx()) { |
c2d43e39c ARM: OMAP: SRAM: ... |
105 |
omap_sram_start = OMAP3_SRAM_PUB_PA; |
5b0acc59d OMAP3: SRAM size ... |
106 107 108 109 110 111 |
if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) || (omap_type() == OMAP2_DEVICE_TYPE_SEC)) { omap_sram_size = 0x7000; /* 28K */ } else { omap_sram_size = 0x8000; /* 32K */ } |
a7c3ae2cb OMAP4: Fix SRAM b... |
112 |
} else if (cpu_is_omap44xx()) { |
a7c3ae2cb OMAP4: Fix SRAM b... |
113 114 |
omap_sram_start = OMAP4_SRAM_PUB_PA; omap_sram_size = 0xa000; /* 40K */ |
c2d43e39c ARM: OMAP: SRAM: ... |
115 |
} else { |
c2d43e39c ARM: OMAP: SRAM: ... |
116 117 118 |
omap_sram_start = OMAP2_SRAM_PUB_PA; omap_sram_size = 0x800; /* 2K */ } |
670c104ae [ARM] 3430/1: ARM... |
119 |
} else { |
c2d43e39c ARM: OMAP: SRAM: ... |
120 |
if (cpu_is_omap34xx()) { |
c2d43e39c ARM: OMAP: SRAM: ... |
121 |
omap_sram_start = OMAP3_SRAM_PA; |
670c104ae [ARM] 3430/1: ARM... |
122 |
omap_sram_size = 0x10000; /* 64K */ |
44169075e ARM: OMAP4: Add m... |
123 |
} else if (cpu_is_omap44xx()) { |
44169075e ARM: OMAP4: Add m... |
124 |
omap_sram_start = OMAP4_SRAM_PA; |
a7c3ae2cb OMAP4: Fix SRAM b... |
125 |
omap_sram_size = 0xe000; /* 56K */ |
c2d43e39c ARM: OMAP: SRAM: ... |
126 |
} else { |
c2d43e39c ARM: OMAP: SRAM: ... |
127 128 129 130 131 132 |
omap_sram_start = OMAP2_SRAM_PA; if (cpu_is_omap242x()) omap_sram_size = 0xa0000; /* 640K */ else if (cpu_is_omap243x()) omap_sram_size = 0x10000; /* 64K */ } |
670c104ae [ARM] 3430/1: ARM... |
133 134 |
} } else { |
c40fae952 ARM: OMAP: Sync c... |
135 |
omap_sram_start = OMAP1_SRAM_PA; |
670c104ae [ARM] 3430/1: ARM... |
136 |
|
557096fe2 [OMAP850] Changes... |
137 |
if (cpu_is_omap7xx()) |
670c104ae [ARM] 3430/1: ARM... |
138 139 140 141 142 143 144 |
omap_sram_size = 0x32000; /* 200K */ else if (cpu_is_omap15xx()) omap_sram_size = 0x30000; /* 192K */ else if (cpu_is_omap1610() || cpu_is_omap1621() || cpu_is_omap1710()) omap_sram_size = 0x4000; /* 16K */ else if (cpu_is_omap1611()) |
28dd31983 OMAP1: SRAM: fix ... |
145 |
omap_sram_size = SZ_256K; |
670c104ae [ARM] 3430/1: ARM... |
146 |
else { |
26a510ba1 OMAP: SRAM: Fix w... |
147 148 |
pr_err("Could not detect SRAM size "); |
670c104ae [ARM] 3430/1: ARM... |
149 150 |
omap_sram_size = 0x4000; } |
92105bb70 [ARM] 2887/1: OMA... |
151 |
} |
5961d0446 Consolidate SRAM ... |
152 153 154 155 156 157 158 159 160 161 162 163 |
{ /* The first SRAM_BOOTLOADER_SZ of SRAM are reserved */ void *base = (void *)omap_sram_base + SRAM_BOOTLOADER_SZ; phys_addr_t phys = omap_sram_start + SRAM_BOOTLOADER_SZ; size_t len = omap_sram_size - SRAM_BOOTLOADER_SZ; omap_gen_pool = gen_pool_create(ilog2(FNCPY_ALIGN), -1); if (omap_gen_pool) WARN_ON(gen_pool_add_virt(omap_gen_pool, (unsigned long)base, phys, len, -1)); WARN_ON(!omap_gen_pool); } |
92105bb70 [ARM] 2887/1: OMA... |
164 |
} |
92105bb70 [ARM] 2887/1: OMA... |
165 |
/* |
ce2deca27 ARM: OMAP: Fix SR... |
166 |
* Note that we cannot use ioremap for SRAM, as clock init needs SRAM early. |
92105bb70 [ARM] 2887/1: OMA... |
167 |
*/ |
b0a330dc5 OMAP: plat-omap: ... |
168 |
static void __init omap_map_sram(void) |
92105bb70 [ARM] 2887/1: OMA... |
169 |
{ |
56849c743 ARM: OMAP: Map SR... |
170 |
int cached = 1; |
670c104ae [ARM] 3430/1: ARM... |
171 |
|
92105bb70 [ARM] 2887/1: OMA... |
172 173 |
if (omap_sram_size == 0) return; |
c2d43e39c ARM: OMAP: SRAM: ... |
174 |
if (cpu_is_omap34xx()) { |
d9295746c OMAP3 SRAM: mark ... |
175 176 177 178 179 180 181 |
/* * SRAM must be marked as non-cached on OMAP3 since the * CORE DPLL M2 divider change code (in SRAM) runs with the * SDRAM controller disabled, and if it is marked cached, * the ARM may attempt to write cache lines back to SDRAM * which will cause the system to hang. */ |
56849c743 ARM: OMAP: Map SR... |
182 |
cached = 0; |
c2d43e39c ARM: OMAP: SRAM: ... |
183 |
} |
56849c743 ARM: OMAP: Map SR... |
184 185 186 187 188 189 190 191 |
omap_sram_start = ROUND_DOWN(omap_sram_start, PAGE_SIZE); omap_sram_base = __arm_ioremap_exec(omap_sram_start, omap_sram_size, cached); if (!omap_sram_base) { pr_err("SRAM: Could not map "); return; } |
1a8bfa1eb [ARM] 3142/1: OMA... |
192 |
|
53d9cc739 [ARM] 3279/1: OMA... |
193 |
/* |
92105bb70 [ARM] 2887/1: OMA... |
194 195 196 197 198 199 |
* Looks like we need to preserve some bootloader code at the * beginning of SRAM for jumping to flash for reboot to work... */ memset((void *)omap_sram_base + SRAM_BOOTLOADER_SZ, 0, omap_sram_size - SRAM_BOOTLOADER_SZ); } |
1a8bfa1eb [ARM] 3142/1: OMA... |
200 201 202 203 204 205 |
#ifdef CONFIG_ARCH_OMAP1 static void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl); void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl) { |
da7a0649b ARM: OMAP: Remove... |
206 |
BUG_ON(!_omap_sram_reprogram_clock); |
020f97063 [ARM] omap: fix a... |
207 |
_omap_sram_reprogram_clock(dpllctl, ckctl); |
1a8bfa1eb [ARM] 3142/1: OMA... |
208 |
} |
e6f168212 arm: omap1: make ... |
209 |
static int __init omap1_sram_init(void) |
92105bb70 [ARM] 2887/1: OMA... |
210 |
{ |
c2d43e39c ARM: OMAP: SRAM: ... |
211 212 213 |
_omap_sram_reprogram_clock = omap_sram_push(omap1_sram_reprogram_clock, omap1_sram_reprogram_clock_sz); |
1a8bfa1eb [ARM] 3142/1: OMA... |
214 215 216 217 218 219 220 |
return 0; } #else #define omap1_sram_init() do {} while (0) #endif |
cc26b3b01 ARM: OMAP3: Add m... |
221 |
#if defined(CONFIG_ARCH_OMAP2) |
1a8bfa1eb [ARM] 3142/1: OMA... |
222 223 224 225 226 227 228 |
static void (*_omap2_sram_ddr_init)(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, u32 base_cs, u32 force_unlock); void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, u32 base_cs, u32 force_unlock) { |
da7a0649b ARM: OMAP: Remove... |
229 |
BUG_ON(!_omap2_sram_ddr_init); |
020f97063 [ARM] omap: fix a... |
230 231 |
_omap2_sram_ddr_init(slow_dll_ctrl, fast_dll_ctrl, base_cs, force_unlock); |
1a8bfa1eb [ARM] 3142/1: OMA... |
232 233 234 235 236 237 238 |
} static void (*_omap2_sram_reprogram_sdrc)(u32 perf_level, u32 dll_val, u32 mem_type); void omap2_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, u32 mem_type) { |
da7a0649b ARM: OMAP: Remove... |
239 |
BUG_ON(!_omap2_sram_reprogram_sdrc); |
020f97063 [ARM] omap: fix a... |
240 |
_omap2_sram_reprogram_sdrc(perf_level, dll_val, mem_type); |
1a8bfa1eb [ARM] 3142/1: OMA... |
241 242 243 244 245 246 |
} static u32 (*_omap2_set_prcm)(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass); u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass) { |
da7a0649b ARM: OMAP: Remove... |
247 |
BUG_ON(!_omap2_set_prcm); |
1a8bfa1eb [ARM] 3142/1: OMA... |
248 249 |
return _omap2_set_prcm(dpll_ctrl_val, sdrc_rfr_val, bypass); } |
c2d43e39c ARM: OMAP: SRAM: ... |
250 |
#endif |
59b479e09 omap: Start using... |
251 |
#ifdef CONFIG_SOC_OMAP2420 |
b0a330dc5 OMAP: plat-omap: ... |
252 |
static int __init omap242x_sram_init(void) |
c2d43e39c ARM: OMAP: SRAM: ... |
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
{ _omap2_sram_ddr_init = omap_sram_push(omap242x_sram_ddr_init, omap242x_sram_ddr_init_sz); _omap2_sram_reprogram_sdrc = omap_sram_push(omap242x_sram_reprogram_sdrc, omap242x_sram_reprogram_sdrc_sz); _omap2_set_prcm = omap_sram_push(omap242x_sram_set_prcm, omap242x_sram_set_prcm_sz); return 0; } #else static inline int omap242x_sram_init(void) { return 0; } #endif |
59b479e09 omap: Start using... |
271 |
#ifdef CONFIG_SOC_OMAP2430 |
b0a330dc5 OMAP: plat-omap: ... |
272 |
static int __init omap243x_sram_init(void) |
c2d43e39c ARM: OMAP: SRAM: ... |
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
{ _omap2_sram_ddr_init = omap_sram_push(omap243x_sram_ddr_init, omap243x_sram_ddr_init_sz); _omap2_sram_reprogram_sdrc = omap_sram_push(omap243x_sram_reprogram_sdrc, omap243x_sram_reprogram_sdrc_sz); _omap2_set_prcm = omap_sram_push(omap243x_sram_set_prcm, omap243x_sram_set_prcm_sz); return 0; } #else static inline int omap243x_sram_init(void) { return 0; } #endif #ifdef CONFIG_ARCH_OMAP3 |
58cda884e OMAP3 SDRC: add s... |
293 294 295 296 297 298 299 300 301 302 303 304 |
static u32 (*_omap3_sram_configure_core_dpll)( u32 m2, u32 unlock_dll, u32 f, u32 inc, u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc, u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1) |
c2d43e39c ARM: OMAP: SRAM: ... |
305 |
{ |
da7a0649b ARM: OMAP: Remove... |
306 |
BUG_ON(!_omap3_sram_configure_core_dpll); |
58cda884e OMAP3 SDRC: add s... |
307 308 309 310 311 312 |
return _omap3_sram_configure_core_dpll( m2, unlock_dll, f, inc, sdrc_rfr_ctrl_0, sdrc_actim_ctrl_a_0, sdrc_actim_ctrl_b_0, sdrc_mr_0, sdrc_rfr_ctrl_1, sdrc_actim_ctrl_a_1, sdrc_actim_ctrl_b_1, sdrc_mr_1); |
c2d43e39c ARM: OMAP: SRAM: ... |
313 |
} |
1a8bfa1eb [ARM] 3142/1: OMA... |
314 |
|
3231fc889 OMAP3: PM: restor... |
315 316 |
#ifdef CONFIG_PM void omap3_sram_restore_context(void) |
1a8bfa1eb [ARM] 3142/1: OMA... |
317 |
{ |
cc26b3b01 ARM: OMAP3: Add m... |
318 319 320 |
_omap3_sram_configure_core_dpll = omap_sram_push(omap3_sram_configure_core_dpll, omap3_sram_configure_core_dpll_sz); |
3231fc889 OMAP3: PM: restor... |
321 |
omap_push_sram_idle(); |
c2d43e39c ARM: OMAP: SRAM: ... |
322 |
} |
3231fc889 OMAP3: PM: restor... |
323 |
#endif /* CONFIG_PM */ |
c2d43e39c ARM: OMAP: SRAM: ... |
324 |
|
46e130d29 ARM: pm: omap3: r... |
325 |
#endif /* CONFIG_ARCH_OMAP3 */ |
c2d43e39c ARM: OMAP: SRAM: ... |
326 327 |
static inline int omap34xx_sram_init(void) { |
46e130d29 ARM: pm: omap3: r... |
328 329 330 |
#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) omap3_sram_restore_context(); #endif |
c2d43e39c ARM: OMAP: SRAM: ... |
331 332 |
return 0; } |
1a8bfa1eb [ARM] 3142/1: OMA... |
333 334 335 |
int __init omap_sram_init(void) { |
e9c44c23b arm:omap:am33xx: ... |
336 337 |
if (cpu_is_am33xx()) return 0; |
1a8bfa1eb [ARM] 3142/1: OMA... |
338 339 |
omap_detect_sram(); omap_map_sram(); |
c2d43e39c ARM: OMAP: SRAM: ... |
340 |
if (!(cpu_class_is_omap2())) |
1a8bfa1eb [ARM] 3142/1: OMA... |
341 |
omap1_sram_init(); |
c2d43e39c ARM: OMAP: SRAM: ... |
342 343 344 345 346 347 |
else if (cpu_is_omap242x()) omap242x_sram_init(); else if (cpu_is_omap2430()) omap243x_sram_init(); else if (cpu_is_omap34xx()) omap34xx_sram_init(); |
1a8bfa1eb [ARM] 3142/1: OMA... |
348 349 |
return 0; |
92105bb70 [ARM] 2887/1: OMA... |
350 |
} |