Skip to content

Commit ae1eb3b

Browse files
committed
memory: tegra30-emc: Print more memory info
Print out additional info about Tegra30 memory hardware during driver probe, making it similar to the info printed by Tegra20 driver. This info is useful for debugging purposes. Signed-off-by: Dmitry Osipenko <[email protected]>
1 parent 93cae38 commit ae1eb3b

File tree

2 files changed

+122
-10
lines changed

2 files changed

+122
-10
lines changed

drivers/memory/tegra/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ config TEGRA30_EMC
2828
default y
2929
depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST
3030
select PM_OPP
31+
select DDR
3132
help
3233
This driver is for the External Memory Controller (EMC) found on
3334
Tegra30 chips. The EMC controls the external DRAM on the board.

drivers/memory/tegra/tegra30-emc.c

Lines changed: 121 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* Copyright (C) 2019 GRATE-DRIVER project
1010
*/
1111

12+
#include <linux/bitfield.h>
1213
#include <linux/clk.h>
1314
#include <linux/clk/tegra.h>
1415
#include <linux/debugfs.h>
@@ -31,11 +32,15 @@
3132
#include <soc/tegra/common.h>
3233
#include <soc/tegra/fuse.h>
3334

35+
#include "../jedec_ddr.h"
36+
#include "../of_memory.h"
37+
3438
#include "mc.h"
3539

3640
#define EMC_INTSTATUS 0x000
3741
#define EMC_INTMASK 0x004
3842
#define EMC_DBG 0x008
43+
#define EMC_ADR_CFG 0x010
3944
#define EMC_CFG 0x00c
4045
#define EMC_REFCTRL 0x020
4146
#define EMC_TIMING_CONTROL 0x028
@@ -81,6 +86,7 @@
8186
#define EMC_EMRS 0x0d0
8287
#define EMC_SELF_REF 0x0e0
8388
#define EMC_MRW 0x0e8
89+
#define EMC_MRR 0x0ec
8490
#define EMC_XM2DQSPADCTRL3 0x0f8
8591
#define EMC_FBIO_SPARE 0x100
8692
#define EMC_FBIO_CFG5 0x104
@@ -208,6 +214,13 @@
208214

209215
#define EMC_REFRESH_OVERFLOW_INT BIT(3)
210216
#define EMC_CLKCHANGE_COMPLETE_INT BIT(4)
217+
#define EMC_MRR_DIVLD_INT BIT(5)
218+
219+
#define EMC_MRR_DEV_SELECTN GENMASK(31, 30)
220+
#define EMC_MRR_MRR_MA GENMASK(23, 16)
221+
#define EMC_MRR_MRR_DATA GENMASK(15, 0)
222+
223+
#define EMC_ADR_CFG_EMEM_NUMDEV BIT(0)
211224

