Add some additional information (input vs. output port, sink associated
with VC, peer device type, max number of VCs supported) and ensure that
any embedded '\0' characters in a branch device's devid string are not
written to debugfs.

cc: dri-devel at lists.freedesktop.org
Signed-off-by: Jim Bride <jim.bride at linux.intel.com>
---
 drivers/gpu/drm/drm_dp_mst_topology.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index 27fbd79..1afa36d 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -2729,7 +2729,7 @@ static void drm_dp_mst_dump_mstb(struct seq_file *m,

        seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports);
        list_for_each_entry(port, &mstb->ports, next) {
-               seq_printf(m, "%sport: %d: ddps: %d ldps: %d, sdp: %d/%d, %p, 
conn: %p\n", prefix, port->port_num, port->ddps, port->ldps, 
port->num_sdp_streams, port->num_sdp_stream_sinks, port, port->connector);
+               seq_printf(m, "%sport: %d: input: %d: pdt: %d, ddps: %d ldps: 
%d, sdp: %d/%d, %p, conn: %p\n", prefix, port->port_num, port->input, 
port->pdt, port->ddps, port->ldps, port->num_sdp_streams, 
port->num_sdp_stream_sinks, port, port->connector);
                if (port->mstb)
                        drm_dp_mst_dump_mstb(m, port->mstb);
        }
@@ -2750,6 +2750,17 @@ static bool dump_dp_payload_table(struct 
drm_dp_mst_topology_mgr *mgr,
        return false;
 }

+static bool fetch_monitor_name(struct drm_dp_mst_topology_mgr *mgr,
+                              struct drm_dp_mst_port *port, char *name)
+{
+       struct edid *mst_edid = NULL;
+
+       mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port);
+       if (mst_edid == NULL)
+               return false;
+       return drm_edid_get_monitor_name(mst_edid, name);
+}
+
 /**
  * drm_dp_mst_dump_topology(): dump topology to seq file.
  * @m: seq_file to dump output to
@@ -2762,6 +2773,8 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
 {
        int i;
        struct drm_dp_mst_port *port;
+       bool mname_valid = false;
+
        mutex_lock(&mgr->lock);
        if (mgr->mst_primary)
                drm_dp_mst_dump_mstb(m, mgr->mst_primary);
@@ -2770,14 +2783,22 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
        mutex_unlock(&mgr->lock);

        mutex_lock(&mgr->payload_lock);
-       seq_printf(m, "vcpi: %lx %lx\n", mgr->payload_mask, mgr->vcpi_mask);
+       seq_printf(m, "vcpi: %lx %lx %d\n", mgr->payload_mask, mgr->vcpi_mask,
+               mgr->max_payloads);

        for (i = 0; i < mgr->max_payloads; i++) {
                if (mgr->proposed_vcpis[i]) {
+                       char name[13];
+
+                       memset(name, 0, 13 * sizeof(char));
                        port = container_of(mgr->proposed_vcpis[i], struct 
drm_dp_mst_port, vcpi);
-                       seq_printf(m, "vcpi %d: %d %d %d\n", i, port->port_num, 
port->vcpi.vcpi, port->vcpi.num_slots);
+                       mname_valid = fetch_monitor_name(mgr, port, name);
+                       seq_printf(m, "vcpi %d: %d %d %d sink name: %s\n", i,
+                                  port->port_num, port->vcpi.vcpi,
+                                  port->vcpi.num_slots, mname_valid ? name :
+                                  "Unknown");
                } else
-                       seq_printf(m, "vcpi %d:unsed\n", i);
+                       seq_printf(m, "vcpi %d:unused\n", i);
        }
        for (i = 0; i < mgr->max_payloads; i++) {
                seq_printf(m, "payload %d: %d, %d, %d\n",
@@ -2818,7 +2839,11 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
                        seq_printf(m, "%02x", buf[i]);
                seq_printf(m, " devid: ");
                for (i = 0x3; i < 0x8; i++)
-                       seq_printf(m, "%c", buf[i]);
+                       if (buf[i] != '\0')
+                               seq_printf(m, "%c", buf[i]);
+                       else
+                               break;
+
                seq_printf(m, " revision: hw: %x.%x sw: %x.%x", buf[0x9] >> 4, 
buf[0x9] & 0xf, buf[0xa], buf[0xb]);
                seq_printf(m, "\n");
                bret = dump_dp_payload_table(mgr, buf);
-- 
2.5.0

Reply via email to