22
22
#include <mach/hardware.h>
23
23
#include <mach/omap4-common.h>
25
#include "omap4-sar-layout.h"
25
27
#ifdef CONFIG_CACHE_L2X0
28
#define L2X0_POR_OFFSET_VALUE 0x9
26
29
void __iomem *l2cache_base;
29
32
void __iomem *gic_dist_base_addr;
33
static void __iomem *gic_cpu_base;
34
static void __iomem *sar_ram_base;
36
void __iomem *omap4_get_gic_dist_base(void)
38
return gic_dist_base_addr;
41
void __iomem *omap4_get_gic_cpu_base(void)
32
46
void __init gic_init_irq(void)
34
void __iomem *gic_cpu_base;
36
49
/* Static mapping, never released */
37
50
gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K);
78
98
* Way size - 32KB (es1.0)
79
99
* Way size - 64KB (es2.0 +)
81
aux_ctrl = ((1 << L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT) |
83
(0x1 << L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT) |
84
(0x1 << L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT));
101
aux_ctrl = readl_relaxed(l2cache_base + L2X0_AUX_CTRL);
86
103
if (omap_rev() == OMAP4430_REV_ES1_0) {
87
104
aux_ctrl |= 0x2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT;
89
aux_ctrl |= ((0x3 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) |
90
(1 << L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT) |
91
(1 << L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT) |
92
(1 << L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT) |
93
(1 << L2X0_AUX_CTRL_EARLY_BRESP_SHIFT));
95
if (omap_rev() != OMAP4430_REV_ES1_0)
96
omap_smc1(0x109, aux_ctrl);
105
goto skip_aux_por_api;
109
* Drop instruction prefetch hint since it degrades the
112
aux_ctrl |= ((0x3 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) |
113
(1 << L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT) |
114
(1 << L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT) |
115
(1 << L2X0_AUX_CTRL_EARLY_BRESP_SHIFT));
117
omap_smc1(0x109, aux_ctrl);
119
/* Setup POR Control register */
120
por_ctrl = readl_relaxed(l2cache_base + L2X0_PREFETCH_CTRL);
123
* Double linefill is available only on OMAP4460 L2X0.
124
* Undocumented bit 25 is set for better performance.
126
if (cpu_is_omap446x())
127
por_ctrl |= ((1 << L2X0_PREFETCH_DATA_PREFETCH_SHIFT) |
128
(1 << L2X0_PREFETCH_DOUBLE_LINEFILL_SHIFT) |
131
if (cpu_is_omap446x() || (omap_rev() >= OMAP4430_REV_ES2_2)) {
132
por_ctrl |= L2X0_POR_OFFSET_VALUE;
133
omap_smc1(0x113, por_ctrl);
136
if (cpu_is_omap446x()) {
137
writel_relaxed(0xa5a5, l2cache_base + 0x900);
138
writel_relaxed(0xa5a5, l2cache_base + 0x908);
139
writel_relaxed(0xa5a5, l2cache_base + 0x904);
140
writel_relaxed(0xa5a5, l2cache_base + 0x90C);
144
* FIXME: Temporary WA for OMAP4460 stability issue.
145
* Lock-down specific L2 cache ways which makes effective
146
* L2 size as 512 KB instead of 1 MB
148
if (cpu_is_omap446x()) {
150
writel_relaxed(lockdown, l2cache_base + L2X0_LOCKDOWN_WAY_D0);
151
writel_relaxed(lockdown, l2cache_base + L2X0_LOCKDOWN_WAY_D1);
152
writel_relaxed(lockdown, l2cache_base + L2X0_LOCKDOWN_WAY_I0);
153
writel_relaxed(lockdown, l2cache_base + L2X0_LOCKDOWN_WAY_I1);
98
157
/* Enable PL310 L2 Cache controller */
99
158
omap_smc1(0x102, 0x1);
112
171
early_initcall(omap_l2_cache_init);
174
void __iomem *omap4_get_sar_ram_base(void)
180
* SAR RAM used to save and restore the HW
181
* context in low power modes
183
static int __init omap4_sar_ram_init(void)
186
* To avoid code running on other OMAPs in
189
if (!cpu_is_omap44xx())
192
/* Static mapping, never released */
193
sar_ram_base = ioremap(OMAP44XX_SAR_RAM_BASE, SZ_8K);
194
if (WARN_ON(!sar_ram_base))
199
early_initcall(omap4_sar_ram_init);