/* SPDX-License-Identifier: GPL-2.0-only */ /* * IXP4XX cpu type detection * * Copyright (C) 2007 MontaVista Software, Inc. */ #ifndef __SOC_IXP4XX_CPU_H__ #define __SOC_IXP4XX_CPU_H__ #include #include #ifdef CONFIG_ARM #include #endif /* Processor id value in CP15 Register 0 */ #define IXP42X_PROCESSOR_ID_VALUE 0x690541c0 /* including unused 0x690541Ex */ #define IXP42X_PROCESSOR_ID_MASK 0xffffffc0 #define IXP43X_PROCESSOR_ID_VALUE 0x69054040 #define IXP43X_PROCESSOR_ID_MASK 0xfffffff0 #define IXP46X_PROCESSOR_ID_VALUE 0x69054200 /* including IXP455 */ #define IXP46X_PROCESSOR_ID_MASK 0xfffffff0 /* Feature register in the expansion bus controller */ #define IXP4XX_EXP_CNFG2 0x2c /* "fuse" bits of IXP_EXP_CFG2 */ /* All IXP4xx CPUs */ #define IXP4XX_FEATURE_RCOMP (1 << 0) #define IXP4XX_FEATURE_USB_DEVICE (1 << 1) #define IXP4XX_FEATURE_HASH (1 << 2) #define IXP4XX_FEATURE_AES (1 << 3) #define IXP4XX_FEATURE_DES (1 << 4) #define IXP4XX_FEATURE_HDLC (1 << 5) #define IXP4XX_FEATURE_AAL (1 << 6) #define IXP4XX_FEATURE_HSS (1 << 7) #define IXP4XX_FEATURE_UTOPIA (1 << 8) #define IXP4XX_FEATURE_NPEB_ETH0 (1 << 9) #define IXP4XX_FEATURE_NPEC_ETH (1 << 10) #define IXP4XX_FEATURE_RESET_NPEA (1 << 11) #define IXP4XX_FEATURE_RESET_NPEB (1 << 12) #define IXP4XX_FEATURE_RESET_NPEC (1 << 13) #define IXP4XX_FEATURE_PCI (1 << 14) #define IXP4XX_FEATURE_UTOPIA_PHY_LIMIT (3 << 16) #define IXP4XX_FEATURE_XSCALE_MAX_FREQ (3 << 22) #define IXP42X_FEATURE_MASK (IXP4XX_FEATURE_RCOMP | \ IXP4XX_FEATURE_USB_DEVICE | \ IXP4XX_FEATURE_HASH | \ IXP4XX_FEATURE_AES | \ IXP4XX_FEATURE_DES | \ IXP4XX_FEATURE_HDLC | \ IXP4XX_FEATURE_AAL | \ IXP4XX_FEATURE_HSS | \ IXP4XX_FEATURE_UTOPIA | \ IXP4XX_FEATURE_NPEB_ETH0 | \ IXP4XX_FEATURE_NPEC_ETH | \ IXP4XX_FEATURE_RESET_NPEA | \ IXP4XX_FEATURE_RESET_NPEB | \ IXP4XX_FEATURE_RESET_NPEC | \ IXP4XX_FEATURE_PCI | \ IXP4XX_FEATURE_UTOPIA_PHY_LIMIT | \ IXP4XX_FEATURE_XSCALE_MAX_FREQ) /* IXP43x/46x CPUs */ #define IXP4XX_FEATURE_ECC_TIMESYNC (1 << 15) #define IXP4XX_FEATURE_USB_HOST (1 << 18) #define IXP4XX_FEATURE_NPEA_ETH (1 << 19) #define IXP43X_FEATURE_MASK (IXP42X_FEATURE_MASK | \ IXP4XX_FEATURE_ECC_TIMESYNC | \ IXP4XX_FEATURE_USB_HOST | \ IXP4XX_FEATURE_NPEA_ETH) /* IXP46x CPU (including IXP455) only */ #define IXP4XX_FEATURE_NPEB_ETH_1_TO_3 (1 << 20) #define IXP4XX_FEATURE_RSA (1 << 21) #define IXP46X_FEATURE_MASK (IXP43X_FEATURE_MASK | \ IXP4XX_FEATURE_NPEB_ETH_1_TO_3 | \ IXP4XX_FEATURE_RSA) #ifdef CONFIG_ARCH_IXP4XX #define cpu_is_ixp42x_rev_a0() ((read_cpuid_id() & (IXP42X_PROCESSOR_ID_MASK | 0xF)) == \ IXP42X_PROCESSOR_ID_VALUE) #define cpu_is_ixp42x() ((read_cpuid_id() & IXP42X_PROCESSOR_ID_MASK) == \ IXP42X_PROCESSOR_ID_VALUE) #define cpu_is_ixp43x() ((read_cpuid_id() & IXP43X_PROCESSOR_ID_MASK) == \ IXP43X_PROCESSOR_ID_VALUE) #define cpu_is_ixp46x() ((read_cpuid_id() & IXP46X_PROCESSOR_ID_MASK) == \ IXP46X_PROCESSOR_ID_VALUE) static inline u32 cpu_ixp4xx_features(struct regmap *rmap) { u32 val; regmap_read(rmap, IXP4XX_EXP_CNFG2, &val); /* For some reason this register is inverted */ val = ~val; if (cpu_is_ixp42x_rev_a0()) return IXP42X_FEATURE_MASK & ~(IXP4XX_FEATURE_RCOMP | IXP4XX_FEATURE_AES); if (cpu_is_ixp42x()) return val & IXP42X_FEATURE_MASK; if (cpu_is_ixp43x()) return val & IXP43X_FEATURE_MASK; return val & IXP46X_FEATURE_MASK; } #else #define cpu_is_ixp42x_rev_a0() 0 #define cpu_is_ixp42x() 0 #define cpu_is_ixp43x() 0 #define cpu_is_ixp46x() 0 static inline u32 cpu_ixp4xx_features(struct regmap *rmap) { return 0; } #endif #endif /* _ASM_ARCH_CPU_H */