linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* cpu features testing 32 vs 64 bit
@ 2005-09-08 21:02 Becky Bruce
  2005-09-08 21:08 ` Pantelis Antoniou
  0 siblings, 1 reply; 18+ messages in thread
From: Becky Bruce @ 2005-09-08 21:02 UTC (permalink / raw)
  To: linuxppc64-dev, linuxppc-embedded, linuxppc-dev

So,

in include/asm-ppc64/cacheflush.h is the following:

static inline void flush_icache_range(unsigned long start, unsigned 
long stop)
{
         if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
                 __flush_icache_range(start, stop);
}

On the 32-bit side, we don't need the feature test - 
CPU_FTR_COHERENT_CACHE is only defined in 64-bit land, and has bits set 
in the upper 32.

There's a couple of ways to deal with merging this:

1) The ever-so-popular #ifdef __powerpc64__around the cpu_has_feature 
test
2) No ifdef in the code itself, but #define CPU_FTR_WHATEVER to be 0 
when !__powerpc64__ in cputable.h so that the cpu_has_feature test will 
always fail for 32-bit.

I'd like to get some opinions on this.  Do folks feel like the 
performance hit of doing the compare is enough to justify going with 
method 1?  Should we be using likely/unlikely with the feature test?

This is just one code example - I suspect there will be others as we 
continue the merge, and the importance of performance may differ 
depending on where in the code we are.

Thanks!
-B

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 21:02 cpu features testing 32 vs 64 bit Becky Bruce
@ 2005-09-08 21:08 ` Pantelis Antoniou
  2005-09-08 21:20   ` Kumar Gala
  0 siblings, 1 reply; 18+ messages in thread
From: Pantelis Antoniou @ 2005-09-08 21:08 UTC (permalink / raw)
  To: linuxppc-embedded; +Cc: linuxppc-dev, linuxppc64-dev

On Friday 09 September 2005 00:02, Becky Bruce wrote:
> So,
>
> in include/asm-ppc64/cacheflush.h is the following:
>
> static inline void flush_icache_range(unsigned long start, unsigned
> long stop)
> {
>          if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
>                  __flush_icache_range(start, stop);
> }
>
> On the 32-bit side, we don't need the feature test -
> CPU_FTR_COHERENT_CACHE is only defined in 64-bit land, and has bits set
> in the upper 32.
>

Oh yes we need it. 8xx is non coherent.

> There's a couple of ways to deal with merging this:
>
> 1) The ever-so-popular #ifdef __powerpc64__around the cpu_has_feature
> test
> 2) No ifdef in the code itself, but #define CPU_FTR_WHATEVER to be 0
> when !__powerpc64__ in cputable.h so that the cpu_has_feature test will
> always fail for 32-bit.
>
> I'd like to get some opinions on this.  Do folks feel like the
> performance hit of doing the compare is enough to justify going with
> method 1?  Should we be using likely/unlikely with the feature test?
>
> This is just one code example - I suspect there will be others as we
> continue the merge, and the importance of performance may differ
> depending on where in the code we are.
>
> Thanks!
> -B
>

Regards

Pantelis

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 21:08 ` Pantelis Antoniou
@ 2005-09-08 21:20   ` Kumar Gala
  2005-09-08 21:48     ` Dan Malek
  2005-09-09 22:19     ` cpu features testing 32 vs 64 bit Benjamin Herrenschmidt
  0 siblings, 2 replies; 18+ messages in thread
From: Kumar Gala @ 2005-09-08 21:20 UTC (permalink / raw)
  To: pantelis.antoniou; +Cc: linuxppc64-dev, linuxppc-dev, linuxppc-embedded


On Sep 8, 2005, at 4:08 PM, Pantelis Antoniou wrote:

> On Friday 09 September 2005 00:02, Becky Bruce wrote:
>
>> So,
>>
>> in include/asm-ppc64/cacheflush.h is the following:
>>
>> static inline void flush_icache_range(unsigned long start, unsigned
>> long stop)
>> {
>>          if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
>>                  __flush_icache_range(start, stop);
>> }
>>
>> On the 32-bit side, we don't need the feature test -
>> CPU_FTR_COHERENT_CACHE is only defined in 64-bit land, and has  
>> bits set
>> in the upper 32.
>>
>>
>
> Oh yes we need it. 8xx is non coherent.

I think she lost the I in ICACHE... its a power5 only feature at this  
point.

- kumar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 21:20   ` Kumar Gala
@ 2005-09-08 21:48     ` Dan Malek
  2005-09-08 22:02       ` Kumar Gala
  2005-09-09 22:19     ` cpu features testing 32 vs 64 bit Benjamin Herrenschmidt
  1 sibling, 1 reply; 18+ messages in thread
From: Dan Malek @ 2005-09-08 21:48 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc64-dev, linuxppc-dev, pantelis.antoniou,
	linuxppc-embedded


On Sep 8, 2005, at 5:20 PM, Kumar Gala wrote:

>>>          if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
>>>                  __flush_icache_range(start, stop);
>>> }

If we #define CPU_FTR_xxx as a 0 or all 1's for processors that have
or don't have these features, will the compiler be smart enough to
recognize an always true or false condition and remove the
test (or code as appropriate)?

Thanks.

	-- Dan

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 21:48     ` Dan Malek
@ 2005-09-08 22:02       ` Kumar Gala
  2005-09-08 22:20         ` Dan Malek
  2005-09-08 22:36         ` Arnd Bergmann
  0 siblings, 2 replies; 18+ messages in thread
From: Kumar Gala @ 2005-09-08 22:02 UTC (permalink / raw)
  To: Dan Malek
  Cc: linuxppc64-dev, linuxppc-dev, pantelis.antoniou,
	linuxppc-embedded


On Sep 8, 2005, at 4:48 PM, Dan Malek wrote:

>
> On Sep 8, 2005, at 5:20 PM, Kumar Gala wrote:
>
>
>>>>          if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
>>>>                  __flush_icache_range(start, stop);
>>>> }
>>>>
>
> If we #define CPU_FTR_xxx as a 0 or all 1's for processors that have
> or don't have these features, will the compiler be smart enough to
> recognize an always true or false condition and remove the
> test (or code as appropriate)?

The compiler is smart enough in this case since cpu_has_feature() is  
an inline function.

- kumar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 22:02       ` Kumar Gala
@ 2005-09-08 22:20         ` Dan Malek
  2005-09-08 22:36         ` Arnd Bergmann
  1 sibling, 0 replies; 18+ messages in thread
From: Dan Malek @ 2005-09-08 22:20 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc64-dev, linuxppc-dev, linuxppc-embedded,
	pantelis.antoniou


On Sep 8, 2005, at 6:02 PM, Kumar Gala wrote:

> The compiler is smart enough in this case since cpu_has_feature() is 
> an inline function.

I guess I didn't read Becky's comments close enough, but she did
suggest this.  I was trying to eliminate the #ifdef, but I guess we will
need it some place.

Thanks.

	-- Dan

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 22:02       ` Kumar Gala
  2005-09-08 22:20         ` Dan Malek
@ 2005-09-08 22:36         ` Arnd Bergmann
  2005-09-09  0:08           ` David Gibson
  2005-09-09  4:23           ` [PATCH] powerpc: merge include/asm/cputable.h Arnd Bergmann
  1 sibling, 2 replies; 18+ messages in thread
From: Arnd Bergmann @ 2005-09-08 22:36 UTC (permalink / raw)
  To: linuxppc64-dev; +Cc: linuxppc-dev, linuxppc-embedded, pantelis.antoniou

On Freedag 09 September 2005 00:02, Kumar Gala wrote:
> 
> On Sep 8, 2005, at 4:48 PM, Dan Malek wrote:
> >
> > If we #define CPU_FTR_xxx as a 0 or all 1's for processors that have
> > or don't have these features, will the compiler be smart enough to
> > recognize an always true or false condition and remove the
> > test (or code as appropriate)?
> 
> The compiler is smart enough in this case since cpu_has_feature() is  
> an inline function.

I actually wrote a patch that solves the problem in a very generic way,
see http://patchwork.ozlabs.org/linuxppc/patch?id=1048 .
I don't remember exactly if there were serious objections against
the patch at that time, but it looks like a much cleaner solution to me
than defining CPU_FTR_xxx to different values depending on the
configuration.

	Arnd <><

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 22:36         ` Arnd Bergmann
@ 2005-09-09  0:08           ` David Gibson
  2005-09-09  4:23           ` [PATCH] powerpc: merge include/asm/cputable.h Arnd Bergmann
  1 sibling, 0 replies; 18+ messages in thread
From: David Gibson @ 2005-09-09  0:08 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linuxppc64-dev, pantelis.antoniou, linuxppc-embedded,
	linuxppc-dev

On Fri, Sep 09, 2005 at 12:36:39AM +0200, Arnd Bergmann wrote:
> On Freedag 09 September 2005 00:02, Kumar Gala wrote:
> > 
> > On Sep 8, 2005, at 4:48 PM, Dan Malek wrote:
> > >
> > > If we #define CPU_FTR_xxx as a 0 or all 1's for processors that have
> > > or don't have these features, will the compiler be smart enough to
> > > recognize an always true or false condition and remove the
> > > test (or code as appropriate)?
> > 
> > The compiler is smart enough in this case since cpu_has_feature() is  
> > an inline function.
> 
> I actually wrote a patch that solves the problem in a very generic way,
> see http://patchwork.ozlabs.org/linuxppc/patch?id=1048 .
> I don't remember exactly if there were serious objections against
> the patch at that time, but it looks like a much cleaner solution to me
> than defining CPU_FTR_xxx to different values depending on the
> configuration.

And we already use a mechanism essentially identical to Arnd's for
fw_has_feature().

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/people/dgibson

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-08 22:36         ` Arnd Bergmann
  2005-09-09  0:08           ` David Gibson
@ 2005-09-09  4:23           ` Arnd Bergmann
  2005-09-14 19:11             ` Kumar Gala
  1 sibling, 1 reply; 18+ messages in thread
From: Arnd Bergmann @ 2005-09-09  4:23 UTC (permalink / raw)
  To: linuxppc64-dev; +Cc: linuxppc-dev, pantelis.antoniou, linuxppc-embedded

This is an updated version of my old patch that creates a more optimized
version of cpu_has_feature(). This version actually combines 
asm-ppc/cputable.h and asm-ppc64/cputable.h, which turned out to be
a lot more work than only the 64 bit version.

The 64 bit parts a relatively straightforward port of my earlier work
which I tested in a number of configurations. The 32 bit parts are
not tested at all, all I did was compiling the ppc defconfig with this.

I think it is best if I hand the patch over to Kumar and Becky for
further testing and cleaning up the remaining bits in the new
file, as they appear to have invested some thought in it already.
This version still has a number of #ifdef __powerpc64__ that should
probably go away in the process.

The patch also relies on having the ASM_CONST() macro in ppc_asm.h,
as proposed by Kumar Gala, so it won't work on the current git
head without that change.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

--

 clean-cg/arch/ppc/kernel/cputable.c     |  401 +++++----------------------
 clean-cg/arch/ppc64/Kconfig             |   30 ++
 clean-cg/arch/ppc64/kernel/cputable.c   |   82 +----
 clean-cg/include/asm-powerpc/cputable.h |  475 ++++++++++++++++++++++++++++++++
 include/asm-ppc/cputable.h              |  128 --------
 include/asm-ppc64/cputable.h            |  167 -----------

Index: clean-cg/include/asm-ppc64/cputable.h
===================================================================
--- clean-cg.orig/include/asm-ppc64/cputable.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  include/asm-ppc64/cputable.h
- *
- *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
- *
- *  Modifications for ppc64:
- *      Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version
- *  2 of the License, or (at your option) any later version.
- */
-
-#ifndef __ASM_PPC_CPUTABLE_H
-#define __ASM_PPC_CPUTABLE_H
-
-#include <linux/config.h>
-#include <asm/page.h> /* for ASM_CONST */
-
-/* Exposed to userland CPU features - Must match ppc32 definitions */
-#define PPC_FEATURE_32			0x80000000
-#define PPC_FEATURE_64			0x40000000
-#define PPC_FEATURE_601_INSTR		0x20000000
-#define PPC_FEATURE_HAS_ALTIVEC		0x10000000
-#define PPC_FEATURE_HAS_FPU		0x08000000
-#define PPC_FEATURE_HAS_MMU		0x04000000
-#define PPC_FEATURE_HAS_4xxMAC		0x02000000
-#define PPC_FEATURE_UNIFIED_CACHE	0x01000000
-
-#ifdef __KERNEL__
-
-#ifndef __ASSEMBLY__
-
-/* This structure can grow, it's real size is used by head.S code
- * via the mkdefs mechanism.
- */
-struct cpu_spec;
-struct op_ppc64_model;
-
-typedef	void (*cpu_setup_t)(unsigned long offset, struct cpu_spec* spec);
-
-struct cpu_spec {
-	/* CPU is matched via (PVR & pvr_mask) == pvr_value */
-	unsigned int	pvr_mask;
-	unsigned int	pvr_value;
-
-	char		*cpu_name;
-	unsigned long	cpu_features;		/* Kernel features */
-	unsigned int	cpu_user_features;	/* Userland features */
-
-	/* cache line sizes */
-	unsigned int	icache_bsize;
-	unsigned int	dcache_bsize;
-
-	/* number of performance monitor counters */
-	unsigned int	num_pmcs;
-
-	/* this is called to initialize various CPU bits like L1 cache,
-	 * BHT, SPD, etc... from head.S before branching to identify_machine
-	 */
-	cpu_setup_t	cpu_setup;
-
-	/* Used by oprofile userspace to select the right counters */
-	char		*oprofile_cpu_type;
-
-	/* Processor specific oprofile operations */
-	struct op_ppc64_model *oprofile_model;
-};
-
-extern struct cpu_spec		cpu_specs[];
-extern struct cpu_spec		*cur_cpu_spec;
-
-static inline unsigned long cpu_has_feature(unsigned long feature)
-{
-	return cur_cpu_spec->cpu_features & feature;
-}
-
-#endif /* __ASSEMBLY__ */
-
-/* CPU kernel features */
-
-/* Retain the 32b definitions for the time being - use bottom half of word */
-#define CPU_FTR_SPLIT_ID_CACHE		ASM_CONST(0x0000000000000001)
-#define CPU_FTR_L2CR			ASM_CONST(0x0000000000000002)
-#define CPU_FTR_SPEC7450		ASM_CONST(0x0000000000000004)
-#define CPU_FTR_ALTIVEC			ASM_CONST(0x0000000000000008)
-#define CPU_FTR_TAU			ASM_CONST(0x0000000000000010)
-#define CPU_FTR_CAN_DOZE		ASM_CONST(0x0000000000000020)
-#define CPU_FTR_USE_TB			ASM_CONST(0x0000000000000040)
-#define CPU_FTR_604_PERF_MON		ASM_CONST(0x0000000000000080)
-#define CPU_FTR_601			ASM_CONST(0x0000000000000100)
-#define CPU_FTR_HPTE_TABLE		ASM_CONST(0x0000000000000200)
-#define CPU_FTR_CAN_NAP			ASM_CONST(0x0000000000000400)
-#define CPU_FTR_L3CR			ASM_CONST(0x0000000000000800)
-#define CPU_FTR_L3_DISABLE_NAP		ASM_CONST(0x0000000000001000)
-#define CPU_FTR_NAP_DISABLE_L2_PR	ASM_CONST(0x0000000000002000)
-#define CPU_FTR_DUAL_PLL_750FX		ASM_CONST(0x0000000000004000)
-
-/* Add the 64b processor unique features in the top half of the word */
-#define CPU_FTR_SLB           		ASM_CONST(0x0000000100000000)
-#define CPU_FTR_16M_PAGE      		ASM_CONST(0x0000000200000000)
-#define CPU_FTR_TLBIEL         		ASM_CONST(0x0000000400000000)
-#define CPU_FTR_NOEXECUTE     		ASM_CONST(0x0000000800000000)
-#define CPU_FTR_NODSISRALIGN  		ASM_CONST(0x0000001000000000)
-#define CPU_FTR_IABR  			ASM_CONST(0x0000002000000000)
-#define CPU_FTR_MMCRA  			ASM_CONST(0x0000004000000000)
-/* unused 				ASM_CONST(0x0000008000000000) */
-#define CPU_FTR_SMT  			ASM_CONST(0x0000010000000000)
-#define CPU_FTR_COHERENT_ICACHE  	ASM_CONST(0x0000020000000000)
-#define CPU_FTR_LOCKLESS_TLBIE		ASM_CONST(0x0000040000000000)
-#define CPU_FTR_MMCRA_SIHV		ASM_CONST(0x0000080000000000)
-#define CPU_FTR_CTRL			ASM_CONST(0x0000100000000000)
-
-#ifndef __ASSEMBLY__
-
-#define COMMON_USER_PPC64	(PPC_FEATURE_32 | PPC_FEATURE_64 | \
-			         PPC_FEATURE_HAS_FPU | PPC_FEATURE_HAS_MMU)
-
-#define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \
-                                 CPU_FTR_TLBIEL | CPU_FTR_NOEXECUTE | \
-                                 CPU_FTR_NODSISRALIGN | CPU_FTR_CTRL)
-
-/* iSeries doesn't support large pages */
-#ifdef CONFIG_PPC_ISERIES
-#define CPU_FTR_PPCAS_ARCH_V2	(CPU_FTR_PPCAS_ARCH_V2_BASE)
-#else
-#define CPU_FTR_PPCAS_ARCH_V2	(CPU_FTR_PPCAS_ARCH_V2_BASE | CPU_FTR_16M_PAGE)
-#endif /* CONFIG_PPC_ISERIES */
-
-#endif /* __ASSEMBLY */
-
-#ifdef __ASSEMBLY__
-
-#define BEGIN_FTR_SECTION		98:
-
-#define END_FTR_SECTION(msk, val)		\
-99:						\
-	.section __ftr_fixup,"a";		\
-	.align 3;				\
-	.llong msk;			        \
-	.llong val;			        \
-	.llong 98b;			        \
-	.llong 99b;	 		        \
-	.previous
-
-#else
-
-#define BEGIN_FTR_SECTION		"98:\n"
-#define END_FTR_SECTION(msk, val)		\
-"99:\n"						\
-"	.section __ftr_fixup,\"a\";\n"		\
-"	.align 3;\n"				\
-"	.llong "#msk";\n"			\
-"	.llong "#val";\n"			\
-"	.llong 98b;\n"			        \
-"	.llong 99b;\n"	 		        \
-"	.previous\n"
-
-#endif /* __ASSEMBLY__ */
-
-#define END_FTR_SECTION_IFSET(msk)	END_FTR_SECTION((msk), (msk))
-#define END_FTR_SECTION_IFCLR(msk)	END_FTR_SECTION((msk), 0)
-
-#endif /* __ASM_PPC_CPUTABLE_H */
-#endif /* __KERNEL__ */
-
Index: clean-cg/arch/ppc64/Kconfig
===================================================================
--- clean-cg.orig/arch/ppc64/Kconfig
+++ clean-cg/arch/ppc64/Kconfig
@@ -125,6 +125,36 @@ config BPA_IIC
 	bool
 	default y
 
