xref: /openbmc/linux/arch/mips/bcm63xx/cpu.c (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1e7300d04SMaxime Bizon /*
2e7300d04SMaxime Bizon  * This file is subject to the terms and conditions of the GNU General Public
3e7300d04SMaxime Bizon  * License.  See the file "COPYING" in the main directory of this archive
4e7300d04SMaxime Bizon  * for more details.
5e7300d04SMaxime Bizon  *
6e7300d04SMaxime Bizon  * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
7e7300d04SMaxime Bizon  * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org>
8e7300d04SMaxime Bizon  */
9e7300d04SMaxime Bizon 
10e7300d04SMaxime Bizon #include <linux/kernel.h>
1126dd3e4fSPaul Gortmaker #include <linux/export.h>
12e7300d04SMaxime Bizon #include <linux/cpu.h>
13602977b0SKevin Cernekee #include <asm/cpu.h>
142b5b9b78SFlorian Fainelli #include <asm/cpu-info.h>
15602977b0SKevin Cernekee #include <asm/mipsregs.h>
16e7300d04SMaxime Bizon #include <bcm63xx_cpu.h>
17e7300d04SMaxime Bizon #include <bcm63xx_regs.h>
18e7300d04SMaxime Bizon #include <bcm63xx_io.h>
19e7300d04SMaxime Bizon #include <bcm63xx_irq.h>
20e7300d04SMaxime Bizon 
21e7300d04SMaxime Bizon const unsigned long *bcm63xx_regs_base;
22e7300d04SMaxime Bizon EXPORT_SYMBOL(bcm63xx_regs_base);
23e7300d04SMaxime Bizon 
24e7300d04SMaxime Bizon const int *bcm63xx_irqs;
25e7300d04SMaxime Bizon EXPORT_SYMBOL(bcm63xx_irqs);
26e7300d04SMaxime Bizon 
27e86ae9e2SJonas Gorski u16 bcm63xx_cpu_id __read_mostly;
28e86ae9e2SJonas Gorski EXPORT_SYMBOL(bcm63xx_cpu_id);
29e86ae9e2SJonas Gorski 
306605428cSJonas Gorski static u8 bcm63xx_cpu_rev;
31e7300d04SMaxime Bizon static unsigned int bcm63xx_cpu_freq;
32e7300d04SMaxime Bizon static unsigned int bcm63xx_memory_size;
33e7300d04SMaxime Bizon 
347b933421SFlorian Fainelli static const unsigned long bcm3368_regs_base[] = {
357b933421SFlorian Fainelli 	__GEN_CPU_REGS_TABLE(3368)
367b933421SFlorian Fainelli };
377b933421SFlorian Fainelli 
387b933421SFlorian Fainelli static const int bcm3368_irqs[] = {
397b933421SFlorian Fainelli 	__GEN_CPU_IRQ_TABLE(3368)
407b933421SFlorian Fainelli };
417b933421SFlorian Fainelli 
42e5766aeaSJonas Gorski static const unsigned long bcm6328_regs_base[] = {
43e5766aeaSJonas Gorski 	__GEN_CPU_REGS_TABLE(6328)
44e5766aeaSJonas Gorski };
45e5766aeaSJonas Gorski 
46e5766aeaSJonas Gorski static const int bcm6328_irqs[] = {
47e5766aeaSJonas Gorski 	__GEN_CPU_IRQ_TABLE(6328)
48e5766aeaSJonas Gorski };
49e5766aeaSJonas Gorski 
50ec68c520SMaxime Bizon static const unsigned long bcm6338_regs_base[] = {
51ec68c520SMaxime Bizon 	__GEN_CPU_REGS_TABLE(6338)
52e7300d04SMaxime Bizon };
53e7300d04SMaxime Bizon 
54ec68c520SMaxime Bizon static const int bcm6338_irqs[] = {
55ec68c520SMaxime Bizon 	__GEN_CPU_IRQ_TABLE(6338)
56e7300d04SMaxime Bizon };
57e7300d04SMaxime Bizon 
58ec68c520SMaxime Bizon static const unsigned long bcm6345_regs_base[] = {
59ec68c520SMaxime Bizon 	__GEN_CPU_REGS_TABLE(6345)
60e7300d04SMaxime Bizon };
61e7300d04SMaxime Bizon 
62ec68c520SMaxime Bizon static const int bcm6345_irqs[] = {
63ec68c520SMaxime Bizon 	__GEN_CPU_IRQ_TABLE(6345)
64e7300d04SMaxime Bizon };
65e7300d04SMaxime Bizon 
66ec68c520SMaxime Bizon static const unsigned long bcm6348_regs_base[] = {
67ec68c520SMaxime Bizon 	__GEN_CPU_REGS_TABLE(6348)
68e7300d04SMaxime Bizon };
69e7300d04SMaxime Bizon 
70ec68c520SMaxime Bizon static const int bcm6348_irqs[] = {
71ec68c520SMaxime Bizon 	__GEN_CPU_IRQ_TABLE(6348)
72ec68c520SMaxime Bizon 
73e7300d04SMaxime Bizon };
74e7300d04SMaxime Bizon 
75ec68c520SMaxime Bizon static const unsigned long bcm6358_regs_base[] = {
76ec68c520SMaxime Bizon 	__GEN_CPU_REGS_TABLE(6358)
77e7300d04SMaxime Bizon };
78e7300d04SMaxime Bizon 
79ec68c520SMaxime Bizon static const int bcm6358_irqs[] = {
80ec68c520SMaxime Bizon 	__GEN_CPU_IRQ_TABLE(6358)
81ec68c520SMaxime Bizon 
82e7300d04SMaxime Bizon };
83e7300d04SMaxime Bizon 
842c8aaf71SJonas Gorski static const unsigned long bcm6362_regs_base[] = {
852c8aaf71SJonas Gorski 	__GEN_CPU_REGS_TABLE(6362)
862c8aaf71SJonas Gorski };
872c8aaf71SJonas Gorski 
882c8aaf71SJonas Gorski static const int bcm6362_irqs[] = {
892c8aaf71SJonas Gorski 	__GEN_CPU_IRQ_TABLE(6362)
902c8aaf71SJonas Gorski 
912c8aaf71SJonas Gorski };
922c8aaf71SJonas Gorski 
9304712f3fSMaxime Bizon static const unsigned long bcm6368_regs_base[] = {
9404712f3fSMaxime Bizon 	__GEN_CPU_REGS_TABLE(6368)
9504712f3fSMaxime Bizon };
9604712f3fSMaxime Bizon 
9704712f3fSMaxime Bizon static const int bcm6368_irqs[] = {
9804712f3fSMaxime Bizon 	__GEN_CPU_IRQ_TABLE(6368)
9904712f3fSMaxime Bizon 
10004712f3fSMaxime Bizon };
10104712f3fSMaxime Bizon 
bcm63xx_get_cpu_rev(void)1026605428cSJonas Gorski u8 bcm63xx_get_cpu_rev(void)
103e7300d04SMaxime Bizon {
104e7300d04SMaxime Bizon 	return bcm63xx_cpu_rev;
105e7300d04SMaxime Bizon }
106e7300d04SMaxime Bizon 
107e7300d04SMaxime Bizon EXPORT_SYMBOL(bcm63xx_get_cpu_rev);
108e7300d04SMaxime Bizon 
bcm63xx_get_cpu_freq(void)109e7300d04SMaxime Bizon unsigned int bcm63xx_get_cpu_freq(void)
110e7300d04SMaxime Bizon {
111e7300d04SMaxime Bizon 	return bcm63xx_cpu_freq;
112e7300d04SMaxime Bizon }
113e7300d04SMaxime Bizon 
bcm63xx_get_memory_size(void)114e7300d04SMaxime Bizon unsigned int bcm63xx_get_memory_size(void)
115e7300d04SMaxime Bizon {
116e7300d04SMaxime Bizon 	return bcm63xx_memory_size;
117e7300d04SMaxime Bizon }
118e7300d04SMaxime Bizon 
detect_cpu_clock(void)119e7300d04SMaxime Bizon static unsigned int detect_cpu_clock(void)
120e7300d04SMaxime Bizon {
12117d97badSMarkos Chandras 	u16 cpu_id = bcm63xx_get_cpu_id();
12217d97badSMarkos Chandras 
12317d97badSMarkos Chandras 	switch (cpu_id) {
1247b933421SFlorian Fainelli 	case BCM3368_CPU_ID:
1257b933421SFlorian Fainelli 		return 300000000;
1267b933421SFlorian Fainelli 
127e5766aeaSJonas Gorski 	case BCM6328_CPU_ID:
128e5766aeaSJonas Gorski 	{
129e5766aeaSJonas Gorski 		unsigned int tmp, mips_pll_fcvo;
130e5766aeaSJonas Gorski 
131e5766aeaSJonas Gorski 		tmp = bcm_misc_readl(MISC_STRAPBUS_6328_REG);
132e5766aeaSJonas Gorski 		mips_pll_fcvo = (tmp & STRAPBUS_6328_FCVO_MASK)
133e5766aeaSJonas Gorski 				>> STRAPBUS_6328_FCVO_SHIFT;
134e5766aeaSJonas Gorski 
135e5766aeaSJonas Gorski 		switch (mips_pll_fcvo) {
136e5766aeaSJonas Gorski 		case 0x12:
137e5766aeaSJonas Gorski 		case 0x14:
138e5766aeaSJonas Gorski 		case 0x19:
139e5766aeaSJonas Gorski 			return 160000000;
140e5766aeaSJonas Gorski 		case 0x1c:
141e5766aeaSJonas Gorski 			return 192000000;
142e5766aeaSJonas Gorski 		case 0x13:
143e5766aeaSJonas Gorski 		case 0x15:
144e5766aeaSJonas Gorski 			return 200000000;
145e5766aeaSJonas Gorski 		case 0x1a:
146e5766aeaSJonas Gorski 			return 384000000;
147e5766aeaSJonas Gorski 		case 0x16:
148e5766aeaSJonas Gorski 			return 400000000;
149e5766aeaSJonas Gorski 		default:
150e5766aeaSJonas Gorski 			return 320000000;
151e5766aeaSJonas Gorski 		}
152e5766aeaSJonas Gorski 
153e5766aeaSJonas Gorski 	}
15404712f3fSMaxime Bizon 	case BCM6338_CPU_ID:
155e7300d04SMaxime Bizon 		/* BCM6338 has a fixed 240 Mhz frequency */
156e7300d04SMaxime Bizon 		return 240000000;
157e7300d04SMaxime Bizon 
15804712f3fSMaxime Bizon 	case BCM6345_CPU_ID:
159e7300d04SMaxime Bizon 		/* BCM6345 has a fixed 140Mhz frequency */
160e7300d04SMaxime Bizon 		return 140000000;
161e7300d04SMaxime Bizon 
16204712f3fSMaxime Bizon 	case BCM6348_CPU_ID:
16304712f3fSMaxime Bizon 	{
16404712f3fSMaxime Bizon 		unsigned int tmp, n1, n2, m1;
16504712f3fSMaxime Bizon 
166e7300d04SMaxime Bizon 		/* 16MHz * (N1 + 1) * (N2 + 2) / (M1_CPU + 1) */
167e7300d04SMaxime Bizon 		tmp = bcm_perf_readl(PERF_MIPSPLLCTL_REG);
168e7300d04SMaxime Bizon 		n1 = (tmp & MIPSPLLCTL_N1_MASK) >> MIPSPLLCTL_N1_SHIFT;
169e7300d04SMaxime Bizon 		n2 = (tmp & MIPSPLLCTL_N2_MASK) >> MIPSPLLCTL_N2_SHIFT;
170e7300d04SMaxime Bizon 		m1 = (tmp & MIPSPLLCTL_M1CPU_MASK) >> MIPSPLLCTL_M1CPU_SHIFT;
171e7300d04SMaxime Bizon 		n1 += 1;
172e7300d04SMaxime Bizon 		n2 += 2;
173e7300d04SMaxime Bizon 		m1 += 1;
17404712f3fSMaxime Bizon 		return (16 * 1000000 * n1 * n2) / m1;
175e7300d04SMaxime Bizon 	}
176e7300d04SMaxime Bizon 
17704712f3fSMaxime Bizon 	case BCM6358_CPU_ID:
17804712f3fSMaxime Bizon 	{
17904712f3fSMaxime Bizon 		unsigned int tmp, n1, n2, m1;
18004712f3fSMaxime Bizon 
181e7300d04SMaxime Bizon 		/* 16MHz * N1 * N2 / M1_CPU */
182e7300d04SMaxime Bizon 		tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_REG);
183e7300d04SMaxime Bizon 		n1 = (tmp & DMIPSPLLCFG_N1_MASK) >> DMIPSPLLCFG_N1_SHIFT;
184e7300d04SMaxime Bizon 		n2 = (tmp & DMIPSPLLCFG_N2_MASK) >> DMIPSPLLCFG_N2_SHIFT;
185e7300d04SMaxime Bizon 		m1 = (tmp & DMIPSPLLCFG_M1_MASK) >> DMIPSPLLCFG_M1_SHIFT;
18604712f3fSMaxime Bizon 		return (16 * 1000000 * n1 * n2) / m1;
187e7300d04SMaxime Bizon 	}
188e7300d04SMaxime Bizon 
1892c8aaf71SJonas Gorski 	case BCM6362_CPU_ID:
1902c8aaf71SJonas Gorski 	{
1912c8aaf71SJonas Gorski 		unsigned int tmp, mips_pll_fcvo;
1922c8aaf71SJonas Gorski 
1932c8aaf71SJonas Gorski 		tmp = bcm_misc_readl(MISC_STRAPBUS_6362_REG);
1942c8aaf71SJonas Gorski 		mips_pll_fcvo = (tmp & STRAPBUS_6362_FCVO_MASK)
1952c8aaf71SJonas Gorski 				>> STRAPBUS_6362_FCVO_SHIFT;
1962c8aaf71SJonas Gorski 		switch (mips_pll_fcvo) {
1972c8aaf71SJonas Gorski 		case 0x03:
1982c8aaf71SJonas Gorski 		case 0x0b:
1992c8aaf71SJonas Gorski 		case 0x13:
2002c8aaf71SJonas Gorski 		case 0x1b:
2012c8aaf71SJonas Gorski 			return 240000000;
2022c8aaf71SJonas Gorski 		case 0x04:
2032c8aaf71SJonas Gorski 		case 0x0c:
2042c8aaf71SJonas Gorski 		case 0x14:
2052c8aaf71SJonas Gorski 		case 0x1c:
2062c8aaf71SJonas Gorski 			return 160000000;
2072c8aaf71SJonas Gorski 		case 0x05:
2082c8aaf71SJonas Gorski 		case 0x0e:
2092c8aaf71SJonas Gorski 		case 0x16:
2102c8aaf71SJonas Gorski 		case 0x1e:
2112c8aaf71SJonas Gorski 		case 0x1f:
2122c8aaf71SJonas Gorski 			return 400000000;
2132c8aaf71SJonas Gorski 		case 0x06:
2142c8aaf71SJonas Gorski 			return 440000000;
2152c8aaf71SJonas Gorski 		case 0x07:
2162c8aaf71SJonas Gorski 		case 0x17:
2172c8aaf71SJonas Gorski 			return 384000000;
2182c8aaf71SJonas Gorski 		case 0x15:
2192c8aaf71SJonas Gorski 		case 0x1d:
2202c8aaf71SJonas Gorski 			return 200000000;
2212c8aaf71SJonas Gorski 		default:
2222c8aaf71SJonas Gorski 			return 320000000;
2232c8aaf71SJonas Gorski 		}
2242c8aaf71SJonas Gorski 	}
22504712f3fSMaxime Bizon 	case BCM6368_CPU_ID:
22604712f3fSMaxime Bizon 	{
22704712f3fSMaxime Bizon 		unsigned int tmp, p1, p2, ndiv, m1;
22804712f3fSMaxime Bizon 
22904712f3fSMaxime Bizon 		/* (64MHz / P1) * P2 * NDIV / M1_CPU */
23004712f3fSMaxime Bizon 		tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_6368_REG);
23104712f3fSMaxime Bizon 
23204712f3fSMaxime Bizon 		p1 = (tmp & DMIPSPLLCFG_6368_P1_MASK) >>
23304712f3fSMaxime Bizon 			DMIPSPLLCFG_6368_P1_SHIFT;
23404712f3fSMaxime Bizon 
23504712f3fSMaxime Bizon 		p2 = (tmp & DMIPSPLLCFG_6368_P2_MASK) >>
23604712f3fSMaxime Bizon 			DMIPSPLLCFG_6368_P2_SHIFT;
23704712f3fSMaxime Bizon 
23804712f3fSMaxime Bizon 		ndiv = (tmp & DMIPSPLLCFG_6368_NDIV_MASK) >>
23904712f3fSMaxime Bizon 			DMIPSPLLCFG_6368_NDIV_SHIFT;
24004712f3fSMaxime Bizon 
24104712f3fSMaxime Bizon 		tmp = bcm_ddr_readl(DDR_DMIPSPLLDIV_6368_REG);
24204712f3fSMaxime Bizon 		m1 = (tmp & DMIPSPLLDIV_6368_MDIV_MASK) >>
24304712f3fSMaxime Bizon 			DMIPSPLLDIV_6368_MDIV_SHIFT;
24404712f3fSMaxime Bizon 
24504712f3fSMaxime Bizon 		return (((64 * 1000000) / p1) * p2 * ndiv) / m1;
24604712f3fSMaxime Bizon 	}
24704712f3fSMaxime Bizon 
24804712f3fSMaxime Bizon 	default:
24917d97badSMarkos Chandras 		panic("Failed to detect clock for CPU with id=%04X\n", cpu_id);
25004712f3fSMaxime Bizon 	}
251e7300d04SMaxime Bizon }
252e7300d04SMaxime Bizon 
253e7300d04SMaxime Bizon /*
254e7300d04SMaxime Bizon  * attempt to detect the amount of memory installed
255e7300d04SMaxime Bizon  */
detect_memory_size(void)256e7300d04SMaxime Bizon static unsigned int detect_memory_size(void)
257e7300d04SMaxime Bizon {
258e7300d04SMaxime Bizon 	unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0;
259e7300d04SMaxime Bizon 	u32 val;
260e7300d04SMaxime Bizon 
2612c8aaf71SJonas Gorski 	if (BCMCPU_IS_6328() || BCMCPU_IS_6362())
262e5766aeaSJonas Gorski 		return bcm_ddr_readl(DDR_CSEND_REG) << 24;
263e5766aeaSJonas Gorski 
264d61fcfe2SFlorian Fainelli 	if (BCMCPU_IS_6345()) {
265d61fcfe2SFlorian Fainelli 		val = bcm_sdram_readl(SDRAM_MBASE_REG);
266635c9907SRalf Baechle 		return val * 8 * 1024 * 1024;
267d61fcfe2SFlorian Fainelli 	}
268e7300d04SMaxime Bizon 
269e7300d04SMaxime Bizon 	if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) {
270e7300d04SMaxime Bizon 		val = bcm_sdram_readl(SDRAM_CFG_REG);
271e7300d04SMaxime Bizon 		rows = (val & SDRAM_CFG_ROW_MASK) >> SDRAM_CFG_ROW_SHIFT;
272e7300d04SMaxime Bizon 		cols = (val & SDRAM_CFG_COL_MASK) >> SDRAM_CFG_COL_SHIFT;
273e7300d04SMaxime Bizon 		is_32bits = (val & SDRAM_CFG_32B_MASK) ? 1 : 0;
274e7300d04SMaxime Bizon 		banks = (val & SDRAM_CFG_BANK_MASK) ? 2 : 1;
275e7300d04SMaxime Bizon 	}
276e7300d04SMaxime Bizon 
2777b933421SFlorian Fainelli 	if (BCMCPU_IS_3368() || BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
278e7300d04SMaxime Bizon 		val = bcm_memc_readl(MEMC_CFG_REG);
279e7300d04SMaxime Bizon 		rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT;
280e7300d04SMaxime Bizon 		cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT;
281e7300d04SMaxime Bizon 		is_32bits = (val & MEMC_CFG_32B_MASK) ? 0 : 1;
282e7300d04SMaxime Bizon 		banks = 2;
283e7300d04SMaxime Bizon 	}
284e7300d04SMaxime Bizon 
285e7300d04SMaxime Bizon 	/* 0 => 11 address bits ... 2 => 13 address bits */
286e7300d04SMaxime Bizon 	rows += 11;
287e7300d04SMaxime Bizon 
288e7300d04SMaxime Bizon 	/* 0 => 8 address bits ... 2 => 10 address bits */
289e7300d04SMaxime Bizon 	cols += 8;
290e7300d04SMaxime Bizon 
291e7300d04SMaxime Bizon 	return 1 << (cols + rows + (is_32bits + 1) + banks);
292e7300d04SMaxime Bizon }
293e7300d04SMaxime Bizon 
bcm63xx_cpu_init(void)294e7300d04SMaxime Bizon void __init bcm63xx_cpu_init(void)
295e7300d04SMaxime Bizon {
29613be798cSJonas Gorski 	unsigned int tmp;
2972b5b9b78SFlorian Fainelli 	unsigned int cpu = smp_processor_id();
29813be798cSJonas Gorski 	u32 chipid_reg;
299e7300d04SMaxime Bizon 
300e7300d04SMaxime Bizon 	/* soc registers location depends on cpu type */
30113be798cSJonas Gorski 	chipid_reg = 0;
302e7300d04SMaxime Bizon 
303d7b12056SWu Zhangjin 	switch (current_cpu_type()) {
304602977b0SKevin Cernekee 	case CPU_BMIPS3300:
3058ff374b9SMaciej W. Rozycki 		if ((read_c0_prid() & PRID_IMP_MASK) != PRID_IMP_BMIPS3300_ALT)
3062b5b9b78SFlorian Fainelli 			__cpu_name[cpu] = "Broadcom BCM6338";
307*c9b02990SLiangliang Huang 		fallthrough;
308602977b0SKevin Cernekee 	case CPU_BMIPS32:
30913be798cSJonas Gorski 		chipid_reg = BCM_6345_PERF_BASE;
310e7300d04SMaxime Bizon 		break;
311602977b0SKevin Cernekee 	case CPU_BMIPS4350:
3128ff374b9SMaciej W. Rozycki 		switch ((read_c0_prid() & PRID_REV_MASK)) {
3137b933421SFlorian Fainelli 		case 0x04:
3147b933421SFlorian Fainelli 			chipid_reg = BCM_3368_PERF_BASE;
3157b933421SFlorian Fainelli 			break;
3167b933421SFlorian Fainelli 		case 0x10:
31713be798cSJonas Gorski 			chipid_reg = BCM_6345_PERF_BASE;
3187b933421SFlorian Fainelli 			break;
3197b933421SFlorian Fainelli 		default:
32013be798cSJonas Gorski 			chipid_reg = BCM_6368_PERF_BASE;
32104712f3fSMaxime Bizon 			break;
322e7300d04SMaxime Bizon 		}
3237b933421SFlorian Fainelli 		break;
3247b933421SFlorian Fainelli 	}
325e7300d04SMaxime Bizon 
326e7300d04SMaxime Bizon 	/*
327e7300d04SMaxime Bizon 	 * really early to panic, but delaying panic would not help since we
328e7300d04SMaxime Bizon 	 * will never get any working console
329e7300d04SMaxime Bizon 	 */
33013be798cSJonas Gorski 	if (!chipid_reg)
331e7300d04SMaxime Bizon 		panic("unsupported Broadcom CPU");
332e7300d04SMaxime Bizon 
33313be798cSJonas Gorski 	/* read out CPU type */
33413be798cSJonas Gorski 	tmp = bcm_readl(chipid_reg);
335e7300d04SMaxime Bizon 	bcm63xx_cpu_id = (tmp & REV_CHIPID_MASK) >> REV_CHIPID_SHIFT;
336e7300d04SMaxime Bizon 	bcm63xx_cpu_rev = (tmp & REV_REVID_MASK) >> REV_REVID_SHIFT;
337e7300d04SMaxime Bizon 
33813be798cSJonas Gorski 	switch (bcm63xx_cpu_id) {
3397b933421SFlorian Fainelli 	case BCM3368_CPU_ID:
3407b933421SFlorian Fainelli 		bcm63xx_regs_base = bcm3368_regs_base;
3417b933421SFlorian Fainelli 		bcm63xx_irqs = bcm3368_irqs;
3427b933421SFlorian Fainelli 		break;
34313be798cSJonas Gorski 	case BCM6328_CPU_ID:
34413be798cSJonas Gorski 		bcm63xx_regs_base = bcm6328_regs_base;
34513be798cSJonas Gorski 		bcm63xx_irqs = bcm6328_irqs;
34613be798cSJonas Gorski 		break;
34713be798cSJonas Gorski 	case BCM6338_CPU_ID:
34813be798cSJonas Gorski 		bcm63xx_regs_base = bcm6338_regs_base;
34913be798cSJonas Gorski 		bcm63xx_irqs = bcm6338_irqs;
35013be798cSJonas Gorski 		break;
35113be798cSJonas Gorski 	case BCM6345_CPU_ID:
35213be798cSJonas Gorski 		bcm63xx_regs_base = bcm6345_regs_base;
35313be798cSJonas Gorski 		bcm63xx_irqs = bcm6345_irqs;
35413be798cSJonas Gorski 		break;
35513be798cSJonas Gorski 	case BCM6348_CPU_ID:
35613be798cSJonas Gorski 		bcm63xx_regs_base = bcm6348_regs_base;
35713be798cSJonas Gorski 		bcm63xx_irqs = bcm6348_irqs;
35813be798cSJonas Gorski 		break;
35913be798cSJonas Gorski 	case BCM6358_CPU_ID:
36013be798cSJonas Gorski 		bcm63xx_regs_base = bcm6358_regs_base;
36113be798cSJonas Gorski 		bcm63xx_irqs = bcm6358_irqs;
36213be798cSJonas Gorski 		break;
3632c8aaf71SJonas Gorski 	case BCM6362_CPU_ID:
3642c8aaf71SJonas Gorski 		bcm63xx_regs_base = bcm6362_regs_base;
3652c8aaf71SJonas Gorski 		bcm63xx_irqs = bcm6362_irqs;
3662c8aaf71SJonas Gorski 		break;
36713be798cSJonas Gorski 	case BCM6368_CPU_ID:
36813be798cSJonas Gorski 		bcm63xx_regs_base = bcm6368_regs_base;
36913be798cSJonas Gorski 		bcm63xx_irqs = bcm6368_irqs;
37013be798cSJonas Gorski 		break;
37113be798cSJonas Gorski 	default:
37213be798cSJonas Gorski 		panic("unsupported broadcom CPU %x", bcm63xx_cpu_id);
37313be798cSJonas Gorski 		break;
37413be798cSJonas Gorski 	}
375e7300d04SMaxime Bizon 
376e7300d04SMaxime Bizon 	bcm63xx_cpu_freq = detect_cpu_clock();
377e7300d04SMaxime Bizon 	bcm63xx_memory_size = detect_memory_size();
378e7300d04SMaxime Bizon 
37963893ea5SGregory Fong 	pr_info("Detected Broadcom 0x%04x CPU revision %02x\n",
380e7300d04SMaxime Bizon 		bcm63xx_cpu_id, bcm63xx_cpu_rev);
38163893ea5SGregory Fong 	pr_info("CPU frequency is %u MHz\n",
382e7300d04SMaxime Bizon 		bcm63xx_cpu_freq / 1000000);
38363893ea5SGregory Fong 	pr_info("%uMB of RAM installed\n",
384e7300d04SMaxime Bizon 		bcm63xx_memory_size >> 20);
385e7300d04SMaxime Bizon }
386