void tegra_init_speedo_data(void) { int i; if (!tegra_platform_is_silicon()) { cpu_process_id = 0; core_process_id = 0; gpu_process_id = 0; cpu_speedo_id = 0; soc_speedo_id = 0; gpu_speedo_id = 0; package_id = -1; cpu_speedo_value = 1777; gpu_speedo_value = 2000; cpu_speedo_0_value = 0; cpu_speedo_1_value = 0; soc_speedo_0_value = 0; soc_speedo_1_value = 0; soc_speedo_2_value = 0; soc_iddq_value = 0; gpu_iddq_value = 0; return; } cpu_speedo_0_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_0); cpu_speedo_1_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_1); /* GPU Speedo is stored in CPU_SPEEDO_2 */ gpu_speedo_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_2); soc_speedo_0_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_0); soc_speedo_1_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_1); soc_speedo_2_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_2); cpu_iddq_value = tegra_fuse_readl(FUSE_CPU_IDDQ); soc_iddq_value = tegra_fuse_readl(FUSE_SOC_IDDQ); gpu_iddq_value = tegra_fuse_readl(FUSE_GPU_IDDQ); cpu_speedo_value = cpu_speedo_0_value; if (cpu_speedo_value == 0) { cpu_speedo_value = 2100; pr_warn("Tegra13: Warning: CPU Speedo value not fused. PLEASE FIX!!!!!!!!!!!\n"); pr_warn("Tegra13: Warning: PLEASE USE BOARD WITH FUSED SPEEDO VALUE !!!!\n"); } if (gpu_speedo_value == 0) { gpu_speedo_value = 2000; pr_warn("Tegra13: Warning: GPU Speedo value not fused. PLEASE FIX!!!!!!!!!!!\n"); pr_warn("Tegra13: Warning: PLEASE USE BOARD WITH FUSED SPEEDO VALUE !!!!\n"); } rev_sku_to_speedo_ids(tegra_revision, tegra_get_sku_id()); for (i = 0; i < GPU_PROCESS_CORNERS_NUM; i++) { if (gpu_speedo_value < gpu_process_speedos[threshold_index][i]) { break; } } gpu_process_id = i; for (i = 0; i < CPU_PROCESS_CORNERS_NUM; i++) { if (cpu_speedo_value < cpu_process_speedos[threshold_index][i]) { break; } } cpu_process_id = i; for (i = 0; i < CORE_PROCESS_CORNERS_NUM; i++) { if (soc_speedo_0_value < core_process_speedos[threshold_index][i]) { break; } } core_process_id = i; pr_info("Tegra13: CPU Speedo ID %d, Soc Speedo ID %d, Gpu Speedo ID %d\n", cpu_speedo_id, soc_speedo_id, gpu_speedo_id); pr_info("Tegra13: CPU Process ID %d,Soc Process ID %d,Gpu Process ID %d\n", cpu_process_id, core_process_id, gpu_process_id); pr_info("Tegra13: CPU Speedo value %d, Soc Speedo value %d, Gpu Speedo value %d\n", cpu_speedo_value, soc_speedo_0_value, gpu_speedo_value); }
void tegra_init_speedo_data(void) { int i; u32 tegra_sku_id; if (!tegra_platform_is_silicon()) { cpu_process_id = 0; core_process_id = 0; gpu_process_id = 0; cpu_speedo_id = 0; soc_speedo_id = 0; gpu_speedo_id = 0; package_id = -1; cpu_speedo_value = TEGRA21_CPU_SPEEDO; gpu_speedo_value = TEGRA21_GPU_SPEEDO; soc_speedo_value = TEGRA21_SOC_SPEEDO; cpu_speedo_0_value = 0; cpu_speedo_1_value = 0; soc_speedo_0_value = 0; soc_speedo_1_value = 0; soc_speedo_2_value = 0; soc_iddq_value = 0; gpu_iddq_value = 0; pr_info("Tegra21: CPU Speedo value %d, Soc Speedo value %d, Gpu Speedo value %d\n", cpu_speedo_value, soc_speedo_value, gpu_speedo_value); pr_info("Tegra21: CPU Speedo ID %d, Soc Speedo ID %d, Gpu Speedo ID %d\n", cpu_speedo_id, soc_speedo_id, gpu_speedo_id); pr_info("Tegra21: CPU Process ID %d,Soc Process ID %d,Gpu Process ID %d\n", cpu_process_id, core_process_id, gpu_process_id); return; } /* Read speedo/iddq fuses */ cpu_speedo_0_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_0); cpu_speedo_1_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_1); cpu_speedo_2_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_2); soc_speedo_0_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_0); soc_speedo_1_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_1); soc_speedo_2_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_2); cpu_iddq_value = tegra_fuse_readl(FUSE_CPU_IDDQ) * 4; soc_iddq_value = tegra_fuse_readl(FUSE_SOC_IDDQ) * 4; gpu_iddq_value = tegra_fuse_readl(FUSE_GPU_IDDQ) * 5; /* * Determine CPU, GPU, SOC speedo values depending on speedo fusing * revision. Note that GPU speedo value is fused in CPU_SPEEDO_2 */ speedo_rev = get_speedo_rev(); if (speedo_rev >= 3) { cpu_speedo_value = cpu_speedo_0_value; gpu_speedo_value = cpu_speedo_2_value; soc_speedo_value = soc_speedo_0_value; } else if (speedo_rev == 2) { cpu_speedo_value = (-1938 + (1095*cpu_speedo_0_value/100)) / 10; gpu_speedo_value = (-1662 + (1082*cpu_speedo_2_value/100)) / 10; soc_speedo_value = (-705 + (1037*soc_speedo_0_value/100)) / 10; } else { /* FIXME: do we need hard-coded IDDQ here? */ cpu_speedo_value = TEGRA21_CPU_SPEEDO; gpu_speedo_value = cpu_speedo_2_value - TEGRA21_GPU_SPEEDO_OFFS; soc_speedo_value = TEGRA21_SOC_SPEEDO; } if (cpu_speedo_value <= 0) { cpu_speedo_value = TEGRA21_CPU_SPEEDO; pr_warn("Tegra21: Warning: CPU Speedo value not fused. PLEASE FIX!!!!!!!!!!!\n"); pr_warn("Tegra21: Warning: PLEASE USE BOARD WITH FUSED SPEEDO VALUE !!!!\n"); } if (gpu_speedo_value <= 0) { gpu_speedo_value = TEGRA21_GPU_SPEEDO; pr_warn("Tegra21: Warning: GPU Speedo value not fused. PLEASE FIX!!!!!!!!!!!\n"); pr_warn("Tegra21: Warning: PLEASE USE BOARD WITH FUSED SPEEDO VALUE !!!!\n"); } if (soc_speedo_value <= 0) { soc_speedo_value = TEGRA21_SOC_SPEEDO; pr_warn("Tegra21: Warning: SOC Speedo value not fused. PLEASE FIX!!!!!!!!!!!\n"); pr_warn("Tegra21: Warning: PLEASE USE BOARD WITH FUSED SPEEDO VALUE !!!!\n"); } /* Map chip sku, rev, speedo values into speedo and process IDs */ tegra_sku_id = tegra_get_sku_id(); rev_sku_to_speedo_ids(tegra_revision, tegra_sku_id, speedo_rev); for (i = 0; i < GPU_PROCESS_CORNERS_NUM; i++) { if (gpu_speedo_value < gpu_process_speedos[threshold_index][i]) { break; } } gpu_process_id = i; for (i = 0; i < CPU_PROCESS_CORNERS_NUM; i++) { if (cpu_speedo_value < cpu_process_speedos[threshold_index][i]) { break; } } cpu_process_id = i; for (i = 0; i < CORE_PROCESS_CORNERS_NUM; i++) { if (soc_speedo_value < core_process_speedos[threshold_index][i]) { break; } } core_process_id = i; pr_info("Tegra21: Speedo/IDDQ fuse revision %d\n", speedo_rev); pr_info("Tegra21: CPU Speedo ID %d, Soc Speedo ID %d, Gpu Speedo ID %d\n", cpu_speedo_id, soc_speedo_id, gpu_speedo_id); pr_info("Tegra21: CPU Process ID %d, Soc Process ID %d, Gpu Process ID %d\n", cpu_process_id, core_process_id, gpu_process_id); pr_info("Tegra21: CPU Speedo value %d, Soc Speedo value %d, Gpu Speedo value %d\n", cpu_speedo_value, soc_speedo_value, gpu_speedo_value); pr_info("Tegra21: CPU IDDQ %d, Soc IDDQ %d, Gpu IDDQ %d\n", cpu_iddq_value, soc_iddq_value, gpu_iddq_value); }