Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

soc: mediatek: svs: Add support for MT8186 SoC

MT8186 svs has a number of banks which used as optimization of opp
voltage table for corresponding dvfs drivers.
MT8186 svs big core uses 2-line high bank and low bank to optimize the
voltage of opp table for higher and lower frequency respectively.

Signed-off-by: Mark Tseng <chun-jen.tseng@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>

authored by

Mark Tseng and committed by
AngeloGioacchino Del Regno
58dbf593 8ccda5ce

+282
+282
drivers/soc/mediatek/mtk-svs.c
··· 1986 1986 return true; 1987 1987 } 1988 1988 1989 + static bool svs_mt8186_efuse_parsing(struct svs_platform *svsp) 1990 + { 1991 + struct svs_bank *svsb; 1992 + u32 idx, i, golden_temp; 1993 + int ret; 1994 + 1995 + for (i = 0; i < svsp->efuse_max; i++) 1996 + if (svsp->efuse[i]) 1997 + dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n", 1998 + i, svsp->efuse[i]); 1999 + 2000 + if (!svsp->efuse[0]) { 2001 + dev_notice(svsp->dev, "svs_efuse[0] = 0x0?\n"); 2002 + return false; 2003 + } 2004 + 2005 + /* Svs efuse parsing */ 2006 + for (idx = 0; idx < svsp->bank_max; idx++) { 2007 + svsb = &svsp->banks[idx]; 2008 + 2009 + switch (svsb->sw_id) { 2010 + case SVSB_CPU_BIG: 2011 + if (svsb->type == SVSB_HIGH) { 2012 + svsb->mdes = (svsp->efuse[2] >> 24) & GENMASK(7, 0); 2013 + svsb->bdes = (svsp->efuse[2] >> 16) & GENMASK(7, 0); 2014 + svsb->mtdes = svsp->efuse[2] & GENMASK(7, 0); 2015 + svsb->dcmdet = (svsp->efuse[13] >> 8) & GENMASK(7, 0); 2016 + svsb->dcbdet = svsp->efuse[13] & GENMASK(7, 0); 2017 + } else if (svsb->type == SVSB_LOW) { 2018 + svsb->mdes = (svsp->efuse[3] >> 24) & GENMASK(7, 0); 2019 + svsb->bdes = (svsp->efuse[3] >> 16) & GENMASK(7, 0); 2020 + svsb->mtdes = svsp->efuse[3] & GENMASK(7, 0); 2021 + svsb->dcmdet = (svsp->efuse[14] >> 24) & GENMASK(7, 0); 2022 + svsb->dcbdet = (svsp->efuse[14] >> 16) & GENMASK(7, 0); 2023 + } 2024 + break; 2025 + case SVSB_CPU_LITTLE: 2026 + svsb->mdes = (svsp->efuse[4] >> 24) & GENMASK(7, 0); 2027 + svsb->bdes = (svsp->efuse[4] >> 16) & GENMASK(7, 0); 2028 + svsb->mtdes = svsp->efuse[4] & GENMASK(7, 0); 2029 + svsb->dcmdet = (svsp->efuse[14] >> 8) & GENMASK(7, 0); 2030 + svsb->dcbdet = svsp->efuse[14] & GENMASK(7, 0); 2031 + break; 2032 + case SVSB_CCI: 2033 + svsb->mdes = (svsp->efuse[5] >> 24) & GENMASK(7, 0); 2034 + svsb->bdes = (svsp->efuse[5] >> 16) & GENMASK(7, 0); 2035 + svsb->mtdes = svsp->efuse[5] & GENMASK(7, 0); 2036 + svsb->dcmdet = (svsp->efuse[15] >> 24) & GENMASK(7, 0); 2037 + svsb->dcbdet = (svsp->efuse[15] >> 16) & GENMASK(7, 0); 2038 + break; 2039 + case SVSB_GPU: 2040 + svsb->mdes = (svsp->efuse[6] >> 24) & GENMASK(7, 0); 2041 + svsb->bdes = (svsp->efuse[6] >> 16) & GENMASK(7, 0); 2042 + svsb->mtdes = svsp->efuse[6] & GENMASK(7, 0); 2043 + svsb->dcmdet = (svsp->efuse[15] >> 8) & GENMASK(7, 0); 2044 + svsb->dcbdet = svsp->efuse[15] & GENMASK(7, 0); 2045 + break; 2046 + default: 2047 + dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id); 2048 + return false; 2049 + } 2050 + 2051 + svsb->vmax += svsb->dvt_fixed; 2052 + } 2053 + 2054 + ret = svs_get_efuse_data(svsp, "t-calibration-data", 2055 + &svsp->tefuse, &svsp->tefuse_max); 2056 + if (ret) 2057 + return false; 2058 + 2059 + golden_temp = (svsp->tefuse[0] >> 24) & GENMASK(7, 0); 2060 + if (!golden_temp) 2061 + golden_temp = 50; 2062 + 2063 + for (idx = 0; idx < svsp->bank_max; idx++) { 2064 + svsb = &svsp->banks[idx]; 2065 + svsb->mts = 409; 2066 + svsb->bts = (((500 * golden_temp + 204650) / 1000) - 25) * 4; 2067 + } 2068 + 2069 + return true; 2070 + } 2071 + 1989 2072 static bool svs_mt8183_efuse_parsing(struct svs_platform *svsp) 1990 2073 { 1991 2074 struct svs_bank *svsb; ··· 2335 2252 return 0; 2336 2253 } 2337 2254 2255 + static int svs_mt8186_platform_probe(struct svs_platform *svsp) 2256 + { 2257 + struct device *dev; 2258 + struct svs_bank *svsb; 2259 + u32 idx; 2260 + 2261 + svsp->rst = devm_reset_control_get_optional(svsp->dev, "svs_rst"); 2262 + if (IS_ERR(svsp->rst)) 2263 + return dev_err_probe(svsp->dev, PTR_ERR(svsp->rst), 2264 + "cannot get svs reset control\n"); 2265 + 2266 + dev = svs_add_device_link(svsp, "lvts"); 2267 + if (IS_ERR(dev)) 2268 + return dev_err_probe(svsp->dev, PTR_ERR(dev), 2269 + "failed to get lvts device\n"); 2270 + 2271 + for (idx = 0; idx < svsp->bank_max; idx++) { 2272 + svsb = &svsp->banks[idx]; 2273 + 2274 + switch (svsb->sw_id) { 2275 + case SVSB_CPU_LITTLE: 2276 + case SVSB_CPU_BIG: 2277 + svsb->opp_dev = get_cpu_device(svsb->cpu_id); 2278 + break; 2279 + case SVSB_CCI: 2280 + svsb->opp_dev = svs_add_device_link(svsp, "cci"); 2281 + break; 2282 + case SVSB_GPU: 2283 + svsb->opp_dev = svs_add_device_link(svsp, "gpu"); 2284 + break; 2285 + default: 2286 + dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id); 2287 + return -EINVAL; 2288 + } 2289 + 2290 + if (IS_ERR(svsb->opp_dev)) 2291 + return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev), 2292 + "failed to get OPP device for bank %d\n", 2293 + idx); 2294 + } 2295 + 2296 + return 0; 2297 + } 2298 + 2338 2299 static int svs_mt8183_platform_probe(struct svs_platform *svsp) 2339 2300 { 2340 2301 struct device *dev; ··· 2588 2461 }, 2589 2462 }; 2590 2463 2464 + static struct svs_bank svs_mt8186_banks[] = { 2465 + { 2466 + .sw_id = SVSB_CPU_BIG, 2467 + .type = SVSB_LOW, 2468 + .set_freq_pct = svs_set_bank_freq_pct_v3, 2469 + .get_volts = svs_get_bank_volts_v3, 2470 + .cpu_id = 6, 2471 + .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT, 2472 + .mode_support = SVSB_MODE_INIT02, 2473 + .opp_count = MAX_OPP_ENTRIES, 2474 + .freq_base = 1670000000, 2475 + .turn_freq_base = 1670000000, 2476 + .volt_step = 6250, 2477 + .volt_base = 400000, 2478 + .volt_od = 4, 2479 + .vmax = 0x59, 2480 + .vmin = 0x20, 2481 + .age_config = 0x1, 2482 + .dc_config = 0x1, 2483 + .dvt_fixed = 0x3, 2484 + .vco = 0x10, 2485 + .chk_shift = 0x87, 2486 + .core_sel = 0x0fff0100, 2487 + .int_st = BIT(0), 2488 + .ctl0 = 0x00540003, 2489 + }, 2490 + { 2491 + .sw_id = SVSB_CPU_BIG, 2492 + .type = SVSB_HIGH, 2493 + .set_freq_pct = svs_set_bank_freq_pct_v3, 2494 + .get_volts = svs_get_bank_volts_v3, 2495 + .cpu_id = 6, 2496 + .tzone_name = "cpu_big0", 2497 + .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | 2498 + SVSB_MON_VOLT_IGNORE, 2499 + .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON, 2500 + .opp_count = MAX_OPP_ENTRIES, 2501 + .freq_base = 2050000000, 2502 + .turn_freq_base = 1670000000, 2503 + .volt_step = 6250, 2504 + .volt_base = 400000, 2505 + .volt_od = 4, 2506 + .vmax = 0x73, 2507 + .vmin = 0x20, 2508 + .age_config = 0x1, 2509 + .dc_config = 0x1, 2510 + .dvt_fixed = 0x6, 2511 + .vco = 0x10, 2512 + .chk_shift = 0x87, 2513 + .core_sel = 0x0fff0101, 2514 + .int_st = BIT(1), 2515 + .ctl0 = 0x00540003, 2516 + .tzone_htemp = 85000, 2517 + .tzone_htemp_voffset = 8, 2518 + .tzone_ltemp = 25000, 2519 + .tzone_ltemp_voffset = 8, 2520 + }, 2521 + { 2522 + .sw_id = SVSB_CPU_LITTLE, 2523 + .set_freq_pct = svs_set_bank_freq_pct_v2, 2524 + .get_volts = svs_get_bank_volts_v2, 2525 + .cpu_id = 0, 2526 + .tzone_name = "cpu_zone0", 2527 + .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | 2528 + SVSB_MON_VOLT_IGNORE, 2529 + .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON, 2530 + .opp_count = MAX_OPP_ENTRIES, 2531 + .freq_base = 2000000000, 2532 + .volt_step = 6250, 2533 + .volt_base = 400000, 2534 + .volt_od = 3, 2535 + .vmax = 0x65, 2536 + .vmin = 0x20, 2537 + .age_config = 0x1, 2538 + .dc_config = 0x1, 2539 + .dvt_fixed = 0x6, 2540 + .vco = 0x10, 2541 + .chk_shift = 0x87, 2542 + .core_sel = 0x0fff0102, 2543 + .int_st = BIT(2), 2544 + .ctl0 = 0x3210000f, 2545 + .tzone_htemp = 85000, 2546 + .tzone_htemp_voffset = 8, 2547 + .tzone_ltemp = 25000, 2548 + .tzone_ltemp_voffset = 8, 2549 + }, 2550 + { 2551 + .sw_id = SVSB_CCI, 2552 + .set_freq_pct = svs_set_bank_freq_pct_v2, 2553 + .get_volts = svs_get_bank_volts_v2, 2554 + .tzone_name = "cpu_zone0", 2555 + .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | 2556 + SVSB_MON_VOLT_IGNORE, 2557 + .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON, 2558 + .opp_count = MAX_OPP_ENTRIES, 2559 + .freq_base = 1400000000, 2560 + .volt_step = 6250, 2561 + .volt_base = 400000, 2562 + .volt_od = 3, 2563 + .vmax = 0x65, 2564 + .vmin = 0x20, 2565 + .age_config = 0x1, 2566 + .dc_config = 0x1, 2567 + .dvt_fixed = 0x6, 2568 + .vco = 0x10, 2569 + .chk_shift = 0x87, 2570 + .core_sel = 0x0fff0103, 2571 + .int_st = BIT(3), 2572 + .ctl0 = 0x3210000f, 2573 + .tzone_htemp = 85000, 2574 + .tzone_htemp_voffset = 8, 2575 + .tzone_ltemp = 25000, 2576 + .tzone_ltemp_voffset = 8, 2577 + }, 2578 + { 2579 + .sw_id = SVSB_GPU, 2580 + .set_freq_pct = svs_set_bank_freq_pct_v2, 2581 + .get_volts = svs_get_bank_volts_v2, 2582 + .tzone_name = "mfg", 2583 + .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | 2584 + SVSB_MON_VOLT_IGNORE, 2585 + .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON, 2586 + .opp_count = MAX_OPP_ENTRIES, 2587 + .freq_base = 850000000, 2588 + .volt_step = 6250, 2589 + .volt_base = 400000, 2590 + .vmax = 0x58, 2591 + .vmin = 0x20, 2592 + .age_config = 0x555555, 2593 + .dc_config = 0x1, 2594 + .dvt_fixed = 0x4, 2595 + .vco = 0x10, 2596 + .chk_shift = 0x87, 2597 + .core_sel = 0x0fff0104, 2598 + .int_st = BIT(4), 2599 + .ctl0 = 0x00100003, 2600 + .tzone_htemp = 85000, 2601 + .tzone_htemp_voffset = 8, 2602 + .tzone_ltemp = 25000, 2603 + .tzone_ltemp_voffset = 7, 2604 + }, 2605 + }; 2606 + 2591 2607 static struct svs_bank svs_mt8183_banks[] = { 2592 2608 { 2593 2609 .sw_id = SVSB_CPU_LITTLE, ··· 2862 2592 .bank_max = ARRAY_SIZE(svs_mt8188_banks), 2863 2593 }; 2864 2594 2595 + static const struct svs_platform_data svs_mt8186_platform_data = { 2596 + .name = "mt8186-svs", 2597 + .banks = svs_mt8186_banks, 2598 + .efuse_parsing = svs_mt8186_efuse_parsing, 2599 + .probe = svs_mt8186_platform_probe, 2600 + .regs = svs_regs_v2, 2601 + .bank_max = ARRAY_SIZE(svs_mt8186_banks), 2602 + }; 2603 + 2865 2604 static const struct svs_platform_data svs_mt8183_platform_data = { 2866 2605 .name = "mt8183-svs", 2867 2606 .banks = svs_mt8183_banks, ··· 2890 2611 }, { 2891 2612 .compatible = "mediatek,mt8188-svs", 2892 2613 .data = &svs_mt8188_platform_data, 2614 + }, { 2615 + .compatible = "mediatek,mt8186-svs", 2616 + .data = &svs_mt8186_platform_data, 2893 2617 }, { 2894 2618 .compatible = "mediatek,mt8183-svs", 2895 2619 .data = &svs_mt8183_platform_data,