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

memory: tegra: Support derated timings on Tegra210

Derated timings are used to ensure that the memory chips keep operating
correctly at high temperatures. This adds code to support polling of the
chip operating state when high temperatures are measured on the chip and
change the refresh mode accordingly. Under very high temperatures, the
driver will switch to the derated tables to ensure proper operation of
the memory chips.

Signed-off-by: Thierry Reding <treding@nvidia.com>

+363 -13
+3
drivers/memory/tegra/tegra210-emc-cc-r21021.c
··· 1070 1070 emc_writel(emc, value, offset); 1071 1071 } 1072 1072 1073 + /* SW addition: do EMC refresh adjustment here. */ 1074 + tegra210_emc_adjust_timing(emc, next); 1075 + 1073 1076 if (dram_type == DRAM_TYPE_LPDDR4) { 1074 1077 value = (23 << EMC_MRW_MRW_MA_SHIFT) | 1075 1078 (next->run_clocks & EMC_MRW_MRW_OP_MASK);
+297 -6
drivers/memory/tegra/tegra210-emc-core.c
··· 3 3 * Copyright (c) 2015-2020, NVIDIA CORPORATION. All rights reserved. 4 4 */ 5 5 6 + #include <linux/bitfield.h> 6 7 #include <linux/clk.h> 7 8 #include <linux/clk/tegra.h> 8 9 #include <linux/clk-provider.h> ··· 15 14 #include <linux/of_platform.h> 16 15 #include <linux/of_reserved_mem.h> 17 16 #include <linux/slab.h> 17 + #include <linux/thermal.h> 18 18 #include <soc/tegra/fuse.h> 19 19 #include <soc/tegra/mc.h> 20 20 ··· 28 26 (0x7 << EMC_CLK_EMC_2X_CLK_SRC_SHIFT) 29 27 #define EMC_CLK_SOURCE_PLLM_LJ 0x4 30 28 #define EMC_CLK_SOURCE_PLLMB_LJ 0x5 29 + #define EMC_CLK_FORCE_CC_TRIGGER BIT(27) 31 30 #define EMC_CLK_MC_EMC_SAME_FREQ BIT(16) 32 31 #define EMC_CLK_EMC_2X_CLK_DIVISOR_SHIFT 0 33 32 #define EMC_CLK_EMC_2X_CLK_DIVISOR_MASK \ ··· 85 82 86 83 #define REFRESH_SPEEDUP(value, speedup) \ 87 84 (((value) & 0xffff0000) | ((value) & 0xffff) * (speedup)) 85 + 86 + #define LPDDR2_MR4_SRR GENMASK(2, 0) 88 87 89 88 static const struct tegra210_emc_sequence *tegra210_emc_sequences[] = { 90 89 &tegra210_emc_r21021, ··· 587 582 del_timer(&emc->training); 588 583 } 589 584 585 + static unsigned int tegra210_emc_get_temperature(struct tegra210_emc *emc) 586 + { 587 + unsigned long flags; 588 + u32 value, max = 0; 589 + unsigned int i; 590 + 591 + spin_lock_irqsave(&emc->lock, flags); 592 + 593 + for (i = 0; i < emc->num_devices; i++) { 594 + value = tegra210_emc_mrr_read(emc, i, 4); 595 + 596 + if (value & BIT(7)) 597 + dev_dbg(emc->dev, 598 + "sensor reading changed for device %u: %08x\n", 599 + i, value); 600 + 601 + value = FIELD_GET(LPDDR2_MR4_SRR, value); 602 + if (value > max) 603 + max = value; 604 + } 605 + 606 + spin_unlock_irqrestore(&emc->lock, flags); 607 + 608 + return max; 609 + } 610 + 611 + static void tegra210_emc_poll_refresh(struct timer_list *timer) 612 + { 613 + struct tegra210_emc *emc = from_timer(emc, timer, refresh_timer); 614 + unsigned int temperature; 615 + 616 + if (!emc->debugfs.temperature) 617 + temperature = tegra210_emc_get_temperature(emc); 618 + else 619 + temperature = emc->debugfs.temperature; 620 + 621 + if (temperature == emc->temperature) 622 + goto reset; 623 + 624 + switch (temperature) { 625 + case 0 ... 3: 626 + /* temperature is fine, using regular refresh */ 627 + dev_dbg(emc->dev, "switching to nominal refresh...\n"); 628 + tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_NOMINAL); 629 + break; 630 + 631 + case 4: 632 + dev_dbg(emc->dev, "switching to 2x refresh...\n"); 633 + tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_2X); 634 + break; 635 + 636 + case 5: 637 + dev_dbg(emc->dev, "switching to 4x refresh...\n"); 638 + tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_4X); 639 + break; 640 + 641 + case 6 ... 7: 642 + dev_dbg(emc->dev, "switching to throttle refresh...\n"); 643 + tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_THROTTLE); 644 + break; 645 + 646 + default: 647 + WARN(1, "invalid DRAM temperature state %u\n", temperature); 648 + return; 649 + } 650 + 651 + emc->temperature = temperature; 652 + 653 + reset: 654 + if (atomic_read(&emc->refresh_poll) > 0) { 655 + unsigned int interval = emc->refresh_poll_interval; 656 + unsigned int timeout = msecs_to_jiffies(interval); 657 + 658 + mod_timer(&emc->refresh_timer, jiffies + timeout); 659 + } 660 + } 661 + 662 + static void tegra210_emc_poll_refresh_stop(struct tegra210_emc *emc) 663 + { 664 + atomic_set(&emc->refresh_poll, 0); 665 + del_timer_sync(&emc->refresh_timer); 666 + } 667 + 668 + static void tegra210_emc_poll_refresh_start(struct tegra210_emc *emc) 669 + { 670 + atomic_set(&emc->refresh_poll, 1); 671 + 672 + mod_timer(&emc->refresh_timer, 673 + jiffies + msecs_to_jiffies(emc->refresh_poll_interval)); 674 + } 675 + 676 + static int tegra210_emc_cd_max_state(struct thermal_cooling_device *cd, 677 + unsigned long *state) 678 + { 679 + *state = 1; 680 + 681 + return 0; 682 + } 683 + 684 + static int tegra210_emc_cd_get_state(struct thermal_cooling_device *cd, 685 + unsigned long *state) 686 + { 687 + struct tegra210_emc *emc = cd->devdata; 688 + 689 + *state = atomic_read(&emc->refresh_poll); 690 + 691 + return 0; 692 + } 693 + 694 + static int tegra210_emc_cd_set_state(struct thermal_cooling_device *cd, 695 + unsigned long state) 696 + { 697 + struct tegra210_emc *emc = cd->devdata; 698 + 699 + if (state == atomic_read(&emc->refresh_poll)) 700 + return 0; 701 + 702 + if (state) 703 + tegra210_emc_poll_refresh_start(emc); 704 + else 705 + tegra210_emc_poll_refresh_stop(emc); 706 + 707 + return 0; 708 + } 709 + 710 + static struct thermal_cooling_device_ops tegra210_emc_cd_ops = { 711 + .get_max_state = tegra210_emc_cd_max_state, 712 + .get_cur_state = tegra210_emc_cd_get_state, 713 + .set_cur_state = tegra210_emc_cd_set_state, 714 + }; 715 + 590 716 static void tegra210_emc_set_clock(struct tegra210_emc *emc, u32 clksrc) 591 717 { 592 718 emc->sequence->set_clock(emc, clksrc); ··· 762 626 tegra210_clk_emc_dll_enable(true); 763 627 else 764 628 tegra210_clk_emc_dll_enable(false); 629 + } 630 + 631 + int tegra210_emc_set_refresh(struct tegra210_emc *emc, 632 + enum tegra210_emc_refresh refresh) 633 + { 634 + struct tegra210_emc_timing *timings; 635 + unsigned long flags; 636 + 637 + if ((emc->dram_type != DRAM_TYPE_LPDDR2 && 638 + emc->dram_type != DRAM_TYPE_LPDDR4) || 639 + !emc->last) 640 + return -ENODEV; 641 + 642 + if (refresh > TEGRA210_EMC_REFRESH_THROTTLE) 643 + return -EINVAL; 644 + 645 + if (refresh == emc->refresh) 646 + return 0; 647 + 648 + spin_lock_irqsave(&emc->lock, flags); 649 + 650 + if (refresh == TEGRA210_EMC_REFRESH_THROTTLE && emc->derated) 651 + timings = emc->derated; 652 + else 653 + timings = emc->nominal; 654 + 655 + if (timings != emc->timings) { 656 + unsigned int index = emc->last - emc->timings; 657 + u32 clksrc; 658 + 659 + clksrc = emc->provider.configs[index].value | 660 + EMC_CLK_FORCE_CC_TRIGGER; 661 + 662 + emc->next = &timings[index]; 663 + emc->timings = timings; 664 + 665 + tegra210_emc_set_clock(emc, clksrc); 666 + } else { 667 + tegra210_emc_adjust_timing(emc, emc->last); 668 + tegra210_emc_timing_update(emc); 669 + 670 + if (refresh != TEGRA210_EMC_REFRESH_NOMINAL) 671 + emc_writel(emc, EMC_REF_REF_CMD, EMC_REF); 672 + } 673 + 674 + spin_unlock_irqrestore(&emc->lock, flags); 675 + 676 + return 0; 765 677 } 766 678 767 679 u32 tegra210_emc_mrr_read(struct tegra210_emc *emc, unsigned int chip, ··· 1490 1306 update_dll_control(emc, value, true); 1491 1307 } 1492 1308 1309 + void tegra210_emc_adjust_timing(struct tegra210_emc *emc, 1310 + struct tegra210_emc_timing *timing) 1311 + { 1312 + u32 dsr_cntrl = timing->burst_regs[EMC_DYN_SELF_REF_CONTROL_INDEX]; 1313 + u32 pre_ref = timing->burst_regs[EMC_PRE_REFRESH_REQ_CNT_INDEX]; 1314 + u32 ref = timing->burst_regs[EMC_REFRESH_INDEX]; 1315 + 1316 + switch (emc->refresh) { 1317 + case TEGRA210_EMC_REFRESH_NOMINAL: 1318 + case TEGRA210_EMC_REFRESH_THROTTLE: 1319 + break; 1320 + 1321 + case TEGRA210_EMC_REFRESH_2X: 1322 + ref = REFRESH_SPEEDUP(ref, 2); 1323 + pre_ref = REFRESH_SPEEDUP(pre_ref, 2); 1324 + dsr_cntrl = REFRESH_SPEEDUP(dsr_cntrl, 2); 1325 + break; 1326 + 1327 + case TEGRA210_EMC_REFRESH_4X: 1328 + ref = REFRESH_SPEEDUP(ref, 4); 1329 + pre_ref = REFRESH_SPEEDUP(pre_ref, 4); 1330 + dsr_cntrl = REFRESH_SPEEDUP(dsr_cntrl, 4); 1331 + break; 1332 + 1333 + default: 1334 + dev_warn(emc->dev, "failed to set refresh: %d\n", emc->refresh); 1335 + return; 1336 + } 1337 + 1338 + emc_writel(emc, ref, emc->offsets->burst[EMC_REFRESH_INDEX]); 1339 + emc_writel(emc, pre_ref, 1340 + emc->offsets->burst[EMC_PRE_REFRESH_REQ_CNT_INDEX]); 1341 + emc_writel(emc, dsr_cntrl, 1342 + emc->offsets->burst[EMC_DYN_SELF_REF_CONTROL_INDEX]); 1343 + } 1344 + 1493 1345 static int tegra210_emc_set_rate(struct device *dev, 1494 1346 const struct tegra210_clk_emc_config *config) 1495 1347 { ··· 1697 1477 tegra210_emc_debug_max_rate_get, 1698 1478 tegra210_emc_debug_max_rate_set, "%llu\n"); 1699 1479 1480 + static int tegra210_emc_debug_temperature_get(void *data, u64 *temperature) 1481 + { 1482 + struct tegra210_emc *emc = data; 1483 + unsigned int value; 1484 + 1485 + if (!emc->debugfs.temperature) 1486 + value = tegra210_emc_get_temperature(emc); 1487 + else 1488 + value = emc->debugfs.temperature; 1489 + 1490 + *temperature = value; 1491 + 1492 + return 0; 1493 + } 1494 + 1495 + static int tegra210_emc_debug_temperature_set(void *data, u64 temperature) 1496 + { 1497 + struct tegra210_emc *emc = data; 1498 + 1499 + if (temperature > 7) 1500 + return -EINVAL; 1501 + 1502 + emc->debugfs.temperature = temperature; 1503 + 1504 + return 0; 1505 + } 1506 + 1507 + DEFINE_SIMPLE_ATTRIBUTE(tegra210_emc_debug_temperature_fops, 1508 + tegra210_emc_debug_temperature_get, 1509 + tegra210_emc_debug_temperature_set, "%llu\n"); 1510 + 1700 1511 static void tegra210_emc_debugfs_init(struct tegra210_emc *emc) 1701 1512 { 1702 1513 struct device *dev = emc->dev; ··· 1771 1520 &tegra210_emc_debug_min_rate_fops); 1772 1521 debugfs_create_file("max_rate", 0644, emc->debugfs.root, emc, 1773 1522 &tegra210_emc_debug_max_rate_fops); 1523 + debugfs_create_file("temperature", 0644, emc->debugfs.root, emc, 1524 + &tegra210_emc_debug_temperature_fops); 1774 1525 } 1775 1526 1776 1527 static void tegra210_emc_detect(struct tegra210_emc *emc) ··· 1827 1574 1828 1575 static int tegra210_emc_probe(struct platform_device *pdev) 1829 1576 { 1577 + struct thermal_cooling_device *cd; 1830 1578 unsigned long current_rate; 1831 1579 struct platform_device *mc; 1832 1580 struct tegra210_emc *emc; ··· 1881 1627 tegra210_emc_detect(emc); 1882 1628 np = pdev->dev.of_node; 1883 1629 1884 - err = of_reserved_mem_device_init(emc->dev); 1630 + /* attach to the nominal and (optional) derated tables */ 1631 + err = of_reserved_mem_device_init_by_name(emc->dev, np, "nominal"); 1885 1632 if (err < 0) { 1886 - dev_err(&pdev->dev, "failed to get EMC table: %d\n", err); 1633 + dev_err(emc->dev, "failed to get nominal EMC table: %d\n", err); 1887 1634 goto put_mc; 1888 1635 } 1889 1636 1890 - /* validate the tables */ 1891 - err = tegra210_emc_validate_timings(emc, emc->timings, 1892 - emc->num_timings); 1893 - if (err < 0) 1637 + err = of_reserved_mem_device_init_by_name(emc->dev, np, "derated"); 1638 + if (err < 0 && err != -ENODEV) { 1639 + dev_err(emc->dev, "failed to get derated EMC table: %d\n", err); 1894 1640 goto release; 1641 + } 1642 + 1643 + /* validate the tables */ 1644 + if (emc->nominal) { 1645 + err = tegra210_emc_validate_timings(emc, emc->nominal, 1646 + emc->num_timings); 1647 + if (err < 0) 1648 + goto release; 1649 + } 1650 + 1651 + if (emc->derated) { 1652 + err = tegra210_emc_validate_timings(emc, emc->derated, 1653 + emc->num_timings); 1654 + if (err < 0) 1655 + goto release; 1656 + } 1657 + 1658 + /* default to the nominal table */ 1659 + emc->timings = emc->nominal; 1895 1660 1896 1661 /* pick the current timing based on the current EMC clock rate */ 1897 1662 current_rate = clk_get_rate(emc->clk) / 1000; ··· 1948 1675 } 1949 1676 1950 1677 emc->offsets = &tegra210_emc_table_register_offsets; 1678 + emc->refresh = TEGRA210_EMC_REFRESH_NOMINAL; 1951 1679 1952 1680 emc->provider.owner = THIS_MODULE; 1953 1681 emc->provider.dev = &pdev->dev; ··· 1991 1717 emc->training_interval = 100; 1992 1718 dev_set_drvdata(emc->dev, emc); 1993 1719 1720 + timer_setup(&emc->refresh_timer, tegra210_emc_poll_refresh, 1721 + TIMER_DEFERRABLE); 1722 + atomic_set(&emc->refresh_poll, 0); 1723 + emc->refresh_poll_interval = 1000; 1724 + 1994 1725 timer_setup(&emc->training, tegra210_emc_train, 0); 1995 1726 1996 1727 tegra210_emc_debugfs_init(emc); 1997 1728 1729 + cd = devm_thermal_of_cooling_device_register(emc->dev, np, "emc", emc, 1730 + &tegra210_emc_cd_ops); 1731 + if (IS_ERR(cd)) { 1732 + err = PTR_ERR(cd); 1733 + dev_err(emc->dev, "failed to register cooling device: %d\n", 1734 + err); 1735 + goto detach; 1736 + } 1737 + 1998 1738 return 0; 1999 1739 1740 + detach: 1741 + debugfs_remove_recursive(emc->debugfs.root); 1742 + tegra210_clk_emc_detach(emc->clk); 2000 1743 release: 2001 1744 of_reserved_mem_device_release(emc->dev); 2002 1745 put_mc:
+38 -7
drivers/memory/tegra/tegra210-emc-table.c
··· 13 13 struct device *dev) 14 14 { 15 15 struct tegra210_emc *emc = dev_get_drvdata(dev); 16 - unsigned int i; 16 + struct tegra210_emc_timing *timings; 17 + unsigned int i, count = 0; 17 18 18 - emc->timings = memremap(rmem->base, rmem->size, MEMREMAP_WB); 19 - if (!emc->timings) { 19 + timings = memremap(rmem->base, rmem->size, MEMREMAP_WB); 20 + if (!timings) { 20 21 dev_err(dev, "failed to map EMC table\n"); 21 22 return -ENOMEM; 22 23 } 23 24 24 - emc->num_timings = 0; 25 + count = 0; 25 26 26 27 for (i = 0; i < TEGRA_EMC_MAX_FREQS; i++) { 27 - if (emc->timings[i].revision == 0) 28 + if (timings[i].revision == 0) 28 29 break; 29 30 30 - emc->num_timings++; 31 + count++; 31 32 } 33 + 34 + /* only the nominal and derated tables are expected */ 35 + if (emc->derated) { 36 + dev_warn(dev, "excess EMC table '%s'\n", rmem->name); 37 + goto out; 38 + } 39 + 40 + if (emc->nominal) { 41 + if (count != emc->num_timings) { 42 + dev_warn(dev, "%u derated vs. %u nominal entries\n", 43 + count, emc->num_timings); 44 + memunmap(timings); 45 + return -EINVAL; 46 + } 47 + 48 + emc->derated = timings; 49 + } else { 50 + emc->num_timings = count; 51 + emc->nominal = timings; 52 + } 53 + 54 + out: 55 + /* keep track of which table this is */ 56 + rmem->priv = timings; 32 57 33 58 return 0; 34 59 } ··· 61 36 static void tegra210_emc_table_device_release(struct reserved_mem *rmem, 62 37 struct device *dev) 63 38 { 39 + struct tegra210_emc_timing *timings = rmem->priv; 64 40 struct tegra210_emc *emc = dev_get_drvdata(dev); 65 41 66 - memunmap(emc->timings); 42 + if ((emc->nominal && timings != emc->nominal) && 43 + (emc->derated && timings != emc->derated)) 44 + dev_warn(dev, "trying to release unassigned EMC table '%s'\n", 45 + rmem->name); 46 + 47 + memunmap(timings); 67 48 } 68 49 69 50 static const struct reserved_mem_ops tegra210_emc_table_ops = {
+25
drivers/memory/tegra/tegra210-emc.h
··· 83 83 #define EMC_EMRS 0xd0 84 84 #define EMC_EMRS_USE_EMRS_LONG_CNT BIT(26) 85 85 #define EMC_REF 0xd4 86 + #define EMC_REF_REF_CMD BIT(0) 86 87 #define EMC_SELF_REF 0xe0 87 88 #define EMC_MRW 0xe8 88 89 #define EMC_MRW_MRW_OP_SHIFT 0 ··· 872 871 u32 latency; 873 872 }; 874 873 874 + enum tegra210_emc_refresh { 875 + TEGRA210_EMC_REFRESH_NOMINAL = 0, 876 + TEGRA210_EMC_REFRESH_2X, 877 + TEGRA210_EMC_REFRESH_4X, 878 + TEGRA210_EMC_REFRESH_THROTTLE, /* 4x Refresh + derating. */ 879 + }; 880 + 875 881 #define DRAM_TYPE_DDR3 0 876 882 #define DRAM_TYPE_LPDDR4 1 877 883 #define DRAM_TYPE_LPDDR2 2 ··· 889 881 struct device *dev; 890 882 struct clk *clk; 891 883 884 + /* nominal EMC frequency table */ 885 + struct tegra210_emc_timing *nominal; 886 + /* derated EMC frequency table */ 887 + struct tegra210_emc_timing *derated; 888 + 889 + /* currently selected table (nominal or derated) */ 892 890 struct tegra210_emc_timing *timings; 893 891 unsigned int num_timings; 894 892 ··· 914 900 unsigned int training_interval; 915 901 struct timer_list training; 916 902 903 + enum tegra210_emc_refresh refresh; 904 + unsigned int refresh_poll_interval; 905 + struct timer_list refresh_timer; 906 + unsigned int temperature; 907 + atomic_t refresh_poll; 908 + 917 909 ktime_t clkchange_time; 918 910 int clkchange_delay; 919 911 ··· 929 909 struct dentry *root; 930 910 unsigned long min_rate; 931 911 unsigned long max_rate; 912 + unsigned int temperature; 932 913 } debugfs; 933 914 934 915 struct tegra210_clk_emc_provider provider; ··· 988 967 /* from tegra210-emc-r21021.c */ 989 968 extern const struct tegra210_emc_sequence tegra210_emc_r21021; 990 969 970 + int tegra210_emc_set_refresh(struct tegra210_emc *emc, 971 + enum tegra210_emc_refresh refresh); 991 972 u32 tegra210_emc_mrr_read(struct tegra210_emc *emc, unsigned int chip, 992 973 unsigned int address); 993 974 void tegra210_emc_do_clock_change(struct tegra210_emc *emc, u32 clksrc); ··· 998 975 u32 tegra210_emc_get_dll_state(struct tegra210_emc_timing *next); 999 976 struct tegra210_emc_timing *tegra210_emc_find_timing(struct tegra210_emc *emc, 1000 977 unsigned long rate); 978 + void tegra210_emc_adjust_timing(struct tegra210_emc *emc, 979 + struct tegra210_emc_timing *timing); 1001 980 int tegra210_emc_wait_for_update(struct tegra210_emc *emc, unsigned int channel, 1002 981 unsigned int offset, u32 bit_mask, bool state); 1003 982 unsigned long tegra210_emc_actual_osc_clocks(u32 in);