Skip to content

Commit b240a5a

Browse files
author
Zheng Yang
committed
drm: bridge: dw-hdmi: add hdmi status debugfs node
Introduce status node in debugfs to show HDMI output status, such as phy status, color and eotf. Here is a sample log: PHY enabled Mode: HDMI Pixel Clk: 594000000Hz TMDS Clk: 594000000Hz Color Format: YUV422 Color Depth: 10 bit Colorimetry: ITU.BT2020 EOTF: ST2084 x0: 0 y0: 0 x1: 0 y1: 0 x2: 0 y2: 0 white x: 0 white y: 0 max lum: 0 min lum: 0 max cll: 0 max fall: 0 Change-Id: I5d458b633dd3bd9aab67cc91f1695621937e58f5 Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
1 parent 647d1b5 commit b240a5a

1 file changed

Lines changed: 134 additions & 0 deletions

File tree

drivers/gpu/drm/bridge/dw-hdmi.c

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)