@@ -462,6 +462,157 @@ static void tvout_hda_start(struct sti_tvout *tvout, bool main_path)
462
462
tvout_write (tvout , 0 , TVO_HD_DAC_CFG_OFF );
463
463
}
464
464
465
+ #define DBGFS_DUMP (reg ) seq_printf(s, "\n %-25s 0x%08X", #reg, \
466
+ readl(tvout->regs + reg))
467
+
468
+ static void tvout_dbg_vip (struct seq_file * s , int val )
469
+ {
470
+ int r , g , b , tmp , mask ;
471
+ char * const reorder [] = {"Y_G" , "Cb_B" , "Cr_R" };
472
+ char * const clipping [] = {"No" , "EAV/SAV" , "Limited range RGB/Y" ,
473
+ "Limited range Cb/Cr" , "decided by register" };
474
+ char * const round [] = {"8-bit" , "10-bit" , "12-bit" };
475
+ char * const input_sel [] = {"Main (color matrix enabled)" ,
476
+ "Main (color matrix by-passed)" ,
477
+ "" , "" , "" , "" , "" , "" ,
478
+ "Aux (color matrix enabled)" ,
479
+ "Aux (color matrix by-passed)" ,
480
+ "" , "" , "" , "" , "" , "Force value" };
481
+
482
+ seq_puts (s , "\t" );
483
+ mask = TVO_VIP_REORDER_MASK << TVO_VIP_REORDER_R_SHIFT ;
484
+ r = (val & mask ) >> TVO_VIP_REORDER_R_SHIFT ;
485
+ mask = TVO_VIP_REORDER_MASK << TVO_VIP_REORDER_G_SHIFT ;
486
+ g = (val & mask ) >> TVO_VIP_REORDER_G_SHIFT ;
487
+ mask = TVO_VIP_REORDER_MASK << TVO_VIP_REORDER_B_SHIFT ;
488
+ b = (val & mask ) >> TVO_VIP_REORDER_B_SHIFT ;
489
+ seq_printf (s , "%-24s %s->%s %s->%s %s->%s\n" , "Reorder:" ,
490
+ reorder [r ], reorder [TVO_VIP_REORDER_CR_R_SEL ],
491
+ reorder [g ], reorder [TVO_VIP_REORDER_Y_G_SEL ],
492
+ reorder [b ], reorder [TVO_VIP_REORDER_CB_B_SEL ]);
493
+ seq_puts (s , "\t\t\t\t\t" );
494
+ mask = TVO_VIP_CLIP_MASK << TVO_VIP_CLIP_SHIFT ;
495
+ tmp = (val & mask ) >> TVO_VIP_CLIP_SHIFT ;
496
+ seq_printf (s , "%-24s %s\n" , "Clipping:" , clipping [tmp ]);
497
+ seq_puts (s , "\t\t\t\t\t" );
498
+ mask = TVO_VIP_RND_MASK << TVO_VIP_RND_SHIFT ;
499
+ tmp = (val & mask ) >> TVO_VIP_RND_SHIFT ;
500
+ seq_printf (s , "%-24s input data rounded to %s per component\n" ,
501
+ "Round:" , round [tmp ]);
502
+ seq_puts (s , "\t\t\t\t\t" );
503
+ tmp = (val & TVO_VIP_SEL_INPUT_MASK );
504
+ seq_printf (s , "%-24s %s" , "Input selection:" , input_sel [tmp ]);
505
+ }
506
+
507
+ static void tvout_dbg_hd_dac_cfg (struct seq_file * s , int val )
508
+ {
509
+ seq_printf (s , "\t%-24s %s" , "HD DAC:" ,
510
+ val & 1 ? "disabled" : "enabled" );
511
+ }
512
+
513
+ static int tvout_dbg_show (struct seq_file * s , void * data )
514
+ {
515
+ struct drm_info_node * node = s -> private ;
516
+ struct sti_tvout * tvout = (struct sti_tvout * )node -> info_ent -> data ;
517
+ struct drm_device * dev = node -> minor -> dev ;
518
+ struct drm_crtc * crtc ;
519
+ int ret ;
520
+
521
+ ret = mutex_lock_interruptible (& dev -> struct_mutex );
522
+ if (ret )
523
+ return ret ;
524
+
525
+ seq_printf (s , "TVOUT: (vaddr = 0x%p)" , tvout -> regs );
526
+
527
+ seq_puts (s , "\n\n HDMI encoder: " );
528
+ crtc = tvout -> hdmi -> crtc ;
529
+ if (crtc ) {
530
+ seq_printf (s , "connected to %s path" ,
531
+ sti_crtc_is_main (crtc ) ? "main" : "aux" );
532
+ DBGFS_DUMP (TVO_HDMI_SYNC_SEL );
533
+ DBGFS_DUMP (TVO_VIP_HDMI );
534
+ tvout_dbg_vip (s , readl (tvout -> regs + TVO_VIP_HDMI ));
535
+ } else {
536
+ seq_puts (s , "disabled" );
537
+ }
538
+
539
+ seq_puts (s , "\n\n DVO encoder: " );
540
+ crtc = tvout -> dvo -> crtc ;
541
+ if (crtc ) {
542
+ seq_printf (s , "connected to %s path" ,
543
+ sti_crtc_is_main (crtc ) ? "main" : "aux" );
544
+ DBGFS_DUMP (TVO_DVO_SYNC_SEL );
545
+ DBGFS_DUMP (TVO_DVO_CONFIG );
546
+ DBGFS_DUMP (TVO_VIP_DVO );
547
+ tvout_dbg_vip (s , readl (tvout -> regs + TVO_VIP_DVO ));
548
+ } else {
549
+ seq_puts (s , "disabled" );
550
+ }
551
+
552
+ seq_puts (s , "\n\n HDA encoder: " );
553
+ crtc = tvout -> hda -> crtc ;
554
+ if (crtc ) {
555
+ seq_printf (s , "connected to %s path" ,
556
+ sti_crtc_is_main (crtc ) ? "main" : "aux" );
557
+ DBGFS_DUMP (TVO_HD_SYNC_SEL );
558
+ DBGFS_DUMP (TVO_HD_DAC_CFG_OFF );
559
+ tvout_dbg_hd_dac_cfg (s ,
560
+ readl (tvout -> regs + TVO_HD_DAC_CFG_OFF ));
561
+ DBGFS_DUMP (TVO_VIP_HDF );
562
+ tvout_dbg_vip (s , readl (tvout -> regs + TVO_VIP_HDF ));
563
+ } else {
564
+ seq_puts (s , "disabled" );
565
+ }
566
+
567
+ seq_puts (s , "\n\n main path configuration" );
568
+ DBGFS_DUMP (TVO_CSC_MAIN_M0 );
569
+ DBGFS_DUMP (TVO_CSC_MAIN_M1 );
570
+ DBGFS_DUMP (TVO_CSC_MAIN_M2 );
571
+ DBGFS_DUMP (TVO_CSC_MAIN_M3 );
572
+ DBGFS_DUMP (TVO_CSC_MAIN_M4 );
573
+ DBGFS_DUMP (TVO_CSC_MAIN_M5 );
574
+ DBGFS_DUMP (TVO_CSC_MAIN_M6 );
575
+ DBGFS_DUMP (TVO_CSC_MAIN_M7 );
576
+ DBGFS_DUMP (TVO_MAIN_IN_VID_FORMAT );
577
+
578
+ seq_puts (s , "\n\n auxiliary path configuration" );
579
+ DBGFS_DUMP (TVO_CSC_AUX_M0 );
580
+ DBGFS_DUMP (TVO_CSC_AUX_M2 );
581
+ DBGFS_DUMP (TVO_CSC_AUX_M3 );
582
+ DBGFS_DUMP (TVO_CSC_AUX_M4 );
583
+ DBGFS_DUMP (TVO_CSC_AUX_M5 );
584
+ DBGFS_DUMP (TVO_CSC_AUX_M6 );
585
+ DBGFS_DUMP (TVO_CSC_AUX_M7 );
586
+ DBGFS_DUMP (TVO_AUX_IN_VID_FORMAT );
587
+ seq_puts (s , "\n" );
588
+
589
+ mutex_unlock (& dev -> struct_mutex );
590
+ return 0 ;
591
+ }
592
+
593
+ static struct drm_info_list tvout_debugfs_files [] = {
594
+ { "tvout" , tvout_dbg_show , 0 , NULL },
595
+ };
596
+
597
+ static void tvout_debugfs_exit (struct sti_tvout * tvout , struct drm_minor * minor )
598
+ {
599
+ drm_debugfs_remove_files (tvout_debugfs_files ,
600
+ ARRAY_SIZE (tvout_debugfs_files ),
601
+ minor );
602
+ }
603
+
604
+ static int tvout_debugfs_init (struct sti_tvout * tvout , struct drm_minor * minor )
605
+ {
606
+ unsigned int i ;
607
+
608
+ for (i = 0 ; i < ARRAY_SIZE (tvout_debugfs_files ); i ++ )
609
+ tvout_debugfs_files [i ].data = tvout ;
610
+
611
+ return drm_debugfs_create_files (tvout_debugfs_files ,
612
+ ARRAY_SIZE (tvout_debugfs_files ),
613
+ minor -> debugfs_root , minor );
614
+ }
615
+
465
616
static void sti_tvout_encoder_dpms (struct drm_encoder * encoder , int mode )
466
617
{
467
618
}
@@ -668,15 +819,21 @@ static int sti_tvout_bind(struct device *dev, struct device *master, void *data)
668
819
669
820
sti_tvout_create_encoders (drm_dev , tvout );
670
821
822
+ if (tvout_debugfs_init (tvout , drm_dev -> primary ))
823
+ DRM_ERROR ("TVOUT debugfs setup failed\n" );
824
+
671
825
return 0 ;
672
826
}
673
827
674
828
static void sti_tvout_unbind (struct device * dev , struct device * master ,
675
829
void * data )
676
830
{
677
831
struct sti_tvout * tvout = dev_get_drvdata (dev );
832
+ struct drm_device * drm_dev = data ;
678
833
679
834
sti_tvout_destroy_encoders (tvout );
835
+
836
+ tvout_debugfs_exit (tvout , drm_dev -> primary );
680
837
}
681
838
682
839
static const struct component_ops sti_tvout_ops = {
0 commit comments