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>
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
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
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
212225enum 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
383398static 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+
10381118static 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