mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 06:25:52 +02:00
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>
This commit is contained in:
parent
647d1b5702
commit
b240a5aae0
|
|
@ -2942,6 +2942,136 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dw_hdmi_status_show(struct seq_file *s, void *v)
|
||||
{
|
||||
struct dw_hdmi *hdmi = s->private;
|
||||
u32 val;
|
||||
|
||||
seq_puts(s, "PHY ");
|
||||
if (!hdmi->phy.enabled) {
|
||||
seq_puts(s, "disabled\n");
|
||||
return 0;
|
||||
}
|
||||
seq_puts(s, "enabled\t\t\tMode: ");
|
||||
if (hdmi->sink_is_hdmi)
|
||||
seq_puts(s, "HDMI\n");
|
||||
else
|
||||
seq_puts(s, "DVI\n");
|
||||
seq_printf(s, "Pixel Clk: %uHz\t\tTMDS Clk: %uHz\n",
|
||||
hdmi->hdmi_data.video_mode.mpixelclock,
|
||||
hdmi->hdmi_data.video_mode.mtmdsclock);
|
||||
seq_puts(s, "Color Format: ");
|
||||
if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format))
|
||||
seq_puts(s, "RGB");
|
||||
else if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format))
|
||||
seq_puts(s, "YUV444");
|
||||
else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format))
|
||||
seq_puts(s, "YUV422");
|
||||
else if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format))
|
||||
seq_puts(s, "YUV420");
|
||||
else
|
||||
seq_puts(s, "UNKNOWN");
|
||||
val = hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format);
|
||||
seq_printf(s, "\t\tColor Depth: %d bit\n", val);
|
||||
seq_puts(s, "Colorimetry: ");
|
||||
switch (hdmi->hdmi_data.enc_out_encoding) {
|
||||
case V4L2_YCBCR_ENC_601:
|
||||
seq_puts(s, "ITU.BT601");
|
||||
break;
|
||||
case V4L2_YCBCR_ENC_709:
|
||||
seq_puts(s, "ITU.BT709");
|
||||
break;
|
||||
case V4L2_YCBCR_ENC_BT2020:
|
||||
seq_puts(s, "ITU.BT2020");
|
||||
break;
|
||||
default: /* Carries no data */
|
||||
seq_puts(s, "ITU.BT601");
|
||||
break;
|
||||
}
|
||||
|
||||
seq_puts(s, "\t\tEOTF: ");
|
||||
|
||||
if (hdmi->version < 0x211a) {
|
||||
seq_puts(s, "Unsupported\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
val = hdmi_readb(hdmi, HDMI_FC_PACKET_TX_EN);
|
||||
if (!(val & HDMI_FC_PACKET_DRM_TX_EN_MASK)) {
|
||||
seq_puts(s, "Off\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (hdmi_readb(hdmi, HDMI_FC_DRM_PB0)) {
|
||||
case TRADITIONAL_GAMMA_SDR:
|
||||
seq_puts(s, "SDR");
|
||||
break;
|
||||
case TRADITIONAL_GAMMA_HDR:
|
||||
seq_puts(s, "HDR");
|
||||
break;
|
||||
case SMPTE_ST2084:
|
||||
seq_puts(s, "ST2084");
|
||||
break;
|
||||
case HLG:
|
||||
seq_puts(s, "HLG");
|
||||
break;
|
||||
default:
|
||||
seq_puts(s, "Not Defined\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB3) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB2);
|
||||
seq_printf(s, "\nx0: %d", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB5) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB4);
|
||||
seq_printf(s, "\t\t\t\ty0: %d\n", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB7) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB6);
|
||||
seq_printf(s, "x1: %d", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB9) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB8);
|
||||
seq_printf(s, "\t\t\t\ty1: %d\n", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB11) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB10);
|
||||
seq_printf(s, "x2: %d", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB13) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB12);
|
||||
seq_printf(s, "\t\t\t\ty2: %d\n", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB15) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB14);
|
||||
seq_printf(s, "white x: %d", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB17) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB16);
|
||||
seq_printf(s, "\t\t\twhite y: %d\n", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB19) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB18);
|
||||
seq_printf(s, "max lum: %d", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB21) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB20);
|
||||
seq_printf(s, "\t\t\tmin lum: %d\n", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB23) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB22);
|
||||
seq_printf(s, "max cll: %d", val);
|
||||
val = hdmi_readb(hdmi, HDMI_FC_DRM_PB25) << 8;
|
||||
val |= hdmi_readb(hdmi, HDMI_FC_DRM_PB24);
|
||||
seq_printf(s, "\t\t\tmax fall: %d\n", val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dw_hdmi_status_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, dw_hdmi_status_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations dw_hdmi_status_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = dw_hdmi_status_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
|
@ -3090,6 +3220,10 @@ static void dw_hdmi_register_debugfs(struct device *dev, struct dw_hdmi *hdmi)
|
|||
dev_err(dev, "failed to create debugfs dir!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debugfs_create_file("status", 0400, hdmi->debugfs_dir,
|
||||
hdmi, &dw_hdmi_status_fops);
|
||||
|
||||
debugfs_create_file("ctrl", 0400, hdmi->debugfs_dir,
|
||||
hdmi, &dw_hdmi_ctrl_fops);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user