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>
31
32
#include <soc/tegra/common.h>
32
33
#include <soc/tegra/fuse.h>
33
34
35
+ #include "../jedec_ddr.h"
36
+ #include "../of_memory.h"
37
+
34
38
#include "mc.h"
35
39
36
40
#define EMC_INTSTATUS 0x000
37
41
#define EMC_INTMASK 0x004
38
42
#define EMC_DBG 0x008
43
+ #define EMC_ADR_CFG 0x010
39
44
#define EMC_CFG 0x00c
40
45
#define EMC_REFCTRL 0x020
41
46
#define EMC_TIMING_CONTROL 0x028
81
86
#define EMC_EMRS 0x0d0
82
87
#define EMC_SELF_REF 0x0e0
83
88
#define EMC_MRW 0x0e8
89
+ #define EMC_MRR 0x0ec
84
90
#define EMC_XM2DQSPADCTRL3 0x0f8
85
91
#define EMC_FBIO_SPARE 0x100
86
92
#define EMC_FBIO_CFG5 0x104
208
214
209
215
#define EMC_REFRESH_OVERFLOW_INT BIT(3)
210
216
#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)
211
224
212
225
enum emc_dram_type {
213
226
DRAM_TYPE_DDR3 ,
@@ -378,6 +391,8 @@ struct tegra_emc {
378
391
379
392
/* protect shared rate-change code path */
380
393
struct mutex rate_lock ;
394
+
395
+ bool mrr_error ;
381
396
};
382
397
383
398
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,
1008
1023
return 0 ;
1009
1024
}
1010
1025
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 )
1012
1027
{
1028
+ struct device * dev = emc -> dev ;
1013
1029
struct device_node * np ;
1014
1030
u32 value , ram_code ;
1015
1031
int err ;
1016
1032
1033
+ if (emc -> mrr_error ) {
1034
+ dev_warn (dev , "memory timings skipped due to MRR error\n" );
1035
+ return NULL ;
1036
+ }
1037
+
1017
1038
if (of_get_child_count (dev -> of_node ) == 0 ) {
1018
1039
dev_info_once (dev , "device-tree doesn't have memory timings\n" );
1019
1040
return NULL ;
@@ -1035,11 +1056,73 @@ static struct device_node *emc_find_node_by_ram_code(struct device *dev)
1035
1056
return NULL ;
1036
1057
}
1037
1058
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
+
1038
1118
static int emc_setup_hw (struct tegra_emc * emc )
1039
1119
{
1120
+ u32 fbio_cfg5 , emc_cfg , emc_dbg , emc_adr_cfg ;
1040
1121
u32 intmask = EMC_REFRESH_OVERFLOW_INT ;
1041
- u32 fbio_cfg5 , emc_cfg , emc_dbg ;
1122
+ static bool print_sdram_info_once ;
1042
1123
enum emc_dram_type dram_type ;
1124
+ const char * dram_type_str ;
1125
+ unsigned int emem_numdev ;
1043
1126
1044
1127
fbio_cfg5 = readl_relaxed (emc -> regs + EMC_FBIO_CFG5 );
1045
1128
dram_type = fbio_cfg5 & EMC_FBIO_CFG5_DRAM_TYPE_MASK ;
@@ -1076,6 +1159,34 @@ static int emc_setup_hw(struct tegra_emc *emc)
1076
1159
emc_dbg &= ~EMC_DBG_FORCE_UPDATE ;
1077
1160
writel_relaxed (emc_dbg , emc -> regs + EMC_DBG );
1078
1161
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
+
1079
1190
return 0 ;
1080
1191
}
1081
1192
@@ -1538,14 +1649,6 @@ static int tegra_emc_probe(struct platform_device *pdev)
1538
1649
emc -> clk_nb .notifier_call = emc_clk_change_notify ;
1539
1650
emc -> dev = & pdev -> dev ;
1540
1651
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
-
1549
1652
emc -> regs = devm_platform_ioremap_resource (pdev , 0 );
1550
1653
if (IS_ERR (emc -> regs ))
1551
1654
return PTR_ERR (emc -> regs );
@@ -1554,6 +1657,14 @@ static int tegra_emc_probe(struct platform_device *pdev)
1554
1657
if (err )
1555
1658
return err ;
1556
1659
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
+
1557
1668
err = platform_get_irq (pdev , 0 );
1558
1669
if (err < 0 )
1559
1670
return err ;
0 commit comments