@@ -2942,6 +2942,136 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
29422942 return 0 ;
29432943}
29442944
2945+ static int dw_hdmi_status_show (struct seq_file * s , void * v )
2946+ {
2947+ struct dw_hdmi * hdmi = s -> private ;
2948+ u32 val ;
2949+
2950+ seq_puts (s , "PHY " );
2951+ if (!hdmi -> phy .enabled ) {
2952+ seq_puts (s , "disabled\n" );
2953+ return 0 ;
2954+ }
2955+ seq_puts (s , "enabled\t\t\tMode: " );
2956+ if (hdmi -> sink_is_hdmi )
2957+ seq_puts (s , "HDMI\n" );
2958+ else
2959+ seq_puts (s , "DVI\n" );
2960+ seq_printf (s , "Pixel Clk: %uHz\t\tTMDS Clk: %uHz\n" ,
2961+ hdmi -> hdmi_data .video_mode .mpixelclock ,
2962+ hdmi -> hdmi_data .video_mode .mtmdsclock );
2963+ seq_puts (s , "Color Format: " );
2964+ if (hdmi_bus_fmt_is_rgb (hdmi -> hdmi_data .enc_out_bus_format ))
2965+ seq_puts (s , "RGB" );
2966+ else if (hdmi_bus_fmt_is_yuv444 (hdmi -> hdmi_data .enc_out_bus_format ))
2967+ seq_puts (s , "YUV444" );
2968+ else if (hdmi_bus_fmt_is_yuv422 (hdmi -> hdmi_data .enc_out_bus_format ))
2969+ seq_puts (s , "YUV422" );
2970+ else if (hdmi_bus_fmt_is_yuv420 (hdmi -> hdmi_data .enc_out_bus_format ))
2971+ seq_puts (s , "YUV420" );
2972+ else
2973+ seq_puts (s , "UNKNOWN" );
2974+ val = hdmi_bus_fmt_color_depth (hdmi -> hdmi_data .enc_out_bus_format );
2975+ seq_printf (s , "\t\tColor Depth: %d bit\n" , val );
2976+ seq_puts (s , "Colorimetry: " );
2977+ switch (hdmi -> hdmi_data .enc_out_encoding ) {
2978+ case V4L2_YCBCR_ENC_601 :
2979+ seq_puts (s , "ITU.BT601" );
2980+ break ;
2981+ case V4L2_YCBCR_ENC_709 :
2982+ seq_puts (s , "ITU.BT709" );
2983+ break ;
2984+ case V4L2_YCBCR_ENC_BT2020 :
2985+ seq_puts (s , "ITU.BT2020" );
2986+ break ;
2987+ default : /* Carries no data */
2988+ seq_puts (s , "ITU.BT601" );
2989+ break ;
2990+ }
2991+
2992+ seq_puts (s , "\t\tEOTF: " );
2993+
2994+ if (hdmi -> version < 0x211a ) {
2995+ seq_puts (s , "Unsupported\n" );
2996+ return 0 ;
2997+ }
2998+
2999+ val = hdmi_readb (hdmi , HDMI_FC_PACKET_TX_EN );
3000+ if (!(val & HDMI_FC_PACKET_DRM_TX_EN_MASK )) {
3001+ seq_puts (s , "Off\n" );
3002+ return 0 ;
3003+ }
3004+
3005+ switch (hdmi_readb (hdmi , HDMI_FC_DRM_PB0 )) {
3006+ case TRADITIONAL_GAMMA_SDR :
3007+ seq_puts (s , "SDR" );
3008+ break ;
3009+ case TRADITIONAL_GAMMA_HDR :
3010+ seq_puts (s , "HDR" );
3011+ break ;
3012+ case SMPTE_ST2084 :
3013+ seq_puts (s , "ST2084" );
3014+ break ;
3015+ case HLG :
3016+ seq_puts (s , "HLG" );
3017+ break ;
3018+ default :
3019+ seq_puts (s , "Not Defined\n" );
3020+ return 0 ;
3021+ }
3022+
3023+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB3 ) << 8 ;
3024+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB2 );
3025+ seq_printf (s , "\nx0: %d" , val );
3026+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB5 ) << 8 ;
3027+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB4 );
3028+ seq_printf (s , "\t\t\t\ty0: %d\n" , val );
3029+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB7 ) << 8 ;
3030+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB6 );
3031+ seq_printf (s , "x1: %d" , val );
3032+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB9 ) << 8 ;
3033+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB8 );
3034+ seq_printf (s , "\t\t\t\ty1: %d\n" , val );
3035+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB11 ) << 8 ;
3036+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB10 );
3037+ seq_printf (s , "x2: %d" , val );
3038+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB13 ) << 8 ;
3039+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB12 );
3040+ seq_printf (s , "\t\t\t\ty2: %d\n" , val );
3041+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB15 ) << 8 ;
3042+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB14 );
3043+ seq_printf (s , "white x: %d" , val );
3044+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB17 ) << 8 ;
3045+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB16 );
3046+ seq_printf (s , "\t\t\twhite y: %d\n" , val );
3047+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB19 ) << 8 ;
3048+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB18 );
3049+ seq_printf (s , "max lum: %d" , val );
3050+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB21 ) << 8 ;
3051+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB20 );
3052+ seq_printf (s , "\t\t\tmin lum: %d\n" , val );
3053+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB23 ) << 8 ;
3054+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB22 );
3055+ seq_printf (s , "max cll: %d" , val );
3056+ val = hdmi_readb (hdmi , HDMI_FC_DRM_PB25 ) << 8 ;
3057+ val |= hdmi_readb (hdmi , HDMI_FC_DRM_PB24 );
3058+ seq_printf (s , "\t\t\tmax fall: %d\n" , val );
3059+ return 0 ;
3060+ }
3061+
3062+ static int dw_hdmi_status_open (struct inode * inode , struct file * file )
3063+ {
3064+ return single_open (file , dw_hdmi_status_show , inode -> i_private );
3065+ }
3066+
3067+ static const struct file_operations dw_hdmi_status_fops = {
3068+ .owner = THIS_MODULE ,
3069+ .open = dw_hdmi_status_open ,
3070+ .read = seq_read ,
3071+ .llseek = seq_lseek ,
3072+ .release = single_release ,
3073+ };
3074+
29453075#include <linux/fs.h>
29463076#include <linux/debugfs.h>
29473077#include <linux/seq_file.h>
@@ -3090,6 +3220,10 @@ static void dw_hdmi_register_debugfs(struct device *dev, struct dw_hdmi *hdmi)
30903220 dev_err (dev , "failed to create debugfs dir!\n" );
30913221 return ;
30923222 }
3223+
3224+ debugfs_create_file ("status" , 0400 , hdmi -> debugfs_dir ,
3225+ hdmi , & dw_hdmi_status_fops );
3226+
30933227 debugfs_create_file ("ctrl" , 0400 , hdmi -> debugfs_dir ,
30943228 hdmi , & dw_hdmi_ctrl_fops );
30953229
0 commit comments