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

memory: tegra30-emc: Print additional memory info

Print out memory type and LPDDR2 configuration on Tegra30, making it
similar to the memory info printed by the Tegra20 memory driver. This
info is useful for debugging purposes.

Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # T30 ASUS TF201 LPDDR2
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20211222043215.28237-1-digetx@gmail.com
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>

authored by

Dmitry Osipenko and committed by
Krzysztof Kozlowski
e3aabb3c e783362e

+122 -10
+1
drivers/memory/tegra/Kconfig
··· 28 28 default y 29 29 depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST 30 30 select PM_OPP 31 + select DDR 31 32 help 32 33 This driver is for the External Memory Controller (EMC) found on 33 34 Tegra30 chips. The EMC controls the external DRAM on the board.
+121 -10
drivers/memory/tegra/tegra30-emc.c
··· 9 9 * Copyright (C) 2019 GRATE-DRIVER project 10 10 */ 11 11 12 + #include <linux/bitfield.h> 12 13 #include <linux/clk.h> 13 14 #include <linux/clk/tegra.h> 14 15 #include <linux/debugfs.h> ··· 32 31 #include <soc/tegra/common.h> 33 32 #include <soc/tegra/fuse.h> 34 33 34 + #include "../jedec_ddr.h" 35 + #include "../of_memory.h" 36 + 35 37 #include "mc.h" 36 38 37 39 #define EMC_INTSTATUS 0x000 38 40 #define EMC_INTMASK 0x004 39 41 #define EMC_DBG 0x008 42 + #define EMC_ADR_CFG 0x010 40 43 #define EMC_CFG 0x00c 41 44 #define EMC_REFCTRL 0x020 42 45 #define EMC_TIMING_CONTROL 0x028 ··· 86 81 #define EMC_EMRS 0x0d0 87 82 #define EMC_SELF_REF 0x0e0 88 83 #define EMC_MRW 0x0e8 84 + #define EMC_MRR 0x0ec 89 85 #define EMC_XM2DQSPADCTRL3 0x0f8 90 86 #define EMC_FBIO_SPARE 0x100 91 87 #define EMC_FBIO_CFG5 0x104 ··· 214 208 215 209 #define EMC_REFRESH_OVERFLOW_INT BIT(3) 216 210 #define EMC_CLKCHANGE_COMPLETE_INT BIT(4) 211 + #define EMC_MRR_DIVLD_INT BIT(5) 212 + 213 + #define EMC_MRR_DEV_SELECTN GENMASK(31, 30) 214 + #define EMC_MRR_MRR_MA GENMASK(23, 16) 215 + #define EMC_MRR_MRR_DATA GENMASK(15, 0) 216 + 217 + #define EMC_ADR_CFG_EMEM_NUMDEV BIT(0) 217 218 218 219 enum emc_dram_type { 219 220 DRAM_TYPE_DDR3, ··· 391 378 392 379 /* protect shared rate-change code path */ 393 380 struct mutex rate_lock; 381 + 382 + bool mrr_error; 394 383 }; 395 384 396 385 static int emc_seq_update_timing(struct tegra_emc *emc) ··· 1023 1008 return 0; 1024 1009 } 1025 1010 1026 - static struct device_node *emc_find_node_by_ram_code(struct device *dev) 1011 + static struct device_node *emc_find_node_by_ram_code(struct tegra_emc *emc) 1027 1012 { 1013 + struct device *dev = emc->dev; 1028 1014 struct device_node *np; 1029 1015 u32 value, ram_code; 1030 1016 int err; 1017 + 1018 + if (emc->mrr_error) { 1019 + dev_warn(dev, "memory timings skipped due to MRR error\n"); 1020 + return NULL; 1021 + } 1031 1022 1032 1023 if (of_get_child_count(dev->of_node) == 0) { 1033 1024 dev_info_once(dev, "device-tree doesn't have memory timings\n"); ··· 1056 1035 return NULL; 1057 1036 } 1058 1037 1038 + static int emc_read_lpddr_mode_register(struct tegra_emc *emc, 1039 + unsigned int emem_dev, 1040 + unsigned int register_addr, 1041 + unsigned int *register_data) 1042 + { 1043 + u32 memory_dev = emem_dev ? 1 : 2; 1044 + u32 val, mr_mask = 0xff; 1045 + int err; 1046 + 1047 + /* clear data-valid interrupt status */ 1048 + writel_relaxed(EMC_MRR_DIVLD_INT, emc->regs + EMC_INTSTATUS); 1049 + 1050 + /* issue mode register read request */ 1051 + val = FIELD_PREP(EMC_MRR_DEV_SELECTN, memory_dev); 1052 + val |= FIELD_PREP(EMC_MRR_MRR_MA, register_addr); 1053 + 1054 + writel_relaxed(val, emc->regs + EMC_MRR); 1055 + 1056 + /* wait for the LPDDR2 data-valid interrupt */ 1057 + err = readl_relaxed_poll_timeout_atomic(emc->regs + EMC_INTSTATUS, val, 1058 + val & EMC_MRR_DIVLD_INT, 1059 + 1, 100); 1060 + if (err) { 1061 + dev_err(emc->dev, "mode register %u read failed: %d\n", 1062 + register_addr, err); 1063 + emc->mrr_error = true; 1064 + return err; 1065 + } 1066 + 1067 + /* read out mode register data */ 1068 + val = readl_relaxed(emc->regs + EMC_MRR); 1069 + *register_data = FIELD_GET(EMC_MRR_MRR_DATA, val) & mr_mask; 1070 + 1071 + return 0; 1072 + } 1073 + 1074 + static void emc_read_lpddr_sdram_info(struct tegra_emc *emc, 1075 + unsigned int emem_dev) 1076 + { 1077 + union lpddr2_basic_config4 basic_conf4; 1078 + unsigned int manufacturer_id; 1079 + unsigned int revision_id1; 1080 + unsigned int revision_id2; 1081 + 1082 + /* these registers are standard for all LPDDR JEDEC memory chips */ 1083 + emc_read_lpddr_mode_register(emc, emem_dev, 5, &manufacturer_id); 1084 + emc_read_lpddr_mode_register(emc, emem_dev, 6, &revision_id1); 1085 + emc_read_lpddr_mode_register(emc, emem_dev, 7, &revision_id2); 1086 + emc_read_lpddr_mode_register(emc, emem_dev, 8, &basic_conf4.value); 1087 + 1088 + dev_info(emc->dev, "SDRAM[dev%u]: manufacturer: 0x%x (%s) rev1: 0x%x rev2: 0x%x prefetch: S%u density: %uMbit iowidth: %ubit\n", 1089 + emem_dev, manufacturer_id, 1090 + lpddr2_jedec_manufacturer(manufacturer_id), 1091 + revision_id1, revision_id2, 1092 + 4 >> basic_conf4.arch_type, 1093 + 64 << basic_conf4.density, 1094 + 32 >> basic_conf4.io_width); 1095 + } 1096 + 1059 1097 static int emc_setup_hw(struct tegra_emc *emc) 1060 1098 { 1099 + u32 fbio_cfg5, emc_cfg, emc_dbg, emc_adr_cfg; 1061 1100 u32 intmask = EMC_REFRESH_OVERFLOW_INT; 1062 - u32 fbio_cfg5, emc_cfg, emc_dbg; 1101 + static bool print_sdram_info_once; 1063 1102 enum emc_dram_type dram_type; 1103 + const char *dram_type_str; 1104 + unsigned int emem_numdev; 1064 1105 1065 1106 fbio_cfg5 = readl_relaxed(emc->regs + EMC_FBIO_CFG5); 1066 1107 dram_type = fbio_cfg5 & EMC_FBIO_CFG5_DRAM_TYPE_MASK; ··· 1158 1075 emc_dbg &= ~EMC_DBG_WRITE_MUX_ACTIVE; 1159 1076 emc_dbg &= ~EMC_DBG_FORCE_UPDATE; 1160 1077 writel_relaxed(emc_dbg, emc->regs + EMC_DBG); 1078 + 1079 + switch (dram_type) { 1080 + case DRAM_TYPE_DDR1: 1081 + dram_type_str = "DDR1"; 1082 + break; 1083 + case DRAM_TYPE_LPDDR2: 1084 + dram_type_str = "LPDDR2"; 1085 + break; 1086 + case DRAM_TYPE_DDR2: 1087 + dram_type_str = "DDR2"; 1088 + break; 1089 + case DRAM_TYPE_DDR3: 1090 + dram_type_str = "DDR3"; 1091 + break; 1092 + } 1093 + 1094 + emc_adr_cfg = readl_relaxed(emc->regs + EMC_ADR_CFG); 1095 + emem_numdev = FIELD_GET(EMC_ADR_CFG_EMEM_NUMDEV, emc_adr_cfg) + 1; 1096 + 1097 + dev_info_once(emc->dev, "%u %s %s attached\n", emem_numdev, 1098 + dram_type_str, emem_numdev == 2 ? "devices" : "device"); 1099 + 1100 + if (dram_type == DRAM_TYPE_LPDDR2 && !print_sdram_info_once) { 1101 + while (emem_numdev--) 1102 + emc_read_lpddr_sdram_info(emc, emem_numdev); 1103 + 1104 + print_sdram_info_once = true; 1105 + } 1161 1106 1162 1107 return 0; 1163 1108 } ··· 1649 1538 emc->clk_nb.notifier_call = emc_clk_change_notify; 1650 1539 emc->dev = &pdev->dev; 1651 1540 1652 - np = emc_find_node_by_ram_code(&pdev->dev); 1653 - if (np) { 1654 - err = emc_load_timings_from_dt(emc, np); 1655 - of_node_put(np); 1656 - if (err) 1657 - return err; 1658 - } 1659 - 1660 1541 emc->regs = devm_platform_ioremap_resource(pdev, 0); 1661 1542 if (IS_ERR(emc->regs)) 1662 1543 return PTR_ERR(emc->regs); ··· 1656 1553 err = emc_setup_hw(emc); 1657 1554 if (err) 1658 1555 return err; 1556 + 1557 + np = emc_find_node_by_ram_code(emc); 1558 + if (np) { 1559 + err = emc_load_timings_from_dt(emc, np); 1560 + of_node_put(np); 1561 + if (err) 1562 + return err; 1563 + } 1659 1564 1660 1565 err = platform_get_irq(pdev, 0); 1661 1566 if (err < 0)