Skip to content

Commit c1c9042

Browse files
committed
drm/display/dp_mst: convert to struct drm_edid
Convert the topology manager to use struct drm_edid, add drm_dp_mst_edid_read() that returns drm_edid, and rewrite the old drm_dp_mst_get_edid() to use it. Note that the old drm_get_edid() ended up calling drm_connector_update_edid_property(). This responsibility is now deferred to drivers, which all do it anyway after calling drm_dp_mst_edid_read() or drm_dp_mst_get_edid(). Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/9c32e5c241934093fc4144eed4c01155e1f03af1.1685437501.git.jani.nikula@intel.com
1 parent d60d2bc commit c1c9042

2 files changed

Lines changed: 49 additions & 13 deletions

File tree

drivers/gpu/drm/display/drm_dp_mst_topology.c

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,7 +1823,7 @@ static void drm_dp_destroy_port(struct kref *kref)
18231823
return;
18241824
}
18251825

1826-
kfree(port->cached_edid);
1826+
drm_edid_free(port->cached_edid);
18271827

18281828
/*
18291829
* we can't destroy the connector here, as we might be holding the
@@ -2272,8 +2272,8 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
22722272
if (port->pdt != DP_PEER_DEVICE_NONE &&
22732273
drm_dp_mst_is_end_device(port->pdt, port->mcs) &&
22742274
port->port_num >= DP_MST_LOGICAL_PORT_0)
2275-
port->cached_edid = drm_get_edid(port->connector,
2276-
&port->aux.ddc);
2275+
port->cached_edid = drm_edid_read_ddc(port->connector,
2276+
&port->aux.ddc);
22772277

22782278
drm_connector_register(port->connector);
22792279
return;
@@ -4133,7 +4133,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
41334133
ret = connector_status_connected;
41344134
/* for logical ports - cache the EDID */
41354135
if (port->port_num >= DP_MST_LOGICAL_PORT_0 && !port->cached_edid)
4136-
port->cached_edid = drm_get_edid(connector, &port->aux.ddc);
4136+
port->cached_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
41374137
break;
41384138
case DP_PEER_DEVICE_DP_LEGACY_CONV:
41394139
if (port->ldps)
@@ -4147,7 +4147,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
41474147
EXPORT_SYMBOL(drm_dp_mst_detect_port);
41484148

41494149
/**
4150-
* drm_dp_mst_get_edid() - get EDID for an MST port
4150+
* drm_dp_mst_edid_read() - get EDID for an MST port
41514151
* @connector: toplevel connector to get EDID for
41524152
* @mgr: manager for this port
41534153
* @port: unverified pointer to a port.
@@ -4156,22 +4156,53 @@ EXPORT_SYMBOL(drm_dp_mst_detect_port);
41564156
* It validates the pointer still exists so the caller doesn't require a
41574157
* reference.
41584158
*/
4159-
struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
4159+
const struct drm_edid *drm_dp_mst_edid_read(struct drm_connector *connector,
4160+
struct drm_dp_mst_topology_mgr *mgr,
4161+
struct drm_dp_mst_port *port)
41604162
{
4161-
struct edid *edid = NULL;
4163+
const struct drm_edid *drm_edid;
41624164

41634165
/* we need to search for the port in the mgr in case it's gone */
41644166
port = drm_dp_mst_topology_get_port_validated(mgr, port);
41654167
if (!port)
41664168
return NULL;
41674169

41684170
if (port->cached_edid)
4169-
edid = drm_edid_duplicate(port->cached_edid);
4170-
else {
4171-
edid = drm_get_edid(connector, &port->aux.ddc);
4172-
}
4171+
drm_edid = drm_edid_dup(port->cached_edid);
4172+
else
4173+
drm_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
41734174

41744175
drm_dp_mst_topology_put_port(port);
4176+
4177+
return drm_edid;
4178+
}
4179+
EXPORT_SYMBOL(drm_dp_mst_edid_read);
4180+
4181+
/**
4182+
* drm_dp_mst_get_edid() - get EDID for an MST port
4183+
* @connector: toplevel connector to get EDID for
4184+
* @mgr: manager for this port
4185+
* @port: unverified pointer to a port.
4186+
*
4187+
* This function is deprecated; please use drm_dp_mst_edid_read() instead.
4188+
*
4189+
* This returns an EDID for the port connected to a connector,
4190+
* It validates the pointer still exists so the caller doesn't require a
4191+
* reference.
4192+
*/
4193+
struct edid *drm_dp_mst_get_edid(struct drm_connector *connector,
4194+
struct drm_dp_mst_topology_mgr *mgr,
4195+
struct drm_dp_mst_port *port)
4196+
{
4197+
const struct drm_edid *drm_edid;
4198+
struct edid *edid;
4199+
4200+
drm_edid = drm_dp_mst_edid_read(connector, mgr, port);
4201+
4202+
edid = drm_edid_duplicate(drm_edid_raw(drm_edid));
4203+
4204+
drm_edid_free(drm_edid);
4205+
41754206
return edid;
41764207
}
41774208
EXPORT_SYMBOL(drm_dp_mst_get_edid);

include/drm/display/drm_dp_mst_helper.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ struct drm_dp_mst_port {
138138
* @cached_edid: for DP logical ports - make tiling work by ensuring
139139
* that the EDID for all connectors is read immediately.
140140
*/
141-
struct edid *cached_edid;
141+
const struct drm_edid *cached_edid;
142142

143143
/**
144144
* @fec_capable: bool indicating if FEC can be supported up to that
@@ -819,7 +819,12 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
819819
struct drm_dp_mst_topology_mgr *mgr,
820820
struct drm_dp_mst_port *port);
821821

822-
struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
822+
const struct drm_edid *drm_dp_mst_edid_read(struct drm_connector *connector,
823+
struct drm_dp_mst_topology_mgr *mgr,
824+
struct drm_dp_mst_port *port);
825+
struct edid *drm_dp_mst_get_edid(struct drm_connector *connector,
826+
struct drm_dp_mst_topology_mgr *mgr,
827+
struct drm_dp_mst_port *port);
823828

824829
int drm_dp_get_vc_payload_bw(const struct drm_dp_mst_topology_mgr *mgr,
825830
int link_rate, int link_lane_count);

0 commit comments

Comments
 (0)