On Fri, Mar 19, 2004 at 03:00:53PM +1100, Benjamin Herrenschmidt wrote: > I much prefer Eugene's idea.
During discussion with Ben on IRC he suggested that having two different DCR access wasn't a good idea and better if we use GCC __builtin_constant_p extension to decide what version to call. New patch version can be found http://kernel.ebshome.net/dcr-2.6-2.diff Here is only _new_ part for review: ===== include/asm-ppc/reg_booke.h 1.5 vs edited ===== --- 1.5/include/asm-ppc/reg_booke.h Fri Feb 13 07:24:55 2004 +++ edited/include/asm-ppc/reg_booke.h Mon Mar 22 17:44:02 2004 @@ -10,20 +10,33 @@ #define __ASM_PPC_REG_BOOKE_H__ #ifndef __ASSEMBLY__ +#include <linux/compiler.h> + /* Device Control Registers */ +void __mtdcr(int reg, unsigned int val); +unsigned int __mfdcr(int reg); #define mfdcr(rn) mfdcr_or_dflt(rn, 0) #define mfdcr_or_dflt(rn,default_rval) \ ({unsigned int rval; \ - if (rn == 0) \ + if (unlikely(rn == 0)) \ rval = default_rval; \ else \ - asm volatile("mfdcr %0," __stringify(rn) : "=r" (rval)); \ + if (__builtin_constant_p(rn)) \ + asm volatile("mfdcr %0," __stringify(rn) \ + : "=r" (rval)); \ + else \ + rval = __mfdcr(rn); \ rval;}) #define mtdcr(rn, v) \ do { \ - if (rn != 0) \ - asm volatile("mtdcr " __stringify(rn) ",%0" : : "r" (v)); \ + if (likely(rn != 0)){ \ + if (__builtin_constant_p(rn)) \ + asm volatile("mtdcr " __stringify(rn) ",%0" \ + : : "r" (v)); \ + else \ + __mtdcr(rn, v); \ + } \ } while (0) /* R/W of indirect DCRs make use of standard naming conventions for DCRs */ Thanks, Eugene ** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
