Skip to content

Commit 5e602f5

Browse files
Kuogee Hsiehlumag
Kuogee Hsieh
authored andcommitted
drm/msm/dp: populate connector of struct dp_panel
DP CTS test case 4.2.2.6 has valid edid with bad checksum on purpose and expect DP source return correct checksum. During drm edid read, correct edid checksum is calculated and stored at connector::real_edid_checksum. The problem is struct dp_panel::connector never be assigned, instead the connector is stored in struct msm_dp::connector. When we run compliance testing test case 4.2.2.6 dp_panel_handle_sink_request() won't have a valid edid set in struct dp_panel::edid so we'll try to use the connectors real_edid_checksum and hit a NULL pointer dereference error because the connector pointer is never assigned. Changes in V2: -- populate panel connector at msm_dp_modeset_init() instead of at dp_panel_read_sink_caps() Changes in V3: -- remove unhelpful kernel crash trace commit text -- remove renaming dp_display parameter to dp Changes in V4: -- add more details to commit text Changes in v10: -- group into one series Changes in v11: -- drop drm/msm/dp: dp_link_parse_sink_count() return immediately if aux read Fixes: 7948fe1 ("drm/msm/dp: return correct edid checksum after corrupted edid checksum read") Signee-off-by: Kuogee Hsieh <[email protected]> Reviewed-by: Bjorn Andersson <[email protected]> Reviewed-by: Stephen Boyd <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 989ebe7 commit 5e602f5

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

drivers/gpu/drm/msm/dp/dp_display.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,7 @@ int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
14821482
struct drm_encoder *encoder)
14831483
{
14841484
struct msm_drm_private *priv;
1485+
struct dp_display_private *dp_priv;
14851486
int ret;
14861487

14871488
if (WARN_ON(!encoder) || WARN_ON(!dp_display) || WARN_ON(!dev))
@@ -1490,6 +1491,8 @@ int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
14901491
priv = dev->dev_private;
14911492
dp_display->drm_dev = dev;
14921493

1494+
dp_priv = container_of(dp_display, struct dp_display_private, dp_display);
1495+
14931496
ret = dp_display_request_irq(dp_display);
14941497
if (ret) {
14951498
DRM_ERROR("request_irq failed, ret=%d\n", ret);
@@ -1507,6 +1510,8 @@ int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
15071510
return ret;
15081511
}
15091512

1513+
dp_priv->panel->connector = dp_display->connector;
1514+
15101515
priv->connectors[priv->num_connectors++] = dp_display->connector;
15111516

15121517
dp_display->bridge = msm_dp_bridge_init(dp_display, dev, encoder);

0 commit comments

Comments
 (0)