aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c30
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h9
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c105
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h7
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c30
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c31
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c104
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h6
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c3
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c90
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c24
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h15
12 files changed, 93 insertions, 361 deletions
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c
index 9d5a8d217bc6..e45c69044935 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c
@@ -319,10 +319,8 @@ static int dpu_debugfs_core_irq_show(struct seq_file *s, void *v)
319 unsigned long irq_flags; 319 unsigned long irq_flags;
320 int i, irq_count, enable_count, cb_count; 320 int i, irq_count, enable_count, cb_count;
321 321
322 if (!irq_obj || !irq_obj->enable_counts || !irq_obj->irq_cb_tbl) { 322 if (WARN_ON(!irq_obj->enable_counts || !irq_obj->irq_cb_tbl))
323 DPU_ERROR("invalid parameters\n");
324 return 0; 323 return 0;
325 }
326 324
327 for (i = 0; i < irq_obj->total_irqs; i++) { 325 for (i = 0; i < irq_obj->total_irqs; i++) {
328 spin_lock_irqsave(&irq_obj->cb_lock, irq_flags); 326 spin_lock_irqsave(&irq_obj->cb_lock, irq_flags);
@@ -343,31 +341,11 @@ static int dpu_debugfs_core_irq_show(struct seq_file *s, void *v)
343 341
344DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_core_irq); 342DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_core_irq);
345 343
346int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, 344void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
347 struct dentry *parent)
348{
349 dpu_kms->irq_obj.debugfs_file = debugfs_create_file("core_irq", 0600,
350 parent, &dpu_kms->irq_obj,
351 &dpu_debugfs_core_irq_fops);
352
353 return 0;
354}
355
356void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms)
357{
358 debugfs_remove(dpu_kms->irq_obj.debugfs_file);
359 dpu_kms->irq_obj.debugfs_file = NULL;
360}
361
362#else
363int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
364 struct dentry *parent) 345 struct dentry *parent)
365{ 346{
366 return 0; 347 debugfs_create_file("core_irq", 0600, parent, &dpu_kms->irq_obj,
367} 348 &dpu_debugfs_core_irq_fops);
368
369void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms)
370{
371} 349}
372#endif 350#endif
373 351
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h
index 884f77fa3eb6..e9015a2b23fe 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h
@@ -132,15 +132,8 @@ int dpu_core_irq_unregister_callback(
132 * dpu_debugfs_core_irq_init - register core irq debugfs 132 * dpu_debugfs_core_irq_init - register core irq debugfs
133 * @dpu_kms: pointer to kms 133 * @dpu_kms: pointer to kms
134 * @parent: debugfs directory root 134 * @parent: debugfs directory root
135 * @Return: 0 on success
136 */ 135 */
137int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, 136void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
138 struct dentry *parent); 137 struct dentry *parent);
139 138
140/**
141 * dpu_debugfs_core_irq_destroy - deregister core irq debugfs
142 * @dpu_kms: pointer to kms
143 */
144void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms);
145
146#endif /* __DPU_CORE_IRQ_H__ */ 139#endif /* __DPU_CORE_IRQ_H__ */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
index e8a87f4b8e0e..9f20f397f77d 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
@@ -24,8 +24,6 @@
24#include "dpu_crtc.h" 24#include "dpu_crtc.h"
25#include "dpu_core_perf.h" 25#include "dpu_core_perf.h"
26 26
27#define DPU_PERF_MODE_STRING_SIZE 128
28
29/** 27/**
30 * enum dpu_perf_mode - performance tuning mode 28 * enum dpu_perf_mode - performance tuning mode
31 * @DPU_PERF_MODE_NORMAL: performance controlled by user mode client 29 * @DPU_PERF_MODE_NORMAL: performance controlled by user mode client
@@ -451,24 +449,14 @@ static ssize_t _dpu_core_perf_mode_write(struct file *file,
451 struct dpu_core_perf *perf = file->private_data; 449 struct dpu_core_perf *perf = file->private_data;
452 struct dpu_perf_cfg *cfg = &perf->catalog->perf; 450 struct dpu_perf_cfg *cfg = &perf->catalog->perf;
453 u32 perf_mode = 0; 451 u32 perf_mode = 0;
454 char buf[10]; 452 int ret;
455
456 if (!perf)
457 return -ENODEV;
458
459 if (count >= sizeof(buf))
460 return -EFAULT;
461
462 if (copy_from_user(buf, user_buf, count))
463 return -EFAULT;
464
465 buf[count] = 0; /* end of string */
466 453
467 if (kstrtouint(buf, 0, &perf_mode)) 454 ret = kstrtouint_from_user(user_buf, count, 0, &perf_mode);
468 return -EFAULT; 455 if (ret)
456 return ret;
469 457
470 if (perf_mode >= DPU_PERF_MODE_MAX) 458 if (perf_mode >= DPU_PERF_MODE_MAX)
471 return -EFAULT; 459 return -EINVAL;
472 460
473 if (perf_mode == DPU_PERF_MODE_FIXED) { 461 if (perf_mode == DPU_PERF_MODE_FIXED) {
474 DRM_INFO("fix performance mode\n"); 462 DRM_INFO("fix performance mode\n");
@@ -493,29 +481,16 @@ static ssize_t _dpu_core_perf_mode_read(struct file *file,
493 char __user *buff, size_t count, loff_t *ppos) 481 char __user *buff, size_t count, loff_t *ppos)
494{ 482{
495 struct dpu_core_perf *perf = file->private_data; 483 struct dpu_core_perf *perf = file->private_data;
496 int len = 0; 484 int len;
497 char buf[DPU_PERF_MODE_STRING_SIZE] = {'\0'}; 485 char buf[128];
498 486
499 if (!perf) 487 len = scnprintf(buf, sizeof(buf),
500 return -ENODEV;
501
502 if (*ppos)
503 return 0; /* the end */
504
505 len = snprintf(buf, sizeof(buf),
506 "mode %d min_mdp_clk %llu min_bus_vote %llu\n", 488 "mode %d min_mdp_clk %llu min_bus_vote %llu\n",
507 perf->perf_tune.mode, 489 perf->perf_tune.mode,
508 perf->perf_tune.min_core_clk, 490 perf->perf_tune.min_core_clk,
509 perf->perf_tune.min_bus_vote); 491 perf->perf_tune.min_bus_vote);
510 if (len < 0 || len >= sizeof(buf))
511 return 0;
512
513 if ((count < sizeof(buf)) || copy_to_user(buff, buf, len))
514 return -EFAULT;
515 492
516 *ppos += len; /* increase offset */ 493 return simple_read_from_buffer(buff, count, ppos, buf, len);
517
518 return len;
519} 494}
520 495
521static const struct file_operations dpu_core_perf_mode_fops = { 496static const struct file_operations dpu_core_perf_mode_fops = {
@@ -524,70 +499,43 @@ static const struct file_operations dpu_core_perf_mode_fops = {
524 .write = _dpu_core_perf_mode_write, 499 .write = _dpu_core_perf_mode_write,
525}; 500};
526 501
527static void dpu_core_perf_debugfs_destroy(struct dpu_core_perf *perf) 502int dpu_core_perf_debugfs_init(struct dpu_kms *dpu_kms, struct dentry *parent)
528{
529 debugfs_remove_recursive(perf->debugfs_root);
530 perf->debugfs_root = NULL;
531}
532
533int dpu_core_perf_debugfs_init(struct dpu_core_perf *perf,
534 struct dentry *parent)
535{ 503{
504 struct dpu_core_perf *perf = &dpu_kms->perf;
536 struct dpu_mdss_cfg *catalog = perf->catalog; 505 struct dpu_mdss_cfg *catalog = perf->catalog;
537 struct msm_drm_private *priv; 506 struct dentry *entry;
538 struct dpu_kms *dpu_kms;
539
540 priv = perf->dev->dev_private;
541 if (!priv || !priv->kms) {
542 DPU_ERROR("invalid KMS reference\n");
543 return -EINVAL;
544 }
545
546 dpu_kms = to_dpu_kms(priv->kms);
547 507
548 perf->debugfs_root = debugfs_create_dir("core_perf", parent); 508 entry = debugfs_create_dir("core_perf", parent);
549 if (!perf->debugfs_root) { 509 if (IS_ERR_OR_NULL(entry))
550 DPU_ERROR("failed to create core perf debugfs\n");
551 return -EINVAL; 510 return -EINVAL;
552 }
553 511
554 debugfs_create_u64("max_core_clk_rate", 0600, perf->debugfs_root, 512 debugfs_create_u64("max_core_clk_rate", 0600, entry,
555 &perf->max_core_clk_rate); 513 &perf->max_core_clk_rate);
556 debugfs_create_u64("core_clk_rate", 0600, perf->debugfs_root, 514 debugfs_create_u64("core_clk_rate", 0600, entry,
557 &perf->core_clk_rate); 515 &perf->core_clk_rate);
558 debugfs_create_u32("enable_bw_release", 0600, perf->debugfs_root, 516 debugfs_create_u32("enable_bw_release", 0600, entry,
559 (u32 *)&perf->enable_bw_release); 517 (u32 *)&perf->enable_bw_release);
560 debugfs_create_u32("threshold_low", 0600, perf->debugfs_root, 518 debugfs_create_u32("threshold_low", 0600, entry,
561 (u32 *)&catalog->perf.max_bw_low); 519 (u32 *)&catalog->perf.max_bw_low);
562 debugfs_create_u32("threshold_high", 0600, perf->debugfs_root, 520 debugfs_create_u32("threshold_high", 0600, entry,
563 (u32 *)&catalog->perf.max_bw_high); 521 (u32 *)&catalog->perf.max_bw_high);
564 debugfs_create_u32("min_core_ib", 0600, perf->debugfs_root, 522 debugfs_create_u32("min_core_ib", 0600, entry,
565 (u32 *)&catalog->perf.min_core_ib); 523 (u32 *)&catalog->perf.min_core_ib);
566 debugfs_create_u32("min_llcc_ib", 0600, perf->debugfs_root, 524 debugfs_create_u32("min_llcc_ib", 0600, entry,
567 (u32 *)&catalog->perf.min_llcc_ib); 525 (u32 *)&catalog->perf.min_llcc_ib);
568 debugfs_create_u32("min_dram_ib", 0600, perf->debugfs_root, 526 debugfs_create_u32("min_dram_ib", 0600, entry,
569 (u32 *)&catalog->perf.min_dram_ib); 527 (u32 *)&catalog->perf.min_dram_ib);
570 debugfs_create_file("perf_mode", 0600, perf->debugfs_root, 528 debugfs_create_file("perf_mode", 0600, entry,
571 (u32 *)perf, &dpu_core_perf_mode_fops); 529 (u32 *)perf, &dpu_core_perf_mode_fops);
572 debugfs_create_u64("fix_core_clk_rate", 0600, perf->debugfs_root, 530 debugfs_create_u64("fix_core_clk_rate", 0600, entry,
573 &perf->fix_core_clk_rate); 531 &perf->fix_core_clk_rate);
574 debugfs_create_u64("fix_core_ib_vote", 0600, perf->debugfs_root, 532 debugfs_create_u64("fix_core_ib_vote", 0600, entry,
575 &perf->fix_core_ib_vote); 533 &perf->fix_core_ib_vote);
576 debugfs_create_u64("fix_core_ab_vote", 0600, perf->debugfs_root, 534 debugfs_create_u64("fix_core_ab_vote", 0600, entry,
577 &perf->fix_core_ab_vote); 535 &perf->fix_core_ab_vote);
578 536
579 return 0; 537 return 0;
580} 538}
581#else
582static void dpu_core_perf_debugfs_destroy(struct dpu_core_perf *perf)
583{
584}
585
586int dpu_core_perf_debugfs_init(struct dpu_core_perf *perf,
587 struct dentry *parent)
588{
589 return 0;
590}
591#endif 539#endif
592 540
593void dpu_core_perf_destroy(struct dpu_core_perf *perf) 541void dpu_core_perf_destroy(struct dpu_core_perf *perf)
@@ -597,7 +545,6 @@ void dpu_core_perf_destroy(struct dpu_core_perf *perf)
597 return; 545 return;
598 } 546 }
599 547
600 dpu_core_perf_debugfs_destroy(perf);
601 perf->max_core_clk_rate = 0; 548 perf->max_core_clk_rate = 0;
602 perf->core_clk = NULL; 549 perf->core_clk = NULL;
603 perf->catalog = NULL; 550 perf->catalog = NULL;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h
index c708451a94a1..37f518815eb7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h
@@ -130,12 +130,13 @@ int dpu_core_perf_init(struct dpu_core_perf *perf,
130 struct dpu_mdss_cfg *catalog, 130 struct dpu_mdss_cfg *catalog,
131 struct dss_clk *core_clk); 131 struct dss_clk *core_clk);
132 132
133struct dpu_kms;
134
133/** 135/**
134 * dpu_core_perf_debugfs_init - initialize debugfs for core performance context 136 * dpu_core_perf_debugfs_init - initialize debugfs for core performance context
135 * @perf: Pointer to core performance context 137 * @dpu_kms: Pointer to the dpu_kms struct
136 * @debugfs_parent: Pointer to parent debugfs 138 * @debugfs_parent: Pointer to parent debugfs
137 */ 139 */
138int dpu_core_perf_debugfs_init(struct dpu_core_perf *perf, 140int dpu_core_perf_debugfs_init(struct dpu_kms *dpu_kms, struct dentry *parent);
139 struct dentry *parent);
140 141
141#endif /* _DPU_CORE_PERF_H_ */ 142#endif /* _DPU_CORE_PERF_H_ */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index ffdb90c70c34..3090854a8575 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -1186,9 +1186,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
1186 1186
1187 int i, out_width; 1187 int i, out_width;
1188 1188
1189 if (!s || !s->private)
1190 return -EINVAL;
1191
1192 dpu_crtc = s->private; 1189 dpu_crtc = s->private;
1193 crtc = &dpu_crtc->base; 1190 crtc = &dpu_crtc->base;
1194 1191
@@ -1328,8 +1325,7 @@ DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_crtc_debugfs_state);
1328 1325
1329static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc) 1326static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc)
1330{ 1327{
1331 struct dpu_crtc *dpu_crtc; 1328 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
1332 struct dpu_kms *dpu_kms;
1333 1329
1334 static const struct file_operations debugfs_status_fops = { 1330 static const struct file_operations debugfs_status_fops = {
1335 .open = _dpu_debugfs_status_open, 1331 .open = _dpu_debugfs_status_open,
@@ -1338,12 +1334,6 @@ static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc)
1338 .release = single_release, 1334 .release = single_release,
1339 }; 1335 };
1340 1336
1341 if (!crtc)
1342 return -EINVAL;
1343 dpu_crtc = to_dpu_crtc(crtc);
1344
1345 dpu_kms = _dpu_crtc_get_kms(crtc);
1346
1347 dpu_crtc->debugfs_root = debugfs_create_dir(dpu_crtc->name, 1337 dpu_crtc->debugfs_root = debugfs_create_dir(dpu_crtc->name,
1348 crtc->dev->primary->debugfs_root); 1338 crtc->dev->primary->debugfs_root);
1349 if (!dpu_crtc->debugfs_root) 1339 if (!dpu_crtc->debugfs_root)
@@ -1360,25 +1350,11 @@ static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc)
1360 1350
1361 return 0; 1351 return 0;
1362} 1352}
1363
1364static void _dpu_crtc_destroy_debugfs(struct drm_crtc *crtc)
1365{
1366 struct dpu_crtc *dpu_crtc;
1367
1368 if (!crtc)
1369 return;
1370 dpu_crtc = to_dpu_crtc(crtc);
1371 debugfs_remove_recursive(dpu_crtc->debugfs_root);
1372}
1373#else 1353#else
1374static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc) 1354static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc)
1375{ 1355{
1376 return 0; 1356 return 0;
1377} 1357}
1378
1379static void _dpu_crtc_destroy_debugfs(struct drm_crtc *crtc)
1380{
1381}
1382#endif /* CONFIG_DEBUG_FS */ 1358#endif /* CONFIG_DEBUG_FS */
1383 1359
1384static int dpu_crtc_late_register(struct drm_crtc *crtc) 1360static int dpu_crtc_late_register(struct drm_crtc *crtc)
@@ -1388,7 +1364,9 @@ static int dpu_crtc_late_register(struct drm_crtc *crtc)
1388 1364
1389static void dpu_crtc_early_unregister(struct drm_crtc *crtc) 1365static void dpu_crtc_early_unregister(struct drm_crtc *crtc)
1390{ 1366{
1391 _dpu_crtc_destroy_debugfs(crtc); 1367 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
1368
1369 debugfs_remove_recursive(dpu_crtc->debugfs_root);
1392} 1370}
1393 1371
1394static const struct drm_crtc_funcs dpu_crtc_funcs = { 1372static const struct drm_crtc_funcs dpu_crtc_funcs = {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index c1baab4c72d2..0dda4a603685 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1863,14 +1863,9 @@ void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc)
1863#ifdef CONFIG_DEBUG_FS 1863#ifdef CONFIG_DEBUG_FS
1864static int _dpu_encoder_status_show(struct seq_file *s, void *data) 1864static int _dpu_encoder_status_show(struct seq_file *s, void *data)
1865{ 1865{
1866 struct dpu_encoder_virt *dpu_enc; 1866 struct dpu_encoder_virt *dpu_enc = s->private;
1867 int i; 1867 int i;
1868 1868
1869 if (!s || !s->private)
1870 return -EINVAL;
1871
1872 dpu_enc = s->private;
1873
1874 mutex_lock(&dpu_enc->enc_lock); 1869 mutex_lock(&dpu_enc->enc_lock);
1875 for (i = 0; i < dpu_enc->num_phys_encs; i++) { 1870 for (i = 0; i < dpu_enc->num_phys_encs; i++) {
1876 struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i]; 1871 struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
@@ -1908,7 +1903,7 @@ static int _dpu_encoder_debugfs_status_open(struct inode *inode,
1908 1903
1909static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc) 1904static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
1910{ 1905{
1911 struct dpu_encoder_virt *dpu_enc; 1906 struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
1912 struct msm_drm_private *priv; 1907 struct msm_drm_private *priv;
1913 struct dpu_kms *dpu_kms; 1908 struct dpu_kms *dpu_kms;
1914 int i; 1909 int i;
@@ -1922,12 +1917,11 @@ static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
1922 1917
1923 char name[DPU_NAME_SIZE]; 1918 char name[DPU_NAME_SIZE];
1924 1919
1925 if (!drm_enc || !drm_enc->dev || !drm_enc->dev->dev_private) { 1920 if (!drm_enc->dev || !drm_enc->dev->dev_private) {
1926 DPU_ERROR("invalid encoder or kms\n"); 1921 DPU_ERROR("invalid encoder or kms\n");
1927 return -EINVAL; 1922 return -EINVAL;
1928 } 1923 }
1929 1924
1930 dpu_enc = to_dpu_encoder_virt(drm_enc);
1931 priv = drm_enc->dev->dev_private; 1925 priv = drm_enc->dev->dev_private;
1932 dpu_kms = to_dpu_kms(priv->kms); 1926 dpu_kms = to_dpu_kms(priv->kms);
1933 1927
@@ -1952,26 +1946,11 @@ static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
1952 1946
1953 return 0; 1947 return 0;
1954} 1948}
1955
1956static void _dpu_encoder_destroy_debugfs(struct drm_encoder *drm_enc)
1957{
1958 struct dpu_encoder_virt *dpu_enc;
1959
1960 if (!drm_enc)
1961 return;
1962
1963 dpu_enc = to_dpu_encoder_virt(drm_enc);
1964 debugfs_remove_recursive(dpu_enc->debugfs_root);
1965}
1966#else 1949#else
1967static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc) 1950static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
1968{ 1951{
1969 return 0; 1952 return 0;
1970} 1953}
1971
1972static void _dpu_encoder_destroy_debugfs(struct drm_encoder *drm_enc)
1973{
1974}
1975#endif 1954#endif
1976 1955
1977static int dpu_encoder_late_register(struct drm_encoder *encoder) 1956static int dpu_encoder_late_register(struct drm_encoder *encoder)
@@ -1981,7 +1960,9 @@ static int dpu_encoder_late_register(struct drm_encoder *encoder)
1981 1960
1982static void dpu_encoder_early_unregister(struct drm_encoder *encoder) 1961static void dpu_encoder_early_unregister(struct drm_encoder *encoder)
1983{ 1962{
1984 _dpu_encoder_destroy_debugfs(encoder); 1963 struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(encoder);
1964
1965 debugfs_remove_recursive(dpu_enc->debugfs_root);
1985} 1966}
1986 1967
1987static int dpu_encoder_virt_add_phys_encs( 1968static int dpu_encoder_virt_add_phys_encs(
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 37dfee1ebba9..51a4a5f7c7f9 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -81,7 +81,7 @@ static int _dpu_danger_signal_status(struct seq_file *s,
81 struct dpu_danger_safe_status status; 81 struct dpu_danger_safe_status status;
82 int i; 82 int i;
83 83
84 if (!kms || !kms->dev || !kms->dev->dev_private || !kms->hw_mdp) { 84 if (!kms->dev || !kms->dev->dev_private || !kms->hw_mdp) {
85 DPU_ERROR("invalid arg(s)\n"); 85 DPU_ERROR("invalid arg(s)\n");
86 return 0; 86 return 0;
87 } 87 }
@@ -138,46 +138,29 @@ static int dpu_debugfs_safe_stats_show(struct seq_file *s, void *v)
138} 138}
139DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_safe_stats); 139DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_safe_stats);
140 140
141static void dpu_debugfs_danger_destroy(struct dpu_kms *dpu_kms) 141static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
142{
143 debugfs_remove_recursive(dpu_kms->debugfs_danger);
144 dpu_kms->debugfs_danger = NULL;
145}
146
147static int dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
148 struct dentry *parent) 142 struct dentry *parent)
149{ 143{
150 dpu_kms->debugfs_danger = debugfs_create_dir("danger", 144 struct dentry *entry = debugfs_create_dir("danger", parent);
151 parent); 145 if (IS_ERR_OR_NULL(entry))
152 if (!dpu_kms->debugfs_danger) { 146 return;
153 DPU_ERROR("failed to create danger debugfs\n");
154 return -EINVAL;
155 }
156 147
157 debugfs_create_file("danger_status", 0600, dpu_kms->debugfs_danger, 148 debugfs_create_file("danger_status", 0600, entry,
158 dpu_kms, &dpu_debugfs_danger_stats_fops); 149 dpu_kms, &dpu_debugfs_danger_stats_fops);
159 debugfs_create_file("safe_status", 0600, dpu_kms->debugfs_danger, 150 debugfs_create_file("safe_status", 0600, entry,
160 dpu_kms, &dpu_debugfs_safe_stats_fops); 151 dpu_kms, &dpu_debugfs_safe_stats_fops);
161
162 return 0;
163} 152}
164 153
165static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data) 154static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data)
166{ 155{
167 struct dpu_debugfs_regset32 *regset; 156 struct dpu_debugfs_regset32 *regset = s->private;
168 struct dpu_kms *dpu_kms; 157 struct dpu_kms *dpu_kms = regset->dpu_kms;
169 struct drm_device *dev; 158 struct drm_device *dev;
170 struct msm_drm_private *priv; 159 struct msm_drm_private *priv;
171 void __iomem *base; 160 void __iomem *base;
172 uint32_t i, addr; 161 uint32_t i, addr;
173 162
174 if (!s || !s->private) 163 if (!dpu_kms->mmio)
175 return 0;
176
177 regset = s->private;
178
179 dpu_kms = regset->dpu_kms;
180 if (!dpu_kms || !dpu_kms->mmio)
181 return 0; 164 return 0;
182 165
183 dev = dpu_kms->dev; 166 dev = dpu_kms->dev;
@@ -250,51 +233,24 @@ void *dpu_debugfs_create_regset32(const char *name, umode_t mode,
250 233
251static int _dpu_debugfs_init(struct dpu_kms *dpu_kms) 234static int _dpu_debugfs_init(struct dpu_kms *dpu_kms)
252{ 235{
253 void *p; 236 void *p = dpu_hw_util_get_log_mask_ptr();
254 int rc; 237 struct dentry *entry;
255
256 p = dpu_hw_util_get_log_mask_ptr();
257 238
258 if (!dpu_kms || !p) 239 if (!p)
259 return -EINVAL; 240 return -EINVAL;
260 241
261 dpu_kms->debugfs_root = debugfs_create_dir("debug", 242 entry = debugfs_create_dir("debug", dpu_kms->dev->primary->debugfs_root);
262 dpu_kms->dev->primary->debugfs_root); 243 if (IS_ERR_OR_NULL(entry))
263 if (IS_ERR_OR_NULL(dpu_kms->debugfs_root)) { 244 return -ENODEV;
264 DRM_ERROR("debugfs create_dir failed %ld\n",
265 PTR_ERR(dpu_kms->debugfs_root));
266 return PTR_ERR(dpu_kms->debugfs_root);
267 }
268 245
269 /* allow root to be NULL */ 246 /* allow root to be NULL */
270 debugfs_create_x32(DPU_DEBUGFS_HWMASKNAME, 0600, dpu_kms->debugfs_root, p); 247 debugfs_create_x32(DPU_DEBUGFS_HWMASKNAME, 0600, entry, p);
271
272 (void) dpu_debugfs_danger_init(dpu_kms, dpu_kms->debugfs_root);
273 (void) dpu_debugfs_vbif_init(dpu_kms, dpu_kms->debugfs_root);
274 (void) dpu_debugfs_core_irq_init(dpu_kms, dpu_kms->debugfs_root);
275 248
276 rc = dpu_core_perf_debugfs_init(&dpu_kms->perf, dpu_kms->debugfs_root); 249 dpu_debugfs_danger_init(dpu_kms, entry);
277 if (rc) { 250 dpu_debugfs_vbif_init(dpu_kms, entry);
278 DPU_ERROR("failed to init perf %d\n", rc); 251 dpu_debugfs_core_irq_init(dpu_kms, entry);
279 return rc;
280 }
281 252
282 return 0; 253 return dpu_core_perf_debugfs_init(dpu_kms, entry);
283}
284
285static void _dpu_debugfs_destroy(struct dpu_kms *dpu_kms)
286{
287 /* don't need to NULL check debugfs_root */
288 if (dpu_kms) {
289 dpu_debugfs_vbif_destroy(dpu_kms);
290 dpu_debugfs_danger_destroy(dpu_kms);
291 dpu_debugfs_core_irq_destroy(dpu_kms);
292 debugfs_remove_recursive(dpu_kms->debugfs_root);
293 }
294}
295#else
296static void _dpu_debugfs_destroy(struct dpu_kms *dpu_kms)
297{
298} 254}
299#endif 255#endif
300 256
@@ -620,22 +576,7 @@ fail:
620#ifdef CONFIG_DEBUG_FS 576#ifdef CONFIG_DEBUG_FS
621static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor) 577static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor)
622{ 578{
623 struct dpu_kms *dpu_kms = to_dpu_kms(kms); 579 return _dpu_debugfs_init(to_dpu_kms(kms));
624 struct drm_device *dev;
625 int rc;
626
627 if (!dpu_kms || !dpu_kms->dev || !dpu_kms->dev->dev) {
628 DPU_ERROR("invalid dpu_kms\n");
629 return -EINVAL;
630 }
631
632 dev = dpu_kms->dev;
633
634 rc = _dpu_debugfs_init(dpu_kms);
635 if (rc)
636 DPU_ERROR("dpu_debugfs init failed: %d\n", rc);
637
638 return rc;
639} 580}
640#endif 581#endif
641 582
@@ -659,7 +600,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
659 dpu_kms->hw_intr = NULL; 600 dpu_kms->hw_intr = NULL;
660 601
661 /* safe to call these more than once during shutdown */ 602 /* safe to call these more than once during shutdown */
662 _dpu_debugfs_destroy(dpu_kms);
663 _dpu_kms_mmu_destroy(dpu_kms); 603 _dpu_kms_mmu_destroy(dpu_kms);
664 604
665 if (dpu_kms->catalog) { 605 if (dpu_kms->catalog) {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
index c15d239e9832..ac75cfc267f4 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
@@ -102,7 +102,6 @@ struct dpu_irq {
102 atomic_t *enable_counts; 102 atomic_t *enable_counts;
103 atomic_t *irq_counts; 103 atomic_t *irq_counts;
104 spinlock_t cb_lock; 104 spinlock_t cb_lock;
105 struct dentry *debugfs_file;
106}; 105};
107 106
108struct dpu_kms { 107struct dpu_kms {
@@ -111,11 +110,6 @@ struct dpu_kms {
111 int core_rev; 110 int core_rev;
112 struct dpu_mdss_cfg *catalog; 111 struct dpu_mdss_cfg *catalog;
113 112
114 /* directory entry for debugfs */
115 struct dentry *debugfs_root;
116 struct dentry *debugfs_danger;
117 struct dentry *debugfs_vbif;
118
119 /* io/register spaces: */ 113 /* io/register spaces: */
120 void __iomem *mmio, *vbif[VBIF_MAX], *reg_dma; 114 void __iomem *mmio, *vbif[VBIF_MAX], *reg_dma;
121 unsigned long mmio_len, vbif_len[VBIF_MAX], reg_dma_len; 115 unsigned long mmio_len, vbif_len[VBIF_MAX], reg_dma_len;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c
index b7963f6bb865..413e1ee43cf2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c
@@ -120,13 +120,12 @@ static int _dpu_mdss_irq_domain_add(struct dpu_mdss *dpu_mdss)
120 return 0; 120 return 0;
121} 121}
122 122
123static int _dpu_mdss_irq_domain_fini(struct dpu_mdss *dpu_mdss) 123static void _dpu_mdss_irq_domain_fini(struct dpu_mdss *dpu_mdss)
124{ 124{
125 if (dpu_mdss->irq_controller.domain) { 125 if (dpu_mdss->irq_controller.domain) {
126 irq_domain_remove(dpu_mdss->irq_controller.domain); 126 irq_domain_remove(dpu_mdss->irq_controller.domain);
127 dpu_mdss->irq_controller.domain = NULL; 127 dpu_mdss->irq_controller.domain = NULL;
128 } 128 }
129 return 0;
130} 129}
131static int dpu_mdss_enable(struct msm_mdss *mdss) 130static int dpu_mdss_enable(struct msm_mdss *mdss)
132{ 131{
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index f7d9bab80dad..278d0edb41a9 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1262,26 +1262,12 @@ static ssize_t _dpu_plane_danger_read(struct file *file,
1262 char __user *buff, size_t count, loff_t *ppos) 1262 char __user *buff, size_t count, loff_t *ppos)
1263{ 1263{
1264 struct dpu_kms *kms = file->private_data; 1264 struct dpu_kms *kms = file->private_data;
1265 struct dpu_mdss_cfg *cfg = kms->catalog; 1265 int len;
1266 int len = 0; 1266 char buf[40];
1267 char buf[40] = {'\0'};
1268 1267
1269 if (!cfg) 1268 len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
1270 return -ENODEV;
1271 1269
1272 if (*ppos) 1270 return simple_read_from_buffer(buff, count, ppos, buf, len);
1273 return 0; /* the end */
1274
1275 len = snprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
1276 if (len < 0 || len >= sizeof(buf))
1277 return 0;
1278
1279 if ((count < sizeof(buf)) || copy_to_user(buff, buf, len))
1280 return -EFAULT;
1281
1282 *ppos += len; /* increase offset */
1283
1284 return len;
1285} 1271}
1286 1272
1287static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool enable) 1273static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool enable)
@@ -1311,23 +1297,12 @@ static ssize_t _dpu_plane_danger_write(struct file *file,
1311 const char __user *user_buf, size_t count, loff_t *ppos) 1297 const char __user *user_buf, size_t count, loff_t *ppos)
1312{ 1298{
1313 struct dpu_kms *kms = file->private_data; 1299 struct dpu_kms *kms = file->private_data;
1314 struct dpu_mdss_cfg *cfg = kms->catalog;
1315 int disable_panic; 1300 int disable_panic;
1316 char buf[10]; 1301 int ret;
1317
1318 if (!cfg)
1319 return -EFAULT;
1320
1321 if (count >= sizeof(buf))
1322 return -EFAULT;
1323
1324 if (copy_from_user(buf, user_buf, count))
1325 return -EFAULT;
1326
1327 buf[count] = 0; /* end of string */
1328 1302
1329 if (kstrtoint(buf, 0, &disable_panic)) 1303 ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
1330 return -EFAULT; 1304 if (ret)
1305 return ret;
1331 1306
1332 if (disable_panic) { 1307 if (disable_panic) {
1333 /* Disable panic signal for all active pipes */ 1308 /* Disable panic signal for all active pipes */
@@ -1352,33 +1327,10 @@ static const struct file_operations dpu_plane_danger_enable = {
1352 1327
1353static int _dpu_plane_init_debugfs(struct drm_plane *plane) 1328static int _dpu_plane_init_debugfs(struct drm_plane *plane)
1354{ 1329{
1355 struct dpu_plane *pdpu; 1330 struct dpu_plane *pdpu = to_dpu_plane(plane);
1356 struct dpu_kms *kms; 1331 struct dpu_kms *kms = _dpu_plane_get_kms(plane);
1357 struct msm_drm_private *priv; 1332 const struct dpu_sspp_cfg *cfg = pdpu->pipe_hw->cap;
1358 const struct dpu_sspp_sub_blks *sblk = 0; 1333 const struct dpu_sspp_sub_blks *sblk = cfg->sblk;
1359 const struct dpu_sspp_cfg *cfg = 0;
1360
1361 if (!plane || !plane->dev) {
1362 DPU_ERROR("invalid arguments\n");
1363 return -EINVAL;
1364 }
1365
1366 priv = plane->dev->dev_private;
1367 if (!priv || !priv->kms) {
1368 DPU_ERROR("invalid KMS reference\n");
1369 return -EINVAL;
1370 }
1371
1372 kms = to_dpu_kms(priv->kms);
1373 pdpu = to_dpu_plane(plane);
1374
1375 if (pdpu && pdpu->pipe_hw)
1376 cfg = pdpu->pipe_hw->cap;
1377 if (cfg)
1378 sblk = cfg->sblk;
1379
1380 if (!sblk)
1381 return 0;
1382 1334
1383 /* create overall sub-directory for the pipe */ 1335 /* create overall sub-directory for the pipe */
1384 pdpu->debugfs_root = 1336 pdpu->debugfs_root =
@@ -1449,25 +1401,11 @@ static int _dpu_plane_init_debugfs(struct drm_plane *plane)
1449 1401
1450 return 0; 1402 return 0;
1451} 1403}
1452
1453static void _dpu_plane_destroy_debugfs(struct drm_plane *plane)
1454{
1455 struct dpu_plane *pdpu;
1456
1457 if (!plane)
1458 return;
1459 pdpu = to_dpu_plane(plane);
1460
1461 debugfs_remove_recursive(pdpu->debugfs_root);
1462}
1463#else 1404#else
1464static int _dpu_plane_init_debugfs(struct drm_plane *plane) 1405static int _dpu_plane_init_debugfs(struct drm_plane *plane)
1465{ 1406{
1466 return 0; 1407 return 0;
1467} 1408}
1468static void _dpu_plane_destroy_debugfs(struct drm_plane *plane)
1469{
1470}
1471#endif 1409#endif
1472 1410
1473static int dpu_plane_late_register(struct drm_plane *plane) 1411static int dpu_plane_late_register(struct drm_plane *plane)
@@ -1477,7 +1415,9 @@ static int dpu_plane_late_register(struct drm_plane *plane)
1477 1415
1478static void dpu_plane_early_unregister(struct drm_plane *plane) 1416static void dpu_plane_early_unregister(struct drm_plane *plane)
1479{ 1417{
1480 _dpu_plane_destroy_debugfs(plane); 1418 struct dpu_plane *pdpu = to_dpu_plane(plane);
1419
1420 debugfs_remove_recursive(pdpu->debugfs_root);
1481} 1421}
1482 1422
1483static const struct drm_plane_funcs dpu_plane_funcs = { 1423static const struct drm_plane_funcs dpu_plane_funcs = {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c
index ff5091d2555d..ef753ea9c499 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c
@@ -310,31 +310,25 @@ void dpu_vbif_init_memtypes(struct dpu_kms *dpu_kms)
310} 310}
311 311
312#ifdef CONFIG_DEBUG_FS 312#ifdef CONFIG_DEBUG_FS
313void dpu_debugfs_vbif_destroy(struct dpu_kms *dpu_kms)
314{
315 debugfs_remove_recursive(dpu_kms->debugfs_vbif);
316 dpu_kms->debugfs_vbif = NULL;
317}
318 313
319int dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) 314void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root)
320{ 315{
321 char vbif_name[32]; 316 char vbif_name[32];
322 struct dentry *debugfs_vbif; 317 struct dentry *entry, *debugfs_vbif;
323 int i, j; 318 int i, j;
324 319
325 dpu_kms->debugfs_vbif = debugfs_create_dir("vbif", debugfs_root); 320 entry = debugfs_create_dir("vbif", debugfs_root);
326 if (!dpu_kms->debugfs_vbif) { 321 if (IS_ERR_OR_NULL(entry))
327 DPU_ERROR("failed to create vbif debugfs\n"); 322 return;
328 return -EINVAL;
329 }
330 323
331 for (i = 0; i < dpu_kms->catalog->vbif_count; i++) { 324 for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
332 struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i]; 325 struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
333 326
334 snprintf(vbif_name, sizeof(vbif_name), "%d", vbif->id); 327 snprintf(vbif_name, sizeof(vbif_name), "%d", vbif->id);
335 328
336 debugfs_vbif = debugfs_create_dir(vbif_name, 329 debugfs_vbif = debugfs_create_dir(vbif_name, entry);
337 dpu_kms->debugfs_vbif); 330 if (IS_ERR_OR_NULL(debugfs_vbif))
331 continue;
338 332
339 debugfs_create_u32("features", 0600, debugfs_vbif, 333 debugfs_create_u32("features", 0600, debugfs_vbif,
340 (u32 *)&vbif->features); 334 (u32 *)&vbif->features);
@@ -376,7 +370,5 @@ int dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root)
376 (u32 *)&cfg->ot_limit); 370 (u32 *)&cfg->ot_limit);
377 } 371 }
378 } 372 }
379
380 return 0;
381} 373}
382#endif 374#endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h
index f17af52dbbd5..6356876d7a66 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h
@@ -78,17 +78,6 @@ void dpu_vbif_clear_errors(struct dpu_kms *dpu_kms);
78 */ 78 */
79void dpu_vbif_init_memtypes(struct dpu_kms *dpu_kms); 79void dpu_vbif_init_memtypes(struct dpu_kms *dpu_kms);
80 80
81#ifdef CONFIG_DEBUG_FS 81void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root);
82int dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root); 82
83void dpu_debugfs_vbif_destroy(struct dpu_kms *dpu_kms);
84#else
85static inline int dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms,
86 struct dentry *debugfs_root)
87{
88 return 0;
89}
90static inline void dpu_debugfs_vbif_destroy(struct dpu_kms *dpu_kms)
91{
92}
93#endif
94#endif /* __DPU_VBIF_H__ */ 83#endif /* __DPU_VBIF_H__ */