diff options
-rw-r--r-- | arch/arm/mach-omap2/id.c | 52 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/control.h | 34 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/cpu.h | 25 |
3 files changed, 108 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index d28e6fec7e47..d7ac8d547141 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
@@ -28,6 +28,7 @@ | |||
28 | static struct omap_chip_id omap_chip; | 28 | static struct omap_chip_id omap_chip; |
29 | static unsigned int omap_revision; | 29 | static unsigned int omap_revision; |
30 | 30 | ||
31 | u32 omap3_features; | ||
31 | 32 | ||
32 | unsigned int omap_rev(void) | 33 | unsigned int omap_rev(void) |
33 | { | 34 | { |
@@ -155,7 +156,33 @@ void __init omap24xx_check_revision(void) | |||
155 | pr_info("\n"); | 156 | pr_info("\n"); |
156 | } | 157 | } |
157 | 158 | ||
158 | void __init omap34xx_check_revision(void) | 159 | #define OMAP3_CHECK_FEATURE(status,feat) \ |
160 | if (((status & OMAP3_ ##feat## _MASK) \ | ||
161 | >> OMAP3_ ##feat## _SHIFT) != FEAT_ ##feat## _NONE) { \ | ||
162 | omap3_features |= OMAP3_HAS_ ##feat; \ | ||
163 | } | ||
164 | |||
165 | void __init omap3_check_features(void) | ||
166 | { | ||
167 | u32 status; | ||
168 | |||
169 | omap3_features = 0; | ||
170 | |||
171 | status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS); | ||
172 | |||
173 | OMAP3_CHECK_FEATURE(status, L2CACHE); | ||
174 | OMAP3_CHECK_FEATURE(status, IVA); | ||
175 | OMAP3_CHECK_FEATURE(status, SGX); | ||
176 | OMAP3_CHECK_FEATURE(status, NEON); | ||
177 | OMAP3_CHECK_FEATURE(status, ISP); | ||
178 | |||
179 | /* | ||
180 | * TODO: Get additional info (where applicable) | ||
181 | * e.g. Size of L2 cache. | ||
182 | */ | ||
183 | } | ||
184 | |||
185 | void __init omap3_check_revision(void) | ||
159 | { | 186 | { |
160 | u32 cpuid, idcode; | 187 | u32 cpuid, idcode; |
161 | u16 hawkeye; | 188 | u16 hawkeye; |
@@ -212,6 +239,22 @@ out: | |||
212 | pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name); | 239 | pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name); |
213 | } | 240 | } |
214 | 241 | ||
242 | #define OMAP3_SHOW_FEATURE(feat) \ | ||
243 | if (omap3_has_ ##feat()) { \ | ||
244 | pr_info (" - "#feat" : Y"); \ | ||
245 | } else { \ | ||
246 | pr_info (" - "#feat" : N"); \ | ||
247 | } | ||
248 | |||
249 | void __init omap3_cpuinfo(void) | ||
250 | { | ||
251 | OMAP3_SHOW_FEATURE(l2cache); | ||
252 | OMAP3_SHOW_FEATURE(iva); | ||
253 | OMAP3_SHOW_FEATURE(sgx); | ||
254 | OMAP3_SHOW_FEATURE(neon); | ||
255 | OMAP3_SHOW_FEATURE(isp); | ||
256 | } | ||
257 | |||
215 | /* | 258 | /* |
216 | * Try to detect the exact revision of the omap we're running on | 259 | * Try to detect the exact revision of the omap we're running on |
217 | */ | 260 | */ |
@@ -223,8 +266,11 @@ void __init omap2_check_revision(void) | |||
223 | */ | 266 | */ |
224 | if (cpu_is_omap24xx()) | 267 | if (cpu_is_omap24xx()) |
225 | omap24xx_check_revision(); | 268 | omap24xx_check_revision(); |
226 | else if (cpu_is_omap34xx()) | 269 | else if (cpu_is_omap34xx()) { |
227 | omap34xx_check_revision(); | 270 | omap3_check_features(); |
271 | omap3_check_revision(); | ||
272 | omap3_cpuinfo(); | ||
273 | } | ||
228 | else if (cpu_is_omap44xx()) { | 274 | else if (cpu_is_omap44xx()) { |
229 | printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n"); | 275 | printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n"); |
230 | return; | 276 | return; |
diff --git a/arch/arm/plat-omap/include/plat/control.h b/arch/arm/plat-omap/include/plat/control.h index 8237cb9e74fd..79985e497c4e 100644 --- a/arch/arm/plat-omap/include/plat/control.h +++ b/arch/arm/plat-omap/include/plat/control.h | |||
@@ -254,6 +254,40 @@ | |||
254 | #define OMAP343X_SCRATCHPAD (OMAP343X_CTRL_BASE + 0x910) | 254 | #define OMAP343X_SCRATCHPAD (OMAP343X_CTRL_BASE + 0x910) |
255 | #define OMAP343X_SCRATCHPAD_ROM_OFFSET 0x19C | 255 | #define OMAP343X_SCRATCHPAD_ROM_OFFSET 0x19C |
256 | 256 | ||
257 | /* | ||
258 | * CONTROL OMAP STATUS register to identify OMAP3 features | ||
259 | */ | ||
260 | #define OMAP3_CONTROL_OMAP_STATUS 0x044c | ||
261 | |||
262 | #define OMAP3_SGX_SHIFT 13 | ||
263 | #define OMAP3_SGX_MASK (3 << OMAP3_SGX_SHIFT) | ||
264 | #define FEAT_SGX_FULL 0 | ||
265 | #define FEAT_SGX_HALF 1 | ||
266 | #define FEAT_SGX_NONE 2 | ||
267 | |||
268 | #define OMAP3_IVA_SHIFT 12 | ||
269 | #define OMAP3_IVA_MASK (1 << OMAP3_SGX_SHIFT) | ||
270 | #define FEAT_IVA 0 | ||
271 | #define FEAT_IVA_NONE 1 | ||
272 | |||
273 | #define OMAP3_L2CACHE_SHIFT 10 | ||
274 | #define OMAP3_L2CACHE_MASK (3 << OMAP3_L2CACHE_SHIFT) | ||
275 | #define FEAT_L2CACHE_NONE 0 | ||
276 | #define FEAT_L2CACHE_64KB 1 | ||
277 | #define FEAT_L2CACHE_128KB 2 | ||
278 | #define FEAT_L2CACHE_256KB 3 | ||
279 | |||
280 | #define OMAP3_ISP_SHIFT 5 | ||
281 | #define OMAP3_ISP_MASK (1<< OMAP3_ISP_SHIFT) | ||
282 | #define FEAT_ISP 0 | ||
283 | #define FEAT_ISP_NONE 1 | ||
284 | |||
285 | #define OMAP3_NEON_SHIFT 4 | ||
286 | #define OMAP3_NEON_MASK (1<< OMAP3_NEON_SHIFT) | ||
287 | #define FEAT_NEON 0 | ||
288 | #define FEAT_NEON_NONE 1 | ||
289 | |||
290 | |||
257 | #ifndef __ASSEMBLY__ | 291 | #ifndef __ASSEMBLY__ |
258 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ | 292 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ |
259 | defined(CONFIG_ARCH_OMAP4) | 293 | defined(CONFIG_ARCH_OMAP4) |
diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index f129efb3075e..431fec45bbbc 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h | |||
@@ -30,6 +30,8 @@ | |||
30 | #ifndef __ASM_ARCH_OMAP_CPU_H | 30 | #ifndef __ASM_ARCH_OMAP_CPU_H |
31 | #define __ASM_ARCH_OMAP_CPU_H | 31 | #define __ASM_ARCH_OMAP_CPU_H |
32 | 32 | ||
33 | #include <linux/bitops.h> | ||
34 | |||
33 | /* | 35 | /* |
34 | * Omap device type i.e. EMU/HS/TST/GP/BAD | 36 | * Omap device type i.e. EMU/HS/TST/GP/BAD |
35 | */ | 37 | */ |
@@ -423,4 +425,27 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
423 | int omap_chip_is(struct omap_chip_id oci); | 425 | int omap_chip_is(struct omap_chip_id oci); |
424 | void omap2_check_revision(void); | 426 | void omap2_check_revision(void); |
425 | 427 | ||
428 | /* | ||
429 | * Runtime detection of OMAP3 features | ||
430 | */ | ||
431 | extern u32 omap3_features; | ||
432 | |||
433 | #define OMAP3_HAS_L2CACHE BIT(0) | ||
434 | #define OMAP3_HAS_IVA BIT(1) | ||
435 | #define OMAP3_HAS_SGX BIT(2) | ||
436 | #define OMAP3_HAS_NEON BIT(3) | ||
437 | #define OMAP3_HAS_ISP BIT(4) | ||
438 | |||
439 | #define OMAP3_HAS_FEATURE(feat,flag) \ | ||
440 | static inline unsigned int omap3_has_ ##feat(void) \ | ||
441 | { \ | ||
442 | return (omap3_features & OMAP3_HAS_ ##flag); \ | ||
443 | } \ | ||
444 | |||
445 | OMAP3_HAS_FEATURE(l2cache, L2CACHE) | ||
446 | OMAP3_HAS_FEATURE(sgx, SGX) | ||
447 | OMAP3_HAS_FEATURE(iva, IVA) | ||
448 | OMAP3_HAS_FEATURE(neon, NEON) | ||
449 | OMAP3_HAS_FEATURE(isp, ISP) | ||
450 | |||
426 | #endif | 451 | #endif |