id.c revision 05574bb27a8a46d354582e72691ff6cb40712da9
11dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren/* 21dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * linux/arch/arm/mach-omap2/id.c 31dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * 41dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * OMAP2 CPU identification code 51dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * 61dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * Copyright (C) 2005 Nokia Corporation 71dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * Written by Tony Lindgren <tony@atomide.com> 81dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * 944169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar * Copyright (C) 2009 Texas Instruments 1044169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> 1144169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar * 121dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * This program is free software; you can redistribute it and/or modify 131dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * it under the terms of the GNU General Public License version 2 as 141dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * published by the Free Software Foundation. 151dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren */ 161dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 171dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/module.h> 181dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/kernel.h> 191dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/init.h> 20fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h> 211dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 220ba8b9b273c45dd23f60ff700e265a0069b33758Russell King#include <asm/cputype.h> 231dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 24ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/common.h> 25ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/control.h> 26ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/cpu.h> 2772d0f1c3cdc7c456e1e357359ec6f566d0a5f264Syed Mohammed Khasim 28097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleystatic struct omap_chip_id omap_chip; 2984a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenstatic unsigned int omap_revision; 3084a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen 318384ce071365244332ea05c81112bfffcf48be87Sanjeev Premiu32 omap3_features; 3284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen 3384a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenunsigned int omap_rev(void) 3484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen{ 3584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen return omap_revision; 3684a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen} 3784a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri LeukkunenEXPORT_SYMBOL(omap_rev); 38097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 39097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley/** 40097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * omap_chip_is - test whether currently running OMAP matches a chip type 41097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * @oc: omap_chip_t to test against 42097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * 43097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * Test whether the currently-running OMAP chip matches the supplied 44097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * chip type 'oc'. Returns 1 upon a match; 0 upon failure. 45097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley */ 46097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleyint omap_chip_is(struct omap_chip_id oci) 47097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley{ 48097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley return (oci.oc & omap_chip.oc) ? 1 : 0; 49097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley} 50097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul WalmsleyEXPORT_SYMBOL(omap_chip_is); 51097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 528e25ad964aac0bf6b30dd013303750089f819679Kevin Hilmanint omap_type(void) 538e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman{ 548e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman u32 val = 0; 558e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman 568e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman if (cpu_is_omap24xx()) 578e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS); 588e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman else if (cpu_is_omap34xx()) 598e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS); 608e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman else { 618e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman pr_err("Cannot detect omap type!\n"); 628e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman goto out; 638e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman } 648e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman 658e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman val &= OMAP2_DEVICETYPE_MASK; 668e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman val >>= 8; 678e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman 688e25ad964aac0bf6b30dd013303750089f819679Kevin Hilmanout: 698e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman return val; 708e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman} 718e25ad964aac0bf6b30dd013303750089f819679Kevin HilmanEXPORT_SYMBOL(omap_type); 728e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman 738e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman 74a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*----------------------------------------------------------------------------*/ 75097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 76a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_IDCODE 0x0204 77a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_0 0x0218 78a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_1 0x021C 79a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_2 0x0220 80a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_3 0x0224 81097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 82a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define read_tap_reg(reg) __raw_readl(tap_base + (reg)) 83097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 84a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstruct omap_id { 85a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u16 hawkeye; /* Silicon type (Hawkeye id) */ 86a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u8 dev; /* Device type from production_id reg */ 8784a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen u32 type; /* Combined type id copied to omap_revision */ 88a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren}; 89097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 90a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* Register values to detect the OMAP version */ 91a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic struct omap_id omap_ids[] __initdata = { 92a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren { .hawkeye = 0xb5d9, .dev = 0x0, .type = 0x24200024 }, 93a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren { .hawkeye = 0xb5d9, .dev = 0x1, .type = 0x24201024 }, 94a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren { .hawkeye = 0xb5d9, .dev = 0x2, .type = 0x24202024 }, 95a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren { .hawkeye = 0xb5d9, .dev = 0x4, .type = 0x24220024 }, 96a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren { .hawkeye = 0xb5d9, .dev = 0x8, .type = 0x24230024 }, 97a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren { .hawkeye = 0xb68a, .dev = 0x0, .type = 0x24300024 }, 98a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren}; 99097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 100a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic void __iomem *tap_base; 101a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic u16 tap_prod_id; 1021dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 1035ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap24xx_check_revision(void) 1041dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren{ 1051dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren int i, j; 106a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u32 idcode, prod_id; 1071dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren u16 hawkeye; 108a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u8 dev_type, rev; 1091dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 1101dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren idcode = read_tap_reg(OMAP_TAP_IDCODE); 1110e564848693b06b037ec05e68c9e4b266250789eTony Lindgren prod_id = read_tap_reg(tap_prod_id); 1121dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren hawkeye = (idcode >> 12) & 0xffff; 1131dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren rev = (idcode >> 28) & 0x0f; 1141dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren dev_type = (prod_id >> 16) & 0x0f; 1151dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 116097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_debug("OMAP_TAP_IDCODE 0x%08x REV %i HAWKEYE 0x%04x MANF %03x\n", 117097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley idcode, rev, hawkeye, (idcode >> 1) & 0x7ff); 118097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_debug("OMAP_TAP_DIE_ID_0: 0x%08x\n", 119097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley read_tap_reg(OMAP_TAP_DIE_ID_0)); 120097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_debug("OMAP_TAP_DIE_ID_1: 0x%08x DEV_REV: %i\n", 121097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley read_tap_reg(OMAP_TAP_DIE_ID_1), 122097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley (read_tap_reg(OMAP_TAP_DIE_ID_1) >> 28) & 0xf); 123097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_debug("OMAP_TAP_DIE_ID_2: 0x%08x\n", 124097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley read_tap_reg(OMAP_TAP_DIE_ID_2)); 125097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_debug("OMAP_TAP_DIE_ID_3: 0x%08x\n", 126097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley read_tap_reg(OMAP_TAP_DIE_ID_3)); 127097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_debug("OMAP_TAP_PROD_ID_0: 0x%08x DEV_TYPE: %i\n", 128097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley prod_id, dev_type); 129097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 1301dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren /* Check hawkeye ids */ 1311dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren for (i = 0; i < ARRAY_SIZE(omap_ids); i++) { 1321dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren if (hawkeye == omap_ids[i].hawkeye) 1331dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren break; 1341dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren } 1351dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 1361dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren if (i == ARRAY_SIZE(omap_ids)) { 1371dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren printk(KERN_ERR "Unknown OMAP CPU id\n"); 1381dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren return; 1391dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren } 1401dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 1411dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren for (j = i; j < ARRAY_SIZE(omap_ids); j++) { 1421dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren if (dev_type == omap_ids[j].dev) 1431dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren break; 1441dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren } 1451dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 1461dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren if (j == ARRAY_SIZE(omap_ids)) { 1471dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren printk(KERN_ERR "Unknown OMAP device type. " 1481dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren "Handling it as OMAP%04x\n", 1491dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren omap_ids[i].type >> 16); 1501dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren j = i; 1511dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren } 1521dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 15384a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen pr_info("OMAP%04x", omap_rev() >> 16); 15484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen if ((omap_rev() >> 8) & 0x0f) 15584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen pr_info("ES%x", (omap_rev() >> 12) & 0xf); 156097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley pr_info("\n"); 157a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren} 158a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren 1598384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi#define OMAP3_CHECK_FEATURE(status,feat) \ 1608384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi if (((status & OMAP3_ ##feat## _MASK) \ 1618384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi >> OMAP3_ ##feat## _SHIFT) != FEAT_ ##feat## _NONE) { \ 1628384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi omap3_features |= OMAP3_HAS_ ##feat; \ 1638384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi } 1648384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 1658384ce071365244332ea05c81112bfffcf48be87Sanjeev Premivoid __init omap3_check_features(void) 1668384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{ 1678384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi u32 status; 1688384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 1698384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi omap3_features = 0; 1708384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 1718384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS); 1728384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 1738384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_CHECK_FEATURE(status, L2CACHE); 1748384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_CHECK_FEATURE(status, IVA); 1758384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_CHECK_FEATURE(status, SGX); 1768384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_CHECK_FEATURE(status, NEON); 1778384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_CHECK_FEATURE(status, ISP); 1788384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 1798384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi /* 1808384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi * TODO: Get additional info (where applicable) 1818384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi * e.g. Size of L2 cache. 1828384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi */ 1838384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi} 1848384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 1858384ce071365244332ea05c81112bfffcf48be87Sanjeev Premivoid __init omap3_check_revision(void) 186a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren{ 187a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u32 cpuid, idcode; 188a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u16 hawkeye; 189a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren u8 rev; 190a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren 191a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* 192a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * We cannot access revision registers on ES1.0. 193a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * If the processor type is Cortex-A8 and the revision is 0x0 194a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * it means its Cortex r0p0 which is 3430 ES1.0. 195a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 196a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren cpuid = read_cpuid(CPUID_ID); 197a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { 19884a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen omap_revision = OMAP3430_REV_ES1_0; 199048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi return; 200a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } 201a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren 202a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* 203a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Detection for 34xx ES2.0 and above can be done with just 204a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * hawkeye and rev. See TRM 1.5.2 Device Identification. 205a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Note that rev does not map directly to our defined processor 206a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * revision numbers as ES1.0 uses value 0. 207a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 208a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren idcode = read_tap_reg(OMAP_TAP_IDCODE); 209a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren hawkeye = (idcode >> 12) & 0xffff; 210a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren rev = (idcode >> 28) & 0xff; 211097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley 2122456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon switch (hawkeye) { 2132456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon case 0xb7ae: 2142456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon /* Handle 34xx/35xx devices */ 215a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren switch (rev) { 216048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case 0: /* Take care of early samples */ 217048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case 1: 21884a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen omap_revision = OMAP3430_REV_ES2_0; 219a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren break; 220a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren case 2: 22184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen omap_revision = OMAP3430_REV_ES2_1; 222a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren break; 223a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren case 3: 22484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen omap_revision = OMAP3430_REV_ES3_0; 225a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren break; 226187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren case 4: 227187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren omap_revision = OMAP3430_REV_ES3_1; 228187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren break; 229a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren default: 230a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* Use the latest known revision as default */ 231187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren omap_revision = OMAP3430_REV_ES3_1; 232a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } 2332456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon break; 2342456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon case 0xb891: 2352456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon /* Handle 36xx devices */ 2362456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon switch (rev) { 2372456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon case 0: 2382456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon omap_revision = OMAP3630_REV_ES1_0; 2392456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon break; 2402456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon default: 2412456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon /* Use the latest known revision as default */ 2422456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon omap_revision = OMAP3630_REV_ES1_0; 2432456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon } 2442456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon break; 2454cac60180649b83e094d4ea5c440229814488431Sanjeev Premi case 0xb868: 2464cac60180649b83e094d4ea5c440229814488431Sanjeev Premi /* Handle OMAP35xx/AM35xx devices 2474cac60180649b83e094d4ea5c440229814488431Sanjeev Premi * 2484cac60180649b83e094d4ea5c440229814488431Sanjeev Premi * Set the device to be OMAP3505 here. Actual device 2494cac60180649b83e094d4ea5c440229814488431Sanjeev Premi * is identified later based on the features. 2504cac60180649b83e094d4ea5c440229814488431Sanjeev Premi */ 2514cac60180649b83e094d4ea5c440229814488431Sanjeev Premi omap_revision = OMAP3505_REV(rev); 2524cac60180649b83e094d4ea5c440229814488431Sanjeev Premi break; 2532456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon default: 2542456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon /* Unknown default to latest silicon rev as default*/ 2552456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon omap_revision = OMAP3630_REV_ES1_0; 256a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } 2571dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren} 2581dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 2598384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi#define OMAP3_SHOW_FEATURE(feat) \ 2608384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi if (omap3_has_ ##feat()) { \ 2618384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi pr_info (" - "#feat" : Y"); \ 2628384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi } else { \ 2638384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi pr_info (" - "#feat" : N"); \ 2648384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi } 2658384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 2668384ce071365244332ea05c81112bfffcf48be87Sanjeev Premivoid __init omap3_cpuinfo(void) 2678384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{ 268048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi u8 rev = GET_OMAP_REVISION(); 269048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi char cpu_name[16], cpu_rev[16]; 270048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 271048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi /* OMAP3430 and OMAP3530 are assumed to be same. 272048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * 273048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * OMAP3525, OMAP3515 and OMAP3503 can be detected only based 274048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * on available features. Upon detection, update the CPU id 275048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * and CPU class bits. 276048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi */ 2772456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon if (cpu_is_omap3630()) 2784cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "OMAP3630"); 2794cac60180649b83e094d4ea5c440229814488431Sanjeev Premi else if (cpu_is_omap3505()) { 2804cac60180649b83e094d4ea5c440229814488431Sanjeev Premi /* 2814cac60180649b83e094d4ea5c440229814488431Sanjeev Premi * AM35xx devices 2824cac60180649b83e094d4ea5c440229814488431Sanjeev Premi */ 2834cac60180649b83e094d4ea5c440229814488431Sanjeev Premi if (omap3_has_sgx()) { 2844cac60180649b83e094d4ea5c440229814488431Sanjeev Premi omap_revision = OMAP3517_REV(rev); 2854cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "AM3517"); 2864cac60180649b83e094d4ea5c440229814488431Sanjeev Premi } 2874cac60180649b83e094d4ea5c440229814488431Sanjeev Premi else { 2884cac60180649b83e094d4ea5c440229814488431Sanjeev Premi /* Already set in omap3_check_revision() */ 2894cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "AM3505"); 2904cac60180649b83e094d4ea5c440229814488431Sanjeev Premi } 2914cac60180649b83e094d4ea5c440229814488431Sanjeev Premi } 2924cac60180649b83e094d4ea5c440229814488431Sanjeev Premi /* 2934cac60180649b83e094d4ea5c440229814488431Sanjeev Premi * OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices 2944cac60180649b83e094d4ea5c440229814488431Sanjeev Premi */ 2952456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon else if (omap3_has_iva() && omap3_has_sgx()) 2964cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "OMAP3430/3530"); 297048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi else if (omap3_has_sgx()) { 298048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi omap_revision = OMAP3525_REV(rev); 2994cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "OMAP3525"); 300048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi } 301048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi else if (omap3_has_iva()) { 302048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi omap_revision = OMAP3515_REV(rev); 3034cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "OMAP3515"); 304048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi } 305048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi else { 306048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi omap_revision = OMAP3503_REV(rev); 3074cac60180649b83e094d4ea5c440229814488431Sanjeev Premi strcpy(cpu_name, "OMAP3503"); 308048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi } 309048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 310048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi switch (rev) { 311048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case OMAP_REVBITS_00: 312048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi strcpy(cpu_rev, "1.0"); 313048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi break; 314048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case OMAP_REVBITS_10: 315048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi strcpy(cpu_rev, "2.0"); 316048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi break; 317048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case OMAP_REVBITS_20: 318048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi strcpy(cpu_rev, "2.1"); 319048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi break; 320048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case OMAP_REVBITS_30: 321048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi strcpy(cpu_rev, "3.0"); 322048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi break; 323048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi case OMAP_REVBITS_40: 324048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi strcpy(cpu_rev, "3.1"); 325048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi break; 326048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi default: 327048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi /* Use the latest known revision as default */ 328048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi strcpy(cpu_rev, "3.1"); 329048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi } 330048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 331048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi /* 332048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * Print verbose information 333048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi */ 3344cac60180649b83e094d4ea5c440229814488431Sanjeev Premi pr_info("%s ES%s\n", cpu_name, cpu_rev); 335048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 3368384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(l2cache); 3378384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(iva); 3388384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(sgx); 3398384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(neon); 3408384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(isp); 3418384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi} 3428384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 343a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* 344a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Try to detect the exact revision of the omap we're running on 345a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 3465ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap2_check_revision(void) 3475ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren{ 348a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* 349a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * At this point we have an idea about the processor revision set 350a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * earlier with omap2_set_globals_tap(). 351a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 352a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren if (cpu_is_omap24xx()) 353a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap24xx_check_revision(); 3548384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi else if (cpu_is_omap34xx()) { 3558384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi omap3_check_revision(); 35605574bb27a8a46d354582e72691ff6cb40712da9Nishanth Menon omap3_check_features(); 3578384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi omap3_cpuinfo(); 3588384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi } 35944169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar else if (cpu_is_omap44xx()) { 36044169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n"); 36144169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar return; 36244169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar } else 363a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren pr_err("OMAP revision unknown, please fix!\n"); 364a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren 365a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* 366a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * OK, now we know the exact revision. Initialize omap_chip bits 367a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * for powerdowmain and clockdomain code. 368a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 369a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren if (cpu_is_omap243x()) { 370a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* Currently only supports 2430ES2.1 and 2430-all */ 371a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap_chip.oc |= CHIP_IS_OMAP2430; 372a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } else if (cpu_is_omap242x()) { 373a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* Currently only supports 2420ES2.1.1 and 2420-all */ 374a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap_chip.oc |= CHIP_IS_OMAP2420; 37556190b609b9c011363dd761838ce01cd3cd0a24fRanjith Lohithakshan } else if (cpu_is_omap3505() || cpu_is_omap3517()) { 37656190b609b9c011363dd761838ce01cd3cd0a24fRanjith Lohithakshan omap_chip.oc = CHIP_IS_OMAP3430 | CHIP_IS_OMAP3430ES3_1; 377a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } else if (cpu_is_omap343x()) { 378a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap_chip.oc = CHIP_IS_OMAP3430; 37984a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen if (omap_rev() == OMAP3430_REV_ES1_0) 380a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap_chip.oc |= CHIP_IS_OMAP3430ES1; 381d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley else if (omap_rev() >= OMAP3430_REV_ES2_0 && 382d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley omap_rev() <= OMAP3430_REV_ES2_1) 383a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap_chip.oc |= CHIP_IS_OMAP3430ES2; 384d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley else if (omap_rev() == OMAP3430_REV_ES3_0) 385d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley omap_chip.oc |= CHIP_IS_OMAP3430ES3_0; 386d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley else if (omap_rev() == OMAP3430_REV_ES3_1) 387d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; 388f18af0a847f9e1a843bcb8ba69697ccbba2d03e9vikram pandita else if (omap_rev() == OMAP3630_REV_ES1_0) 389f18af0a847f9e1a843bcb8ba69697ccbba2d03e9vikram pandita omap_chip.oc |= CHIP_IS_OMAP3630ES1; 390a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } else { 391a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren pr_err("Uninitialized omap_chip, please fix!\n"); 392a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } 3935ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren} 3945ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren 395a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* 396a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Set up things for map_io and processor detection later on. Gets called 397a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * pretty much first thing from board init. For multi-omap, this gets 398a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to 399a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * detect the exact revision later on in omap2_detect_revision() once map_io 400a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * is done. 401a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 4020e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenvoid __init omap2_set_globals_tap(struct omap_globals *omap2_globals) 4030e564848693b06b037ec05e68c9e4b266250789eTony Lindgren{ 40484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen omap_revision = omap2_globals->class; 4050e564848693b06b037ec05e68c9e4b266250789eTony Lindgren tap_base = omap2_globals->tap; 4060e564848693b06b037ec05e68c9e4b266250789eTony Lindgren 407a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren if (cpu_is_omap34xx()) 4080e564848693b06b037ec05e68c9e4b266250789eTony Lindgren tap_prod_id = 0x0210; 4090e564848693b06b037ec05e68c9e4b266250789eTony Lindgren else 4100e564848693b06b037ec05e68c9e4b266250789eTony Lindgren tap_prod_id = 0x0208; 4110e564848693b06b037ec05e68c9e4b266250789eTony Lindgren} 412