162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 462306a36Sopenharmony_ci * for more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr> 762306a36Sopenharmony_ci * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/export.h> 1262306a36Sopenharmony_ci#include <linux/cpu.h> 1362306a36Sopenharmony_ci#include <asm/cpu.h> 1462306a36Sopenharmony_ci#include <asm/cpu-info.h> 1562306a36Sopenharmony_ci#include <asm/mipsregs.h> 1662306a36Sopenharmony_ci#include <bcm63xx_cpu.h> 1762306a36Sopenharmony_ci#include <bcm63xx_regs.h> 1862306a36Sopenharmony_ci#include <bcm63xx_io.h> 1962306a36Sopenharmony_ci#include <bcm63xx_irq.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciconst unsigned long *bcm63xx_regs_base; 2262306a36Sopenharmony_ciEXPORT_SYMBOL(bcm63xx_regs_base); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ciconst int *bcm63xx_irqs; 2562306a36Sopenharmony_ciEXPORT_SYMBOL(bcm63xx_irqs); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciu16 bcm63xx_cpu_id __read_mostly; 2862306a36Sopenharmony_ciEXPORT_SYMBOL(bcm63xx_cpu_id); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic u8 bcm63xx_cpu_rev; 3162306a36Sopenharmony_cistatic unsigned int bcm63xx_cpu_freq; 3262306a36Sopenharmony_cistatic unsigned int bcm63xx_memory_size; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic const unsigned long bcm3368_regs_base[] = { 3562306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(3368) 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic const int bcm3368_irqs[] = { 3962306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(3368) 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic const unsigned long bcm6328_regs_base[] = { 4362306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6328) 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic const int bcm6328_irqs[] = { 4762306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6328) 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic const unsigned long bcm6338_regs_base[] = { 5162306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6338) 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic const int bcm6338_irqs[] = { 5562306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6338) 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic const unsigned long bcm6345_regs_base[] = { 5962306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6345) 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic const int bcm6345_irqs[] = { 6362306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6345) 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic const unsigned long bcm6348_regs_base[] = { 6762306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6348) 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic const int bcm6348_irqs[] = { 7162306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6348) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic const unsigned long bcm6358_regs_base[] = { 7662306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6358) 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic const int bcm6358_irqs[] = { 8062306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6358) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic const unsigned long bcm6362_regs_base[] = { 8562306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6362) 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic const int bcm6362_irqs[] = { 8962306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6362) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic const unsigned long bcm6368_regs_base[] = { 9462306a36Sopenharmony_ci __GEN_CPU_REGS_TABLE(6368) 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic const int bcm6368_irqs[] = { 9862306a36Sopenharmony_ci __GEN_CPU_IRQ_TABLE(6368) 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciu8 bcm63xx_get_cpu_rev(void) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci return bcm63xx_cpu_rev; 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ciEXPORT_SYMBOL(bcm63xx_get_cpu_rev); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ciunsigned int bcm63xx_get_cpu_freq(void) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci return bcm63xx_cpu_freq; 11262306a36Sopenharmony_ci} 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciunsigned int bcm63xx_get_memory_size(void) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci return bcm63xx_memory_size; 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic unsigned int detect_cpu_clock(void) 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci u16 cpu_id = bcm63xx_get_cpu_id(); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci switch (cpu_id) { 12462306a36Sopenharmony_ci case BCM3368_CPU_ID: 12562306a36Sopenharmony_ci return 300000000; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci case BCM6328_CPU_ID: 12862306a36Sopenharmony_ci { 12962306a36Sopenharmony_ci unsigned int tmp, mips_pll_fcvo; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci tmp = bcm_misc_readl(MISC_STRAPBUS_6328_REG); 13262306a36Sopenharmony_ci mips_pll_fcvo = (tmp & STRAPBUS_6328_FCVO_MASK) 13362306a36Sopenharmony_ci >> STRAPBUS_6328_FCVO_SHIFT; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci switch (mips_pll_fcvo) { 13662306a36Sopenharmony_ci case 0x12: 13762306a36Sopenharmony_ci case 0x14: 13862306a36Sopenharmony_ci case 0x19: 13962306a36Sopenharmony_ci return 160000000; 14062306a36Sopenharmony_ci case 0x1c: 14162306a36Sopenharmony_ci return 192000000; 14262306a36Sopenharmony_ci case 0x13: 14362306a36Sopenharmony_ci case 0x15: 14462306a36Sopenharmony_ci return 200000000; 14562306a36Sopenharmony_ci case 0x1a: 14662306a36Sopenharmony_ci return 384000000; 14762306a36Sopenharmony_ci case 0x16: 14862306a36Sopenharmony_ci return 400000000; 14962306a36Sopenharmony_ci default: 15062306a36Sopenharmony_ci return 320000000; 15162306a36Sopenharmony_ci } 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci } 15462306a36Sopenharmony_ci case BCM6338_CPU_ID: 15562306a36Sopenharmony_ci /* BCM6338 has a fixed 240 Mhz frequency */ 15662306a36Sopenharmony_ci return 240000000; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci case BCM6345_CPU_ID: 15962306a36Sopenharmony_ci /* BCM6345 has a fixed 140Mhz frequency */ 16062306a36Sopenharmony_ci return 140000000; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci case BCM6348_CPU_ID: 16362306a36Sopenharmony_ci { 16462306a36Sopenharmony_ci unsigned int tmp, n1, n2, m1; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci /* 16MHz * (N1 + 1) * (N2 + 2) / (M1_CPU + 1) */ 16762306a36Sopenharmony_ci tmp = bcm_perf_readl(PERF_MIPSPLLCTL_REG); 16862306a36Sopenharmony_ci n1 = (tmp & MIPSPLLCTL_N1_MASK) >> MIPSPLLCTL_N1_SHIFT; 16962306a36Sopenharmony_ci n2 = (tmp & MIPSPLLCTL_N2_MASK) >> MIPSPLLCTL_N2_SHIFT; 17062306a36Sopenharmony_ci m1 = (tmp & MIPSPLLCTL_M1CPU_MASK) >> MIPSPLLCTL_M1CPU_SHIFT; 17162306a36Sopenharmony_ci n1 += 1; 17262306a36Sopenharmony_ci n2 += 2; 17362306a36Sopenharmony_ci m1 += 1; 17462306a36Sopenharmony_ci return (16 * 1000000 * n1 * n2) / m1; 17562306a36Sopenharmony_ci } 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci case BCM6358_CPU_ID: 17862306a36Sopenharmony_ci { 17962306a36Sopenharmony_ci unsigned int tmp, n1, n2, m1; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* 16MHz * N1 * N2 / M1_CPU */ 18262306a36Sopenharmony_ci tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_REG); 18362306a36Sopenharmony_ci n1 = (tmp & DMIPSPLLCFG_N1_MASK) >> DMIPSPLLCFG_N1_SHIFT; 18462306a36Sopenharmony_ci n2 = (tmp & DMIPSPLLCFG_N2_MASK) >> DMIPSPLLCFG_N2_SHIFT; 18562306a36Sopenharmony_ci m1 = (tmp & DMIPSPLLCFG_M1_MASK) >> DMIPSPLLCFG_M1_SHIFT; 18662306a36Sopenharmony_ci return (16 * 1000000 * n1 * n2) / m1; 18762306a36Sopenharmony_ci } 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci case BCM6362_CPU_ID: 19062306a36Sopenharmony_ci { 19162306a36Sopenharmony_ci unsigned int tmp, mips_pll_fcvo; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci tmp = bcm_misc_readl(MISC_STRAPBUS_6362_REG); 19462306a36Sopenharmony_ci mips_pll_fcvo = (tmp & STRAPBUS_6362_FCVO_MASK) 19562306a36Sopenharmony_ci >> STRAPBUS_6362_FCVO_SHIFT; 19662306a36Sopenharmony_ci switch (mips_pll_fcvo) { 19762306a36Sopenharmony_ci case 0x03: 19862306a36Sopenharmony_ci case 0x0b: 19962306a36Sopenharmony_ci case 0x13: 20062306a36Sopenharmony_ci case 0x1b: 20162306a36Sopenharmony_ci return 240000000; 20262306a36Sopenharmony_ci case 0x04: 20362306a36Sopenharmony_ci case 0x0c: 20462306a36Sopenharmony_ci case 0x14: 20562306a36Sopenharmony_ci case 0x1c: 20662306a36Sopenharmony_ci return 160000000; 20762306a36Sopenharmony_ci case 0x05: 20862306a36Sopenharmony_ci case 0x0e: 20962306a36Sopenharmony_ci case 0x16: 21062306a36Sopenharmony_ci case 0x1e: 21162306a36Sopenharmony_ci case 0x1f: 21262306a36Sopenharmony_ci return 400000000; 21362306a36Sopenharmony_ci case 0x06: 21462306a36Sopenharmony_ci return 440000000; 21562306a36Sopenharmony_ci case 0x07: 21662306a36Sopenharmony_ci case 0x17: 21762306a36Sopenharmony_ci return 384000000; 21862306a36Sopenharmony_ci case 0x15: 21962306a36Sopenharmony_ci case 0x1d: 22062306a36Sopenharmony_ci return 200000000; 22162306a36Sopenharmony_ci default: 22262306a36Sopenharmony_ci return 320000000; 22362306a36Sopenharmony_ci } 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci case BCM6368_CPU_ID: 22662306a36Sopenharmony_ci { 22762306a36Sopenharmony_ci unsigned int tmp, p1, p2, ndiv, m1; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci /* (64MHz / P1) * P2 * NDIV / M1_CPU */ 23062306a36Sopenharmony_ci tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_6368_REG); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci p1 = (tmp & DMIPSPLLCFG_6368_P1_MASK) >> 23362306a36Sopenharmony_ci DMIPSPLLCFG_6368_P1_SHIFT; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci p2 = (tmp & DMIPSPLLCFG_6368_P2_MASK) >> 23662306a36Sopenharmony_ci DMIPSPLLCFG_6368_P2_SHIFT; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci ndiv = (tmp & DMIPSPLLCFG_6368_NDIV_MASK) >> 23962306a36Sopenharmony_ci DMIPSPLLCFG_6368_NDIV_SHIFT; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci tmp = bcm_ddr_readl(DDR_DMIPSPLLDIV_6368_REG); 24262306a36Sopenharmony_ci m1 = (tmp & DMIPSPLLDIV_6368_MDIV_MASK) >> 24362306a36Sopenharmony_ci DMIPSPLLDIV_6368_MDIV_SHIFT; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci return (((64 * 1000000) / p1) * p2 * ndiv) / m1; 24662306a36Sopenharmony_ci } 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci default: 24962306a36Sopenharmony_ci panic("Failed to detect clock for CPU with id=%04X\n", cpu_id); 25062306a36Sopenharmony_ci } 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/* 25462306a36Sopenharmony_ci * attempt to detect the amount of memory installed 25562306a36Sopenharmony_ci */ 25662306a36Sopenharmony_cistatic unsigned int detect_memory_size(void) 25762306a36Sopenharmony_ci{ 25862306a36Sopenharmony_ci unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0; 25962306a36Sopenharmony_ci u32 val; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci if (BCMCPU_IS_6328() || BCMCPU_IS_6362()) 26262306a36Sopenharmony_ci return bcm_ddr_readl(DDR_CSEND_REG) << 24; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci if (BCMCPU_IS_6345()) { 26562306a36Sopenharmony_ci val = bcm_sdram_readl(SDRAM_MBASE_REG); 26662306a36Sopenharmony_ci return val * 8 * 1024 * 1024; 26762306a36Sopenharmony_ci } 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { 27062306a36Sopenharmony_ci val = bcm_sdram_readl(SDRAM_CFG_REG); 27162306a36Sopenharmony_ci rows = (val & SDRAM_CFG_ROW_MASK) >> SDRAM_CFG_ROW_SHIFT; 27262306a36Sopenharmony_ci cols = (val & SDRAM_CFG_COL_MASK) >> SDRAM_CFG_COL_SHIFT; 27362306a36Sopenharmony_ci is_32bits = (val & SDRAM_CFG_32B_MASK) ? 1 : 0; 27462306a36Sopenharmony_ci banks = (val & SDRAM_CFG_BANK_MASK) ? 2 : 1; 27562306a36Sopenharmony_ci } 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci if (BCMCPU_IS_3368() || BCMCPU_IS_6358() || BCMCPU_IS_6368()) { 27862306a36Sopenharmony_ci val = bcm_memc_readl(MEMC_CFG_REG); 27962306a36Sopenharmony_ci rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT; 28062306a36Sopenharmony_ci cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT; 28162306a36Sopenharmony_ci is_32bits = (val & MEMC_CFG_32B_MASK) ? 0 : 1; 28262306a36Sopenharmony_ci banks = 2; 28362306a36Sopenharmony_ci } 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci /* 0 => 11 address bits ... 2 => 13 address bits */ 28662306a36Sopenharmony_ci rows += 11; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci /* 0 => 8 address bits ... 2 => 10 address bits */ 28962306a36Sopenharmony_ci cols += 8; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci return 1 << (cols + rows + (is_32bits + 1) + banks); 29262306a36Sopenharmony_ci} 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_civoid __init bcm63xx_cpu_init(void) 29562306a36Sopenharmony_ci{ 29662306a36Sopenharmony_ci unsigned int tmp; 29762306a36Sopenharmony_ci unsigned int cpu = smp_processor_id(); 29862306a36Sopenharmony_ci u32 chipid_reg; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci /* soc registers location depends on cpu type */ 30162306a36Sopenharmony_ci chipid_reg = 0; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci switch (current_cpu_type()) { 30462306a36Sopenharmony_ci case CPU_BMIPS3300: 30562306a36Sopenharmony_ci if ((read_c0_prid() & PRID_IMP_MASK) != PRID_IMP_BMIPS3300_ALT) 30662306a36Sopenharmony_ci __cpu_name[cpu] = "Broadcom BCM6338"; 30762306a36Sopenharmony_ci fallthrough; 30862306a36Sopenharmony_ci case CPU_BMIPS32: 30962306a36Sopenharmony_ci chipid_reg = BCM_6345_PERF_BASE; 31062306a36Sopenharmony_ci break; 31162306a36Sopenharmony_ci case CPU_BMIPS4350: 31262306a36Sopenharmony_ci switch ((read_c0_prid() & PRID_REV_MASK)) { 31362306a36Sopenharmony_ci case 0x04: 31462306a36Sopenharmony_ci chipid_reg = BCM_3368_PERF_BASE; 31562306a36Sopenharmony_ci break; 31662306a36Sopenharmony_ci case 0x10: 31762306a36Sopenharmony_ci chipid_reg = BCM_6345_PERF_BASE; 31862306a36Sopenharmony_ci break; 31962306a36Sopenharmony_ci default: 32062306a36Sopenharmony_ci chipid_reg = BCM_6368_PERF_BASE; 32162306a36Sopenharmony_ci break; 32262306a36Sopenharmony_ci } 32362306a36Sopenharmony_ci break; 32462306a36Sopenharmony_ci } 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci /* 32762306a36Sopenharmony_ci * really early to panic, but delaying panic would not help since we 32862306a36Sopenharmony_ci * will never get any working console 32962306a36Sopenharmony_ci */ 33062306a36Sopenharmony_ci if (!chipid_reg) 33162306a36Sopenharmony_ci panic("unsupported Broadcom CPU"); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci /* read out CPU type */ 33462306a36Sopenharmony_ci tmp = bcm_readl(chipid_reg); 33562306a36Sopenharmony_ci bcm63xx_cpu_id = (tmp & REV_CHIPID_MASK) >> REV_CHIPID_SHIFT; 33662306a36Sopenharmony_ci bcm63xx_cpu_rev = (tmp & REV_REVID_MASK) >> REV_REVID_SHIFT; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci switch (bcm63xx_cpu_id) { 33962306a36Sopenharmony_ci case BCM3368_CPU_ID: 34062306a36Sopenharmony_ci bcm63xx_regs_base = bcm3368_regs_base; 34162306a36Sopenharmony_ci bcm63xx_irqs = bcm3368_irqs; 34262306a36Sopenharmony_ci break; 34362306a36Sopenharmony_ci case BCM6328_CPU_ID: 34462306a36Sopenharmony_ci bcm63xx_regs_base = bcm6328_regs_base; 34562306a36Sopenharmony_ci bcm63xx_irqs = bcm6328_irqs; 34662306a36Sopenharmony_ci break; 34762306a36Sopenharmony_ci case BCM6338_CPU_ID: 34862306a36Sopenharmony_ci bcm63xx_regs_base = bcm6338_regs_base; 34962306a36Sopenharmony_ci bcm63xx_irqs = bcm6338_irqs; 35062306a36Sopenharmony_ci break; 35162306a36Sopenharmony_ci case BCM6345_CPU_ID: 35262306a36Sopenharmony_ci bcm63xx_regs_base = bcm6345_regs_base; 35362306a36Sopenharmony_ci bcm63xx_irqs = bcm6345_irqs; 35462306a36Sopenharmony_ci break; 35562306a36Sopenharmony_ci case BCM6348_CPU_ID: 35662306a36Sopenharmony_ci bcm63xx_regs_base = bcm6348_regs_base; 35762306a36Sopenharmony_ci bcm63xx_irqs = bcm6348_irqs; 35862306a36Sopenharmony_ci break; 35962306a36Sopenharmony_ci case BCM6358_CPU_ID: 36062306a36Sopenharmony_ci bcm63xx_regs_base = bcm6358_regs_base; 36162306a36Sopenharmony_ci bcm63xx_irqs = bcm6358_irqs; 36262306a36Sopenharmony_ci break; 36362306a36Sopenharmony_ci case BCM6362_CPU_ID: 36462306a36Sopenharmony_ci bcm63xx_regs_base = bcm6362_regs_base; 36562306a36Sopenharmony_ci bcm63xx_irqs = bcm6362_irqs; 36662306a36Sopenharmony_ci break; 36762306a36Sopenharmony_ci case BCM6368_CPU_ID: 36862306a36Sopenharmony_ci bcm63xx_regs_base = bcm6368_regs_base; 36962306a36Sopenharmony_ci bcm63xx_irqs = bcm6368_irqs; 37062306a36Sopenharmony_ci break; 37162306a36Sopenharmony_ci default: 37262306a36Sopenharmony_ci panic("unsupported broadcom CPU %x", bcm63xx_cpu_id); 37362306a36Sopenharmony_ci break; 37462306a36Sopenharmony_ci } 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci bcm63xx_cpu_freq = detect_cpu_clock(); 37762306a36Sopenharmony_ci bcm63xx_memory_size = detect_memory_size(); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci pr_info("Detected Broadcom 0x%04x CPU revision %02x\n", 38062306a36Sopenharmony_ci bcm63xx_cpu_id, bcm63xx_cpu_rev); 38162306a36Sopenharmony_ci pr_info("CPU frequency is %u MHz\n", 38262306a36Sopenharmony_ci bcm63xx_cpu_freq / 1000000); 38362306a36Sopenharmony_ci pr_info("%uMB of RAM installed\n", 38462306a36Sopenharmony_ci bcm63xx_memory_size >> 20); 38562306a36Sopenharmony_ci} 386