@@ -7242,8 +7242,7 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector)
edid = drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw()
aconnector->dc_em_sink = dc_link_add_remote_sink(
aconnector->dc_link,
- (uint8_t *)edid,
- (edid->extensions + 1) * EDID_LENGTH,
+ edid,
&init_params);
if (aconnector->base.force == DRM_FORCE_ON) {
@@ -327,7 +327,6 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
dc_sink = dc_link_add_remote_sink(
aconnector->dc_link,
NULL,
- 0,
&init_params);
if (!dc_sink) {
@@ -367,8 +366,7 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
edid = drm_edid_raw(aconnector->drm_edid); // FIXME: Get rid of drm_edid_raw()
dc_sink = dc_link_add_remote_sink(
aconnector->dc_link,
- (uint8_t *)edid,
- (edid->extensions + 1) * EDID_LENGTH,
+ edid,
&init_params);
if (!dc_sink) {
@@ -266,11 +266,10 @@ unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link)
struct dc_sink *dc_link_add_remote_sink(
struct dc_link *link,
- const uint8_t *edid,
- int len,
+ const struct edid *edid,
struct dc_sink_init_data *init_data)
{
- return link->dc->link_srv->add_remote_sink(link, edid, len, init_data);
+ return link->dc->link_srv->add_remote_sink(link, edid, init_data);
}
void dc_link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink)
@@ -1846,14 +1846,12 @@ struct dc_sink_init_data;
* called.
*
* @dc_link - link the remote sink will be added to.
- * @edid - byte array of EDID raw data.
- * @len - size of the edid in byte
+ * @edid - EDID data.
* @init_data -
*/
struct dc_sink *dc_link_add_remote_sink(
struct dc_link *dc_link,
- const uint8_t *edid,
- int len,
+ const struct edid *edid,
struct dc_sink_init_data *init_data);
/* Remove remote sink from a link with dc_connection_mst_branch connection type.
@@ -109,8 +109,7 @@ struct link_service {
enum dc_connection_type *type);
struct dc_sink *(*add_remote_sink)(
struct dc_link *link,
- const uint8_t *edid,
- int len,
+ const struct edid *edid,
struct dc_sink_init_data *init_data);
void (*remove_remote_sink)(struct dc_link *link, struct dc_sink *sink);
bool (*get_hpd_state)(struct dc_link *link);
@@ -48,6 +48,8 @@
#include "dm_helpers.h"
#include "clk_mgr.h"
+#include <drm/drm_edid.h>
+
// Offset DPCD 050Eh == 0x5A
#define MST_HUB_ID_0x5A 0x5A
@@ -1390,10 +1392,10 @@ static bool link_add_remote_sink_helper(struct dc_link *dc_link, struct dc_sink
struct dc_sink *link_add_remote_sink(
struct dc_link *link,
- const uint8_t *edid,
- int len,
+ const struct edid *edid,
struct dc_sink_init_data *init_data)
{
+ int len = edid ? (edid->extensions + 1) * EDID_LENGTH : 0;
struct dc_sink *dc_sink;
enum dc_edid_status edid_status;
@@ -31,8 +31,7 @@ bool link_detect_connection_type(struct dc_link *link,
enum dc_connection_type *type);
struct dc_sink *link_add_remote_sink(
struct dc_link *link,
- const uint8_t *edid,
- int len,
+ const struct edid *edid,
struct dc_sink_init_data *init_data);
void link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink);
bool link_reset_cur_dp_mst_topology(struct dc_link *link);
The callers of dc_link_add_remote_sink() are using 'struct edid' which they all need to cast to uint8_t *. Allow the direct passing of 'struct edid' to avoid these cast and also move the length calculation so it does not need to be duplicated everywhere. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +-- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 4 +--- drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c | 5 ++--- drivers/gpu/drm/amd/display/dc/dc.h | 6 ++---- drivers/gpu/drm/amd/display/dc/inc/link.h | 3 +-- drivers/gpu/drm/amd/display/dc/link/link_detection.c | 6 ++++-- drivers/gpu/drm/amd/display/dc/link/link_detection.h | 3 +-- 7 files changed, 12 insertions(+), 18 deletions(-)