Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
Hi, * Premi, Sanjeev pr...@ti.com [090810 20:15]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Friday, August 07, 2009 1:53 PM To: Kevin Hilman Cc: Premi, Sanjeev; linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x snip--snip Adding conditionals like if (omap3_has_iva2()) ... and if (omap3_has_sgx()) ... rather than having a long list of cpu_is checks that have to be changed each time a new SoC comes out. Agreed. Tony Tony, Kevin, Here is a work in progress patch implementing the conditionals. I am looking for your suggestions on these: 1) The detection of ES2.0 is different between OMAP3530 and OMAP3430. For 3430 ES2.0, (idcode 28) == 0x0 For 3530 ES2.0, (idcode 28) == 0x1 What can be easy way to make this distinction? Hmm, looks like in switch (rev) case 1 is not used, so I guess you can use that? Hmm, might be worth checking if the 3530 ES2.0 is really based on the 3430 ES2.1 core though.. 2) How do we handle the power domain differences between OMAP34x and the new OMAP3517 and OMAP05 devices. The hawkeye is different, but, would it make sense to omap_revision to be like: 0x34050034, 0x34170034 - when we reuse the 34xx class. Can't you use the bits documented in cpu.h: /* * omap_rev bits: * CPU id bits (0730, 1510, 1710, 2422...) [31:16] * CPU revision (See _REV_ defined in cpu.h)[15:08] * CPU class bits (15xx, 16xx, 24xx, 34xx...) [07:00] */ unsigned int omap_rev(void); Basically 0x3505??34, 0x3517??34 and so on? The cpu_is_omap34xx() is omap_rev() 0xff. 3) Currently, the macros like OMAP3430_REV_ES1_0 are defined to be whole numbers. I am trying to change them to something like: #define OMAP34XX_REV(type,rev) (OMAP34XX_CLASS (type 16) (rev 12)) And use as (if needed): #define OMAP3430_REV_ES3_1 OMAP34XX_REV(0x30, 0x4) #define OMAP3403_REV_ES3_1 OMAP34XX_REV(0x03, 0x4) What is your view? In fact, wouldn't it be better if we tested for si rev independent from si type? Well cpu_is_omap34xx() should be enough in most places, but I guess here you'd want to test for the exact revision, and just define: #define OMAP3505_REV_ES?_? 0x3505??34 4) These macros are, possibly, duplicating the data in omap_revision: #define CHIP_IS_OMAP3430ES3_0 (1 5) #define CHIP_IS_OMAP3430ES3_1 (1 6) But, might be used for faster checking. Is this duplication necessary? These are currently needed for the clock framework, eventually we should unify them.. 5) Assuming that we are able to maintain current, macros, would this help in reducing the duplication? struct omap_id { u16 id; /* e.g. 0x3430, 0x3517, ... */ u8 class; /* 34x */ u8 subclass; /* 0x30, 0x03, 0x05, 0x15, 0x17 ... */ u8 rev;/* 0x10 (for ES 1.0), 0x21 (for ES2.1) etc. */ /* use nibble as decimal separator */ } Yeah we could do something like that as a separate patch eventually. Few more comments inlined below. I have tried many approaches, before sending this mail, so there might be few duplications in the code below. The cpu_is_35xx() macros are also incomplete for now. Best regards, Sanjeev diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..f17d4db 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -25,9 +25,47 @@ #include mach/control.h #include mach/cpu.h +#define OMAP3_CONTROL_OMAP_STATUS0x044c + +#define OMAP3_SGX_SHIFT 13 +#define OMAP3_SGX_MASK (3 OMAP3_SGX_SHIFT) +#define FEAT_SGX_FULL 0 +#define FEAT_SGX_HALF 1 +#define FEAT_SGX_NONE 2 + +#define OMAP3_IVA_SHIFT 12 +#define OMAP3_IVA_MASK (1 OMAP3_SGX_SHIFT) +#define FEAT_IVA0 +#define FEAT_IVA_NONE 1 + +#define OMAP3_L2CACHE_SHIFT 10 +#define OMAP3_L2CACHE_MASK (3 OMAP3_L2CACHE_SHIFT) +#define FEAT_L2CACHE_0KB0 +#define FEAT_L2CACHE_64KB 1 +#define FEAT_L2CACHE_128KB 2 +#define FEAT_L2CACHE_256KB 3 + +#define OMAP3_ISP_SHIFT 5 +#define OMAP3_ISP_MASK (1 OMAP3_ISP_SHIFT) +#define FEAT_ISP0 +#define FEAT_ISP_NONE 1 + +#define OMAP3_NEON_SHIFT 4 +#define OMAP3_NEON_MASK (1 OMAP3_NEON_SHIFT) +#define FEAT_NEON 0 +#define FEAT_NEON_NONE 1 + static struct omap_chip_id omap_chip; static
RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
-Original Message- From: linux-omap-ow...@vger.kernel.org [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Premi, Sanjeev Sent: Tuesday, August 11, 2009 5:22 PM To: Tony Lindgren Cc: Kevin Hilman; linux-omap@vger.kernel.org Subject: RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Tuesday, August 11, 2009 1:33 PM To: Premi, Sanjeev Cc: Kevin Hilman; linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x Hi, * Premi, Sanjeev pr...@ti.com [090810 20:15]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Friday, August 07, 2009 1:53 PM To: Kevin Hilman Cc: Premi, Sanjeev; linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x snip--snip Adding conditionals like if (omap3_has_iva2()) ... and if (omap3_has_sgx()) ... rather than having a long list of cpu_is checks that have to be changed each time a new SoC comes out. Agreed. Tony Tony, Kevin, Here is a work in progress patch implementing the conditionals. I am looking for your suggestions on these: 1) The detection of ES2.0 is different between OMAP3530 and OMAP3430. For 3430 ES2.0, (idcode 28) == 0x0 For 3530 ES2.0, (idcode 28) == 0x1 What can be easy way to make this distinction? Hmm, looks like in switch (rev) case 1 is not used, so I guess you can use that? Hmm, might be worth checking if the 3530 ES2.0 is really based on the 3430 ES2.1 core though.. [sp] Yes, it is. 2) How do we handle the power domain differences between OMAP34x and the new OMAP3517 and OMAP05 devices. The hawkeye is different, but, would it make sense to omap_revision to be like: 0x34050034, 0x34170034 - when we reuse the 34xx class. Can't you use the bits documented in cpu.h: [sp] I was trying to use these bit only; but was trying to avoid multiple declarations for each silicon rev like this: #define OMAP3430_REV_ES1_00x34300034 #define OMAP3430_REV_ES2_00x34301034 #define OMAP3430_REV_ES2_10x34302034 #define OMAP3430_REV_ES3_00x34303034 #define OMAP3430_REV_ES3_10x34304034 In my earlier patches, I had tried using masks for the ES revision; but the current code uses these values in direct assignment. omap_revision = OMAP3430_REV_ES3_1; If we could use a mask for omap_revision bits, I believe we won't need to multiple definitions for each si revision for all the variants - 3505, 3517, and so on. /* * omap_rev bits: * CPU id bits (0730, 1510, 1710, 2422...) [31:16] * CPU revision (See _REV_ defined in cpu.h)[15:08] * CPU class bits (15xx, 16xx, 24xx, 34xx...) [07:00] */ unsigned int omap_rev(void); Basically 0x3505??34, 0x3517??34 and so on? The cpu_is_omap34xx() is omap_rev() 0xff. 3) Currently, the macros like OMAP3430_REV_ES1_0 are defined to be whole numbers. I am trying to change them to something like: #define OMAP34XX_REV(type,rev) (OMAP34XX_CLASS (type 16) (rev 12)) And use as (if needed): #define OMAP3430_REV_ES3_1 OMAP34XX_REV(0x30, 0x4) #define OMAP3403_REV_ES3_1 OMAP34XX_REV(0x03, 0x4) What is your view? In fact, wouldn't it be better if we tested for si rev independent from si type? Well cpu_is_omap34xx() should be enough in most places, but I guess here you'd want to test for the exact revision, and just define: #define OMAP3505_REV_ES?_? 0x3505??34 [sp] This is the multiplicity on definitions I am trying to avoid as same revision will be valid across OMAP3505 and OMAP3517 in this case. Holds good even for 3503, 3515, 3525 and 3530. 4) These macros are, possibly, duplicating the data in omap_revision: #define CHIP_IS_OMAP3430ES3_0 (1 5) #define CHIP_IS_OMAP3430ES3_1 (1 6) But, might be used for faster checking. Is this duplication necessary? These are currently needed for the clock framework, eventually we should unify them.. 5) Assuming that we are able to maintain current, macros, would this help in reducing the duplication? struct omap_id { u16 id; /* e.g. 0x3430, 0x3517, ... */ u8 class; /* 34x */ u8 subclass; /* 0x30, 0x03, 0x05, 0x15, 0x17 ... */ u8 rev;/* 0x10 (for ES 1.0), 0x21 (for ES2.1) etc. */ /* use nibble as decimal separator */ } Yeah we could do something like that as a separate patch eventually. Few more comments inlined below. I have tried many approaches, before sending this mail
RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
-Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Friday, August 07, 2009 1:53 PM To: Kevin Hilman Cc: Premi, Sanjeev; linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x snip--snip Adding conditionals like if (omap3_has_iva2()) ... and if (omap3_has_sgx()) ... rather than having a long list of cpu_is checks that have to be changed each time a new SoC comes out. Agreed. Tony Tony, Kevin, Here is a work in progress patch implementing the conditionals. I am looking for your suggestions on these: 1) The detection of ES2.0 is different between OMAP3530 and OMAP3430. For 3430 ES2.0, (idcode 28) == 0x0 For 3530 ES2.0, (idcode 28) == 0x1 What can be easy way to make this distinction? 2) How do we handle the power domain differences between OMAP34x and the new OMAP3517 and OMAP05 devices. The hawkeye is different, but, would it make sense to omap_revision to be like: 0x34050034, 0x34170034 - when we reuse the 34xx class. 3) Currently, the macros like OMAP3430_REV_ES1_0 are defined to be whole numbers. I am trying to change them to something like: #define OMAP34XX_REV(type,rev) (OMAP34XX_CLASS (type 16) (rev 12)) And use as (if needed): #define OMAP3430_REV_ES3_1 OMAP34XX_REV(0x30, 0x4) #define OMAP3403_REV_ES3_1 OMAP34XX_REV(0x03, 0x4) What is your view? In fact, wouldn't it be better if we tested for si rev independent from si type? 4) These macros are, possibly, duplicating the data in omap_revision: #define CHIP_IS_OMAP3430ES3_0 (1 5) #define CHIP_IS_OMAP3430ES3_1 (1 6) But, might be used for faster checking. Is this duplication necessary? 5) Assuming that we are able to maintain current, macros, would this help in reducing the duplication? struct omap_id { u16 id; /* e.g. 0x3430, 0x3517, ... */ u8 class; /* 34x */ u8 subclass; /* 0x30, 0x03, 0x05, 0x15, 0x17 ... */ u8 rev;/* 0x10 (for ES 1.0), 0x21 (for ES2.1) etc. */ /* use nibble as decimal separator */ } I have tried many approaches, before sending this mail, so there might be few duplications in the code below. The cpu_is_35xx() macros are also incomplete for now. Best regards, Sanjeev diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..f17d4db 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -25,9 +25,47 @@ #include mach/control.h #include mach/cpu.h +#define OMAP3_CONTROL_OMAP_STATUS 0x044c + +#define OMAP3_SGX_SHIFT13 +#define OMAP3_SGX_MASK (3 OMAP3_SGX_SHIFT) +#defineFEAT_SGX_FULL 0 +#defineFEAT_SGX_HALF 1 +#defineFEAT_SGX_NONE 2 + +#define OMAP3_IVA_SHIFT12 +#define OMAP3_IVA_MASK (1 OMAP3_SGX_SHIFT) +#defineFEAT_IVA0 +#defineFEAT_IVA_NONE 1 + +#define OMAP3_L2CACHE_SHIFT10 +#define OMAP3_L2CACHE_MASK (3 OMAP3_L2CACHE_SHIFT) +#defineFEAT_L2CACHE_0KB0 +#defineFEAT_L2CACHE_64KB 1 +#defineFEAT_L2CACHE_128KB 2 +#defineFEAT_L2CACHE_256KB 3 + +#define OMAP3_ISP_SHIFT5 +#define OMAP3_ISP_MASK (1 OMAP3_ISP_SHIFT) +#defineFEAT_ISP0 +#defineFEAT_ISP_NONE 1 + +#define OMAP3_NEON_SHIFT 4 +#define OMAP3_NEON_MASK(1 OMAP3_NEON_SHIFT) +#defineFEAT_NEON 0 +#defineFEAT_NEON_NONE 1 + static struct omap_chip_id omap_chip; static unsigned int omap_revision; +struct omap_feature { + u8 avail; + u32 attrib; +}; + +static struct omap_feature feat_sgx; +static struct omap_feature feat_iva; +static struct omap_feature feat_l2cache; unsigned int omap_rev(void) { @@ -35,6 +73,24 @@ unsigned int omap_rev(void) } EXPORT_SYMBOL(omap_rev); +unsigned int omap3_has_sgx(void) +{ + return feat_sgx.avail; +} +EXPORT_SYMBOL(omap3_has_sgx); + +unsigned int omap3_has_iva(void) +{ + return feat_iva.avail; +} +EXPORT_SYMBOL(omap3_has_iva); + +unsigned int omap3_has_l2cache(void) +{ + return feat_l2cache.avail; +} +EXPORT_SYMBOL(omap3_has_l2cache); + /** * omap_chip_is - test whether currently running OMAP matches a chip type * @oc: omap_chip_t to test against @@ -155,12 +211,32 @@ void __init omap24xx_check_revision(void) pr_info(\n); } -void __init omap34xx_check_revision(void) +void __init omap3_check_features(void) +{ + u32 status; + + status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS); + + /* Check for SGX
Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
* Kevin Hilman khil...@deeprootsystems.com [090806 17:56]: Premi, Sanjeev pr...@ti.com writes: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 5:20 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x * Premi, Sanjeev pr...@ti.com [090806 14:34]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 4:34 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x Hi, * Sanjeev Premi pr...@ti.com [090806 13:36]: Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G1 0x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G2 0x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ +switch (rev) { +case 0: +omap_revision = OMAP3430_REV_ES2_0; +strcat(rev_name, ES2.0); +break; +case 2: +omap_revision = OMAP3430_REV_ES2_1; +strcat(rev_name, ES2.1); +break; +case 3: +omap_revision = OMAP3430_REV_ES3_0; +strcat(rev_name, ES3.0); +break; +case 4: +omap_revision = OMAP3430_REV_ES3_1; +strcat(rev_name, ES3.1); +break; +default: +/* Use the latest known revision as default */ +omap_revision = OMAP3430_REV_ES3_1; +strcat(rev_name, Unknown revision); +} +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ +omap_revision = OMAP35XX_CLASS ; + +if (gen == OMAP35XX_G1) { +switch (rev) { +case 0: /* Take care of some older boards */ +case 1: +omap_revision |= OMAP35XX_MASK_ES2_0; +strcat(rev_name, ES2.0); +break; +case 2: +omap_revision |= OMAP35XX_MASK_ES2_1; +strcat(rev_name, ES2.1); +break; +case 3: +omap_revision |= OMAP35XX_MASK_ES3_0; +strcat(rev_name, ES3.0); +break; +case 4: +omap_revision |= OMAP35XX_MASK_ES3_1; +strcat(rev_name, ES3.1); +break; +default: +/* Use the latest known revision as default */ +omap_revision |= OMAP35XX_MASK_ES3_0; +strcat(rev_name, Unknown revision); +} +} else { +strcat(rev_name, ES1.0); +} +} + To me it looks like you're checking the exact same cores as we already do for 34xx. That is, (idcode 28) 0xff for both 34xx and 35xx. So basically they have the same omap cores. No, the cores in OMAP3505 and OMAP3517 are very different. I have listed major differences in PATCH 2/6. These devices differ in following areas: - Power management capabilities (Only 1 power domain, 1 OPP, etc.) - EMIF4 instead of SDRC - Support for DDR2 - EMAC - USB
[PATCH 3/6] OMAP3: Add runtime check for OMAP35x
Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G10x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G20x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ + switch (rev) { + case 0: + omap_revision = OMAP3430_REV_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision = OMAP3430_REV_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision = OMAP3430_REV_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, Unknown revision); + } +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ + omap_revision = OMAP35XX_CLASS ; + + if (gen == OMAP35XX_G1) { + switch (rev) { + case 0: /* Take care of some older boards */ + case 1: + omap_revision |= OMAP35XX_MASK_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision |= OMAP35XX_MASK_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision |= OMAP35XX_MASK_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, Unknown revision); + } + } else { + strcat(rev_name, ES1.0); + } +} + void __init omap34xx_check_revision(void) { u32 cpuid, idcode; u16 hawkeye; u8 rev; - char *rev_name = ES1.0; + char rev_name[16] = ; /* * We cannot access revision registers on ES1.0. @@ -184,28 +251,12 @@ void __init omap34xx_check_revision(void) rev = (idcode 28) 0xff; if (hawkeye == 0xb7ae) { - switch (rev) { - case 0: - omap_revision = OMAP3430_REV_ES2_0; - rev_name = ES2.0; - break; - case 2: - omap_revision = OMAP3430_REV_ES2_1; - rev_name = ES2.1; - break; - case 3: - omap_revision = OMAP3430_REV_ES3_0; - rev_name = ES3.0; - break; - case 4: - omap_revision = OMAP3430_REV_ES3_1; - rev_name = ES3.1; - break; - default: - /* Use the latest known revision as default */ - omap_revision = OMAP3430_REV_ES3_1; - rev_name = Unknown revision\n; - } + if (cpu_is_omap35xx()) + omap35xx_set_revision(rev, OMAP35XX_G1, rev_name); + else + omap34xx_set_revision(rev, rev_name); + } else if (hawkeye == 0xb868) { + omap35xx_set_revision(rev, OMAP35XX_G2, rev_name); } out: @@ -241,6
Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
Hi, * Sanjeev Premi pr...@ti.com [090806 13:36]: Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G1 0x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G2 0x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ + switch (rev) { + case 0: + omap_revision = OMAP3430_REV_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision = OMAP3430_REV_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision = OMAP3430_REV_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, Unknown revision); + } +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ + omap_revision = OMAP35XX_CLASS ; + + if (gen == OMAP35XX_G1) { + switch (rev) { + case 0: /* Take care of some older boards */ + case 1: + omap_revision |= OMAP35XX_MASK_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision |= OMAP35XX_MASK_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision |= OMAP35XX_MASK_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, Unknown revision); + } + } else { + strcat(rev_name, ES1.0); + } +} + To me it looks like you're checking the exact same cores as we already do for 34xx. That is, (idcode 28) 0xff for both 34xx and 35xx. So basically they have the same omap cores. Considering this I don't see much sense adding cpu_is_35xx() category because cpu_is_34xx() already covers these processors. Just like cpu_is_16xx() covers both 1610 and 1710. Let's just rather add more feature tests for IVA2 etc as needed, then cpu_is_35something() becomse just cpu_is_34xx() cpu_has_iva2() or similar. void __init omap34xx_check_revision(void) { u32 cpuid, idcode; u16 hawkeye; u8 rev; - char *rev_name = ES1.0; + char rev_name[16] = ; /* * We cannot access revision registers on ES1.0. @@ -184,28 +251,12 @@ void __init omap34xx_check_revision(void) rev = (idcode 28) 0xff; if (hawkeye == 0xb7ae) { - switch (rev) { - case 0: - omap_revision = OMAP3430_REV_ES2_0; - rev_name = ES2.0; - break; - case 2: - omap_revision = OMAP3430_REV_ES2_1; - rev_name = ES2.1; - break; - case 3: - omap_revision = OMAP3430_REV_ES3_0; - rev_name = ES3.0; - break; - case 4: - omap_revision = OMAP3430_REV_ES3_1; - rev_name = ES3.1; - break; - default: -
RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
-Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 4:34 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x Hi, * Sanjeev Premi pr...@ti.com [090806 13:36]: Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G10x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G20x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ + switch (rev) { + case 0: + omap_revision = OMAP3430_REV_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision = OMAP3430_REV_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision = OMAP3430_REV_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, Unknown revision); + } +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ + omap_revision = OMAP35XX_CLASS ; + + if (gen == OMAP35XX_G1) { + switch (rev) { + case 0: /* Take care of some older boards */ + case 1: + omap_revision |= OMAP35XX_MASK_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision |= OMAP35XX_MASK_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision |= OMAP35XX_MASK_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, Unknown revision); + } + } else { + strcat(rev_name, ES1.0); + } +} + To me it looks like you're checking the exact same cores as we already do for 34xx. That is, (idcode 28) 0xff for both 34xx and 35xx. So basically they have the same omap cores. No, the cores in OMAP3505 and OMAP3517 are very different. I have listed major differences in PATCH 2/6. These devices differ in following areas: - Power management capabilities (Only 1 power domain, 1 OPP, etc.) - EMIF4 instead of SDRC - Support for DDR2 - EMAC - USB - HECC Considering this I don't see much sense adding cpu_is_35xx() category because cpu_is_34xx() already covers these processors. Just like cpu_is_16xx() covers both 1610 and 1710. Let's just rather add more feature tests for IVA2 etc as needed, then cpu_is_35something() becomse just cpu_is_34xx() cpu_has_iva2() or similar. I did feel the need for these tests as well, and have an internal patch. It was in my queue for submission next. void __init omap34xx_check_revision(void) { u32 cpuid, idcode; u16 hawkeye; u8 rev; - char *rev_name = ES1.0; + char rev_name[16] = ; /* * We cannot access revision registers on ES1.0. @@ -184,28 +251,12 @@ void __init omap34xx_check_revision(void) rev = (idcode 28) 0xff; if (hawkeye == 0xb7ae
RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
-Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 5:20 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x * Premi, Sanjeev pr...@ti.com [090806 14:34]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 4:34 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x Hi, * Sanjeev Premi pr...@ti.com [090806 13:36]: Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G10x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G20x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ + switch (rev) { + case 0: + omap_revision = OMAP3430_REV_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision = OMAP3430_REV_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision = OMAP3430_REV_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, Unknown revision); + } +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ + omap_revision = OMAP35XX_CLASS ; + + if (gen == OMAP35XX_G1) { + switch (rev) { + case 0: /* Take care of some older boards */ + case 1: + omap_revision |= OMAP35XX_MASK_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision |= OMAP35XX_MASK_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision |= OMAP35XX_MASK_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, Unknown revision); + } + } else { + strcat(rev_name, ES1.0); + } +} + To me it looks like you're checking the exact same cores as we already do for 34xx. That is, (idcode 28) 0xff for both 34xx and 35xx. So basically they have the same omap cores. No, the cores in OMAP3505 and OMAP3517 are very different. I have listed major differences in PATCH 2/6. These devices differ in following areas: - Power management capabilities (Only 1 power domain, 1 OPP, etc.) - EMIF4 instead of SDRC - Support for DDR2 - EMAC - USB - HECC Sure, but from compiler flags and io point of view they can still
Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
* Premi, Sanjeev pr...@ti.com [090806 17:11]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 5:20 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x * Premi, Sanjeev pr...@ti.com [090806 14:34]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 4:34 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x Hi, * Sanjeev Premi pr...@ti.com [090806 13:36]: Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G1 0x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G2 0x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ + switch (rev) { + case 0: + omap_revision = OMAP3430_REV_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision = OMAP3430_REV_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision = OMAP3430_REV_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, Unknown revision); + } +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ + omap_revision = OMAP35XX_CLASS ; + + if (gen == OMAP35XX_G1) { + switch (rev) { + case 0: /* Take care of some older boards */ + case 1: + omap_revision |= OMAP35XX_MASK_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision |= OMAP35XX_MASK_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision |= OMAP35XX_MASK_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, Unknown revision); + } + } else { + strcat(rev_name, ES1.0); + } +} + To me it looks like you're checking the exact same cores as we already do for 34xx. That is, (idcode 28) 0xff for both 34xx and 35xx. So basically they have the same omap cores. No, the cores in OMAP3505 and OMAP3517 are very different. I have listed major differences in PATCH 2/6. These devices differ in following areas: - Power management capabilities (Only 1 power domain, 1 OPP, etc.) - EMIF4 instead of SDRC - Support for DDR2 - EMAC - USB
Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
Premi, Sanjeev pr...@ti.com writes: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 5:20 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x * Premi, Sanjeev pr...@ti.com [090806 14:34]: -Original Message- From: Tony Lindgren [mailto:t...@atomide.com] Sent: Thursday, August 06, 2009 4:34 PM To: Premi, Sanjeev Cc: linux-omap@vger.kernel.org Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x Hi, * Sanjeev Premi pr...@ti.com [090806 13:36]: Added runtime check via omap2_set_globals_35xx(). Parts of this patch have been derived from an earlier earlier patch submitted by Tony Lindgren t...@atomide.com [1] http://marc.info/?l=linux-omapm=123301852702797w=2 [2] http://marc.info/?l=linux-omapm=123334055822212w=2 Signed-off-by: Sanjeev Premi pr...@ti.com --- arch/arm/mach-omap2/id.c | 115 -- arch/arm/plat-omap/common.c | 18 +- arch/arm/plat-omap/include/mach/common.h |1 + arch/arm/plat-omap/include/mach/cpu.h| 64 - 4 files changed, 173 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a98201c..06770aa 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,6 +28,14 @@ static struct omap_chip_id omap_chip; static unsigned int omap_revision; +/* The new OMAP35x devices have assymetric names - OMAP3505 and OMAP3517. + * It is not possible to define a common macro to identify them. + * + * A quick way is to separate them across 'generations' as below. + */ +#define OMAP35XX_G1 0x1 /* Applies to 3503, 3515, 3525 and 3530 */ +#define OMAP35XX_G2 0x2 /* Applies to 3505 and 3517 */ + unsigned int omap_rev(void) { @@ -155,12 +163,71 @@ void __init omap24xx_check_revision(void) pr_info(\n); } +static void __init omap34xx_set_revision(u8 rev, char *rev_name) +{ + switch (rev) { + case 0: + omap_revision = OMAP3430_REV_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision = OMAP3430_REV_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision = OMAP3430_REV_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision = OMAP3430_REV_ES3_1; + strcat(rev_name, Unknown revision); + } +} + +static void __init omap35xx_set_revision(u8 rev, u8 gen, char *rev_name) +{ + omap_revision = OMAP35XX_CLASS ; + + if (gen == OMAP35XX_G1) { + switch (rev) { + case 0: /* Take care of some older boards */ + case 1: + omap_revision |= OMAP35XX_MASK_ES2_0; + strcat(rev_name, ES2.0); + break; + case 2: + omap_revision |= OMAP35XX_MASK_ES2_1; + strcat(rev_name, ES2.1); + break; + case 3: + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, ES3.0); + break; + case 4: + omap_revision |= OMAP35XX_MASK_ES3_1; + strcat(rev_name, ES3.1); + break; + default: + /* Use the latest known revision as default */ + omap_revision |= OMAP35XX_MASK_ES3_0; + strcat(rev_name, Unknown revision); + } + } else { + strcat(rev_name, ES1.0); + } +} + To me it looks like you're checking the exact same cores as we already do for 34xx. That is, (idcode 28) 0xff for both 34xx and 35xx. So basically they have the same omap cores. No, the cores in OMAP3505 and OMAP3517 are very different. I have listed major differences in PATCH 2/6. These devices differ in following areas: - Power management capabilities (Only 1 power domain, 1 OPP, etc.) - EMIF4 instead of SDRC - Support for DDR2 - EMAC - USB - HECC Sure, but from compiler flags and io point of view they can still be treated as 34xx