+config CPU_POWER3
+	bool
+	default y
+	depends on (PPC_ISERIES || PPC_PSERIES) && !POWER4_ONLY
+
+config CPU_RS64
+	bool
+	default y
+	depends on (PPC_ISERIES || PPC_PSERIES) && !POWER4_ONLY
+
+config CPU_POWER4
+	bool
+	default y
+	depends on PPC_ISERIES || PPC_PSERIES
+
+config CPU_PPC970
+	bool
+	default y
+	depends on PPC_PSERIES || PPC_PMAC || PPC_MAPLE
+
+config CPU_POWER5
+	bool
+	default y
+	depends on PPC_PSERIES
+
+config CPU_CELL
+	bool
+	default y
+	depends on PPC_BPA
+
 # VMX is pSeries only for now until somebody writes the iSeries
 # exception vectors for it
 config ALTIVEC
Index: clean-cg/arch/ppc64/kernel/cputable.c
===================================================================
--- clean-cg.orig/arch/ppc64/kernel/cputable.c
+++ clean-cg/arch/ppc64/kernel/cputable.c
@@ -37,26 +37,13 @@ extern void __setup_cpu_power4(unsigned 
 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_be(unsigned long offset, struct cpu_spec* spec);
 
-
-/* We only set the altivec features if the kernel was compiled with altivec
- * support
- */
-#ifdef CONFIG_ALTIVEC
-#define CPU_FTR_ALTIVEC_COMP	CPU_FTR_ALTIVEC
-#define PPC_FEATURE_HAS_ALTIVEC_COMP PPC_FEATURE_HAS_ALTIVEC
-#else
-#define CPU_FTR_ALTIVEC_COMP	0
-#define PPC_FEATURE_HAS_ALTIVEC_COMP    0
-#endif
-
 struct cpu_spec	cpu_specs[] = {
 	{	/* Power3 */
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00400000,
 		.cpu_name		= "POWER3 (630)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
-		.cpu_user_features = COMMON_USER_PPC64,
+		.cpu_features		= CPU_FTR_POWER3,
+		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.num_pmcs		= 8,
@@ -70,8 +57,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00410000,
 		.cpu_name		= "POWER3 (630+)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
+		.cpu_features		= CPU_FTR_POWER3,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -86,9 +72,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00330000,
 		.cpu_name		= "RS64-II (northstar)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
-			CPU_FTR_MMCRA | CPU_FTR_CTRL,
+		.cpu_features		= CPU_FTR_RS64,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -103,9 +87,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00340000,
 		.cpu_name		= "RS64-III (pulsar)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
-			CPU_FTR_MMCRA | CPU_FTR_CTRL,
+		.cpu_features		= CPU_FTR_RS64,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -120,9 +102,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00360000,
 		.cpu_name		= "RS64-III (icestar)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
-			CPU_FTR_MMCRA | CPU_FTR_CTRL,
+		.cpu_features		= CPU_FTR_RS64,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -137,9 +117,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00370000,
 		.cpu_name		= "RS64-IV (sstar)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
-			CPU_FTR_MMCRA | CPU_FTR_CTRL,
+		.cpu_features		= CPU_FTR_RS64,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -154,9 +132,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00350000,
 		.cpu_name		= "POWER4 (gp)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
+		.cpu_features		= CPU_FTR_POWER4,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -171,9 +147,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00380000,
 		.cpu_name		= "POWER4+ (gq)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
+		.cpu_features		= CPU_FTR_POWER4,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -188,10 +162,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00390000,
 		.cpu_name		= "PPC970",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
-			CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
+		.cpu_features		= CPU_FTR_PPC970,
 		.cpu_user_features	= COMMON_USER_PPC64 |
 			PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 128,
@@ -207,10 +178,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x003c0000,
 		.cpu_name		= "PPC970FX",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
-			CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
+		.cpu_features		= CPU_FTR_PPC970,
 		.cpu_user_features	= COMMON_USER_PPC64 |
 			PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 128,
@@ -226,10 +194,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00440000,
 		.cpu_name		= "PPC970MP",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
-			CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
+		.cpu_features		= CPU_FTR_PPC970,
 		.cpu_user_features	= COMMON_USER_PPC64 |
 			PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 128,
@@ -244,11 +209,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x003a0000,
 		.cpu_name		= "POWER5 (gr)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
-			CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
-			CPU_FTR_MMCRA_SIHV,
+		.cpu_features		= CPU_FTR_POWER5,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -263,11 +224,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x003b0000,
 		.cpu_name		= "POWER5 (gs)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
-			CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
-			CPU_FTR_MMCRA_SIHV,
+		.cpu_features		= CPU_FTR_POWER5,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -281,11 +238,8 @@ struct cpu_spec	cpu_specs[] = {
 	{	/* BE DD1.x */
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00700000,
-		.cpu_name		= "Broadband Engine",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
-			CPU_FTR_SMT,
+		.cpu_name		= "Cell Broadband Engine",
+		.cpu_features		= CPU_FTR_CELL,
 		.cpu_user_features	= COMMON_USER_PPC64 |
 			PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 128,
@@ -296,9 +250,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0x00000000,
 		.pvr_value		= 0x00000000,
 		.cpu_name		= "POWER4 (compatible)",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_PPCAS_ARCH_V2,
+		.cpu_features		= CPU_FTR_COMPATIBLE,
 		.cpu_user_features	= COMMON_USER_PPC64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
Index: clean-cg/arch/ppc/kernel/cputable.c
===================================================================
--- clean-cg.orig/arch/ppc/kernel/cputable.c
+++ clean-cg/arch/ppc/kernel/cputable.c
@@ -42,17 +42,6 @@ extern void __setup_cpu_generic(unsigned
 #define COMMON_PPC	(PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \
 			 PPC_FEATURE_HAS_MMU)
 
-/* We only set the altivec features if the kernel was compiled with altivec
- * support
- */
-#ifdef CONFIG_ALTIVEC
-#define CPU_FTR_ALTIVEC_COMP		CPU_FTR_ALTIVEC
-#define PPC_FEATURE_ALTIVEC_COMP    	PPC_FEATURE_HAS_ALTIVEC
-#else
-#define CPU_FTR_ALTIVEC_COMP		0
-#define PPC_FEATURE_ALTIVEC_COMP       	0
-#endif
-
 /* We only set the spe features if the kernel was compiled with
  * spe support
  */
@@ -62,34 +51,13 @@ extern void __setup_cpu_generic(unsigned
 #define PPC_FEATURE_SPE_COMP       	0
 #endif
 
-/* We need to mark all pages as being coherent if we're SMP or we
- * have a 74[45]x and an MPC107 host bridge.
- */
-#if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE)
-#define CPU_FTR_COMMON                  CPU_FTR_NEED_COHERENT
-#else
-#define CPU_FTR_COMMON                  0
-#endif
-
-/* The powersave features NAP & DOZE seems to confuse BDI when
-   debugging. So if a BDI is used, disable theses
- */
-#ifndef CONFIG_BDI_SWITCH
-#define CPU_FTR_MAYBE_CAN_DOZE	CPU_FTR_CAN_DOZE
-#define CPU_FTR_MAYBE_CAN_NAP	CPU_FTR_CAN_NAP
-#else
-#define CPU_FTR_MAYBE_CAN_DOZE	0
-#define CPU_FTR_MAYBE_CAN_NAP	0
-#endif
-
 struct cpu_spec	cpu_specs[] = {
 #if CLASSIC_PPC
 	{ 	/* 601 */
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00010000,
 		.cpu_name		= "601",
-		.cpu_features		= CPU_FTR_COMMON | CPU_FTR_601 |
-			CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_PPC601,
 		.cpu_user_features 	= COMMON_PPC | PPC_FEATURE_601_INSTR |
 			PPC_FEATURE_UNIFIED_CACHE,
 		.icache_bsize		= 32,
@@ -100,9 +68,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00030000,
 		.cpu_name		= "603",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_603,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -112,9 +78,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00060000,
 		.cpu_name		= "603e",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_603,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -124,9 +88,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00070000,
 		.cpu_name		= "603ev",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_603,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -136,9 +98,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00040000,
 		.cpu_name		= "604",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_604,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -149,9 +109,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xfffff000,
 		.pvr_value		= 0x00090000,
 		.cpu_name		= "604e",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_604,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -162,9 +120,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00090000,
 		.cpu_name		= "604r",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_604,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -175,9 +131,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x000a0000,
 		.cpu_name		= "604ev",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_604,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -188,10 +142,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x00084202,
 		.cpu_name		= "740/750",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_740_NOTAU,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -202,10 +153,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xfffffff0,
 		.pvr_value		= 0x00080100,
 		.cpu_name		= "750CX",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_750,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -216,10 +164,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xfffffff0,
 		.pvr_value		= 0x00082200,
 		.cpu_name		= "750CX",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_750,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -230,10 +175,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xfffffff0,
 		.pvr_value		= 0x00082210,
 		.cpu_name		= "750CXe",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_750,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -244,10 +186,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x00083214,
 		.cpu_name		= "750CXe",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_750,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -258,10 +197,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xfffff000,
 		.pvr_value		= 0x00083000,
 		.cpu_name		= "745/755",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_750,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -272,11 +208,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffff00,
 		.pvr_value		= 0x70000100,
 		.cpu_name		= "750FX",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
-			CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM,
+		.cpu_features		= CPU_FTR_750FX1,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -287,11 +219,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x70000200,
 		.cpu_name		= "750FX",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
-			CPU_FTR_NO_DPM,
+		.cpu_features		= CPU_FTR_750FX2,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -302,11 +230,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x70000000,
 		.cpu_name		= "750FX",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
-			CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS,
+		.cpu_features		= CPU_FTR_750FX,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -317,11 +241,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x70020000,
 		.cpu_name		= "750GX",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
-			CPU_FTR_L2CR | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_DUAL_PLL_750FX |
-			CPU_FTR_HAS_HIGH_BATS,
+		.cpu_features		= CPU_FTR_750GX,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -332,10 +252,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00080000,
 		.cpu_name		= "740/750",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+		.cpu_features		= CPU_FTR_740,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -346,11 +263,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x000c1101,
 		.cpu_name		= "7400 (1.1)",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7400_NOTAU,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 4,
@@ -360,12 +274,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x000c0000,
 		.cpu_name		= "7400",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_MAYBE_CAN_NAP,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7400,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 4,
@@ -375,12 +285,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x800c0000,
 		.cpu_name		= "7410",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_MAYBE_CAN_NAP,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7400,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 4,
@@ -390,12 +296,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x80000200,
 		.cpu_name		= "7450",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7450_20,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -405,14 +307,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x80000201,
 		.cpu_name		= "7450",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
-			CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7450_21,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -422,13 +318,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x80000000,
 		.cpu_name		= "7450",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7450_23,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -438,12 +329,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffff00,
 		.pvr_value		= 0x80010100,
 		.cpu_name		= "7455",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_HAS_HIGH_BATS | CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7455_1,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -453,14 +340,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x80010200,
 		.cpu_name		= "7455",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
-			CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7455_20,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -470,14 +351,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x80010000,
 		.cpu_name		= "7455",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
-			CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7455,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -487,14 +362,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x80020100,
 		.cpu_name		= "7447/7457",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
-			CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7447_10,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -504,14 +373,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffffff,
 		.pvr_value		= 0x80020101,
 		.cpu_name		= "7447/7457",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
-			CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7447_10,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -521,14 +384,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x80020000,
 		.cpu_name		= "7447/7457",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
-			CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
-			CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
-			CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7447,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -538,13 +395,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x80030000,
 		.cpu_name		= "7447A",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_SPEC7450 | CPU_FTR_NAP_DISABLE_L2_PR |
-			CPU_FTR_HAS_HIGH_BATS | CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7447A,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -554,13 +406,8 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x80040000,
 		.cpu_name		= "7448",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
-			CPU_FTR_SPEC7450 | CPU_FTR_NAP_DISABLE_L2_PR |
-			CPU_FTR_HAS_HIGH_BATS | CPU_FTR_NEED_COHERENT,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_7447A,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
 		.num_pmcs		= 6,
@@ -570,9 +417,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0x7fff0000,
 		.pvr_value		= 0x00810000,
 		.cpu_name		= "82xx",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_82XX,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -582,9 +427,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0x7fff0000,
 		.pvr_value		= 0x00820000,
 		.cpu_name		= "G2_LE",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS,
+		.cpu_features		= CPU_FTR_G2_LE,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -594,9 +437,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0x7fff0000,
 		.pvr_value		= 0x00830000,
 		.cpu_name		= "e300",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
-			CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS,
+		.cpu_features		= CPU_FTR_E300,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -606,9 +447,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0x00000000,
 		.pvr_value		= 0x00000000,
 		.cpu_name		= "(generic PPC)",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_CLASSIC32,
 		.cpu_user_features	= COMMON_PPC,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -620,9 +459,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00400000,
 		.cpu_name		= "Power3 (630)",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_POWER3_32,
 		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -633,9 +470,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00410000,
 		.cpu_name		= "Power3 (630+)",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_POWER3_32,
 		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -646,9 +481,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00360000,
 		.cpu_name		= "I-star",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_POWER3_32,
 		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
@@ -659,55 +492,19 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00370000,
 		.cpu_name		= "S-star",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE,
+		.cpu_features		= CPU_FTR_POWER3_32,
 		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.num_pmcs		= 8,
 		.cpu_setup		= __setup_cpu_power3
 	},
-#endif /* CONFIG_PPC64BRIDGE */
-#ifdef CONFIG_POWER4
-	{	/* Power4 */
-		.pvr_mask		= 0xffff0000,
-		.pvr_value		= 0x00350000,
-		.cpu_name		= "Power4",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64,
-		.icache_bsize		= 128,
-		.dcache_bsize		= 128,
-		.num_pmcs		= 8,
-		.cpu_setup		= __setup_cpu_power4
-	},
-	{	/* PPC970 */
-		.pvr_mask		= 0xffff0000,
-		.pvr_value		= 0x00390000,
-		.cpu_name		= "PPC970",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_MAYBE_CAN_NAP,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64 |
-			PPC_FEATURE_ALTIVEC_COMP,
-		.icache_bsize		= 128,
-		.dcache_bsize		= 128,
-		.num_pmcs		= 8,
-		.cpu_setup		= __setup_cpu_ppc970
-	},
 	{	/* PPC970FX */
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x003c0000,
 		.cpu_name		= "PPC970FX",
-		.cpu_features		= CPU_FTR_COMMON |
-			CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
-			CPU_FTR_HPTE_TABLE |
-			CPU_FTR_ALTIVEC_COMP | CPU_FTR_MAYBE_CAN_NAP,
-		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64 |
-			PPC_FEATURE_ALTIVEC_COMP,
+		.cpu_features		= CPU_FTR_970_32,
+		.cpu_user_features	= COMMON_PPC | PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC_COMP,
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.num_pmcs		= 8,
@@ -721,8 +518,7 @@ struct cpu_spec	cpu_specs[] = {
 		.cpu_name		= "8xx",
 		/* CPU_FTR_MAYBE_CAN_DOZE is possible,
 		 * if the 8xx code is there.... */
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_8XX,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 16,
 		.dcache_bsize		= 16,
@@ -733,8 +529,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffff00,
 		.pvr_value		= 0x00200200,
 		.cpu_name		= "403GC",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 16,
 		.dcache_bsize		= 16,
@@ -743,8 +538,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffffff00,
 		.pvr_value		= 0x00201400,
 		.cpu_name		= "403GCX",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 16,
 		.dcache_bsize		= 16,
@@ -753,8 +547,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00200000,
 		.cpu_name		= "403G ??",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 16,
 		.dcache_bsize		= 16,
@@ -763,8 +556,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x40110000,
 		.cpu_name		= "405GP",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -774,8 +566,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x40130000,
 		.cpu_name		= "STB03xxx",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -785,8 +576,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x41810000,
 		.cpu_name		= "STB04xxx",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -796,8 +586,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x41610000,
 		.cpu_name		= "NP405L",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -807,8 +596,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x40B10000,
 		.cpu_name		= "NP4GS3",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -818,8 +606,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x41410000,
 		.cpu_name		= "NP405H",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -829,8 +616,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x50910000,
 		.cpu_name		= "405GPr",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -840,8 +626,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x51510000,
 		.cpu_name		= "STBx25xx",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -851,8 +636,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x41F10000,
 		.cpu_name		= "405LP",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -861,8 +645,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x20010000,
 		.cpu_name		= "Virtex-II Pro",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -872,8 +655,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x51210000,
 		.cpu_name		= "405EP",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_40X,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
 		.icache_bsize		= 32,
@@ -886,8 +668,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x40000850,
 		.cpu_name		= "440EP Rev. A",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= COMMON_PPC, /* 440EP has an FPU */
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -896,8 +677,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x400008d3,
 		.cpu_name		= "440EP Rev. B",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= COMMON_PPC, /* 440EP has an FPU */
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -906,8 +686,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x40000440,
 		.cpu_name		= "440GP Rev. B",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -916,8 +695,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x40000481,
 		.cpu_name		= "440GP Rev. C",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -926,8 +704,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x50000850,
 		.cpu_name		= "440GX Rev. A",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -936,8 +713,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x50000851,
 		.cpu_name		= "440GX Rev. B",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -946,8 +722,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x50000892,
 		.cpu_name		= "440GX Rev. C",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -956,8 +731,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xf0000fff,
 		.pvr_value		= 0x50000894,
 		.cpu_name		= "440GX Rev. F",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -966,8 +740,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0xff000fff,
 		.pvr_value		= 0x53000891,
 		.cpu_name		= "440SP Rev. A",
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_44X,
 		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
@@ -979,7 +752,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_value		= 0x81000000,
 		.cpu_name		= "e200z5",
 		/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
-		.cpu_features		= CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_E200,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_EFP_SINGLE |
 			PPC_FEATURE_UNIFIED_CACHE,
@@ -990,7 +763,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_value		= 0x81100000,
 		.cpu_name		= "e200z6",
 		/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
-		.cpu_features		= CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_E200,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
 			PPC_FEATURE_HAS_EFP_SINGLE |
@@ -1002,8 +775,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_value		= 0x80200000,
 		.cpu_name		= "e500",
 		/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB,
+		.cpu_features		= CPU_FTR_E500,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
 			PPC_FEATURE_HAS_EFP_SINGLE,
@@ -1016,8 +788,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_value		= 0x80210000,
 		.cpu_name		= "e500v2",
 		/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
-		.cpu_features		= CPU_FTR_SPLIT_ID_CACHE |
-			CPU_FTR_USE_TB | CPU_FTR_BIG_PHYS,
+		.cpu_features		= CPU_FTR_E500_2,
 		.cpu_user_features	= PPC_FEATURE_32 |
 			PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
 			PPC_FEATURE_HAS_EFP_SINGLE | PPC_FEATURE_HAS_EFP_DOUBLE,
@@ -1031,7 +802,7 @@ struct cpu_spec	cpu_specs[] = {
 		.pvr_mask		= 0x00000000,
 		.pvr_value		= 0x00000000,
 		.cpu_name		= "(generic PPC)",
-		.cpu_features		= CPU_FTR_COMMON,
+		.cpu_features		= CPU_FTR_GENERIC_32,
 		.cpu_user_features	= PPC_FEATURE_32,
 		.icache_bsize		= 32,
 		.dcache_bsize		= 32,
Index: clean-cg/include/asm-powerpc/cputable.h
===================================================================
--- /dev/null
+++ clean-cg/include/asm-powerpc/cputable.h
@@ -0,0 +1,475 @@
+#ifndef __ASM_POWERPC_CPUTABLE_H
+#define __ASM_POWERPC_CPUTABLE_H
+
+#ifdef __KERNEL__
+#include <linux/config.h>
+#include <asm/ppc_asm.h> /* for ASM_CONST */
+
+#define PPC_FEATURE_32			0x80000000
+#define PPC_FEATURE_64			0x40000000
+#define PPC_FEATURE_601_INSTR		0x20000000
+#define PPC_FEATURE_HAS_ALTIVEC		0x10000000
+#define PPC_FEATURE_HAS_FPU		0x08000000
+#define PPC_FEATURE_HAS_MMU		0x04000000
+#define PPC_FEATURE_HAS_4xxMAC		0x02000000
+#define PPC_FEATURE_UNIFIED_CACHE	0x01000000
+#define PPC_FEATURE_HAS_SPE		0x00800000
+#define PPC_FEATURE_HAS_EFP_SINGLE	0x00400000
+#define PPC_FEATURE_HAS_EFP_DOUBLE	0x00200000
+
+#ifndef __ASSEMBLY__
+
+/* This structure can grow, it's real size is used by head.S code
+ * via the mkdefs mechanism.
+ */
+struct cpu_spec;
+struct op_ppc64_model;
+
+#ifndef __powerpc64__
+typedef	void (*cpu_setup_t)(unsigned long offset, int cpu_nr, struct cpu_spec* spec);
+#else /* __powerpc64__ */
+typedef	void (*cpu_setup_t)(unsigned long offset, struct cpu_spec* spec);
+#endif /* __powerpc64__ */
+
+struct cpu_spec {
+	/* CPU is matched via (PVR & pvr_mask) == pvr_value */
+	unsigned int	pvr_mask;
+	unsigned int	pvr_value;
+
+	char		*cpu_name;
+	unsigned long	cpu_features;		/* Kernel features */
+	unsigned int	cpu_user_features;	/* Userland features */
+
+	/* cache line sizes */
+	unsigned int	icache_bsize;
+	unsigned int	dcache_bsize;
+
+	/* number of performance monitor counters */
+	unsigned int	num_pmcs;
+
+	/* this is called to initialize various CPU bits like L1 cache,
+	 * BHT, SPD, etc... from head.S before branching to identify_machine
+	 */
+	cpu_setup_t	cpu_setup;
+#ifdef __powerpc64__
+
+	/* Used by oprofile userspace to select the right counters */
+	char		*oprofile_cpu_type;
+
+	/* Processor specific oprofile operations */
+	struct op_ppc64_model *oprofile_model;
+#endif /* __powerpc64__ */
+};
+
+extern struct cpu_spec		cpu_specs[];
+
+#ifndef __powerpc64__
+extern struct cpu_spec		*cur_cpu_spec[];
+#else /* __powerpc64__ */
+extern struct cpu_spec		*cur_cpu_spec;
+#endif /* __powerpc64__ */
+
+#endif /* __ASSEMBLY__ */
+
+/* CPU kernel features */
+
+/* Retain the 32b definitions all use bottom half of word */
+#define CPU_FTR_SPLIT_ID_CACHE		ASM_CONST(0x0000000000000001)
+#define CPU_FTR_L2CR			ASM_CONST(0x0000000000000002)
+#define CPU_FTR_SPEC7450		ASM_CONST(0x0000000000000004)
+#define CPU_FTR_ALTIVEC			ASM_CONST(0x0000000000000008)
+#define CPU_FTR_TAU			ASM_CONST(0x0000000000000010)
+#define CPU_FTR_CAN_DOZE		ASM_CONST(0x0000000000000020)
+#define CPU_FTR_USE_TB			ASM_CONST(0x0000000000000040)
+#define CPU_FTR_604_PERF_MON		ASM_CONST(0x0000000000000080)
+#define CPU_FTR_601			ASM_CONST(0x0000000000000100)
+#define CPU_FTR_HPTE_TABLE		ASM_CONST(0x0000000000000200)
+#define CPU_FTR_CAN_NAP			ASM_CONST(0x0000000000000400)
+#define CPU_FTR_L3CR			ASM_CONST(0x0000000000000800)
+#define CPU_FTR_L3_DISABLE_NAP		ASM_CONST(0x0000000000001000)
+#define CPU_FTR_NAP_DISABLE_L2_PR	ASM_CONST(0x0000000000002000)
+#define CPU_FTR_DUAL_PLL_750FX		ASM_CONST(0x0000000000004000)
+#define CPU_FTR_NO_DPM			ASM_CONST(0x0000000000008000)
+#define CPU_FTR_HAS_HIGH_BATS		ASM_CONST(0x0000000000010000)
+#define CPU_FTR_NEED_COHERENT		ASM_CONST(0x0000000000020000)
+#define CPU_FTR_NO_BTIC			ASM_CONST(0x0000000000040000)
+#define CPU_FTR_BIG_PHYS		ASM_CONST(0x0000000000080000)
+
+#ifdef __powerpc64__
+/* Add the 64b processor unique features in the top half of the word */
+#define CPU_FTR_SLB           		ASM_CONST(0x0000000100000000)
+#define CPU_FTR_16M_PAGE      		ASM_CONST(0x0000000200000000)
+#define CPU_FTR_TLBIEL         		ASM_CONST(0x0000000400000000)
+#define CPU_FTR_NOEXECUTE     		ASM_CONST(0x0000000800000000)
+#define CPU_FTR_NODSISRALIGN  		ASM_CONST(0x0000001000000000)
+#define CPU_FTR_IABR  			ASM_CONST(0x0000002000000000)
+#define CPU_FTR_MMCRA  			ASM_CONST(0x0000004000000000)
+/* unused 				ASM_CONST(0x0000008000000000) */
+#define CPU_FTR_SMT  			ASM_CONST(0x0000010000000000)
+#define CPU_FTR_COHERENT_ICACHE  	ASM_CONST(0x0000020000000000)
+#define CPU_FTR_LOCKLESS_TLBIE		ASM_CONST(0x0000040000000000)
+#define CPU_FTR_MMCRA_SIHV		ASM_CONST(0x0000080000000000)
+#define CPU_FTR_CTRL			ASM_CONST(0x0000100000000000)
+#endif
+
+#ifndef __ASSEMBLY__
+
+#define COMMON_USER_PPC64	(PPC_FEATURE_32 | PPC_FEATURE_64 | \
+				 PPC_FEATURE_HAS_FPU | PPC_FEATURE_HAS_MMU)
+
+#define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \
+					CPU_FTR_TLBIEL | CPU_FTR_NOEXECUTE | \
+					CPU_FTR_NODSISRALIGN | CPU_FTR_CTRL)
+
+/* iSeries doesn't support large pages */
+#ifdef CONFIG_PPC_ISERIES
+#define CPU_FTR_PPCAS_ARCH_V2	(CPU_FTR_PPCAS_ARCH_V2_BASE)
+#else
+#define CPU_FTR_PPCAS_ARCH_V2	(CPU_FTR_PPCAS_ARCH_V2_BASE | CPU_FTR_16M_PAGE)
+#endif /* CONFIG_PPC_ISERIES */
+
+/* We only set the altivec features if the kernel was compiled with altivec
+ * support
+ */
+#ifdef CONFIG_ALTIVEC
+#define CPU_FTR_ALTIVEC_COMP	CPU_FTR_ALTIVEC
+#define PPC_FEATURE_HAS_ALTIVEC_COMP PPC_FEATURE_HAS_ALTIVEC
+#else
+#define CPU_FTR_ALTIVEC_COMP	0
+#define PPC_FEATURE_HAS_ALTIVEC_COMP    0
+#endif
+
+/* We need to mark all pages as being coherent if we're SMP or we
+ * have a 74[45]x and an MPC107 host bridge.
+ */
+#if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE)
+#define CPU_FTR_COMMON                  CPU_FTR_NEED_COHERENT
+#else
+#define CPU_FTR_COMMON                  0
+#endif
+
+/* The powersave features NAP & DOZE seems to confuse BDI when
+   debugging. So if a BDI is used, disable theses
+ */
+#ifndef CONFIG_BDI_SWITCH
+#define CPU_FTR_MAYBE_CAN_DOZE	CPU_FTR_CAN_DOZE
+#define CPU_FTR_MAYBE_CAN_NAP	CPU_FTR_CAN_NAP
+#else
+#define CPU_FTR_MAYBE_CAN_DOZE	0
+#define CPU_FTR_MAYBE_CAN_NAP	0
+#endif
+
+#define CLASSIC_PPC (!defined(CONFIG_8xx) && !defined(CONFIG_4xx) && \
+		     !defined(CONFIG_POWER3) && !defined(CONFIG_POWER4) && \
+		     !defined(CONFIG_BOOKE))
+
+enum {
+	CPU_FTR_PPC601 = CPU_FTR_COMMON | CPU_FTR_601 | CPU_FTR_HPTE_TABLE,
+	CPU_FTR_603 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_604 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
+	CPU_FTR_740_NOTAU = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_740 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_750 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_750FX1 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
+	    CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM,
+	CPU_FTR_750FX2 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
+	    CPU_FTR_NO_DPM,
+	CPU_FTR_750FX = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
+	    CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS,
+	CPU_FTR_750GX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
+	    CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
+	    CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS,
+	CPU_FTR_7400_NOTAU = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
+	    CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_7400 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
+	    CPU_FTR_TAU | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
+	    CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_7450_20 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NEED_COHERENT,
+	CPU_FTR_7450_21 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
+	    CPU_FTR_NEED_COHERENT,
+	CPU_FTR_7450_23 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT,
+	CPU_FTR_7455_1 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_HAS_HIGH_BATS |
+	    CPU_FTR_NEED_COHERENT,
+	CPU_FTR_7455_20 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
+	    CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS,
+	CPU_FTR_7455 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
+	    CPU_FTR_NEED_COHERENT,
+	CPU_FTR_7447_10 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
+	    CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC,
+	CPU_FTR_7447 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
+	    CPU_FTR_NEED_COHERENT,
+	CPU_FTR_7447A = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB |
+	    CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
+	    CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
+	    CPU_FTR_NEED_COHERENT,
+	CPU_FTR_82XX = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB,
+	CPU_FTR_G2_LE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
+	    CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS,
+	CPU_FTR_E300 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
+	    CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS,
+	CPU_FTR_CLASSIC32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
+	CPU_FTR_POWER3_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
+	CPU_FTR_POWER4_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
+	CPU_FTR_970_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
+	    CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP |
+	    CPU_FTR_MAYBE_CAN_NAP,
+	CPU_FTR_8XX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
+	CPU_FTR_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
+	CPU_FTR_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
+	CPU_FTR_E200 = CPU_FTR_USE_TB,
+	CPU_FTR_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
+	CPU_FTR_E500_2 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_BIG_PHYS,
+	CPU_FTR_GENERIC_32 = CPU_FTR_COMMON,
+#ifdef __powerpc64__
+	CPU_FTR_POWER3 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
+	CPU_FTR_RS64 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
+	    CPU_FTR_MMCRA | CPU_FTR_CTRL,
+	CPU_FTR_POWER4 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
+	CPU_FTR_PPC970 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
+	    CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
+	CPU_FTR_POWER5 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
+	    CPU_FTR_MMCRA | CPU_FTR_SMT |
+	    CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
+	    CPU_FTR_MMCRA_SIHV,
+	CPU_FTR_CELL = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
+	    CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT,
+	CPU_FTR_COMPATIBLE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
+	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2,
+#endif
+	CPU_FTR_POSSIBLE =
+#if CLASSIC_PPC
+	    CPU_FTR_601 | CPU_FTR_603 | CPU_FTR_604 | CPU_FTR_740_NOTAU |
+	    CPU_FTR_740 | CPU_FTR_750 | CPU_FTR_750FX1 |
+	    CPU_FTR_750FX2 | CPU_FTR_750FX | CPU_FTR_750GX |
+	    CPU_FTR_7400_NOTAU | CPU_FTR_7400 | CPU_FTR_7450_20 |
+	    CPU_FTR_7450_21 | CPU_FTR_7450_23 | CPU_FTR_7455_1 |
+	    CPU_FTR_7455_20 | CPU_FTR_7455 | CPU_FTR_7447_10 |
+	    CPU_FTR_7447 | CPU_FTR_7447A | CPU_FTR_82XX |
+	    CPU_FTR_G2_LE | CPU_FTR_E300 | CPU_FTR_CLASSIC32 |
+#else
+	    CPU_FTR_GENERIC_32 |
+#endif
+#ifdef CONFIG_PPC64BRIDGE
+	    CPU_FTR_POWER3_32 |
+#endif
+#ifdef CONFIG_POWER4
+	    CPU_FTR_POWER4_32 | CPU_FTR_970_32 |
+#endif
+#ifdef CONFIG_8xx
+	    CPU_FTR_8XX |
+#endif
+#ifdef CONFIG_40x
+	    CPU_FTR_40X |
+#endif
+#ifdef CONFIG_44x
+	    CPU_FTR_44X |
+#endif
+#ifdef CONFIG_FSL_BOOKE
+	    CPU_FTR_E200 | CPU_FTR_E500 | CPU_FTR_E500_2 |
+#endif
+#ifdef CONFIG_CPU_POWER3
+	    CPU_FTR_POWER3 |
+#endif
+#ifdef CONFIG_CPU_RS64
+	    CPU_FTR_RS64 |
+#endif
+#ifdef CONFIG_CPU_POWER4
+	    CPU_FTR_POWER4 |
+#endif
+#ifdef CONFIG_CPU_PPC970
+	    CPU_FTR_PPC970 |
+#endif
+#ifdef CONFIG_CPU_POWER5
+	    CPU_FTR_POWER5 |
+#endif
+#ifdef CONFIG_CPU_CELL
+	    CPU_FTR_CELL |
+#endif
+	    0,
+	CPU_FTR_ALWAYS =
+#if CLASSIC_PPC
+	    CPU_FTR_601 & CPU_FTR_603 & CPU_FTR_604 & CPU_FTR_740_NOTAU &
+	    CPU_FTR_740 & CPU_FTR_750 & CPU_FTR_750FX1 &
+	    CPU_FTR_750FX2 & CPU_FTR_750FX & CPU_FTR_750GX &
+	    CPU_FTR_7400_NOTAU & CPU_FTR_7400 & CPU_FTR_7450_20 &
+	    CPU_FTR_7450_21 & CPU_FTR_7450_23 & CPU_FTR_7455_1 &
+	    CPU_FTR_7455_20 & CPU_FTR_7455 & CPU_FTR_7447_10 &
+	    CPU_FTR_7447 & CPU_FTR_7447A & CPU_FTR_82XX &
+	    CPU_FTR_G2_LE & CPU_FTR_E300 & CPU_FTR_CLASSIC32 &
+#else
+	    CPU_FTR_GENERIC_32 &
+#endif
+#ifdef CONFIG_PPC64BRIDGE
+	    CPU_FTR_POWER3_32 &
+#endif
+#ifdef CONFIG_POWER4
+	    CPU_FTR_POWER4_32 & CPU_FTR_970_32 &
+#endif
+#ifdef CONFIG_8xx
+	    CPU_FTR_8XX &
+#endif
+#ifdef CONFIG_40x
+	    CPU_FTR_40X &
+#endif
+#ifdef CONFIG_44x
+	    CPU_FTR_44X &
+#endif
+#ifdef CONFIG_FSL_BOOKE
+	    CPU_FTR_E200 & CPU_FTR_E500 & CPU_FTR_E500_2 &
+#endif
+#ifdef CONFIG_CPU_POWER3
+	    CPU_FTR_POWER3 &
+#endif
+#ifdef CONFIG_CPU_RS64
+	    CPU_FTR_RS64 &
+#endif
+#ifdef CONFIG_CPU_POWER4
+	    CPU_FTR_POWER4 &
+#endif
+#ifdef CONFIG_CPU_PPC970
+	    CPU_FTR_PPC970 &
+#endif
+#ifdef CONFIG_CPU_POWER5
+	    CPU_FTR_POWER5 &
+#endif
+#ifdef CONFIG_CPU_CELL
+	    CPU_FTR_CELL &
+#endif
+	    CPU_FTR_POSSIBLE,
+};
+
+static inline int cpu_has_feature(unsigned long feature)
+{
+	return (CPU_FTR_ALWAYS & feature) ||
+	       (CPU_FTR_POSSIBLE
+#ifndef __powerpc64__
+		& cur_cpu_spec[0]->cpu_features
+#else
+		& cur_cpu_spec->cpu_features
+#endif
+		& feature);
+}
+
+#endif /* __ASSEMBLY */
+
+#ifdef __ASSEMBLY__
+
+#define BEGIN_FTR_SECTION		98:
+
+#ifndef __powerpc64__
+#define END_FTR_SECTION(msk, val)		\
+99:						\
+	.section __ftr_fixup,"a";		\
+	.align 2;				\
+	.long msk;				\
+	.long val;				\
+	.long 98b;				\
+	.long 99b;				\
+	.previous
+#else /* __powerpc64__ */
+#define END_FTR_SECTION(msk, val)		\
+99:						\
+	.section __ftr_fixup,"a";		\
+	.align 3;				\
+	.llong msk;				\
+	.llong val;				\
+	.llong 98b;				\
+	.llong 99b;	 			\
+	.previous
+#endif /* __powerpc64__ */
+
+#else
+
+#define BEGIN_FTR_SECTION		"98:\n"
+
+#ifndef __powerpc64__
+#define END_FTR_SECTION(msk, val)		\
+"99:\n"						\
+"	.section __ftr_fixup,\"a\";\n"		\
+"	.align 2;\n"				\
+"	.long "#msk";\n"			\
+"	.long "#val";\n"			\
+"	.long 98b;\n"				\
+"	.long 99b;\n"	 			\
+"	.previous\n"
+#else /* __powerpc64__ */
+#define END_FTR_SECTION(msk, val)		\
+"99:\n"						\
+"	.section __ftr_fixup,\"a\";\n"		\
+"	.align 3;\n"				\
+"	.llong "#msk";\n"			\
+"	.llong "#val";\n"			\
+"	.llong 98b;\n"				\
+"	.llong 99b;\n"	 			\
+"	.previous\n"
+#endif /* __powerpc64__ */
+
+#endif /* __ASSEMBLY__ */
+
+#define END_FTR_SECTION_IFSET(msk)	END_FTR_SECTION((msk), (msk))
+#define END_FTR_SECTION_IFCLR(msk)	END_FTR_SECTION((msk), 0)
+
+#endif /* __KERNEL__ */
+#endif /* __ASM_POWERPC_CPUTABLE_H */
Index: clean-cg/include/asm-ppc/cputable.h
===================================================================
--- clean-cg.orig/include/asm-ppc/cputable.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  include/asm-ppc/cputable.h
- *
- *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version
- *  2 of the License, or (at your option) any later version.
- */
-
-#ifndef __ASM_PPC_CPUTABLE_H
-#define __ASM_PPC_CPUTABLE_H
-
-/* Exposed to userland CPU features */
-#define PPC_FEATURE_32			0x80000000
-#define PPC_FEATURE_64			0x40000000
-#define PPC_FEATURE_601_INSTR		0x20000000
-#define PPC_FEATURE_HAS_ALTIVEC		0x10000000
-#define PPC_FEATURE_HAS_FPU		0x08000000
-#define PPC_FEATURE_HAS_MMU		0x04000000
-#define PPC_FEATURE_HAS_4xxMAC		0x02000000
-#define PPC_FEATURE_UNIFIED_CACHE	0x01000000
-#define PPC_FEATURE_HAS_SPE		0x00800000
-#define PPC_FEATURE_HAS_EFP_SINGLE	0x00400000
-#define PPC_FEATURE_HAS_EFP_DOUBLE	0x00200000
-
-#ifdef __KERNEL__
-
-#ifndef __ASSEMBLY__
-
-/* This structure can grow, it's real size is used by head.S code
- * via the mkdefs mecanism.
- */
-struct cpu_spec;
-
-typedef	void (*cpu_setup_t)(unsigned long offset, int cpu_nr, struct cpu_spec* spec);
-
-struct cpu_spec {
-	/* CPU is matched via (PVR & pvr_mask) == pvr_value */
-	unsigned int	pvr_mask;
-	unsigned int	pvr_value;
-
-	char		*cpu_name;
-	unsigned int	cpu_features;		/* Kernel features */
-	unsigned int	cpu_user_features;	/* Userland features */
-
-	/* cache line sizes */
-	unsigned int	icache_bsize;
-	unsigned int	dcache_bsize;
-
-	/* number of performance monitor counters */
-	unsigned int	num_pmcs;
-
-	/* this is called to initialize various CPU bits like L1 cache,
-	 * BHT, SPD, etc... from head.S before branching to identify_machine
-	 */
-	cpu_setup_t	cpu_setup;
-};
-
-extern struct cpu_spec		cpu_specs[];
-extern struct cpu_spec		*cur_cpu_spec[];
-
-static inline unsigned int cpu_has_feature(unsigned int feature)
-{
-	return cur_cpu_spec[0]->cpu_features & feature;
-}
-
-#endif /* __ASSEMBLY__ */
-
-/* CPU kernel features */
-#define CPU_FTR_SPLIT_ID_CACHE		0x00000001
-#define CPU_FTR_L2CR			0x00000002
-#define CPU_FTR_SPEC7450		0x00000004
-#define CPU_FTR_ALTIVEC			0x00000008
-#define CPU_FTR_TAU			0x00000010
-#define CPU_FTR_CAN_DOZE		0x00000020
-#define CPU_FTR_USE_TB			0x00000040
-#define CPU_FTR_604_PERF_MON		0x00000080
-#define CPU_FTR_601			0x00000100
-#define CPU_FTR_HPTE_TABLE		0x00000200
-#define CPU_FTR_CAN_NAP			0x00000400
-#define CPU_FTR_L3CR			0x00000800
-#define CPU_FTR_L3_DISABLE_NAP		0x00001000
-#define CPU_FTR_NAP_DISABLE_L2_PR	0x00002000
-#define CPU_FTR_DUAL_PLL_750FX		0x00004000
-#define CPU_FTR_NO_DPM			0x00008000
-#define CPU_FTR_HAS_HIGH_BATS		0x00010000
-#define CPU_FTR_NEED_COHERENT		0x00020000
-#define CPU_FTR_NO_BTIC			0x00040000
-#define CPU_FTR_BIG_PHYS		0x00080000
-
-#ifdef __ASSEMBLY__
-
-#define BEGIN_FTR_SECTION		98:
-
-#define END_FTR_SECTION(msk, val)		\
-99:						\
-	.section __ftr_fixup,"a";		\
-	.align 2;				\
-	.long msk;				\
-	.long val;				\
-	.long 98b;				\
-	.long 99b;				\
-	.previous
-
-#else
-
-#define BEGIN_FTR_SECTION		"98:\n"
-#define END_FTR_SECTION(msk, val)		\
-"99:\n"						\
-"	.section __ftr_fixup,\"a\";\n"		\
-"	.align 2;\n"				\
-"	.long "#msk";\n"			\
-"	.long "#val";\n"			\
-"	.long 98b;\n"			        \
-"	.long 99b;\n"	 		        \
-"	.previous\n"
-
-
-#endif /* __ASSEMBLY__ */
-
-#define END_FTR_SECTION_IFSET(msk)	END_FTR_SECTION((msk), (msk))
-#define END_FTR_SECTION_IFCLR(msk)	END_FTR_SECTION((msk), 0)
-
-#endif /* __ASM_PPC_CPUTABLE_H */
-#endif /* __KERNEL__ */
-

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: cpu features testing 32 vs 64 bit
  2005-09-08 21:20   ` Kumar Gala
  2005-09-08 21:48     ` Dan Malek
@ 2005-09-09 22:19     ` Benjamin Herrenschmidt
  1 sibling, 0 replies; 18+ messages in thread
From: Benjamin Herrenschmidt @ 2005-09-09 22:19 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc-dev, linuxppc64-dev, linuxppc-embedded,
	pantelis.antoniou


> 
> I think she lost the I in ICACHE... its a power5 only feature at this  
> point.

And good old 601 too :) It has a unified cache. We could make a common
feature bit for these.

Ben.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-09  4:23           ` [PATCH] powerpc: merge include/asm/cputable.h Arnd Bergmann
@ 2005-09-14 19:11             ` Kumar Gala
  2005-09-14 23:58               ` Arnd Bergmann
  0 siblings, 1 reply; 18+ messages in thread
From: Kumar Gala @ 2005-09-14 19:11 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

Arnd,

I not sure I understand what the introduction of the enum's gets us.

- kumar

On Sep 8, 2005, at 11:23 PM, Arnd Bergmann wrote:

> This is an updated version of my old patch that creates a more  
> optimized
> version of cpu_has_feature(). This version actually combines
> asm-ppc/cputable.h and asm-ppc64/cputable.h, which turned out to be
> a lot more work than only the 64 bit version.
>
> The 64 bit parts a relatively straightforward port of my earlier work
> which I tested in a number of configurations. The 32 bit parts are
> not tested at all, all I did was compiling the ppc defconfig with  
> this.
>
> I think it is best if I hand the patch over to Kumar and Becky for
> further testing and cleaning up the remaining bits in the new
> file, as they appear to have invested some thought in it already.
> This version still has a number of #ifdef __powerpc64__ that should
> probably go away in the process.
>
> The patch also relies on having the ASM_CONST() macro in ppc_asm.h,
> as proposed by Kumar Gala, so it won't work on the current git
> head without that change.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
>
> --
>
>  clean-cg/arch/ppc/kernel/cputable.c     |  401 ++++ 
> +----------------------
>  clean-cg/arch/ppc64/Kconfig             |   30 ++
>  clean-cg/arch/ppc64/kernel/cputable.c   |   82 +----
>  clean-cg/include/asm-powerpc/cputable.h |  475 ++++++++++++++++++++ 
> ++++++++++++
>  include/asm-ppc/cputable.h              |  128 --------
>  include/asm-ppc64/cputable.h            |  167 -----------
>
> Index: clean-cg/include/asm-ppc64/cputable.h
> ===================================================================
> --- clean-cg.orig/include/asm-ppc64/cputable.h
> +++ /dev/null
> @@ -1,167 +0,0 @@
> -/*
> - *  include/asm-ppc64/cputable.h
> - *
> - *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
> - *
> - *  Modifications for ppc64:
> - *      Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
> - *
> - *  This program is free software; you can redistribute it and/or
> - *  modify it under the terms of the GNU General Public License
> - *  as published by the Free Software Foundation; either version
> - *  2 of the License, or (at your option) any later version.
> - */
> -
> -#ifndef __ASM_PPC_CPUTABLE_H
> -#define __ASM_PPC_CPUTABLE_H
> -
> -#include <linux/config.h>
> -#include <asm/page.h> /* for ASM_CONST */
> -
> -/* Exposed to userland CPU features - Must match ppc32 definitions */
> -#define PPC_FEATURE_32            0x80000000
> -#define PPC_FEATURE_64            0x40000000
> -#define PPC_FEATURE_601_INSTR        0x20000000
> -#define PPC_FEATURE_HAS_ALTIVEC        0x10000000
> -#define PPC_FEATURE_HAS_FPU        0x08000000
> -#define PPC_FEATURE_HAS_MMU        0x04000000
> -#define PPC_FEATURE_HAS_4xxMAC        0x02000000
> -#define PPC_FEATURE_UNIFIED_CACHE    0x01000000
> -
> -#ifdef __KERNEL__
> -
> -#ifndef __ASSEMBLY__
> -
> -/* This structure can grow, it's real size is used by head.S code
> - * via the mkdefs mechanism.
> - */
> -struct cpu_spec;
> -struct op_ppc64_model;
> -
> -typedef    void (*cpu_setup_t)(unsigned long offset, struct  
> cpu_spec* spec);
> -
> -struct cpu_spec {
> -    /* CPU is matched via (PVR & pvr_mask) == pvr_value */
> -    unsigned int    pvr_mask;
> -    unsigned int    pvr_value;
> -
> -    char        *cpu_name;
> -    unsigned long    cpu_features;        /* Kernel features */
> -    unsigned int    cpu_user_features;    /* Userland features */
> -
> -    /* cache line sizes */
> -    unsigned int    icache_bsize;
> -    unsigned int    dcache_bsize;
> -
> -    /* number of performance monitor counters */
> -    unsigned int    num_pmcs;
> -
> -    /* this is called to initialize various CPU bits like L1 cache,
> -     * BHT, SPD, etc... from head.S before branching to  
> identify_machine
> -     */
> -    cpu_setup_t    cpu_setup;
> -
> -    /* Used by oprofile userspace to select the right counters */
> -    char        *oprofile_cpu_type;
> -
> -    /* Processor specific oprofile operations */
> -    struct op_ppc64_model *oprofile_model;
> -};
> -
> -extern struct cpu_spec        cpu_specs[];
> -extern struct cpu_spec        *cur_cpu_spec;
> -
> -static inline unsigned long cpu_has_feature(unsigned long feature)
> -{
> -    return cur_cpu_spec->cpu_features & feature;
> -}
> -
> -#endif /* __ASSEMBLY__ */
> -
> -/* CPU kernel features */
> -
> -/* Retain the 32b definitions for the time being - use bottom half  
> of word */
> -#define CPU_FTR_SPLIT_ID_CACHE        ASM_CONST(0x0000000000000001)
> -#define CPU_FTR_L2CR            ASM_CONST(0x0000000000000002)
> -#define CPU_FTR_SPEC7450        ASM_CONST(0x0000000000000004)
> -#define CPU_FTR_ALTIVEC            ASM_CONST(0x0000000000000008)
> -#define CPU_FTR_TAU            ASM_CONST(0x0000000000000010)
> -#define CPU_FTR_CAN_DOZE        ASM_CONST(0x0000000000000020)
> -#define CPU_FTR_USE_TB            ASM_CONST(0x0000000000000040)
> -#define CPU_FTR_604_PERF_MON        ASM_CONST(0x0000000000000080)
> -#define CPU_FTR_601            ASM_CONST(0x0000000000000100)
> -#define CPU_FTR_HPTE_TABLE        ASM_CONST(0x0000000000000200)
> -#define CPU_FTR_CAN_NAP            ASM_CONST(0x0000000000000400)
> -#define CPU_FTR_L3CR            ASM_CONST(0x0000000000000800)
> -#define CPU_FTR_L3_DISABLE_NAP        ASM_CONST(0x0000000000001000)
> -#define CPU_FTR_NAP_DISABLE_L2_PR    ASM_CONST(0x0000000000002000)
> -#define CPU_FTR_DUAL_PLL_750FX        ASM_CONST(0x0000000000004000)
> -
> -/* Add the 64b processor unique features in the top half of the  
> word */
> -#define CPU_FTR_SLB                   ASM_CONST(0x0000000100000000)
> -#define CPU_FTR_16M_PAGE              ASM_CONST(0x0000000200000000)
> -#define CPU_FTR_TLBIEL                 ASM_CONST(0x0000000400000000)
> -#define CPU_FTR_NOEXECUTE             ASM_CONST(0x0000000800000000)
> -#define CPU_FTR_NODSISRALIGN          ASM_CONST(0x0000001000000000)
> -#define CPU_FTR_IABR              ASM_CONST(0x0000002000000000)
> -#define CPU_FTR_MMCRA              ASM_CONST(0x0000004000000000)
> -/* unused                 ASM_CONST(0x0000008000000000) */
> -#define CPU_FTR_SMT              ASM_CONST(0x0000010000000000)
> -#define CPU_FTR_COHERENT_ICACHE      ASM_CONST(0x0000020000000000)
> -#define CPU_FTR_LOCKLESS_TLBIE        ASM_CONST(0x0000040000000000)
> -#define CPU_FTR_MMCRA_SIHV        ASM_CONST(0x0000080000000000)
> -#define CPU_FTR_CTRL            ASM_CONST(0x0000100000000000)
> -
> -#ifndef __ASSEMBLY__
> -
> -#define COMMON_USER_PPC64    (PPC_FEATURE_32 | PPC_FEATURE_64 | \
> -                     PPC_FEATURE_HAS_FPU | PPC_FEATURE_HAS_MMU)
> -
> -#define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \
> -                                 CPU_FTR_TLBIEL |  
> CPU_FTR_NOEXECUTE | \
> -                                 CPU_FTR_NODSISRALIGN | CPU_FTR_CTRL)
> -
> -/* iSeries doesn't support large pages */
> -#ifdef CONFIG_PPC_ISERIES
> -#define CPU_FTR_PPCAS_ARCH_V2    (CPU_FTR_PPCAS_ARCH_V2_BASE)
> -#else
> -#define CPU_FTR_PPCAS_ARCH_V2    (CPU_FTR_PPCAS_ARCH_V2_BASE |  
> CPU_FTR_16M_PAGE)
> -#endif /* CONFIG_PPC_ISERIES */
> -
> -#endif /* __ASSEMBLY */
> -
> -#ifdef __ASSEMBLY__
> -
> -#define BEGIN_FTR_SECTION        98:
> -
> -#define END_FTR_SECTION(msk, val)        \
> -99:                        \
> -    .section __ftr_fixup,"a";        \
> -    .align 3;                \
> -    .llong msk;                    \
> -    .llong val;                    \
> -    .llong 98b;                    \
> -    .llong 99b;                     \
> -    .previous
> -
> -#else
> -
> -#define BEGIN_FTR_SECTION        "98:\n"
> -#define END_FTR_SECTION(msk, val)        \
> -"99:\n"                        \
> -"    .section __ftr_fixup,\"a\";\n"        \
> -"    .align 3;\n"                \
> -"    .llong "#msk";\n"            \
> -"    .llong "#val";\n"            \
> -"    .llong 98b;\n"                    \
> -"    .llong 99b;\n"                     \
> -"    .previous\n"
> -
> -#endif /* __ASSEMBLY__ */
> -
> -#define END_FTR_SECTION_IFSET(msk)    END_FTR_SECTION((msk), (msk))
> -#define END_FTR_SECTION_IFCLR(msk)    END_FTR_SECTION((msk), 0)
> -
> -#endif /* __ASM_PPC_CPUTABLE_H */
> -#endif /* __KERNEL__ */
> -
> Index: clean-cg/arch/ppc64/Kconfig
> ===================================================================
> --- clean-cg.orig/arch/ppc64/Kconfig
> +++ clean-cg/arch/ppc64/Kconfig
> @@ -125,6 +125,36 @@ config BPA_IIC
>      bool
>      default y
>
> +config CPU_POWER3
> +    bool
> +    default y
> +    depends on (PPC_ISERIES || PPC_PSERIES) && !POWER4_ONLY
> +
> +config CPU_RS64
> +    bool
> +    default y
> +    depends on (PPC_ISERIES || PPC_PSERIES) && !POWER4_ONLY
> +
> +config CPU_POWER4
> +    bool
> +    default y
> +    depends on PPC_ISERIES || PPC_PSERIES
> +
> +config CPU_PPC970
> +    bool
> +    default y
> +    depends on PPC_PSERIES || PPC_PMAC || PPC_MAPLE
> +
> +config CPU_POWER5
> +    bool
> +    default y
> +    depends on PPC_PSERIES
> +
> +config CPU_CELL
> +    bool
> +    default y
> +    depends on PPC_BPA
> +
>  # VMX is pSeries only for now until somebody writes the iSeries
>  # exception vectors for it
>  config ALTIVEC
> Index: clean-cg/arch/ppc64/kernel/cputable.c
> ===================================================================
> --- clean-cg.orig/arch/ppc64/kernel/cputable.c
> +++ clean-cg/arch/ppc64/kernel/cputable.c
> @@ -37,26 +37,13 @@ extern void __setup_cpu_power4(unsigned
>  extern void __setup_cpu_ppc970(unsigned long offset, struct  
> cpu_spec* spec);
>  extern void __setup_cpu_be(unsigned long offset, struct cpu_spec*  
> spec);
>
> -
> -/* We only set the altivec features if the kernel was compiled  
> with altivec
> - * support
> - */
> -#ifdef CONFIG_ALTIVEC
> -#define CPU_FTR_ALTIVEC_COMP    CPU_FTR_ALTIVEC
> -#define PPC_FEATURE_HAS_ALTIVEC_COMP PPC_FEATURE_HAS_ALTIVEC
> -#else
> -#define CPU_FTR_ALTIVEC_COMP    0
> -#define PPC_FEATURE_HAS_ALTIVEC_COMP    0
> -#endif
> -
>  struct cpu_spec    cpu_specs[] = {
>      {    /* Power3 */
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00400000,
>          .cpu_name        = "POWER3 (630)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
> -        .cpu_user_features = COMMON_USER_PPC64,
> +        .cpu_features        = CPU_FTR_POWER3,
> +        .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
>          .num_pmcs        = 8,
> @@ -70,8 +57,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00410000,
>          .cpu_name        = "POWER3 (630+)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
> +        .cpu_features        = CPU_FTR_POWER3,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -86,9 +72,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00330000,
>          .cpu_name        = "RS64-II (northstar)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
> -            CPU_FTR_MMCRA | CPU_FTR_CTRL,
> +        .cpu_features        = CPU_FTR_RS64,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -103,9 +87,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00340000,
>          .cpu_name        = "RS64-III (pulsar)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
> -            CPU_FTR_MMCRA | CPU_FTR_CTRL,
> +        .cpu_features        = CPU_FTR_RS64,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -120,9 +102,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00360000,
>          .cpu_name        = "RS64-III (icestar)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
> -            CPU_FTR_MMCRA | CPU_FTR_CTRL,
> +        .cpu_features        = CPU_FTR_RS64,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -137,9 +117,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00370000,
>          .cpu_name        = "RS64-IV (sstar)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
> -            CPU_FTR_MMCRA | CPU_FTR_CTRL,
> +        .cpu_features        = CPU_FTR_RS64,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -154,9 +132,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00350000,
>          .cpu_name        = "POWER4 (gp)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
> +        .cpu_features        = CPU_FTR_POWER4,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -171,9 +147,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00380000,
>          .cpu_name        = "POWER4+ (gq)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
> +        .cpu_features        = CPU_FTR_POWER4,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -188,10 +162,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00390000,
>          .cpu_name        = "PPC970",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
> -            CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
> +        .cpu_features        = CPU_FTR_PPC970,
>          .cpu_user_features    = COMMON_USER_PPC64 |
>              PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 128,
> @@ -207,10 +178,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x003c0000,
>          .cpu_name        = "PPC970FX",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
> -            CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
> +        .cpu_features        = CPU_FTR_PPC970,
>          .cpu_user_features    = COMMON_USER_PPC64 |
>              PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 128,
> @@ -226,10 +194,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00440000,
>          .cpu_name        = "PPC970MP",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
> -            CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
> +        .cpu_features        = CPU_FTR_PPC970,
>          .cpu_user_features    = COMMON_USER_PPC64 |
>              PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 128,
> @@ -244,11 +209,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x003a0000,
>          .cpu_name        = "POWER5 (gr)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
> -            CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
> -            CPU_FTR_MMCRA_SIHV,
> +        .cpu_features        = CPU_FTR_POWER5,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -263,11 +224,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x003b0000,
>          .cpu_name        = "POWER5 (gs)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
> -            CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
> -            CPU_FTR_MMCRA_SIHV,
> +        .cpu_features        = CPU_FTR_POWER5,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -281,11 +238,8 @@ struct cpu_spec    cpu_specs[] = {
>      {    /* BE DD1.x */
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00700000,
> -        .cpu_name        = "Broadband Engine",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
> -            CPU_FTR_SMT,
> +        .cpu_name        = "Cell Broadband Engine",
> +        .cpu_features        = CPU_FTR_CELL,
>          .cpu_user_features    = COMMON_USER_PPC64 |
>              PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 128,
> @@ -296,9 +250,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0x00000000,
>          .pvr_value        = 0x00000000,
>          .cpu_name        = "POWER4 (compatible)",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_PPCAS_ARCH_V2,
> +        .cpu_features        = CPU_FTR_COMPATIBLE,
>          .cpu_user_features    = COMMON_USER_PPC64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> Index: clean-cg/arch/ppc/kernel/cputable.c
> ===================================================================
> --- clean-cg.orig/arch/ppc/kernel/cputable.c
> +++ clean-cg/arch/ppc/kernel/cputable.c
> @@ -42,17 +42,6 @@ extern void __setup_cpu_generic(unsigned
>  #define COMMON_PPC    (PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \
>               PPC_FEATURE_HAS_MMU)
>
> -/* We only set the altivec features if the kernel was compiled  
> with altivec
> - * support
> - */
> -#ifdef CONFIG_ALTIVEC
> -#define CPU_FTR_ALTIVEC_COMP        CPU_FTR_ALTIVEC
> -#define PPC_FEATURE_ALTIVEC_COMP        PPC_FEATURE_HAS_ALTIVEC
> -#else
> -#define CPU_FTR_ALTIVEC_COMP        0
> -#define PPC_FEATURE_ALTIVEC_COMP           0
> -#endif
> -
>  /* We only set the spe features if the kernel was compiled with
>   * spe support
>   */
> @@ -62,34 +51,13 @@ extern void __setup_cpu_generic(unsigned
>  #define PPC_FEATURE_SPE_COMP           0
>  #endif
>
> -/* We need to mark all pages as being coherent if we're SMP or we
> - * have a 74[45]x and an MPC107 host bridge.
> - */
> -#if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE)
> -#define CPU_FTR_COMMON                  CPU_FTR_NEED_COHERENT
> -#else
> -#define CPU_FTR_COMMON                  0
> -#endif
> -
> -/* The powersave features NAP & DOZE seems to confuse BDI when
> -   debugging. So if a BDI is used, disable theses
> - */
> -#ifndef CONFIG_BDI_SWITCH
> -#define CPU_FTR_MAYBE_CAN_DOZE    CPU_FTR_CAN_DOZE
> -#define CPU_FTR_MAYBE_CAN_NAP    CPU_FTR_CAN_NAP
> -#else
> -#define CPU_FTR_MAYBE_CAN_DOZE    0
> -#define CPU_FTR_MAYBE_CAN_NAP    0
> -#endif
> -
>  struct cpu_spec    cpu_specs[] = {
>  #if CLASSIC_PPC
>      {     /* 601 */
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00010000,
>          .cpu_name        = "601",
> -        .cpu_features        = CPU_FTR_COMMON | CPU_FTR_601 |
> -            CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_PPC601,
>          .cpu_user_features     = COMMON_PPC | PPC_FEATURE_601_INSTR |
>              PPC_FEATURE_UNIFIED_CACHE,
>          .icache_bsize        = 32,
> @@ -100,9 +68,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00030000,
>          .cpu_name        = "603",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_603,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -112,9 +78,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00060000,
>          .cpu_name        = "603e",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_603,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -124,9 +88,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00070000,
>          .cpu_name        = "603ev",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_603,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -136,9 +98,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00040000,
>          .cpu_name        = "604",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_604,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -149,9 +109,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xfffff000,
>          .pvr_value        = 0x00090000,
>          .cpu_name        = "604e",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_604,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -162,9 +120,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00090000,
>          .cpu_name        = "604r",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_604,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -175,9 +131,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x000a0000,
>          .cpu_name        = "604ev",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_604,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -188,10 +142,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x00084202,
>          .cpu_name        = "740/750",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_740_NOTAU,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -202,10 +153,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xfffffff0,
>          .pvr_value        = 0x00080100,
>          .cpu_name        = "750CX",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_750,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -216,10 +164,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xfffffff0,
>          .pvr_value        = 0x00082200,
>          .cpu_name        = "750CX",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_750,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -230,10 +175,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xfffffff0,
>          .pvr_value        = 0x00082210,
>          .cpu_name        = "750CXe",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_750,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -244,10 +186,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x00083214,
>          .cpu_name        = "750CXe",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_750,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -258,10 +197,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xfffff000,
>          .pvr_value        = 0x00083000,
>          .cpu_name        = "745/755",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_750,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -272,11 +208,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffff00,
>          .pvr_value        = 0x70000100,
>          .cpu_name        = "750FX",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> -            CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM,
> +        .cpu_features        = CPU_FTR_750FX1,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -287,11 +219,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x70000200,
>          .cpu_name        = "750FX",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> -            CPU_FTR_NO_DPM,
> +        .cpu_features        = CPU_FTR_750FX2,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -302,11 +230,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x70000000,
>          .cpu_name        = "750FX",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> -            CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS,
> +        .cpu_features        = CPU_FTR_750FX,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -317,11 +241,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x70020000,
>          .cpu_name        = "750GX",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
> -            CPU_FTR_L2CR | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_DUAL_PLL_750FX |
> -            CPU_FTR_HAS_HIGH_BATS,
> +        .cpu_features        = CPU_FTR_750GX,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -332,10 +252,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00080000,
>          .cpu_name        = "740/750",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +        .cpu_features        = CPU_FTR_740,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -346,11 +263,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x000c1101,
>          .cpu_name        = "7400 (1.1)",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7400_NOTAU,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 4,
> @@ -360,12 +274,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x000c0000,
>          .cpu_name        = "7400",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_MAYBE_CAN_NAP,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7400,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 4,
> @@ -375,12 +285,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x800c0000,
>          .cpu_name        = "7410",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_MAYBE_CAN_NAP,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7400,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 4,
> @@ -390,12 +296,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x80000200,
>          .cpu_name        = "7450",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7450_20,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -405,14 +307,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x80000201,
>          .cpu_name        = "7450",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
> -            CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7450_21,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -422,13 +318,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x80000000,
>          .cpu_name        = "7450",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7450_23,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -438,12 +329,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffff00,
>          .pvr_value        = 0x80010100,
>          .cpu_name        = "7455",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_HAS_HIGH_BATS | CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7455_1,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -453,14 +340,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x80010200,
>          .cpu_name        = "7455",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
> -            CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7455_20,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -470,14 +351,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x80010000,
>          .cpu_name        = "7455",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> -            CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7455,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -487,14 +362,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x80020100,
>          .cpu_name        = "7447/7457",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> -            CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7447_10,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -504,14 +373,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffffff,
>          .pvr_value        = 0x80020101,
>          .cpu_name        = "7447/7457",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> -            CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7447_10,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -521,14 +384,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x80020000,
>          .cpu_name        = "7447/7457",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> -            CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> -            CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> -            CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7447,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -538,13 +395,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x80030000,
>          .cpu_name        = "7447A",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_SPEC7450 | CPU_FTR_NAP_DISABLE_L2_PR |
> -            CPU_FTR_HAS_HIGH_BATS | CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7447A,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -554,13 +406,8 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x80040000,
>          .cpu_name        = "7448",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_SPEC7450 | CPU_FTR_NAP_DISABLE_L2_PR |
> -            CPU_FTR_HAS_HIGH_BATS | CPU_FTR_NEED_COHERENT,
> -        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_7447A,
> +        .cpu_user_features    = COMMON_PPC |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
>          .num_pmcs        = 6,
> @@ -570,9 +417,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0x7fff0000,
>          .pvr_value        = 0x00810000,
>          .cpu_name        = "82xx",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_82XX,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -582,9 +427,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0x7fff0000,
>          .pvr_value        = 0x00820000,
>          .cpu_name        = "G2_LE",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS,
> +        .cpu_features        = CPU_FTR_G2_LE,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -594,9 +437,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0x7fff0000,
>          .pvr_value        = 0x00830000,
>          .cpu_name        = "e300",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
> -            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS,
> +        .cpu_features        = CPU_FTR_E300,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -606,9 +447,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0x00000000,
>          .pvr_value        = 0x00000000,
>          .cpu_name        = "(generic PPC)",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_CLASSIC32,
>          .cpu_user_features    = COMMON_PPC,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -620,9 +459,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00400000,
>          .cpu_name        = "Power3 (630)",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_POWER3_32,
>          .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -633,9 +470,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00410000,
>          .cpu_name        = "Power3 (630+)",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_POWER3_32,
>          .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -646,9 +481,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00360000,
>          .cpu_name        = "I-star",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_POWER3_32,
>          .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
> @@ -659,55 +492,19 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00370000,
>          .cpu_name        = "S-star",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE,
> +        .cpu_features        = CPU_FTR_POWER3_32,
>          .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
>          .num_pmcs        = 8,
>          .cpu_setup        = __setup_cpu_power3
>      },
> -#endif /* CONFIG_PPC64BRIDGE */
> -#ifdef CONFIG_POWER4
> -    {    /* Power4 */
> -        .pvr_mask        = 0xffff0000,
> -        .pvr_value        = 0x00350000,
> -        .cpu_name        = "Power4",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE,
> -        .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64,
> -        .icache_bsize        = 128,
> -        .dcache_bsize        = 128,
> -        .num_pmcs        = 8,
> -        .cpu_setup        = __setup_cpu_power4
> -    },
> -    {    /* PPC970 */
> -        .pvr_mask        = 0xffff0000,
> -        .pvr_value        = 0x00390000,
> -        .cpu_name        = "PPC970",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_MAYBE_CAN_NAP,
> -        .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64 |
> -            PPC_FEATURE_ALTIVEC_COMP,
> -        .icache_bsize        = 128,
> -        .dcache_bsize        = 128,
> -        .num_pmcs        = 8,
> -        .cpu_setup        = __setup_cpu_ppc970
> -    },
>      {    /* PPC970FX */
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x003c0000,
>          .cpu_name        = "PPC970FX",
> -        .cpu_features        = CPU_FTR_COMMON |
> -            CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> -            CPU_FTR_HPTE_TABLE |
> -            CPU_FTR_ALTIVEC_COMP | CPU_FTR_MAYBE_CAN_NAP,
> -        .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64 |
> -            PPC_FEATURE_ALTIVEC_COMP,
> +        .cpu_features        = CPU_FTR_970_32,
> +        .cpu_user_features    = COMMON_PPC | PPC_FEATURE_64 |  
> PPC_FEATURE_HAS_ALTIVEC_COMP,
>          .icache_bsize        = 128,
>          .dcache_bsize        = 128,
>          .num_pmcs        = 8,
> @@ -721,8 +518,7 @@ struct cpu_spec    cpu_specs[] = {
>          .cpu_name        = "8xx",
>          /* CPU_FTR_MAYBE_CAN_DOZE is possible,
>           * if the 8xx code is there.... */
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_8XX,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 16,
>          .dcache_bsize        = 16,
> @@ -733,8 +529,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffff00,
>          .pvr_value        = 0x00200200,
>          .cpu_name        = "403GC",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 16,
>          .dcache_bsize        = 16,
> @@ -743,8 +538,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffffff00,
>          .pvr_value        = 0x00201400,
>          .cpu_name        = "403GCX",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 16,
>          .dcache_bsize        = 16,
> @@ -753,8 +547,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x00200000,
>          .cpu_name        = "403G ??",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 16,
>          .dcache_bsize        = 16,
> @@ -763,8 +556,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x40110000,
>          .cpu_name        = "405GP",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -774,8 +566,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x40130000,
>          .cpu_name        = "STB03xxx",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -785,8 +576,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x41810000,
>          .cpu_name        = "STB04xxx",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -796,8 +586,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x41610000,
>          .cpu_name        = "NP405L",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -807,8 +596,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x40B10000,
>          .cpu_name        = "NP4GS3",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -818,8 +606,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x41410000,
>          .cpu_name        = "NP405H",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -829,8 +616,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x50910000,
>          .cpu_name        = "405GPr",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -840,8 +626,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x51510000,
>          .cpu_name        = "STBx25xx",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -851,8 +636,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x41F10000,
>          .cpu_name        = "405LP",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -861,8 +645,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x20010000,
>          .cpu_name        = "Virtex-II Pro",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -872,8 +655,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xffff0000,
>          .pvr_value        = 0x51210000,
>          .cpu_name        = "405EP",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_40X,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
>          .icache_bsize        = 32,
> @@ -886,8 +668,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x40000850,
>          .cpu_name        = "440EP Rev. A",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = COMMON_PPC, /* 440EP has an FPU */
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -896,8 +677,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x400008d3,
>          .cpu_name        = "440EP Rev. B",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = COMMON_PPC, /* 440EP has an FPU */
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -906,8 +686,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x40000440,
>          .cpu_name        = "440GP Rev. B",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -916,8 +695,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x40000481,
>          .cpu_name        = "440GP Rev. C",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -926,8 +704,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x50000850,
>          .cpu_name        = "440GX Rev. A",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -936,8 +713,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x50000851,
>          .cpu_name        = "440GX Rev. B",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -946,8 +722,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x50000892,
>          .cpu_name        = "440GX Rev. C",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -956,8 +731,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xf0000fff,
>          .pvr_value        = 0x50000894,
>          .cpu_name        = "440GX Rev. F",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -966,8 +740,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0xff000fff,
>          .pvr_value        = 0x53000891,
>          .cpu_name        = "440SP Rev. A",
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_44X,
>          .cpu_user_features    = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> @@ -979,7 +752,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_value        = 0x81000000,
>          .cpu_name        = "e200z5",
>          /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
> -        .cpu_features        = CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_E200,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_EFP_SINGLE |
>              PPC_FEATURE_UNIFIED_CACHE,
> @@ -990,7 +763,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_value        = 0x81100000,
>          .cpu_name        = "e200z6",
>          /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
> -        .cpu_features        = CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_E200,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
>              PPC_FEATURE_HAS_EFP_SINGLE |
> @@ -1002,8 +775,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_value        = 0x80200000,
>          .cpu_name        = "e500",
>          /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB,
> +        .cpu_features        = CPU_FTR_E500,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
>              PPC_FEATURE_HAS_EFP_SINGLE,
> @@ -1016,8 +788,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_value        = 0x80210000,
>          .cpu_name        = "e500v2",
>          /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
> -        .cpu_features        = CPU_FTR_SPLIT_ID_CACHE |
> -            CPU_FTR_USE_TB | CPU_FTR_BIG_PHYS,
> +        .cpu_features        = CPU_FTR_E500_2,
>          .cpu_user_features    = PPC_FEATURE_32 |
>              PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP |
>              PPC_FEATURE_HAS_EFP_SINGLE | PPC_FEATURE_HAS_EFP_DOUBLE,
> @@ -1031,7 +802,7 @@ struct cpu_spec    cpu_specs[] = {
>          .pvr_mask        = 0x00000000,
>          .pvr_value        = 0x00000000,
>          .cpu_name        = "(generic PPC)",
> -        .cpu_features        = CPU_FTR_COMMON,
> +        .cpu_features        = CPU_FTR_GENERIC_32,
>          .cpu_user_features    = PPC_FEATURE_32,
>          .icache_bsize        = 32,
>          .dcache_bsize        = 32,
> Index: clean-cg/include/asm-powerpc/cputable.h
> ===================================================================
> --- /dev/null
> +++ clean-cg/include/asm-powerpc/cputable.h
> @@ -0,0 +1,475 @@
> +#ifndef __ASM_POWERPC_CPUTABLE_H
> +#define __ASM_POWERPC_CPUTABLE_H
> +
> +#ifdef __KERNEL__
> +#include <linux/config.h>
> +#include <asm/ppc_asm.h> /* for ASM_CONST */
> +
> +#define PPC_FEATURE_32            0x80000000
> +#define PPC_FEATURE_64            0x40000000
> +#define PPC_FEATURE_601_INSTR        0x20000000
> +#define PPC_FEATURE_HAS_ALTIVEC        0x10000000
> +#define PPC_FEATURE_HAS_FPU        0x08000000
> +#define PPC_FEATURE_HAS_MMU        0x04000000
> +#define PPC_FEATURE_HAS_4xxMAC        0x02000000
> +#define PPC_FEATURE_UNIFIED_CACHE    0x01000000
> +#define PPC_FEATURE_HAS_SPE        0x00800000
> +#define PPC_FEATURE_HAS_EFP_SINGLE    0x00400000
> +#define PPC_FEATURE_HAS_EFP_DOUBLE    0x00200000
> +
> +#ifndef __ASSEMBLY__
> +
> +/* This structure can grow, it's real size is used by head.S code
> + * via the mkdefs mechanism.
> + */
> +struct cpu_spec;
> +struct op_ppc64_model;
> +
> +#ifndef __powerpc64__
> +typedef    void (*cpu_setup_t)(unsigned long offset, int cpu_nr,  
> struct cpu_spec* spec);
> +#else /* __powerpc64__ */
> +typedef    void (*cpu_setup_t)(unsigned long offset, struct  
> cpu_spec* spec);
> +#endif /* __powerpc64__ */
> +
> +struct cpu_spec {
> +    /* CPU is matched via (PVR & pvr_mask) == pvr_value */
> +    unsigned int    pvr_mask;
> +    unsigned int    pvr_value;
> +
> +    char        *cpu_name;
> +    unsigned long    cpu_features;        /* Kernel features */
> +    unsigned int    cpu_user_features;    /* Userland features */
> +
> +    /* cache line sizes */
> +    unsigned int    icache_bsize;
> +    unsigned int    dcache_bsize;
> +
> +    /* number of performance monitor counters */
> +    unsigned int    num_pmcs;
> +
> +    /* this is called to initialize various CPU bits like L1 cache,
> +     * BHT, SPD, etc... from head.S before branching to  
> identify_machine
> +     */
> +    cpu_setup_t    cpu_setup;
> +#ifdef __powerpc64__
> +
> +    /* Used by oprofile userspace to select the right counters */
> +    char        *oprofile_cpu_type;
> +
> +    /* Processor specific oprofile operations */
> +    struct op_ppc64_model *oprofile_model;
> +#endif /* __powerpc64__ */
> +};
> +
> +extern struct cpu_spec        cpu_specs[];
> +
> +#ifndef __powerpc64__
> +extern struct cpu_spec        *cur_cpu_spec[];
> +#else /* __powerpc64__ */
> +extern struct cpu_spec        *cur_cpu_spec;
> +#endif /* __powerpc64__ */
> +
> +#endif /* __ASSEMBLY__ */
> +
> +/* CPU kernel features */
> +
> +/* Retain the 32b definitions all use bottom half of word */
> +#define CPU_FTR_SPLIT_ID_CACHE        ASM_CONST(0x0000000000000001)
> +#define CPU_FTR_L2CR            ASM_CONST(0x0000000000000002)
> +#define CPU_FTR_SPEC7450        ASM_CONST(0x0000000000000004)
> +#define CPU_FTR_ALTIVEC            ASM_CONST(0x0000000000000008)
> +#define CPU_FTR_TAU            ASM_CONST(0x0000000000000010)
> +#define CPU_FTR_CAN_DOZE        ASM_CONST(0x0000000000000020)
> +#define CPU_FTR_USE_TB            ASM_CONST(0x0000000000000040)
> +#define CPU_FTR_604_PERF_MON        ASM_CONST(0x0000000000000080)
> +#define CPU_FTR_601            ASM_CONST(0x0000000000000100)
> +#define CPU_FTR_HPTE_TABLE        ASM_CONST(0x0000000000000200)
> +#define CPU_FTR_CAN_NAP            ASM_CONST(0x0000000000000400)
> +#define CPU_FTR_L3CR            ASM_CONST(0x0000000000000800)
> +#define CPU_FTR_L3_DISABLE_NAP        ASM_CONST(0x0000000000001000)
> +#define CPU_FTR_NAP_DISABLE_L2_PR    ASM_CONST(0x0000000000002000)
> +#define CPU_FTR_DUAL_PLL_750FX        ASM_CONST(0x0000000000004000)
> +#define CPU_FTR_NO_DPM            ASM_CONST(0x0000000000008000)
> +#define CPU_FTR_HAS_HIGH_BATS        ASM_CONST(0x0000000000010000)
> +#define CPU_FTR_NEED_COHERENT        ASM_CONST(0x0000000000020000)
> +#define CPU_FTR_NO_BTIC            ASM_CONST(0x0000000000040000)
> +#define CPU_FTR_BIG_PHYS        ASM_CONST(0x0000000000080000)
> +
> +#ifdef __powerpc64__
> +/* Add the 64b processor unique features in the top half of the  
> word */
> +#define CPU_FTR_SLB                   ASM_CONST(0x0000000100000000)
> +#define CPU_FTR_16M_PAGE              ASM_CONST(0x0000000200000000)
> +#define CPU_FTR_TLBIEL                 ASM_CONST(0x0000000400000000)
> +#define CPU_FTR_NOEXECUTE             ASM_CONST(0x0000000800000000)
> +#define CPU_FTR_NODSISRALIGN          ASM_CONST(0x0000001000000000)
> +#define CPU_FTR_IABR              ASM_CONST(0x0000002000000000)
> +#define CPU_FTR_MMCRA              ASM_CONST(0x0000004000000000)
> +/* unused                 ASM_CONST(0x0000008000000000) */
> +#define CPU_FTR_SMT              ASM_CONST(0x0000010000000000)
> +#define CPU_FTR_COHERENT_ICACHE      ASM_CONST(0x0000020000000000)
> +#define CPU_FTR_LOCKLESS_TLBIE        ASM_CONST(0x0000040000000000)
> +#define CPU_FTR_MMCRA_SIHV        ASM_CONST(0x0000080000000000)
> +#define CPU_FTR_CTRL            ASM_CONST(0x0000100000000000)
> +#endif
> +
> +#ifndef __ASSEMBLY__
> +
> +#define COMMON_USER_PPC64    (PPC_FEATURE_32 | PPC_FEATURE_64 | \
> +                 PPC_FEATURE_HAS_FPU | PPC_FEATURE_HAS_MMU)
> +
> +#define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \
> +                    CPU_FTR_TLBIEL | CPU_FTR_NOEXECUTE | \
> +                    CPU_FTR_NODSISRALIGN | CPU_FTR_CTRL)
> +
> +/* iSeries doesn't support large pages */
> +#ifdef CONFIG_PPC_ISERIES
> +#define CPU_FTR_PPCAS_ARCH_V2    (CPU_FTR_PPCAS_ARCH_V2_BASE)
> +#else
> +#define CPU_FTR_PPCAS_ARCH_V2    (CPU_FTR_PPCAS_ARCH_V2_BASE |  
> CPU_FTR_16M_PAGE)
> +#endif /* CONFIG_PPC_ISERIES */
> +
> +/* We only set the altivec features if the kernel was compiled  
> with altivec
> + * support
> + */
> +#ifdef CONFIG_ALTIVEC
> +#define CPU_FTR_ALTIVEC_COMP    CPU_FTR_ALTIVEC
> +#define PPC_FEATURE_HAS_ALTIVEC_COMP PPC_FEATURE_HAS_ALTIVEC
> +#else
> +#define CPU_FTR_ALTIVEC_COMP    0
> +#define PPC_FEATURE_HAS_ALTIVEC_COMP    0
> +#endif
> +
> +/* We need to mark all pages as being coherent if we're SMP or we
> + * have a 74[45]x and an MPC107 host bridge.
> + */
> +#if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE)
> +#define CPU_FTR_COMMON                  CPU_FTR_NEED_COHERENT
> +#else
> +#define CPU_FTR_COMMON                  0
> +#endif
> +
> +/* The powersave features NAP & DOZE seems to confuse BDI when
> +   debugging. So if a BDI is used, disable theses
> + */
> +#ifndef CONFIG_BDI_SWITCH
> +#define CPU_FTR_MAYBE_CAN_DOZE    CPU_FTR_CAN_DOZE
> +#define CPU_FTR_MAYBE_CAN_NAP    CPU_FTR_CAN_NAP
> +#else
> +#define CPU_FTR_MAYBE_CAN_DOZE    0
> +#define CPU_FTR_MAYBE_CAN_NAP    0
> +#endif
> +
> +#define CLASSIC_PPC (!defined(CONFIG_8xx) && !defined(CONFIG_4xx)  
> && \
> +             !defined(CONFIG_POWER3) && !defined(CONFIG_POWER4) && \
> +             !defined(CONFIG_BOOKE))
> +
> +enum {
> +    CPU_FTR_PPC601 = CPU_FTR_COMMON | CPU_FTR_601 |  
> CPU_FTR_HPTE_TABLE,
> +    CPU_FTR_603 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_604 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE,
> +    CPU_FTR_740_NOTAU = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_740 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_750 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_750FX1 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> +        CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM,
> +    CPU_FTR_750FX2 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> +        CPU_FTR_NO_DPM,
> +    CPU_FTR_750FX = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> +        CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS,
> +    CPU_FTR_750GX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> +        CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP |
> +        CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS,
> +    CPU_FTR_7400_NOTAU = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
> +        CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_7400 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR |
> +        CPU_FTR_TAU | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE |
> +        CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_7450_20 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_7450_21 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
> +        CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_7450_23 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_7455_1 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |  
> CPU_FTR_HAS_HIGH_BATS |
> +        CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_7455_20 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP |
> +        CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS,
> +    CPU_FTR_7455 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> +        CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_7447_10 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> +        CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC,
> +    CPU_FTR_7447 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> +        CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_7447A = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB |
> +        CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 |
> +        CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS |
> +        CPU_FTR_NEED_COHERENT,
> +    CPU_FTR_82XX = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB,
> +    CPU_FTR_G2_LE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> +        CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP |  
> CPU_FTR_HAS_HIGH_BATS,
> +    CPU_FTR_E300 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE |
> +        CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP |  
> CPU_FTR_HAS_HIGH_BATS,
> +    CPU_FTR_CLASSIC32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
> +    CPU_FTR_POWER3_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
> +    CPU_FTR_POWER4_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
> +    CPU_FTR_970_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
> +        CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP |
> +        CPU_FTR_MAYBE_CAN_NAP,
> +    CPU_FTR_8XX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
> +    CPU_FTR_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
> +    CPU_FTR_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
> +    CPU_FTR_E200 = CPU_FTR_USE_TB,
> +    CPU_FTR_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
> +    CPU_FTR_E500_2 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_BIG_PHYS,
> +    CPU_FTR_GENERIC_32 = CPU_FTR_COMMON,
> +#ifdef __powerpc64__
> +    CPU_FTR_POWER3 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
> +    CPU_FTR_RS64 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
> +        CPU_FTR_MMCRA | CPU_FTR_CTRL,
> +    CPU_FTR_POWER4 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
> +    CPU_FTR_PPC970 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
> +        CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
> +    CPU_FTR_POWER5 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
> +        CPU_FTR_MMCRA | CPU_FTR_SMT |
> +        CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
> +        CPU_FTR_MMCRA_SIHV,
> +    CPU_FTR_CELL = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
> +        CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT,
> +    CPU_FTR_COMPATIBLE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
> +        CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2,
> +#endif
> +    CPU_FTR_POSSIBLE =
> +#if CLASSIC_PPC
> +        CPU_FTR_601 | CPU_FTR_603 | CPU_FTR_604 | CPU_FTR_740_NOTAU |
> +        CPU_FTR_740 | CPU_FTR_750 | CPU_FTR_750FX1 |
> +        CPU_FTR_750FX2 | CPU_FTR_750FX | CPU_FTR_750GX |
> +        CPU_FTR_7400_NOTAU | CPU_FTR_7400 | CPU_FTR_7450_20 |
> +        CPU_FTR_7450_21 | CPU_FTR_7450_23 | CPU_FTR_7455_1 |
> +        CPU_FTR_7455_20 | CPU_FTR_7455 | CPU_FTR_7447_10 |
> +        CPU_FTR_7447 | CPU_FTR_7447A | CPU_FTR_82XX |
> +        CPU_FTR_G2_LE | CPU_FTR_E300 | CPU_FTR_CLASSIC32 |
> +#else
> +        CPU_FTR_GENERIC_32 |
> +#endif
> +#ifdef CONFIG_PPC64BRIDGE
> +        CPU_FTR_POWER3_32 |
> +#endif
> +#ifdef CONFIG_POWER4
> +        CPU_FTR_POWER4_32 | CPU_FTR_970_32 |
> +#endif
> +#ifdef CONFIG_8xx
> +        CPU_FTR_8XX |
> +#endif
> +#ifdef CONFIG_40x
> +        CPU_FTR_40X |
> +#endif
> +#ifdef CONFIG_44x
> +        CPU_FTR_44X |
> +#endif
> +#ifdef CONFIG_FSL_BOOKE
> +        CPU_FTR_E200 | CPU_FTR_E500 | CPU_FTR_E500_2 |
> +#endif
> +#ifdef CONFIG_CPU_POWER3
> +        CPU_FTR_POWER3 |
> +#endif
> +#ifdef CONFIG_CPU_RS64
> +        CPU_FTR_RS64 |
> +#endif
> +#ifdef CONFIG_CPU_POWER4
> +        CPU_FTR_POWER4 |
> +#endif
> +#ifdef CONFIG_CPU_PPC970
> +        CPU_FTR_PPC970 |
> +#endif
> +#ifdef CONFIG_CPU_POWER5
> +        CPU_FTR_POWER5 |
> +#endif
> +#ifdef CONFIG_CPU_CELL
> +        CPU_FTR_CELL |
> +#endif
> +        0,
> +    CPU_FTR_ALWAYS =
> +#if CLASSIC_PPC
> +        CPU_FTR_601 & CPU_FTR_603 & CPU_FTR_604 & CPU_FTR_740_NOTAU &
> +        CPU_FTR_740 & CPU_FTR_750 & CPU_FTR_750FX1 &
> +        CPU_FTR_750FX2 & CPU_FTR_750FX & CPU_FTR_750GX &
> +        CPU_FTR_7400_NOTAU & CPU_FTR_7400 & CPU_FTR_7450_20 &
> +        CPU_FTR_7450_21 & CPU_FTR_7450_23 & CPU_FTR_7455_1 &
> +        CPU_FTR_7455_20 & CPU_FTR_7455 & CPU_FTR_7447_10 &
> +        CPU_FTR_7447 & CPU_FTR_7447A & CPU_FTR_82XX &
> +        CPU_FTR_G2_LE & CPU_FTR_E300 & CPU_FTR_CLASSIC32 &
> +#else
> +        CPU_FTR_GENERIC_32 &
> +#endif
> +#ifdef CONFIG_PPC64BRIDGE
> +        CPU_FTR_POWER3_32 &
> +#endif
> +#ifdef CONFIG_POWER4
> +        CPU_FTR_POWER4_32 & CPU_FTR_970_32 &
> +#endif
> +#ifdef CONFIG_8xx
> +        CPU_FTR_8XX &
> +#endif
> +#ifdef CONFIG_40x
> +        CPU_FTR_40X &
> +#endif
> +#ifdef CONFIG_44x
> +        CPU_FTR_44X &
> +#endif
> +#ifdef CONFIG_FSL_BOOKE
> +        CPU_FTR_E200 & CPU_FTR_E500 & CPU_FTR_E500_2 &
> +#endif
> +#ifdef CONFIG_CPU_POWER3
> +        CPU_FTR_POWER3 &
> +#endif
> +#ifdef CONFIG_CPU_RS64
> +        CPU_FTR_RS64 &
> +#endif
> +#ifdef CONFIG_CPU_POWER4
> +        CPU_FTR_POWER4 &
> +#endif
> +#ifdef CONFIG_CPU_PPC970
> +        CPU_FTR_PPC970 &
> +#endif
> +#ifdef CONFIG_CPU_POWER5
> +        CPU_FTR_POWER5 &
> +#endif
> +#ifdef CONFIG_CPU_CELL
> +        CPU_FTR_CELL &
> +#endif
> +        CPU_FTR_POSSIBLE,
> +};
> +
> +static inline int cpu_has_feature(unsigned long feature)
> +{
> +    return (CPU_FTR_ALWAYS & feature) ||
> +           (CPU_FTR_POSSIBLE
> +#ifndef __powerpc64__
> +        & cur_cpu_spec[0]->cpu_features
> +#else
> +        & cur_cpu_spec->cpu_features
> +#endif
> +        & feature);
> +}
> +
> +#endif /* __ASSEMBLY */
> +
> +#ifdef __ASSEMBLY__
> +
> +#define BEGIN_FTR_SECTION        98:
> +
> +#ifndef __powerpc64__
> +#define END_FTR_SECTION(msk, val)        \
> +99:                        \
> +    .section __ftr_fixup,"a";        \
> +    .align 2;                \
> +    .long msk;                \
> +    .long val;                \
> +    .long 98b;                \
> +    .long 99b;                \
> +    .previous
> +#else /* __powerpc64__ */
> +#define END_FTR_SECTION(msk, val)        \
> +99:                        \
> +    .section __ftr_fixup,"a";        \
> +    .align 3;                \
> +    .llong msk;                \
> +    .llong val;                \
> +    .llong 98b;                \
> +    .llong 99b;                 \
> +    .previous
> +#endif /* __powerpc64__ */
> +
> +#else
> +
> +#define BEGIN_FTR_SECTION        "98:\n"
> +
> +#ifndef __powerpc64__
> +#define END_FTR_SECTION(msk, val)        \
> +"99:\n"                        \
> +"    .section __ftr_fixup,\"a\";\n"        \
> +"    .align 2;\n"                \
> +"    .long "#msk";\n"            \
> +"    .long "#val";\n"            \
> +"    .long 98b;\n"                \
> +"    .long 99b;\n"                 \
> +"    .previous\n"
> +#else /* __powerpc64__ */
> +#define END_FTR_SECTION(msk, val)        \
> +"99:\n"                        \
> +"    .section __ftr_fixup,\"a\";\n"        \
> +"    .align 3;\n"                \
> +"    .llong "#msk";\n"            \
> +"    .llong "#val";\n"            \
> +"    .llong 98b;\n"                \
> +"    .llong 99b;\n"                 \
> +"    .previous\n"
> +#endif /* __powerpc64__ */
> +
> +#endif /* __ASSEMBLY__ */
> +
> +#define END_FTR_SECTION_IFSET(msk)    END_FTR_SECTION((msk), (msk))
> +#define END_FTR_SECTION_IFCLR(msk)    END_FTR_SECTION((msk), 0)
> +
> +#endif /* __KERNEL__ */
> +#endif /* __ASM_POWERPC_CPUTABLE_H */
> Index: clean-cg/include/asm-ppc/cputable.h
> ===================================================================
> --- clean-cg.orig/include/asm-ppc/cputable.h
> +++ /dev/null
> @@ -1,128 +0,0 @@
> -/*
> - *  include/asm-ppc/cputable.h
> - *
> - *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
> - *
> - *  This program is free software; you can redistribute it and/or
> - *  modify it under the terms of the GNU General Public License
> - *  as published by the Free Software Foundation; either version
> - *  2 of the License, or (at your option) any later version.
> - */
> -
> -#ifndef __ASM_PPC_CPUTABLE_H
> -#define __ASM_PPC_CPUTABLE_H
> -
> -/* Exposed to userland CPU features */
> -#define PPC_FEATURE_32            0x80000000
> -#define PPC_FEATURE_64            0x40000000
> -#define PPC_FEATURE_601_INSTR        0x20000000
> -#define PPC_FEATURE_HAS_ALTIVEC        0x10000000
> -#define PPC_FEATURE_HAS_FPU        0x08000000
> -#define PPC_FEATURE_HAS_MMU        0x04000000
> -#define PPC_FEATURE_HAS_4xxMAC        0x02000000
> -#define PPC_FEATURE_UNIFIED_CACHE    0x01000000
> -#define PPC_FEATURE_HAS_SPE        0x00800000
> -#define PPC_FEATURE_HAS_EFP_SINGLE    0x00400000
> -#define PPC_FEATURE_HAS_EFP_DOUBLE    0x00200000
> -
> -#ifdef __KERNEL__
> -
> -#ifndef __ASSEMBLY__
> -
> -/* This structure can grow, it's real size is used by head.S code
> - * via the mkdefs mecanism.
> - */
> -struct cpu_spec;
> -
> -typedef    void (*cpu_setup_t)(unsigned long offset, int cpu_nr,  
> struct cpu_spec* spec);
> -
> -struct cpu_spec {
> -    /* CPU is matched via (PVR & pvr_mask) == pvr_value */
> -    unsigned int    pvr_mask;
> -    unsigned int    pvr_value;
> -
> -    char        *cpu_name;
> -    unsigned int    cpu_features;        /* Kernel features */
> -    unsigned int    cpu_user_features;    /* Userland features */
> -
> -    /* cache line sizes */
> -    unsigned int    icache_bsize;
> -    unsigned int    dcache_bsize;
> -
> -    /* number of performance monitor counters */
> -    unsigned int    num_pmcs;
> -
> -    /* this is called to initialize various CPU bits like L1 cache,
> -     * BHT, SPD, etc... from head.S before branching to  
> identify_machine
> -     */
> -    cpu_setup_t    cpu_setup;
> -};
> -
> -extern struct cpu_spec        cpu_specs[];
> -extern struct cpu_spec        *cur_cpu_spec[];
> -
> -static inline unsigned int cpu_has_feature(unsigned int feature)
> -{
> -    return cur_cpu_spec[0]->cpu_features & feature;
> -}
> -
> -#endif /* __ASSEMBLY__ */
> -
> -/* CPU kernel features */
> -#define CPU_FTR_SPLIT_ID_CACHE        0x00000001
> -#define CPU_FTR_L2CR            0x00000002
> -#define CPU_FTR_SPEC7450        0x00000004
> -#define CPU_FTR_ALTIVEC            0x00000008
> -#define CPU_FTR_TAU            0x00000010
> -#define CPU_FTR_CAN_DOZE        0x00000020
> -#define CPU_FTR_USE_TB            0x00000040
> -#define CPU_FTR_604_PERF_MON        0x00000080
> -#define CPU_FTR_601            0x00000100
> -#define CPU_FTR_HPTE_TABLE        0x00000200
> -#define CPU_FTR_CAN_NAP            0x00000400
> -#define CPU_FTR_L3CR            0x00000800
> -#define CPU_FTR_L3_DISABLE_NAP        0x00001000
> -#define CPU_FTR_NAP_DISABLE_L2_PR    0x00002000
> -#define CPU_FTR_DUAL_PLL_750FX        0x00004000
> -#define CPU_FTR_NO_DPM            0x00008000
> -#define CPU_FTR_HAS_HIGH_BATS        0x00010000
> -#define CPU_FTR_NEED_COHERENT        0x00020000
> -#define CPU_FTR_NO_BTIC            0x00040000
> -#define CPU_FTR_BIG_PHYS        0x00080000
> -
> -#ifdef __ASSEMBLY__
> -
> -#define BEGIN_FTR_SECTION        98:
> -
> -#define END_FTR_SECTION(msk, val)        \
> -99:                        \
> -    .section __ftr_fixup,"a";        \
> -    .align 2;                \
> -    .long msk;                \
> -    .long val;                \
> -    .long 98b;                \
> -    .long 99b;                \
> -    .previous
> -
> -#else
> -
> -#define BEGIN_FTR_SECTION        "98:\n"
> -#define END_FTR_SECTION(msk, val)        \
> -"99:\n"                        \
> -"    .section __ftr_fixup,\"a\";\n"        \
> -"    .align 2;\n"                \
> -"    .long "#msk";\n"            \
> -"    .long "#val";\n"            \
> -"    .long 98b;\n"                    \
> -"    .long 99b;\n"                     \
> -"    .previous\n"
> -
> -
> -#endif /* __ASSEMBLY__ */
> -
> -#define END_FTR_SECTION_IFSET(msk)    END_FTR_SECTION((msk), (msk))
> -#define END_FTR_SECTION_IFCLR(msk)    END_FTR_SECTION((msk), 0)
> -
> -#endif /* __ASM_PPC_CPUTABLE_H */
> -#endif /* __KERNEL__ */
> -
>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-14 19:11             ` Kumar Gala
@ 2005-09-14 23:58               ` Arnd Bergmann
  2005-09-15 17:44                 ` Kumar Gala
  0 siblings, 1 reply; 18+ messages in thread
From: Arnd Bergmann @ 2005-09-14 23:58 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

On Middeweken 14 September 2005 21:11, Kumar Gala wrote:
> I not sure I understand what the introduction of the enum's gets us.
> 
It doesn't have to be an enum, it could just as well be a #define,
if we find that to be better in some way (maybe compile-time).

The general idea is to convert run-time checks into compile-time
checks in order to improve the running kernel. If you have

// start code
enum {
	FEATURE_1 = 1,
	FEATURE_2 = 2,
	PLATFORM_1 = FEATURE_1, 
	PLATFORM_2 = FEATURE_2, 
	PLATFORM_3 = FEATURE_1 | FEATURE_2,
	FEATURE_POSSIBLE = 
#ifdef CONFIG_PLATFORM_1
		PLATFORM_1 |
#endif
#ifdef CONFIG_FEATURE_2
		PLATFORM_2 |
#endif
#ifdef CONFIG_FEATURE_3
		PLATFORM_3 |
#endif
		0,
	FEATURE_ALWAYS =
#ifdef CONFIG_PLATFORM_1
		PLATFORM_1 &
#endif
#ifdef CONFIG_PLATFORM_2
		PLATFORM_2 &
#endif
#ifdef CONFIG_PLATFORM_3
		PLATFORM_3 &
#endif
		FEATURE_POSSIBLE,
};

static inline int have_feature(unsigned long feature)
{
    return (FEATURE_ALWAYS & feature) ||
           (FEATURE_POSSIBLE & runtime_feature & feature);
}

int foo();
int bar();
int main(void)
{
	if (have_feature(FEATURE_1))
		return foo();
	if (have_feature(FEATURE_2))
		return bar();
	return 0;
}
// end code

Then gcc will produce optimal object code for any combination
of CONFIG_PLATFORM_{1,2,3}. Of course I have to admit that the
header file is not exactly elegant ;-).

	Arnd <><

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-14 23:58               ` Arnd Bergmann
@ 2005-09-15 17:44                 ` Kumar Gala
  2005-09-15 22:56                   ` Arnd Bergmann
  0 siblings, 1 reply; 18+ messages in thread
From: Kumar Gala @ 2005-09-15 17:44 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

I get the idea now, how about we make CPU_FTR_ALWAYS &  
CPU_FTR_POSSIBLE just #defines and leave it to various sub-archs to  
define CPU_FTR_POSSIBLE if they want to.

I see the classes of for FTR_POSSIBLE: CLASSIC_PPC, 8xx, 4xx, FSL- 
BOOKE, PPC64 (maybe more subclasses here).

The hugh enum while useful, is just really ugly and I can't believe  
it's worth it for the ~60 cases we are using cpu_has_feature() in.

- kumar

On Sep 14, 2005, at 6:58 PM, Arnd Bergmann wrote:

> On Middeweken 14 September 2005 21:11, Kumar Gala wrote:
>
>> I not sure I understand what the introduction of the enum's gets us.
>>
>>
> It doesn't have to be an enum, it could just as well be a #define,
> if we find that to be better in some way (maybe compile-time).
>
> The general idea is to convert run-time checks into compile-time
> checks in order to improve the running kernel. If you have
>
> // start code
> enum {
>     FEATURE_1 = 1,
>     FEATURE_2 = 2,
>     PLATFORM_1 = FEATURE_1,
>     PLATFORM_2 = FEATURE_2,
>     PLATFORM_3 = FEATURE_1 | FEATURE_2,
>     FEATURE_POSSIBLE =
> #ifdef CONFIG_PLATFORM_1
>         PLATFORM_1 |
> #endif
> #ifdef CONFIG_FEATURE_2
>         PLATFORM_2 |
> #endif
> #ifdef CONFIG_FEATURE_3
>         PLATFORM_3 |
> #endif
>         0,
>     FEATURE_ALWAYS =
> #ifdef CONFIG_PLATFORM_1
>         PLATFORM_1 &
> #endif
> #ifdef CONFIG_PLATFORM_2
>         PLATFORM_2 &
> #endif
> #ifdef CONFIG_PLATFORM_3
>         PLATFORM_3 &
> #endif
>         FEATURE_POSSIBLE,
> };
>
> static inline int have_feature(unsigned long feature)
> {
>     return (FEATURE_ALWAYS & feature) ||
>            (FEATURE_POSSIBLE & runtime_feature & feature);
> }
>
> int foo();
> int bar();
> int main(void)
> {
>     if (have_feature(FEATURE_1))
>         return foo();
>     if (have_feature(FEATURE_2))
>         return bar();
>     return 0;
> }
> // end code
>
> Then gcc will produce optimal object code for any combination
> of CONFIG_PLATFORM_{1,2,3}. Of course I have to admit that the
> header file is not exactly elegant ;-).
>
>     Arnd <><
>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-15 17:44                 ` Kumar Gala
@ 2005-09-15 22:56                   ` Arnd Bergmann
  2005-09-16  2:22                     ` Kumar Gala
  0 siblings, 1 reply; 18+ messages in thread
From: Arnd Bergmann @ 2005-09-15 22:56 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

On Dunnersdag 15 September 2005 19:44, Kumar Gala wrote:

> I get the idea now, how about we make CPU_FTR_ALWAYS &  
> CPU_FTR_POSSIBLE just #defines and leave it to various sub-archs to  
> define CPU_FTR_POSSIBLE if they want to.
>
 

So you mean like:

#ifdef CONFIG_PPC_PSERIES
#define CPU_FTR_PSERIES_POSSIBLE (CPU_FTR_FOO | CPU_FTR_BAR)
#define CPU_FTR_PSERIES_ALWAYS (CPU_FTR_FOO)
#else
#define CPU_FTR_PSERIES_POSSIBLE (0)
#define CPU_FTR_PSERIES_ALWAYS (-1)
#endif

#ifdef CONFIG_PPC_PMAC
#define CPU_FTR_PMAC_POSSIBLE (CPU_FTR_BAR | CPU_FTR_BAZ)
#define CPU_FTR_PMAL_ALWAYS (CPU_FTR_BAZ)
#else
#define CPU_FTR_PMAC_POSSIBLE (0)
#define CPU_FTR_PMAC_ALWAYS (-1)
#endif

...

#define CPU_FTR_POSSIBLE CPU_FTR_PSERIES_POSSIBLE | CPU_FTR_PMAC_POSSIBLE \
		 | CPU_FTR_...
#define CPU_FTR_ALWAYS CPU_FTR_POSSIBLE & CPU_FTR_PSERIES_ALWAYS \
		& CPU_FTR_PMAC_ALWAYS & CPU_FTR_ ...

That would of course avoid having to define the features per CPU type,
but at the same time make the system more error prone, because every
time you add a feature to some of the CPUs, you'd have to know exactly
which platform defines to change as well, and they might get out of sync.

I also don't think that using the #defines here makes it any more
readable than the enums, because you cannot have compile-time conditionals
inside of #define.

> I see the classes of for FTR_POSSIBLE: CLASSIC_PPC, 8xx, 4xx, FSL- 
> BOOKE, PPC64 (maybe more subclasses here).
>
> The hugh enum while useful, is just really ugly and I can't believe  
> it's worth it for the ~60 cases we are using cpu_has_feature() in.

One point to consider is that we traditionally use #ifdef in the
source for many places that could simply use cpu_has_feature(). E.g.
most instances of #ifdef CONFIG_ALTIVEC could be replaced by
cpu_has_feature(CPU_FTR_ALTIVEC) without additional run-time overhead.

	Arnd <><

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-15 22:56                   ` Arnd Bergmann
@ 2005-09-16  2:22                     ` Kumar Gala
  2005-09-16  3:11                       ` Arnd Bergmann
  0 siblings, 1 reply; 18+ messages in thread
From: Kumar Gala @ 2005-09-16  2:22 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded


On Sep 15, 2005, at 5:56 PM, Arnd Bergmann wrote:

> On Dunnersdag 15 September 2005 19:44, Kumar Gala wrote:
>
>
>> I get the idea now, how about we make CPU_FTR_ALWAYS &
>> CPU_FTR_POSSIBLE just #defines and leave it to various sub-archs to
>> define CPU_FTR_POSSIBLE if they want to.
>>
>>
>
>
> So you mean like:
>
> #ifdef CONFIG_PPC_PSERIES
> #define CPU_FTR_PSERIES_POSSIBLE (CPU_FTR_FOO | CPU_FTR_BAR)
> #define CPU_FTR_PSERIES_ALWAYS (CPU_FTR_FOO)
> #else
> #define CPU_FTR_PSERIES_POSSIBLE (0)
> #define CPU_FTR_PSERIES_ALWAYS (-1)
> #endif
>
> #ifdef CONFIG_PPC_PMAC
> #define CPU_FTR_PMAC_POSSIBLE (CPU_FTR_BAR | CPU_FTR_BAZ)
> #define CPU_FTR_PMAL_ALWAYS (CPU_FTR_BAZ)
> #else
> #define CPU_FTR_PMAC_POSSIBLE (0)
> #define CPU_FTR_PMAC_ALWAYS (-1)
> #endif
>
> ...
>
> #define CPU_FTR_POSSIBLE CPU_FTR_PSERIES_POSSIBLE |  
> CPU_FTR_PMAC_POSSIBLE \
>          | CPU_FTR_...
> #define CPU_FTR_ALWAYS CPU_FTR_POSSIBLE & CPU_FTR_PSERIES_ALWAYS \
>         & CPU_FTR_PMAC_ALWAYS & CPU_FTR_ ...

Yes, something like that.  Why do we need the CPU_FTR_ALWAYS.  It  
seems that CPU_FTR_POSSIBLE is sufficient.  I may just not understand  
the purpose of CPU_FTR_ALWAYS.

> That would of course avoid having to define the features per CPU type,
> but at the same time make the system more error prone, because every
> time you add a feature to some of the CPUs, you'd have to know exactly
> which platform defines to change as well, and they might get out of  
> sync.

Well if you are adding a new FTR you better know what CPUs it belongs  
to otherwise how would you update the cputable today?  However, I do  
agree it could be error prone.

> I also don't think that using the #defines here makes it any more
> readable than the enums, because you cannot have compile-time  
> conditionals
> inside of #define.
>
>
>> I see the classes of for FTR_POSSIBLE: CLASSIC_PPC, 8xx, 4xx, FSL-
>> BOOKE, PPC64 (maybe more subclasses here).
>>
>> The hugh enum while useful, is just really ugly and I can't believe
>> it's worth it for the ~60 cases we are using cpu_has_feature() in.
>>
>
> One point to consider is that we traditionally use #ifdef in the
> source for many places that could simply use cpu_has_feature(). E.g.
> most instances of #ifdef CONFIG_ALTIVEC could be replaced by
> cpu_has_feature(CPU_FTR_ALTIVEC) without additional run-time overhead.

These should stay as CONFIG options because to reduce the code size  
of the kernel which is important to embedded people.

- kumar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-16  2:22                     ` Kumar Gala
@ 2005-09-16  3:11                       ` Arnd Bergmann
  2005-09-16 21:40                         ` Kumar Gala
  0 siblings, 1 reply; 18+ messages in thread
From: Arnd Bergmann @ 2005-09-16  3:11 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

On Freedag 16 September 2005 04:22, Kumar Gala wrote:

> > #define CPU_FTR_POSSIBLE CPU_FTR_PSERIES_POSSIBLE |  
> > CPU_FTR_PMAC_POSSIBLE \
> >          | CPU_FTR_...
> > #define CPU_FTR_ALWAYS CPU_FTR_POSSIBLE & CPU_FTR_PSERIES_ALWAYS \
> >         & CPU_FTR_PMAC_ALWAYS & CPU_FTR_ ...
> 
> Yes, something like that.  Why do we need the CPU_FTR_ALWAYS.  It  
> seems that CPU_FTR_POSSIBLE is sufficient.  I may just not understand  
> the purpose of CPU_FTR_ALWAYS.
>
> > One point to consider is that we traditionally use #ifdef in the
> > source for many places that could simply use cpu_has_feature(). E.g.
> > most instances of #ifdef CONFIG_ALTIVEC could be replaced by
> > cpu_has_feature(CPU_FTR_ALTIVEC) without additional run-time overhead.
> 
> These should stay as CONFIG options because to reduce the code size  
> of the kernel which is important to embedded people.

The whole point of the logic is to reduce code size, because gcc
is smart enough to remove all dead code then.
Consider again the definition of

| static inline int have_feature(unsigned long feature)
| {
|      return (FEATURE_ALWAYS & feature) ||
|             (FEATURE_POSSIBLE & runtime_feature & feature);
| }

If the feature is part of FEATURE_ALWAYS, this will be optimized to

|      return 1 || FEATURE_POSSIBLE & runtime_feature & feature;

and subsequently

|      return 1;

If it is not part of FEATURE_POSSIBLE, it it equivalent to

|      return 0 || (0 & runtime_feature & feature);

which becomes

|      return 0;


Any code inside of

|      if (0) { /* ... */ }

is only checked for syntax by gcc but will not end up in the object code.
For the 'if(1)' case, the code gets smaller as well, because the runtime
flag does not have to be dereferenced.

For some places, we might prefer to replace '#ifdef CONFIG_FOO' not with
have_feature(FOO), but rather with feature_possible(FOO), given a definition
of 

static inline int have_feature(unsigned int feature)
{
	return !!(FEATURE_POSSIBLE & feature);
}

which always get evaluated at compile time.

	Arnd <><

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-16  3:11                       ` Arnd Bergmann
@ 2005-09-16 21:40                         ` Kumar Gala
  2005-09-17  0:36                           ` Arnd Bergmann
  0 siblings, 1 reply; 18+ messages in thread
From: Kumar Gala @ 2005-09-16 21:40 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

Ok, I've given into the enum as I dont see anything better.

However, I do have some questions, why introduce new Kconfig options  
for ppc64.  It seems overkill to have specific build options for each  
"class" of ppc64.  One could make the argument we should go do the  
same thing for classic ppc32.  From an embedded point of view I could  
reduce down to the specific cpu I'm using.  I really dont think we  
want to start doing this.

If we did I would have to say we would have to add Kconfig for 601,  
603, 604, 750 (740, 750, 755), 7400 (7400/7410), 7450 (744x/745x).   
That's six more Kconfig options

I'm ok with the patch, but think we should drop the arch/ppc64/ 
Kconfig portion and its related effects.

Also, I've changed CPU_FTR to CPU_FTRS for the "left hand side" of  
the enum.

- kumar

On Sep 15, 2005, at 10:11 PM, Arnd Bergmann wrote:

> On Freedag 16 September 2005 04:22, Kumar Gala wrote:
>
>
>>> #define CPU_FTR_POSSIBLE CPU_FTR_PSERIES_POSSIBLE |
>>> CPU_FTR_PMAC_POSSIBLE \
>>>          | CPU_FTR_...
>>> #define CPU_FTR_ALWAYS CPU_FTR_POSSIBLE & CPU_FTR_PSERIES_ALWAYS \
>>>         & CPU_FTR_PMAC_ALWAYS & CPU_FTR_ ...
>>>
>>
>> Yes, something like that.  Why do we need the CPU_FTR_ALWAYS.  It
>> seems that CPU_FTR_POSSIBLE is sufficient.  I may just not understand
>> the purpose of CPU_FTR_ALWAYS.
>>
>>
>>> One point to consider is that we traditionally use #ifdef in the
>>> source for many places that could simply use cpu_has_feature(). E.g.
>>> most instances of #ifdef CONFIG_ALTIVEC could be replaced by
>>> cpu_has_feature(CPU_FTR_ALTIVEC) without additional run-time  
>>> overhead.
>>>
>>
>> These should stay as CONFIG options because to reduce the code size
>> of the kernel which is important to embedded people.
>>
>
> The whole point of the logic is to reduce code size, because gcc
> is smart enough to remove all dead code then.
> Consider again the definition of
>
> | static inline int have_feature(unsigned long feature)
> | {
> |      return (FEATURE_ALWAYS & feature) ||
> |             (FEATURE_POSSIBLE & runtime_feature & feature);
> | }
>
> If the feature is part of FEATURE_ALWAYS, this will be optimized to
>
> |      return 1 || FEATURE_POSSIBLE & runtime_feature & feature;
>
> and subsequently
>
> |      return 1;
>
> If it is not part of FEATURE_POSSIBLE, it it equivalent to
>
> |      return 0 || (0 & runtime_feature & feature);
>
> which becomes
>
> |      return 0;
>
>
> Any code inside of
>
> |      if (0) { /* ... */ }
>
> is only checked for syntax by gcc but will not end up in the object  
> code.
> For the 'if(1)' case, the code gets smaller as well, because the  
> runtime
> flag does not have to be dereferenced.
>
> For some places, we might prefer to replace '#ifdef CONFIG_FOO' not  
> with
> have_feature(FOO), but rather with feature_possible(FOO), given a  
> definition
> of
>
> static inline int have_feature(unsigned int feature)
> {
>     return !!(FEATURE_POSSIBLE & feature);
> }
>
> which always get evaluated at compile time.
>
>     Arnd <><
>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] powerpc: merge include/asm/cputable.h
  2005-09-16 21:40                         ` Kumar Gala
@ 2005-09-17  0:36                           ` Arnd Bergmann
  0 siblings, 0 replies; 18+ messages in thread
From: Arnd Bergmann @ 2005-09-17  0:36 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc-dev, pantelis.antoniou, linuxppc64-dev,
	linuxppc-embedded

On Freedag 16 September 2005 23:40, Kumar Gala wrote:
> However, I do have some questions, why introduce new Kconfig options  
> for ppc64.  It seems overkill to have specific build options for each  
> "class" of ppc64.  One could make the argument we should go do the  
> same thing for classic ppc32.  From an embedded point of view I could  
> reduce down to the specific cpu I'm using.  I really dont think we  
> want to start doing this.

Note that the configuration options that my patch introduced are
all autodetected from the existing platform CONFIG_PPC_ symbols, so
they don't give you extra settings that might be messed up.

Having the options makes the enum in cpufeatures.h more readable
imho, but if you want to do a patch without them, I wont complain.

> If we did I would have to say we would have to add Kconfig for 601,  
> 603, 604, 750 (740, 750, 755), 7400 (7400/7410), 7450 (744x/745x).   
> That's six more Kconfig options

I actually like the idea more flexibility to which CPU optimizations
you get in the kernel. These could be combined with the gcc -mcpu=
argument, if there is a way for Kconfig to deduce the most generic
cpu type that still supports all selected models.
The easiest way to do something like this should be to add more
choices to the existing "Processor Type" submenu instead of having
each one selectable separately.

Something tells me that the platform and CPU type selection will
keep us busy for some time, because they are currently treated very
differently in ppc and ppc64. Please tell me if I understand this
correctly:

In ppc, the user can select one out of 27 platforms and one out of
seven separate sets of CPUs. All platforms except CHRP/PowerMac/PReP
can only ever work with a specific CPU selection, while that one
platform has the choice between 6xx/7xx/74xx/52xx/82xx/83xx, POWER3
and POWER4/970. These connections are currently not documented.

In ppc64, the user has to choose between the legacy iSeries and 
the generic platform. Generic means any combination of pSeries, 
PowerMac, Cell or Maple. The only CPU selection possibility is
'any cpu' or 'Power4 or better'. In future, we will have at least
a third option 'Book E' (or e700), which is incompatible with the
others. With my patch applied, the kernel would automatically disable
support for CPUs that are not possible with the selected platform
setting.

	Arnd <><

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2005-09-17  0:36 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-08 21:02 cpu features testing 32 vs 64 bit Becky Bruce
2005-09-08 21:08 ` Pantelis Antoniou
2005-09-08 21:20   ` Kumar Gala
2005-09-08 21:48     ` Dan Malek
2005-09-08 22:02       ` Kumar Gala
2005-09-08 22:20         ` Dan Malek
2005-09-08 22:36         ` Arnd Bergmann
2005-09-09  0:08           ` David Gibson
2005-09-09  4:23           ` [PATCH] powerpc: merge include/asm/cputable.h Arnd Bergmann
2005-09-14 19:11             ` Kumar Gala
2005-09-14 23:58               ` Arnd Bergmann
2005-09-15 17:44                 ` Kumar Gala
2005-09-15 22:56                   ` Arnd Bergmann
2005-09-16  2:22                     ` Kumar Gala
2005-09-16  3:11                       ` Arnd Bergmann
2005-09-16 21:40                         ` Kumar Gala
2005-09-17  0:36                           ` Arnd Bergmann
2005-09-09 22:19     ` cpu features testing 32 vs 64 bit Benjamin Herrenschmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).