1*10e32048SÁlvaro Fernández Rojas /* 2*10e32048SÁlvaro Fernández Rojas * Copyright (C) 2017 Álvaro Fernández Rojas <noltari@gmail.com> 3*10e32048SÁlvaro Fernández Rojas * 4*10e32048SÁlvaro Fernández Rojas * Derived from linux/arch/mips/bcm63xx/cpu.c: 5*10e32048SÁlvaro Fernández Rojas * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr> 6*10e32048SÁlvaro Fernández Rojas * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org> 7*10e32048SÁlvaro Fernández Rojas * 8*10e32048SÁlvaro Fernández Rojas * SPDX-License-Identifier: GPL-2.0+ 9*10e32048SÁlvaro Fernández Rojas */ 10*10e32048SÁlvaro Fernández Rojas 11*10e32048SÁlvaro Fernández Rojas #include <common.h> 12*10e32048SÁlvaro Fernández Rojas #include <cpu.h> 13*10e32048SÁlvaro Fernández Rojas #include <dm.h> 14*10e32048SÁlvaro Fernández Rojas #include <errno.h> 15*10e32048SÁlvaro Fernández Rojas #include <asm/io.h> 16*10e32048SÁlvaro Fernández Rojas 17*10e32048SÁlvaro Fernández Rojas DECLARE_GLOBAL_DATA_PTR; 18*10e32048SÁlvaro Fernández Rojas 19*10e32048SÁlvaro Fernández Rojas #define REV_CHIPID_SHIFT 16 20*10e32048SÁlvaro Fernández Rojas #define REV_CHIPID_MASK (0xffff << REV_CHIPID_SHIFT) 21*10e32048SÁlvaro Fernández Rojas #define REV_LONG_CHIPID_SHIFT 12 22*10e32048SÁlvaro Fernández Rojas #define REV_LONG_CHIPID_MASK (0xfffff << REV_LONG_CHIPID_SHIFT) 23*10e32048SÁlvaro Fernández Rojas #define REV_REVID_SHIFT 0 24*10e32048SÁlvaro Fernández Rojas #define REV_REVID_MASK (0xff << REV_REVID_SHIFT) 25*10e32048SÁlvaro Fernández Rojas 26*10e32048SÁlvaro Fernández Rojas #define REG_BCM6328_OTP 0x62c 27*10e32048SÁlvaro Fernández Rojas #define BCM6328_TP1_DISABLED BIT(9) 28*10e32048SÁlvaro Fernández Rojas 29*10e32048SÁlvaro Fernández Rojas #define REG_BCM6328_MISC_STRAPBUS 0x1a40 30*10e32048SÁlvaro Fernández Rojas #define STRAPBUS_6328_FCVO_SHIFT 7 31*10e32048SÁlvaro Fernández Rojas #define STRAPBUS_6328_FCVO_MASK (0x1f << STRAPBUS_6328_FCVO_SHIFT) 32*10e32048SÁlvaro Fernández Rojas 33*10e32048SÁlvaro Fernández Rojas #define REG_BCM6358_DDR_DMIPSPLLCFG 0x12b8 34*10e32048SÁlvaro Fernández Rojas #define DMIPSPLLCFG_6358_M1_SHIFT 0 35*10e32048SÁlvaro Fernández Rojas #define DMIPSPLLCFG_6358_M1_MASK (0xff << DMIPSPLLCFG_6358_M1_SHIFT) 36*10e32048SÁlvaro Fernández Rojas #define DMIPSPLLCFG_6358_N1_SHIFT 23 37*10e32048SÁlvaro Fernández Rojas #define DMIPSPLLCFG_6358_N1_MASK (0x3f << DMIPSPLLCFG_6358_N1_SHIFT) 38*10e32048SÁlvaro Fernández Rojas #define DMIPSPLLCFG_6358_N2_SHIFT 29 39*10e32048SÁlvaro Fernández Rojas #define DMIPSPLLCFG_6358_N2_MASK (0x7 << DMIPSPLLCFG_6358_N2_SHIFT) 40*10e32048SÁlvaro Fernández Rojas 41*10e32048SÁlvaro Fernández Rojas #define REG_BCM63268_MISC_STRAPBUS 0x1814 42*10e32048SÁlvaro Fernández Rojas #define STRAPBUS_63268_FCVO_SHIFT 21 43*10e32048SÁlvaro Fernández Rojas #define STRAPBUS_63268_FCVO_MASK (0xf << STRAPBUS_63268_FCVO_SHIFT) 44*10e32048SÁlvaro Fernández Rojas 45*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_priv; 46*10e32048SÁlvaro Fernández Rojas 47*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_hw { 48*10e32048SÁlvaro Fernández Rojas int (*get_cpu_desc)(struct bmips_cpu_priv *priv, char *buf, int size); 49*10e32048SÁlvaro Fernández Rojas ulong (*get_cpu_freq)(struct bmips_cpu_priv *); 50*10e32048SÁlvaro Fernández Rojas int (*get_cpu_count)(struct bmips_cpu_priv *); 51*10e32048SÁlvaro Fernández Rojas }; 52*10e32048SÁlvaro Fernández Rojas 53*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_priv { 54*10e32048SÁlvaro Fernández Rojas void __iomem *regs; 55*10e32048SÁlvaro Fernández Rojas const struct bmips_cpu_hw *hw; 56*10e32048SÁlvaro Fernández Rojas }; 57*10e32048SÁlvaro Fernández Rojas 58*10e32048SÁlvaro Fernández Rojas /* Specific CPU Ops */ 59*10e32048SÁlvaro Fernández Rojas static int bcm6358_get_cpu_desc(struct bmips_cpu_priv *priv, char *buf, 60*10e32048SÁlvaro Fernández Rojas int size) 61*10e32048SÁlvaro Fernández Rojas { 62*10e32048SÁlvaro Fernández Rojas unsigned short cpu_id; 63*10e32048SÁlvaro Fernández Rojas unsigned char cpu_rev; 64*10e32048SÁlvaro Fernández Rojas u32 val; 65*10e32048SÁlvaro Fernández Rojas 66*10e32048SÁlvaro Fernández Rojas val = readl_be(priv->regs); 67*10e32048SÁlvaro Fernández Rojas cpu_id = (val & REV_CHIPID_MASK) >> REV_CHIPID_SHIFT; 68*10e32048SÁlvaro Fernández Rojas cpu_rev = (val & REV_REVID_MASK) >> REV_REVID_SHIFT; 69*10e32048SÁlvaro Fernández Rojas 70*10e32048SÁlvaro Fernández Rojas snprintf(buf, size, "BCM%04X%02X", cpu_id, cpu_rev); 71*10e32048SÁlvaro Fernández Rojas 72*10e32048SÁlvaro Fernández Rojas return 0; 73*10e32048SÁlvaro Fernández Rojas } 74*10e32048SÁlvaro Fernández Rojas 75*10e32048SÁlvaro Fernández Rojas static int bcm6328_get_cpu_desc(struct bmips_cpu_priv *priv, char *buf, 76*10e32048SÁlvaro Fernández Rojas int size) 77*10e32048SÁlvaro Fernández Rojas { 78*10e32048SÁlvaro Fernández Rojas unsigned int cpu_id; 79*10e32048SÁlvaro Fernández Rojas unsigned char cpu_rev; 80*10e32048SÁlvaro Fernández Rojas u32 val; 81*10e32048SÁlvaro Fernández Rojas 82*10e32048SÁlvaro Fernández Rojas val = readl_be(priv->regs); 83*10e32048SÁlvaro Fernández Rojas cpu_id = (val & REV_LONG_CHIPID_MASK) >> REV_LONG_CHIPID_SHIFT; 84*10e32048SÁlvaro Fernández Rojas cpu_rev = (val & REV_REVID_MASK) >> REV_REVID_SHIFT; 85*10e32048SÁlvaro Fernández Rojas 86*10e32048SÁlvaro Fernández Rojas snprintf(buf, size, "BCM%05X%02X", cpu_id, cpu_rev); 87*10e32048SÁlvaro Fernández Rojas 88*10e32048SÁlvaro Fernández Rojas return 0; 89*10e32048SÁlvaro Fernández Rojas } 90*10e32048SÁlvaro Fernández Rojas 91*10e32048SÁlvaro Fernández Rojas static ulong bcm6328_get_cpu_freq(struct bmips_cpu_priv *priv) 92*10e32048SÁlvaro Fernández Rojas { 93*10e32048SÁlvaro Fernández Rojas unsigned int mips_pll_fcvo; 94*10e32048SÁlvaro Fernández Rojas 95*10e32048SÁlvaro Fernández Rojas mips_pll_fcvo = readl_be(priv->regs + REG_BCM6328_MISC_STRAPBUS); 96*10e32048SÁlvaro Fernández Rojas mips_pll_fcvo = (mips_pll_fcvo & STRAPBUS_6328_FCVO_MASK) 97*10e32048SÁlvaro Fernández Rojas >> STRAPBUS_6328_FCVO_SHIFT; 98*10e32048SÁlvaro Fernández Rojas 99*10e32048SÁlvaro Fernández Rojas switch (mips_pll_fcvo) { 100*10e32048SÁlvaro Fernández Rojas case 0x12: 101*10e32048SÁlvaro Fernández Rojas case 0x14: 102*10e32048SÁlvaro Fernández Rojas case 0x19: 103*10e32048SÁlvaro Fernández Rojas return 160000000; 104*10e32048SÁlvaro Fernández Rojas case 0x1c: 105*10e32048SÁlvaro Fernández Rojas return 192000000; 106*10e32048SÁlvaro Fernández Rojas case 0x13: 107*10e32048SÁlvaro Fernández Rojas case 0x15: 108*10e32048SÁlvaro Fernández Rojas return 200000000; 109*10e32048SÁlvaro Fernández Rojas case 0x1a: 110*10e32048SÁlvaro Fernández Rojas return 384000000; 111*10e32048SÁlvaro Fernández Rojas case 0x16: 112*10e32048SÁlvaro Fernández Rojas return 400000000; 113*10e32048SÁlvaro Fernández Rojas default: 114*10e32048SÁlvaro Fernández Rojas return 320000000; 115*10e32048SÁlvaro Fernández Rojas } 116*10e32048SÁlvaro Fernández Rojas } 117*10e32048SÁlvaro Fernández Rojas 118*10e32048SÁlvaro Fernández Rojas static ulong bcm6358_get_cpu_freq(struct bmips_cpu_priv *priv) 119*10e32048SÁlvaro Fernández Rojas { 120*10e32048SÁlvaro Fernández Rojas unsigned int tmp, n1, n2, m1; 121*10e32048SÁlvaro Fernández Rojas 122*10e32048SÁlvaro Fernández Rojas tmp = readl_be(priv->regs + REG_BCM6358_DDR_DMIPSPLLCFG); 123*10e32048SÁlvaro Fernández Rojas n1 = (tmp & DMIPSPLLCFG_6358_N1_MASK) >> DMIPSPLLCFG_6358_N1_SHIFT; 124*10e32048SÁlvaro Fernández Rojas n2 = (tmp & DMIPSPLLCFG_6358_N2_MASK) >> DMIPSPLLCFG_6358_N2_SHIFT; 125*10e32048SÁlvaro Fernández Rojas m1 = (tmp & DMIPSPLLCFG_6358_M1_MASK) >> DMIPSPLLCFG_6358_M1_SHIFT; 126*10e32048SÁlvaro Fernández Rojas 127*10e32048SÁlvaro Fernández Rojas return (16 * 1000000 * n1 * n2) / m1; 128*10e32048SÁlvaro Fernández Rojas } 129*10e32048SÁlvaro Fernández Rojas 130*10e32048SÁlvaro Fernández Rojas static ulong bcm63268_get_cpu_freq(struct bmips_cpu_priv *priv) 131*10e32048SÁlvaro Fernández Rojas { 132*10e32048SÁlvaro Fernández Rojas unsigned int mips_pll_fcvo; 133*10e32048SÁlvaro Fernández Rojas 134*10e32048SÁlvaro Fernández Rojas mips_pll_fcvo = readl_be(priv->regs + REG_BCM63268_MISC_STRAPBUS); 135*10e32048SÁlvaro Fernández Rojas mips_pll_fcvo = (mips_pll_fcvo & STRAPBUS_63268_FCVO_MASK) 136*10e32048SÁlvaro Fernández Rojas >> STRAPBUS_63268_FCVO_SHIFT; 137*10e32048SÁlvaro Fernández Rojas 138*10e32048SÁlvaro Fernández Rojas switch (mips_pll_fcvo) { 139*10e32048SÁlvaro Fernández Rojas case 0x3: 140*10e32048SÁlvaro Fernández Rojas case 0xe: 141*10e32048SÁlvaro Fernández Rojas return 320000000; 142*10e32048SÁlvaro Fernández Rojas case 0xa: 143*10e32048SÁlvaro Fernández Rojas return 333000000; 144*10e32048SÁlvaro Fernández Rojas case 0x2: 145*10e32048SÁlvaro Fernández Rojas case 0xb: 146*10e32048SÁlvaro Fernández Rojas case 0xf: 147*10e32048SÁlvaro Fernández Rojas return 400000000; 148*10e32048SÁlvaro Fernández Rojas default: 149*10e32048SÁlvaro Fernández Rojas return 0; 150*10e32048SÁlvaro Fernández Rojas } 151*10e32048SÁlvaro Fernández Rojas } 152*10e32048SÁlvaro Fernández Rojas 153*10e32048SÁlvaro Fernández Rojas static int bcm6328_get_cpu_count(struct bmips_cpu_priv *priv) 154*10e32048SÁlvaro Fernández Rojas { 155*10e32048SÁlvaro Fernández Rojas u32 val = readl_be(priv->regs + REG_BCM6328_OTP); 156*10e32048SÁlvaro Fernández Rojas 157*10e32048SÁlvaro Fernández Rojas if (val & BCM6328_TP1_DISABLED) 158*10e32048SÁlvaro Fernández Rojas return 1; 159*10e32048SÁlvaro Fernández Rojas else 160*10e32048SÁlvaro Fernández Rojas return 2; 161*10e32048SÁlvaro Fernández Rojas } 162*10e32048SÁlvaro Fernández Rojas 163*10e32048SÁlvaro Fernández Rojas static int bcm6358_get_cpu_count(struct bmips_cpu_priv *priv) 164*10e32048SÁlvaro Fernández Rojas { 165*10e32048SÁlvaro Fernández Rojas return 2; 166*10e32048SÁlvaro Fernández Rojas } 167*10e32048SÁlvaro Fernández Rojas 168*10e32048SÁlvaro Fernández Rojas static const struct bmips_cpu_hw bmips_cpu_bcm6328 = { 169*10e32048SÁlvaro Fernández Rojas .get_cpu_desc = bcm6328_get_cpu_desc, 170*10e32048SÁlvaro Fernández Rojas .get_cpu_freq = bcm6328_get_cpu_freq, 171*10e32048SÁlvaro Fernández Rojas .get_cpu_count = bcm6328_get_cpu_count, 172*10e32048SÁlvaro Fernández Rojas }; 173*10e32048SÁlvaro Fernández Rojas 174*10e32048SÁlvaro Fernández Rojas static const struct bmips_cpu_hw bmips_cpu_bcm6358 = { 175*10e32048SÁlvaro Fernández Rojas .get_cpu_desc = bcm6358_get_cpu_desc, 176*10e32048SÁlvaro Fernández Rojas .get_cpu_freq = bcm6358_get_cpu_freq, 177*10e32048SÁlvaro Fernández Rojas .get_cpu_count = bcm6358_get_cpu_count, 178*10e32048SÁlvaro Fernández Rojas }; 179*10e32048SÁlvaro Fernández Rojas 180*10e32048SÁlvaro Fernández Rojas static const struct bmips_cpu_hw bmips_cpu_bcm63268 = { 181*10e32048SÁlvaro Fernández Rojas .get_cpu_desc = bcm6328_get_cpu_desc, 182*10e32048SÁlvaro Fernández Rojas .get_cpu_freq = bcm63268_get_cpu_freq, 183*10e32048SÁlvaro Fernández Rojas .get_cpu_count = bcm6358_get_cpu_count, 184*10e32048SÁlvaro Fernández Rojas }; 185*10e32048SÁlvaro Fernández Rojas 186*10e32048SÁlvaro Fernández Rojas /* Generic CPU Ops */ 187*10e32048SÁlvaro Fernández Rojas static int bmips_cpu_get_desc(struct udevice *dev, char *buf, int size) 188*10e32048SÁlvaro Fernández Rojas { 189*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_priv *priv = dev_get_priv(dev); 190*10e32048SÁlvaro Fernández Rojas const struct bmips_cpu_hw *hw = priv->hw; 191*10e32048SÁlvaro Fernández Rojas 192*10e32048SÁlvaro Fernández Rojas return hw->get_cpu_desc(priv, buf, size); 193*10e32048SÁlvaro Fernández Rojas } 194*10e32048SÁlvaro Fernández Rojas 195*10e32048SÁlvaro Fernández Rojas static int bmips_cpu_get_info(struct udevice *dev, struct cpu_info *info) 196*10e32048SÁlvaro Fernández Rojas { 197*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_priv *priv = dev_get_priv(dev); 198*10e32048SÁlvaro Fernández Rojas const struct bmips_cpu_hw *hw = priv->hw; 199*10e32048SÁlvaro Fernández Rojas 200*10e32048SÁlvaro Fernández Rojas info->cpu_freq = hw->get_cpu_freq(priv); 201*10e32048SÁlvaro Fernández Rojas info->features = BIT(CPU_FEAT_L1_CACHE); 202*10e32048SÁlvaro Fernández Rojas info->features |= BIT(CPU_FEAT_MMU); 203*10e32048SÁlvaro Fernández Rojas info->features |= BIT(CPU_FEAT_DEVICE_ID); 204*10e32048SÁlvaro Fernández Rojas 205*10e32048SÁlvaro Fernández Rojas return 0; 206*10e32048SÁlvaro Fernández Rojas } 207*10e32048SÁlvaro Fernández Rojas 208*10e32048SÁlvaro Fernández Rojas static int bmips_cpu_get_count(struct udevice *dev) 209*10e32048SÁlvaro Fernández Rojas { 210*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_priv *priv = dev_get_priv(dev); 211*10e32048SÁlvaro Fernández Rojas const struct bmips_cpu_hw *hw = priv->hw; 212*10e32048SÁlvaro Fernández Rojas 213*10e32048SÁlvaro Fernández Rojas return hw->get_cpu_count(priv); 214*10e32048SÁlvaro Fernández Rojas } 215*10e32048SÁlvaro Fernández Rojas 216*10e32048SÁlvaro Fernández Rojas static int bmips_cpu_get_vendor(struct udevice *dev, char *buf, int size) 217*10e32048SÁlvaro Fernández Rojas { 218*10e32048SÁlvaro Fernández Rojas snprintf(buf, size, "Broadcom"); 219*10e32048SÁlvaro Fernández Rojas 220*10e32048SÁlvaro Fernández Rojas return 0; 221*10e32048SÁlvaro Fernández Rojas } 222*10e32048SÁlvaro Fernández Rojas 223*10e32048SÁlvaro Fernández Rojas static const struct cpu_ops bmips_cpu_ops = { 224*10e32048SÁlvaro Fernández Rojas .get_desc = bmips_cpu_get_desc, 225*10e32048SÁlvaro Fernández Rojas .get_info = bmips_cpu_get_info, 226*10e32048SÁlvaro Fernández Rojas .get_count = bmips_cpu_get_count, 227*10e32048SÁlvaro Fernández Rojas .get_vendor = bmips_cpu_get_vendor, 228*10e32048SÁlvaro Fernández Rojas }; 229*10e32048SÁlvaro Fernández Rojas 230*10e32048SÁlvaro Fernández Rojas /* BMIPS CPU driver */ 231*10e32048SÁlvaro Fernández Rojas int bmips_cpu_bind(struct udevice *dev) 232*10e32048SÁlvaro Fernández Rojas { 233*10e32048SÁlvaro Fernández Rojas struct cpu_platdata *plat = dev_get_parent_platdata(dev); 234*10e32048SÁlvaro Fernández Rojas 235*10e32048SÁlvaro Fernández Rojas plat->cpu_id = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev), 236*10e32048SÁlvaro Fernández Rojas "reg", -1); 237*10e32048SÁlvaro Fernández Rojas plat->device_id = read_c0_prid(); 238*10e32048SÁlvaro Fernández Rojas 239*10e32048SÁlvaro Fernández Rojas return 0; 240*10e32048SÁlvaro Fernández Rojas } 241*10e32048SÁlvaro Fernández Rojas 242*10e32048SÁlvaro Fernández Rojas int bmips_cpu_probe(struct udevice *dev) 243*10e32048SÁlvaro Fernández Rojas { 244*10e32048SÁlvaro Fernández Rojas struct bmips_cpu_priv *priv = dev_get_priv(dev); 245*10e32048SÁlvaro Fernández Rojas const struct bmips_cpu_hw *hw = 246*10e32048SÁlvaro Fernández Rojas (const struct bmips_cpu_hw *)dev_get_driver_data(dev); 247*10e32048SÁlvaro Fernández Rojas fdt_addr_t addr; 248*10e32048SÁlvaro Fernández Rojas fdt_size_t size; 249*10e32048SÁlvaro Fernández Rojas 250*10e32048SÁlvaro Fernández Rojas addr = dev_get_addr_size_index(dev_get_parent(dev), 0, &size); 251*10e32048SÁlvaro Fernández Rojas if (addr == FDT_ADDR_T_NONE) 252*10e32048SÁlvaro Fernández Rojas return -EINVAL; 253*10e32048SÁlvaro Fernández Rojas 254*10e32048SÁlvaro Fernández Rojas priv->regs = ioremap(addr, size); 255*10e32048SÁlvaro Fernández Rojas priv->hw = hw; 256*10e32048SÁlvaro Fernández Rojas 257*10e32048SÁlvaro Fernández Rojas return 0; 258*10e32048SÁlvaro Fernández Rojas } 259*10e32048SÁlvaro Fernández Rojas 260*10e32048SÁlvaro Fernández Rojas static const struct udevice_id bmips_cpu_ids[] = { 261*10e32048SÁlvaro Fernández Rojas { 262*10e32048SÁlvaro Fernández Rojas .compatible = "brcm,bcm6328-cpu", 263*10e32048SÁlvaro Fernández Rojas .data = (ulong)&bmips_cpu_bcm6328, 264*10e32048SÁlvaro Fernández Rojas }, { 265*10e32048SÁlvaro Fernández Rojas .compatible = "brcm,bcm6358-cpu", 266*10e32048SÁlvaro Fernández Rojas .data = (ulong)&bmips_cpu_bcm6358, 267*10e32048SÁlvaro Fernández Rojas }, { 268*10e32048SÁlvaro Fernández Rojas .compatible = "brcm,bcm63268-cpu", 269*10e32048SÁlvaro Fernández Rojas .data = (ulong)&bmips_cpu_bcm63268, 270*10e32048SÁlvaro Fernández Rojas }, 271*10e32048SÁlvaro Fernández Rojas { /* sentinel */ } 272*10e32048SÁlvaro Fernández Rojas }; 273*10e32048SÁlvaro Fernández Rojas 274*10e32048SÁlvaro Fernández Rojas U_BOOT_DRIVER(bmips_cpu_drv) = { 275*10e32048SÁlvaro Fernández Rojas .name = "bmips_cpu", 276*10e32048SÁlvaro Fernández Rojas .id = UCLASS_CPU, 277*10e32048SÁlvaro Fernández Rojas .of_match = bmips_cpu_ids, 278*10e32048SÁlvaro Fernández Rojas .bind = bmips_cpu_bind, 279*10e32048SÁlvaro Fernández Rojas .probe = bmips_cpu_probe, 280*10e32048SÁlvaro Fernández Rojas .priv_auto_alloc_size = sizeof(struct bmips_cpu_priv), 281*10e32048SÁlvaro Fernández Rojas .ops = &bmips_cpu_ops, 282*10e32048SÁlvaro Fernández Rojas .flags = DM_FLAG_PRE_RELOC, 283*10e32048SÁlvaro Fernández Rojas }; 284*10e32048SÁlvaro Fernández Rojas 285*10e32048SÁlvaro Fernández Rojas #ifdef CONFIG_DISPLAY_CPUINFO 286*10e32048SÁlvaro Fernández Rojas int print_cpuinfo(void) 287*10e32048SÁlvaro Fernández Rojas { 288*10e32048SÁlvaro Fernández Rojas struct cpu_info cpu; 289*10e32048SÁlvaro Fernández Rojas struct udevice *dev; 290*10e32048SÁlvaro Fernández Rojas int err; 291*10e32048SÁlvaro Fernández Rojas char desc[100]; 292*10e32048SÁlvaro Fernández Rojas 293*10e32048SÁlvaro Fernández Rojas err = uclass_get_device(UCLASS_CPU, 0, &dev); 294*10e32048SÁlvaro Fernández Rojas if (err) 295*10e32048SÁlvaro Fernández Rojas return 0; 296*10e32048SÁlvaro Fernández Rojas 297*10e32048SÁlvaro Fernández Rojas err = cpu_get_info(dev, &cpu); 298*10e32048SÁlvaro Fernández Rojas if (err) 299*10e32048SÁlvaro Fernández Rojas return 0; 300*10e32048SÁlvaro Fernández Rojas 301*10e32048SÁlvaro Fernández Rojas err = cpu_get_desc(dev, desc, sizeof(desc)); 302*10e32048SÁlvaro Fernández Rojas if (err) 303*10e32048SÁlvaro Fernández Rojas return 0; 304*10e32048SÁlvaro Fernández Rojas 305*10e32048SÁlvaro Fernández Rojas printf("Chip ID: %s, MIPS: ", desc); 306*10e32048SÁlvaro Fernández Rojas print_freq(cpu.cpu_freq, "\n"); 307*10e32048SÁlvaro Fernández Rojas 308*10e32048SÁlvaro Fernández Rojas return 0; 309*10e32048SÁlvaro Fernández Rojas } 310*10e32048SÁlvaro Fernández Rojas #endif 311