hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/drivers/devfreq/rockchip_dmc_dbg.c
....@@ -74,59 +74,10 @@
7474
7575 struct dram_info {
7676 unsigned int version;
77
- char dramtype[12];
77
+ char dramtype[10];
7878 unsigned int dramfreq;
7979 unsigned int channel_num;
8080 struct dram_cap_info ch[2];
81
- unsigned int dramid[3];
82
-};
83
-
84
-struct lpddrx_id {
85
- unsigned int dramid;
86
- char *name;
87
-};
88
-
89
-static const struct lpddrx_id lp23_manuf_id[] = {
90
- { 0x1, "Samsung" },
91
- { 0x2, "Qimonda" },
92
- { 0x3, "Elpida" },
93
- { 0x4, "Etron" },
94
- { 0x5, "Nanya" },
95
- { 0x6, "SK hynix" },
96
- { 0x7, "Mosel" },
97
- { 0x8, "Winbond" },
98
- { 0x9, "ESMT" },
99
- { 0xa, "Zentel" },
100
- { 0xb, "Spansion" },
101
- { 0xc, "SST" },
102
- { 0xd, "ZMOS" },
103
- { 0xe, "Intel" },
104
- { 0x12, "Being Advanced Memory Corp" },
105
- { 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" },
106
- { 0x1b, "ISSI" },
107
- { 0x1c, "JSC" },
108
- { 0xaa, "Tezzaron" },
109
- { 0xc2, "Macronix" },
110
- { 0xf8, "Fidelix" },
111
- { 0xfc, "eveRAM" },
112
- { 0xfd, "AP Memory" },
113
- { 0xfe, "Numonyx" },
114
- { 0xff, "Micron" }
115
-};
116
-
117
-static const struct lpddrx_id lp4_manuf_id[] = {
118
- { 0x1, "Samsung" },
119
- { 0x5, "Nanya" },
120
- { 0x6, "SK hynix" },
121
- { 0x8, "Winbond" },
122
- { 0x9, "ESMT" },
123
- { 0x13, "CXMT" },
124
- { 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" },
125
- { 0x1c, "JSC" },
126
- { 0xf8, "Fidelix" },
127
- { 0xf9, "Ultra Memory" },
128
- { 0xfd, "AP Memory" },
129
- { 0xff, "Micron" }
13081 };
13182
13283 static const char * const power_save_msg[] = {
....@@ -241,9 +192,9 @@
241192 {
242193 struct arm_smccc_res res;
243194 struct dram_info *p_dram_info;
244
- struct file *fp = NULL;
245
- char cur_freq[20] = { 0 };
246
- char governor[20] = { 0 };
195
+ struct file *fp = NULL;
196
+ char cur_freq[20] = {0};
197
+ char governor[20] = {0};
247198 loff_t pos;
248199 u32 i;
249200
....@@ -254,11 +205,6 @@
254205 res.a0);
255206 return -ENOMEM;
256207 }
257
- if (res.a1) {
258
- seq_printf(m, "ddrdbg function get dram info error:%lx\n",
259
- res.a1);
260
- return -EPERM;
261
- }
262208
263209 if (!dmcdbg_data.inited_flag) {
264210 seq_puts(m, "dmcdbg_data no int\n");
....@@ -267,57 +213,25 @@
267213 p_dram_info = (struct dram_info *)dmcdbg_data.share_memory;
268214
269215 /* dram type information */
270
- seq_printf(m, "DramType: %s\n", p_dram_info->dramtype);
271
- if (p_dram_info->version >= 0x2) {
272
- if ((strcmp(p_dram_info->dramtype, "LPDDR2") == 0) ||
273
- (strcmp(p_dram_info->dramtype, "LPDDR3") == 0)) {
274
- for (i = 0; i < ARRAY_SIZE(lp23_manuf_id); i++) {
275
- if (lp23_manuf_id[i].dramid == p_dram_info->dramid[0]) {
276
- seq_printf(m,
277
- "Dram ID: %s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
278
- lp23_manuf_id[i].name,
279
- p_dram_info->dramid[0],
280
- p_dram_info->dramid[1],
281
- p_dram_info->dramid[2]);
282
- break;
283
- }
284
- }
285
- if (i == ARRAY_SIZE(lp23_manuf_id))
286
- seq_printf(m,
287
- "Dram ID: Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
288
- p_dram_info->dramid[0],
289
- p_dram_info->dramid[1],
290
- p_dram_info->dramid[2]);
291
- } else if ((strcmp(p_dram_info->dramtype, "LPDDR4") == 0) ||
292
- (strcmp(p_dram_info->dramtype, "LPDDR4X") == 0)) {
293
- for (i = 0; i < ARRAY_SIZE(lp4_manuf_id); i++) {
294
- if (lp4_manuf_id[i].dramid == p_dram_info->dramid[0]) {
295
- seq_printf(m,
296
- "Dram ID: %s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
297
- lp4_manuf_id[i].name,
298
- p_dram_info->dramid[0],
299
- p_dram_info->dramid[1],
300
- p_dram_info->dramid[2]);
301
- break;
302
- }
303
- }
304
- if (i == ARRAY_SIZE(lp4_manuf_id))
305
- seq_printf(m,
306
- "Dram ID: Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
307
- p_dram_info->dramid[0],
308
- p_dram_info->dramid[1],
309
- p_dram_info->dramid[2]);
310
- } else {
311
- seq_printf(m, "Dram ID: None\n");
312
- }
313
- }
216
+ seq_printf(m,
217
+ "DramType: %s\n"
218
+ ,
219
+ p_dram_info->dramtype
220
+ );
221
+
314222 /* dram capacity information */
315
- seq_printf(m, "\n"
316
- "DramCapacity:\n");
223
+ seq_printf(m,
224
+ "\n"
225
+ "DramCapacity:\n"
226
+ );
317227
318228 for (i = 0; i < p_dram_info->channel_num; i++) {
319229 if (p_dram_info->channel_num == 2)
320
- seq_printf(m, "Channel [%d]:\n", i);
230
+ seq_printf(m,
231
+ "Channel [%d]:\n"
232
+ ,
233
+ i
234
+ );
321235
322236 seq_printf(m,
323237 "CS Count: %d\n"
....@@ -327,7 +241,8 @@
327241 "CS0_Row: %d\n"
328242 "CS1_Row: %d\n"
329243 "DieBusWidth: %d bit\n"
330
- "TotalSize: %d MB\n",
244
+ "TotalSize: %d MB\n"
245
+ ,
331246 p_dram_info->ch[i].rank,
332247 p_dram_info->ch[i].buswidth,
333248 p_dram_info->ch[i].col,
....@@ -335,7 +250,8 @@
335250 p_dram_info->ch[i].cs0_row,
336251 p_dram_info->ch[i].cs1_row,
337252 p_dram_info->ch[i].die_buswidth,
338
- p_dram_info->ch[i].size);
253
+ p_dram_info->ch[i].size
254
+ );
339255 }
340256
341257 /* check devfreq/dmc device */
....@@ -344,8 +260,10 @@
344260 seq_printf(m,
345261 "\n"
346262 "devfreq/dmc: Disable\n"
347
- "DramFreq: %d\n",
348
- p_dram_info->dramfreq);
263
+ "DramFreq: %d\n"
264
+ ,
265
+ p_dram_info->dramfreq
266
+ );
349267 } else {
350268 pos = 0;
351269 kernel_read(fp, cur_freq, sizeof(cur_freq), &pos);
....@@ -364,11 +282,15 @@
364282 "\n"
365283 "devfreq/dmc: Enable\n"
366284 "governor: %s\n"
367
- "cur_freq: %s\n",
368
- governor, cur_freq);
285
+ "cur_freq: %s\n"
286
+ ,
287
+ governor,
288
+ cur_freq
289
+ );
369290 seq_printf(m,
370291 "NOTE:\n"
371
- "more information about dmc can get from /sys/class/devfreq/dmc.\n");
292
+ "more information about dmc can get from /sys/class/devfreq/dmc.\n"
293
+ );
372294 }
373295
374296 return 0;
....@@ -418,15 +340,19 @@
418340 }
419341 p_power = (struct power_save_info *)dmcdbg_data.share_memory;
420342
421
- seq_printf(m, "low power information:\n"
422
- "\n"
423
- "[number]name: value\n");
343
+ seq_printf(m,
344
+ "low power information:\n"
345
+ "\n"
346
+ "[number]name: value\n"
347
+ );
424348
425349 p_uint = (unsigned int *)p_power;
426350 for (i = 0; i < ARRAY_SIZE(power_save_msg); i++)
427351 seq_printf(m,
428
- "[%d]%s: %d\n",
429
- i, power_save_msg[i], *(p_uint + i));
352
+ "[%d]%s: %d\n"
353
+ ,
354
+ i, power_save_msg[i], *(p_uint + i)
355
+ );
430356
431357 seq_printf(m,
432358 "\n"
....@@ -438,7 +364,8 @@
438364 "Support for setting multiple parameters at the same time.\n"
439365 "echo number=value,number=value,... > /proc/dmcdbg/powersave\n"
440366 "eg:\n"
441
- " echo 0=1,1=32 > /proc/dmcdbg/powersave\n");
367
+ " echo 0=1,1=32 > /proc/dmcdbg/powersave\n"
368
+ );
442369
443370 return 0;
444371 }
....@@ -575,34 +502,48 @@
575502 }
576503 p_drvodt = (struct drv_odt_info *)dmcdbg_data.share_memory;
577504
578
- seq_printf(m, "drv and odt information:\n"
579
- "\n"
580
- "[number]name: value (ohm)\n");
505
+ seq_printf(m,
506
+ "drv and odt information:\n"
507
+ "\n"
508
+ "[number]name: value (ohm)\n"
509
+ );
581510
582511 p_uint = (unsigned int *)p_drvodt;
583512 for (i = 0; i < ARRAY_SIZE(drv_odt_msg); i++) {
584513 if (*(p_uint + (i * 3)) == DRV_ODT_UNKNOWN)
585514 seq_printf(m,
586
- "[%2d]%s: NULL (unknown) %c\n",
515
+ "[%2d]%s: NULL (unknown) %c\n"
516
+ ,
587517 i, drv_odt_msg[i],
588
- (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
518
+ (*(p_uint + (i * 3) + 2) ==
519
+ DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
520
+ );
589521 else if (*(p_uint + (i * 3) + 1) == DRV_ODT_UNKNOWN)
590522 seq_printf(m,
591
- "[%2d]%s: %d (unknown) %c\n",
523
+ "[%2d]%s: %d (unknown) %c\n"
524
+ ,
592525 i, drv_odt_msg[i], *(p_uint + (i * 3)),
593
- (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
526
+ (*(p_uint + (i * 3) + 2) ==
527
+ DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
528
+ );
594529 else if (i < (ARRAY_SIZE(drv_odt_msg) - 2))
595530 seq_printf(m,
596
- "[%2d]%s: %d (%d ohm) %c\n",
531
+ "[%2d]%s: %d (%d ohm) %c\n"
532
+ ,
597533 i, drv_odt_msg[i], *(p_uint + (i * 3)),
598534 *(p_uint + (i * 3) + 1),
599
- (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
535
+ (*(p_uint + (i * 3) + 2) ==
536
+ DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
537
+ );
600538 else
601539 seq_printf(m,
602
- "[%2d]%s: %d (%d %%) %c\n",
540
+ "[%2d]%s: %d (%d %%) %c\n"
541
+ ,
603542 i, drv_odt_msg[i], *(p_uint + (i * 3)),
604543 *(p_uint + (i * 3) + 1),
605
- (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
544
+ (*(p_uint + (i * 3) + 2) ==
545
+ DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
546
+ );
606547 }
607548
608549 seq_printf(m,
....@@ -617,7 +558,8 @@
617558 "eg: set soc side ca drv up and down to 20\n"
618559 " echo 6=20,7=20 > /proc/dmcdbg/drvodt\n"
619560 "Note: Please update both up and down at the same time.\n"
620
- " (*) mean unsupported setting value\n");
561
+ " (*) mean unsupported setting value\n"
562
+ );
621563
622564 return 0;
623565 }
....@@ -752,20 +694,28 @@
752694 return -EPERM;
753695 }
754696
755
- seq_printf(m, "de-skew information:\n"
756
- "\n"
757
- "[group_number]name: value\n");
697
+ seq_printf(m,
698
+ "de-skew information:\n"
699
+ "\n"
700
+ "[group_number]name: value\n"
701
+ );
758702
759703 for (group = 0; group < dmcdbg_data.skew_group_num; group++) {
760704 if (dmcdbg_data.skew_group[group].note != NULL)
761
- seq_printf(m, "%s\n",
762
- dmcdbg_data.skew_group[group].note);
705
+ seq_printf(m,
706
+ "%s\n"
707
+ ,
708
+ dmcdbg_data.skew_group[group].note
709
+ );
763710 p_uint = (unsigned int *)dmcdbg_data.skew_group[group].p_skew_info;
764711 for (i = 0; i < dmcdbg_data.skew_group[group].skew_num; i++)
765
- seq_printf(m, "[%c%d_%d]%s: %d\n",
766
- (i < 10) ? ' ' : '\0', group, i,
767
- dmcdbg_data.skew_group[group].p_skew_timing[i],
768
- *(p_uint + i));
712
+ seq_printf(m,
713
+ "[%c%d_%d]%s: %d\n"
714
+ ,
715
+ (i < 10) ? ' ' : '\0', group, i,
716
+ dmcdbg_data.skew_group[group].p_skew_timing[i],
717
+ *(p_uint + i)
718
+ );
769719 }
770720
771721 seq_printf(m,
....@@ -778,7 +728,8 @@
778728 "Support for setting multiple parameters simultaneously.\n"
779729 "echo group_number=value,group_number=value,... > /proc/dmcdbg/deskew\n"
780730 "eg:\n"
781
- " echo 0_1=8,1_2=8 > /proc/dmcdbg/deskew\n");
731
+ " echo 0_1=8,1_2=8 > /proc/dmcdbg/deskew\n"
732
+ );
782733
783734 return 0;
784735 }
....@@ -925,13 +876,18 @@
925876 }
926877 p_regsinfo = (struct registers_info *)dmcdbg_data.share_memory;
927878
928
- seq_printf(m, "registers base address information:\n"
929
- "\n");
879
+ seq_printf(m,
880
+ "registers base address information:\n"
881
+ "\n"
882
+ );
930883
931884 for (i = 0; i < p_regsinfo->regs_num; i++) {
932
- seq_printf(m, "%s=0x%x\n",
885
+ seq_printf(m,
886
+ "%s=0x%x\n"
887
+ ,
933888 p_regsinfo->regs[i].regs_name,
934
- p_regsinfo->regs[i].regs_addr);
889
+ p_regsinfo->regs[i].regs_addr
890
+ );
935891 }
936892
937893 return 0;
....@@ -948,56 +904,6 @@
948904 .llseek = seq_lseek,
949905 .release = single_release,
950906 };
951
-
952
-static int rk_dmcdbg_sip_smc_match_ver(struct platform_device *pdev,
953
- u32 match_ver)
954
-{
955
- struct arm_smccc_res res;
956
-
957
- /* check ddr_debug_func version */
958
- res = sip_smc_dram(0, DDRDBG_FUNC_GET_VERSION,
959
- ROCKCHIP_SIP_CONFIG_DRAM_DEBUG);
960
- dev_notice(&pdev->dev, "current ATF ddr_debug_func version 0x%lx.\n",
961
- res.a1);
962
- /*
963
- * [15:8] major version, [7:0] minor version
964
- * major version must match both kernel dmcdbg and ATF ddr_debug_func.
965
- */
966
- if (res.a0 || res.a1 < match_ver || ((res.a1 & 0xff00) != (match_ver & 0xff00))) {
967
- dev_err(&pdev->dev,
968
- "version invalid, need update to 0x%x or newer, the major version unmatch!\n",
969
- match_ver);
970
-
971
- return -ENXIO;
972
- }
973
-
974
- return 0;
975
-}
976
-
977
-static int proc_dmcdbg_init(struct platform_device *pdev)
978
-{
979
- struct arm_smccc_res res;
980
-
981
- /* request share memory for pass parameter */
982
- res = sip_smc_request_share_mem(DMCDBG_PAGE_NUMS,
983
- SHARE_PAGE_TYPE_DDRDBG);
984
- if (res.a0 != 0) {
985
- dev_err(&pdev->dev, "request share mem error!\n");
986
- return -ENOMEM;
987
- }
988
-
989
- dmcdbg_data.share_memory = (void __iomem *)res.a1;
990
- dmcdbg_data.inited_flag = 1;
991
-
992
- /* create parent dir in /proc */
993
- proc_dmcdbg_dir = proc_mkdir(PROC_DMCDBG_DIR_NAME, NULL);
994
- if (!proc_dmcdbg_dir) {
995
- dev_err(&pdev->dev, "create proc dir error!\n");
996
- return -ENOENT;
997
- }
998
-
999
- return 0;
1000
-}
1001907
1002908 static int proc_regsinfo_init(void)
1003909 {
....@@ -1062,18 +968,42 @@
1062968 static __maybe_unused int rv1126_dmcdbg_init(struct platform_device *pdev,
1063969 struct rockchip_dmcdbg *dmcdbg)
1064970 {
1065
- u32 version = 0x102;
1066
- int ret;
971
+ struct arm_smccc_res res;
1067972
1068
- ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);
1069
- if (ret)
1070
- return ret;
973
+ /* check ddr_debug_func version */
974
+ res = sip_smc_dram(0, DDRDBG_FUNC_GET_VERSION,
975
+ ROCKCHIP_SIP_CONFIG_DRAM_DEBUG);
976
+ dev_notice(&pdev->dev, "current ATF ddr_debug_func version 0x%lx.\n",
977
+ res.a1);
978
+ /*
979
+ * [15:8] major version, [7:0] minor version
980
+ * major version must match both kernel dmcdbg and ATF ddr_debug_func.
981
+ */
982
+ if (res.a0 || res.a1 < 0x101 || ((res.a1 & 0xff00) != 0x100)) {
983
+ dev_err(&pdev->dev,
984
+ "version invalid,need update,the major version unmatch!\n");
985
+ return -ENXIO;
986
+ }
1071987
1072
- ret = proc_dmcdbg_init(pdev);
1073
- if (ret)
1074
- return ret;
988
+ /* request share memory for pass parameter */
989
+ res = sip_smc_request_share_mem(DMCDBG_PAGE_NUMS,
990
+ SHARE_PAGE_TYPE_DDRDBG);
991
+ if (res.a0 != 0) {
992
+ dev_err(&pdev->dev, "request share mem error\n");
993
+ return -ENOMEM;
994
+ }
995
+
996
+ dmcdbg_data.share_memory = (void __iomem *)res.a1;
997
+ dmcdbg_data.inited_flag = 1;
1075998
1076999 rv1126_get_skew_parameter();
1000
+
1001
+ /* create parent dir in /proc */
1002
+ proc_dmcdbg_dir = proc_mkdir(PROC_DMCDBG_DIR_NAME, NULL);
1003
+ if (!proc_dmcdbg_dir) {
1004
+ dev_err(&pdev->dev, "create proc dir error!");
1005
+ return -ENOENT;
1006
+ }
10771007
10781008 proc_dmcinfo_init();
10791009 proc_powersave_init();
....@@ -1083,54 +1013,8 @@
10831013 return 0;
10841014 }
10851015
1086
-static __maybe_unused int px30_dmcdbg_init(struct platform_device *pdev,
1087
- struct rockchip_dmcdbg *dmcdbg)
1088
-{
1089
- u32 version = 0x101;
1090
- int ret;
1091
-
1092
- ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);
1093
- if (ret)
1094
- return ret;
1095
-
1096
- ret = proc_dmcdbg_init(pdev);
1097
- if (ret)
1098
- return ret;
1099
-
1100
- proc_dmcinfo_init();
1101
-
1102
- return 0;
1103
-}
1104
-
1105
-static __maybe_unused int rk3568_dmcdbg_init(struct platform_device *pdev,
1106
- struct rockchip_dmcdbg *dmcdbg)
1107
-{
1108
- u32 version = 0x101;
1109
- int ret;
1110
-
1111
- ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);
1112
- if (ret)
1113
- return ret;
1114
-
1115
- ret = proc_dmcdbg_init(pdev);
1116
- if (ret)
1117
- return ret;
1118
-
1119
- proc_dmcinfo_init();
1120
-
1121
- return 0;
1122
-}
1123
-
11241016 static const struct of_device_id rockchip_dmcdbg_of_match[] = {
1125
-#ifdef CONFIG_CPU_PX30
1126
- { .compatible = "rockchip,px30-dmcdbg", .data = px30_dmcdbg_init },
1127
-#endif
1128
-#ifdef CONFIG_CPU_RV1126
1129
- { .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init },
1130
-#endif
1131
-#ifdef CONFIG_CPU_RK3568
1132
- { .compatible = "rockchip,rk3568-dmcdbg", .data = rk3568_dmcdbg_init },
1133
-#endif
1017
+ { .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init},
11341018 { },
11351019 };
11361020 MODULE_DEVICE_TABLE(of, rockchip_dmcdbg_of_match);