aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_debugfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 2dc05c30b800..d90a70744d93 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1937,6 +1937,9 @@ static int i915_sink_crc(struct seq_file *m, void *data)
1937 if (connector->base.dpms != DRM_MODE_DPMS_ON) 1937 if (connector->base.dpms != DRM_MODE_DPMS_ON)
1938 continue; 1938 continue;
1939 1939
1940 if (!connector->base.encoder)
1941 continue;
1942
1940 encoder = to_intel_encoder(connector->base.encoder); 1943 encoder = to_intel_encoder(connector->base.encoder);
1941 if (encoder->type != INTEL_OUTPUT_EDP) 1944 if (encoder->type != INTEL_OUTPUT_EDP)
1942 continue; 1945 continue;
@@ -2074,6 +2077,164 @@ static int i915_power_domain_info(struct seq_file *m, void *unused)
2074 return 0; 2077 return 0;
2075} 2078}
2076 2079
2080static void intel_seq_print_mode(struct seq_file *m, int tabs,
2081 struct drm_display_mode *mode)
2082{
2083 int i;
2084
2085 for (i = 0; i < tabs; i++)
2086 seq_putc(m, '\t');
2087
2088 seq_printf(m, "id %d:\"%s\" freq %d clock %d hdisp %d hss %d hse %d htot %d vdisp %d vss %d vse %d vtot %d type 0x%x flags 0x%x\n",
2089 mode->base.id, mode->name,
2090 mode->vrefresh, mode->clock,
2091 mode->hdisplay, mode->hsync_start,
2092 mode->hsync_end, mode->htotal,
2093 mode->vdisplay, mode->vsync_start,
2094 mode->vsync_end, mode->vtotal,
2095 mode->type, mode->flags);
2096}
2097
2098static void intel_encoder_info(struct seq_file *m,
2099 struct intel_crtc *intel_crtc,
2100 struct intel_encoder *intel_encoder)
2101{
2102 struct drm_info_node *node = (struct drm_info_node *) m->private;
2103 struct drm_device *dev = node->minor->dev;
2104 struct drm_crtc *crtc = &intel_crtc->base;
2105 struct intel_connector *intel_connector;
2106 struct drm_encoder *encoder;
2107
2108 encoder = &intel_encoder->base;
2109 seq_printf(m, "\tencoder %d: type: %s, connectors:\n",
2110 encoder->base.id, drm_get_encoder_name(encoder));
2111 for_each_connector_on_encoder(dev, encoder, intel_connector) {
2112 struct drm_connector *connector = &intel_connector->base;
2113 seq_printf(m, "\t\tconnector %d: type: %s, status: %s",
2114 connector->base.id,
2115 drm_get_connector_name(connector),
2116 drm_get_connector_status_name(connector->status));
2117 if (connector->status == connector_status_connected) {
2118 struct drm_display_mode *mode = &crtc->mode;
2119 seq_printf(m, ", mode:\n");
2120 intel_seq_print_mode(m, 2, mode);
2121 } else {
2122 seq_putc(m, '\n');
2123 }
2124 }
2125}
2126
2127static void intel_crtc_info(struct seq_file *m, struct intel_crtc *intel_crtc)
2128{
2129 struct drm_info_node *node = (struct drm_info_node *) m->private;
2130 struct drm_device *dev = node->minor->dev;
2131 struct drm_crtc *crtc = &intel_crtc->base;
2132 struct intel_encoder *intel_encoder;
2133
2134 seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
2135 crtc->fb->base.id, crtc->x, crtc->y,
2136 crtc->fb->width, crtc->fb->height);
2137 for_each_encoder_on_crtc(dev, crtc, intel_encoder)
2138 intel_encoder_info(m, intel_crtc, intel_encoder);
2139}
2140
2141static void intel_panel_info(struct seq_file *m, struct intel_panel *panel)
2142{
2143 struct drm_display_mode *mode = panel->fixed_mode;
2144
2145 seq_printf(m, "\tfixed mode:\n");
2146 intel_seq_print_mode(m, 2, mode);
2147}
2148
2149static void intel_dp_info(struct seq_file *m,
2150 struct intel_connector *intel_connector)
2151{
2152 struct intel_encoder *intel_encoder = intel_connector->encoder;
2153 struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
2154
2155 seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]);
2156 seq_printf(m, "\taudio support: %s\n", intel_dp->has_audio ? "yes" :
2157 "no");
2158 if (intel_encoder->type == INTEL_OUTPUT_EDP)
2159 intel_panel_info(m, &intel_connector->panel);
2160}
2161
2162static void intel_hdmi_info(struct seq_file *m,
2163 struct intel_connector *intel_connector)
2164{
2165 struct intel_encoder *intel_encoder = intel_connector->encoder;
2166 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&intel_encoder->base);
2167
2168 seq_printf(m, "\taudio support: %s\n", intel_hdmi->has_audio ? "yes" :
2169 "no");
2170}
2171
2172static void intel_lvds_info(struct seq_file *m,
2173 struct intel_connector *intel_connector)
2174{
2175 intel_panel_info(m, &intel_connector->panel);
2176}
2177
2178static void intel_connector_info(struct seq_file *m,
2179 struct drm_connector *connector)
2180{
2181 struct intel_connector *intel_connector = to_intel_connector(connector);
2182 struct intel_encoder *intel_encoder = intel_connector->encoder;
2183
2184 seq_printf(m, "connector %d: type %s, status: %s\n",
2185 connector->base.id, drm_get_connector_name(connector),
2186 drm_get_connector_status_name(connector->status));
2187 if (connector->status == connector_status_connected) {
2188 seq_printf(m, "\tname: %s\n", connector->display_info.name);
2189 seq_printf(m, "\tphysical dimensions: %dx%dmm\n",
2190 connector->display_info.width_mm,
2191 connector->display_info.height_mm);
2192 seq_printf(m, "\tsubpixel order: %s\n",
2193 drm_get_subpixel_order_name(connector->display_info.subpixel_order));
2194 seq_printf(m, "\tCEA rev: %d\n",
2195 connector->display_info.cea_rev);
2196 }
2197 if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
2198 intel_encoder->type == INTEL_OUTPUT_EDP)
2199 intel_dp_info(m, intel_connector);
2200 else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
2201 intel_hdmi_info(m, intel_connector);
2202 else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
2203 intel_lvds_info(m, intel_connector);
2204
2205}
2206
2207static int i915_display_info(struct seq_file *m, void *unused)
2208{
2209 struct drm_info_node *node = (struct drm_info_node *) m->private;
2210 struct drm_device *dev = node->minor->dev;
2211 struct drm_crtc *crtc;
2212 struct drm_connector *connector;
2213
2214 drm_modeset_lock_all(dev);
2215 seq_printf(m, "CRTC info\n");
2216 seq_printf(m, "---------\n");
2217 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2218 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2219
2220 seq_printf(m, "CRTC %d: pipe: %c, active: %s\n",
2221 crtc->base.id, pipe_name(intel_crtc->pipe),
2222 intel_crtc->active ? "yes" : "no");
2223 if (intel_crtc->active)
2224 intel_crtc_info(m, intel_crtc);
2225 }
2226
2227 seq_printf(m, "\n");
2228 seq_printf(m, "Connector info\n");
2229 seq_printf(m, "--------------\n");
2230 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2231 intel_connector_info(m, connector);
2232 }
2233 drm_modeset_unlock_all(dev);
2234
2235 return 0;
2236}
2237
2077struct pipe_crc_info { 2238struct pipe_crc_info {
2078 const char *name; 2239 const char *name;
2079 struct drm_device *dev; 2240 struct drm_device *dev;
@@ -3519,6 +3680,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
3519 {"i915_energy_uJ", i915_energy_uJ, 0}, 3680 {"i915_energy_uJ", i915_energy_uJ, 0},
3520 {"i915_pc8_status", i915_pc8_status, 0}, 3681 {"i915_pc8_status", i915_pc8_status, 0},
3521 {"i915_power_domain_info", i915_power_domain_info, 0}, 3682 {"i915_power_domain_info", i915_power_domain_info, 0},
3683 {"i915_display_info", i915_display_info, 0},
3522}; 3684};
3523#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list) 3685#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
3524 3686