212225
enum emc_dram_type {
213226
DRAM_TYPE_DDR3,
@@ -378,6 +391,8 @@ struct tegra_emc {
378391

379392
/* protect shared rate-change code path */
380393
struct mutex rate_lock;
394+
395+
bool mrr_error;
381396
};
382397

383398
static int emc_seq_update_timing(struct tegra_emc *emc)
@@ -1008,12 +1023,18 @@ static int emc_load_timings_from_dt(struct tegra_emc *emc,
10081023
return 0;
10091024
}
10101025

1011-
static struct device_node *emc_find_node_by_ram_code(struct device *dev)
1026+
static struct device_node *emc_find_node_by_ram_code(struct tegra_emc *emc)
10121027
{
1028+
struct device *dev = emc->dev;
10131029
struct device_node *np;
10141030
u32 value, ram_code;
10151031
int err;
10161032

1033+
if (emc->mrr_error) {
1034+
dev_warn(dev, "memory timings skipped due to MRR error\n");
1035+
return NULL;
1036+
}
1037+
10171038
if (of_get_child_count(dev->of_node) == 0) {
10181039
dev_info_once(dev, "device-tree doesn't have memory timings\n");
10191040
return NULL;
@@ -1035,11 +1056,73 @@ static struct device_node *emc_find_node_by_ram_code(struct device *dev)
10351056
return NULL;
10361057
}
10371058

1059+
static int emc_read_lpddr_mode_register(struct tegra_emc *emc,
1060+
unsigned int emem_dev,
1061+
unsigned int register_addr,
1062+
unsigned int *register_data)
1063+
{
1064+
u32 memory_dev = emem_dev + 1;
1065+
u32 val, mr_mask = 0xff;
1066+
int err;
1067+
1068+
/* clear data-valid interrupt status */
1069+
writel_relaxed(EMC_MRR_DIVLD_INT, emc->regs + EMC_INTSTATUS);
1070+
1071+
/* issue mode register read request */
1072+
val = FIELD_PREP(EMC_MRR_DEV_SELECTN, memory_dev);
1073+
val |= FIELD_PREP(EMC_MRR_MRR_MA, register_addr);
1074+
1075+
writel_relaxed(val, emc->regs + EMC_MRR);
1076+
1077+
/* wait for the LPDDR2 data-valid interrupt */
1078+
err = readl_relaxed_poll_timeout_atomic(emc->regs + EMC_INTSTATUS, val,
1079+
val & EMC_MRR_DIVLD_INT,
1080+
1, 100);
1081+
if (err) {
1082+
dev_err(emc->dev, "mode register %u read failed: %d\n",
1083+
register_addr, err);
1084+
emc->mrr_error = true;
1085+
return err;
1086+
}
1087+
1088+
/* read out mode register data */
1089+
val = readl_relaxed(emc->regs + EMC_MRR);
1090+
*register_data = FIELD_GET(EMC_MRR_MRR_DATA, val) & mr_mask;
1091+
1092+
return 0;
1093+
}
1094+
1095+
static void emc_read_lpddr_sdram_info(struct tegra_emc *emc,
1096+
unsigned int emem_dev)
1097+
{
1098+
union lpddr2_basic_config4 basic_conf4;
1099+
unsigned int manufacturer_id;
1100+
unsigned int revision_id1;
1101+
unsigned int revision_id2;
1102+
1103+
/* these registers are standard for all LPDDR JEDEC memory chips */
1104+
emc_read_lpddr_mode_register(emc, emem_dev, 5, &manufacturer_id);
1105+
emc_read_lpddr_mode_register(emc, emem_dev, 6, &revision_id1);
1106+
emc_read_lpddr_mode_register(emc, emem_dev, 7, &revision_id2);
1107+
emc_read_lpddr_mode_register(emc, emem_dev, 8, &basic_conf4.value);
1108+
1109+
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",
1110+
emem_dev, manufacturer_id,
1111+
lpddr2_jedec_manufacturer(manufacturer_id),
1112+
revision_id1, revision_id2,
1113+
4 >> basic_conf4.arch_type,
1114+
64 << basic_conf4.density,
1115+
32 >> basic_conf4.io_width);
1116+
}
1117+
10381118
static int emc_setup_hw(struct tegra_emc *emc)
10391119
{
1120+
u32 fbio_cfg5, emc_cfg, emc_dbg, emc_adr_cfg;
10401121
u32 intmask = EMC_REFRESH_OVERFLOW_INT;
1041-
u32 fbio_cfg5, emc_cfg, emc_dbg;
1122+
static bool print_sdram_info_once;
10421123
enum emc_dram_type dram_type;
1124+
const char *dram_type_str;
1125+
unsigned int emem_numdev;
10431126

10441127
fbio_cfg5 = readl_relaxed(emc->regs + EMC_FBIO_CFG5);
10451128
dram_type = fbio_cfg5 & EMC_FBIO_CFG5_DRAM_TYPE_MASK;
@@ -1076,6 +1159,34 @@ static int emc_setup_hw(struct tegra_emc *emc)
10761159
emc_dbg &= ~EMC_DBG_FORCE_UPDATE;
10771160
writel_relaxed(emc_dbg, emc->regs + EMC_DBG);
10781161

1162+
switch (dram_type) {
1163+
case DRAM_TYPE_DDR1:
1164+
dram_type_str = "DDR1";
1165+
break;
1166+
case DRAM_TYPE_LPDDR2:
1167+
dram_type_str = "LPDDR2";
1168+
break;
1169+
case DRAM_TYPE_DDR2:
1170+
dram_type_str = "DDR2";
1171+
break;
1172+
case DRAM_TYPE_DDR3:
1173+
dram_type_str = "DDR3";
1174+
break;
1175+
}
1176+
1177+
emc_adr_cfg = readl_relaxed(emc->regs + EMC_ADR_CFG);
1178+
emem_numdev = FIELD_GET(EMC_ADR_CFG_EMEM_NUMDEV, emc_adr_cfg) + 1;
1179+
1180+
dev_info_once(emc->dev, "%u %s %s attached\n", emem_numdev,
1181+
dram_type_str, emem_numdev == 2 ? "devices" : "device");
1182+
1183+
if (dram_type == DRAM_TYPE_LPDDR2 && !print_sdram_info_once) {
1184+
while (emem_numdev--)
1185+
emc_read_lpddr_sdram_info(emc, emem_numdev);
1186+
1187+
print_sdram_info_once = true;
1188+
}
1189+
10791190
return 0;
10801191
}
10811192

@@ -1538,14 +1649,6 @@ static int tegra_emc_probe(struct platform_device *pdev)
15381649
emc->clk_nb.notifier_call = emc_clk_change_notify;
15391650
emc->dev = &pdev->dev;
15401651

1541-
np = emc_find_node_by_ram_code(&pdev->dev);
1542-
if (np) {
1543-
err = emc_load_timings_from_dt(emc, np);
1544-
of_node_put(np);
1545-
if (err)
1546-
return err;
1547-
}
1548-
15491652
emc->regs = devm_platform_ioremap_resource(pdev, 0);
15501653
if (IS_ERR(emc->regs))
15511654
return PTR_ERR(emc->regs);
@@ -1554,6 +1657,14 @@ static int tegra_emc_probe(struct platform_device *pdev)
15541657
if (err)
15551658
return err;
15561659

1660+
np = emc_find_node_by_ram_code(emc);
1661+
if (np) {
1662+
err = emc_load_timings_from_dt(emc, np);
1663+
of_node_put(np);
1664+
if (err)
1665+
return err;
1666+
}
1667+
15571668
err = platform_get_irq(pdev, 0);
15581669
if (err < 0)
15591670
return err;

0 commit comments

Comments
 (0)