void tegra_init_speedo_data(void) { u32 reg, val; int i, bit, rev; int sku = tegra_sku_id(); void __iomem *apb_misc = IO_ADDRESS(TEGRA_APB_MISC_BASE); reg = readl(apb_misc + CHIP_ID); rev = (reg & CHIP_MINOR_MASK) >> CHIP_MINOR_SHIFT; if (SPEEDO_ID_SELECT_0(rev)) soc_speedo_id = 0; else if (SPEEDO_ID_SELECT_1(sku)) soc_speedo_id = 1; else soc_speedo_id = 2; BUG_ON(soc_speedo_id >= ARRAY_SIZE(cpu_process_speedos)); BUG_ON(soc_speedo_id >= ARRAY_SIZE(core_process_speedos)); val = 0; for (bit = CPU_SPEEDO_MSBIT; bit >= CPU_SPEEDO_LSBIT; bit--) { reg = tegra_spare_fuse(bit) | tegra_spare_fuse(bit + CPU_SPEEDO_REDUND_OFFS); val = (val << 1) | (reg & 0x1); } val = val * SPEEDO_MULT; pr_debug("%s CPU speedo level %u\n", __func__, val); for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) { if (val <= cpu_process_speedos[soc_speedo_id][i]) break; } cpu_process_id = i; val = 0; for (bit = CORE_SPEEDO_MSBIT; bit >= CORE_SPEEDO_LSBIT; bit--) { reg = tegra_spare_fuse(bit) | tegra_spare_fuse(bit + CORE_SPEEDO_REDUND_OFFS); val = (val << 1) | (reg & 0x1); } val = val * SPEEDO_MULT; pr_debug("%s Core speedo level %u\n", __func__, val); for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) { if (val <= core_process_speedos[soc_speedo_id][i]) break; } core_process_id = i; pr_info("Tegra SKU: %d Rev: A%.2d CPU Process: %d Core Process: %d" " Speedo ID: %d\n", sku, rev, cpu_process_id, core_process_id, soc_speedo_id); }
static void rev_sku_to_speedo_ids(int rev, int sku) { int can_boost = tegra_spare_fuse(60); /* FIXME: boost board check */ if (rev == TEGRA_REVISION_A01) { cpu_speedo_id = 0; soc_speedo_id = 0; gpu_speedo_id = 0; threshold_index = 0; } else if (rev == TEGRA_REVISION_A02) { switch (sku) { case 0x00: /* Engg sku */ cpu_speedo_id = 1; soc_speedo_id = 0; gpu_speedo_id = 1; threshold_index = 0; break; default: pr_warn("Tegra13: Unknown SKU %d\n", sku); cpu_speedo_id = 1; soc_speedo_id = 0; gpu_speedo_id = 0; threshold_index = 0; break; } } }
static int get_speedo_rev(void) { return (tegra_spare_fuse(4) << 2) | (tegra_spare_fuse(3) << 1) | (tegra_spare_fuse(2) << 0); }