[Freedreno] [RFC PATCH v2 1/5] drm/msm/dp: fix panel bridge attachment
Abhinav Kumar
quic_abhinavk at quicinc.com
Thu Feb 24 18:25:55 UTC 2022
On 2/18/2022 6:26 PM, Dmitry Baryshkov wrote:
> On 19/02/2022 02:56, Stephen Boyd wrote:
>> Quoting Dmitry Baryshkov (2022-02-11 14:40:02)
>>> In commit 8a3b4c17f863 ("drm/msm/dp: employ bridge mechanism for display
>>> enable and disable") the DP driver received a drm_bridge instance, which
>>> is always attached to the encoder as a root bridge. However it conflicts
>>> with the panel_bridge support for eDP panels. The panel bridge attaches
>>> to the encoder before the "dp" bridge has a chace to do so. Change
>>
>> s/chace/chance/
>>
>>> panel_bridge attachment to come after dp_bridge attachment.
>>
>> s/panel_bridge/panel bridge/ possibly? And maybe clarify that dp_bridge
>> is the "DP driver's drm_bridge instance created in
>> msm_dp_bridge_init()"?
>>
>> My understanding is that we want to pass the bridge created in
>> msm_dp_bridge_init() as the 'previous' bridge so that it attaches the
>> panel bridge to the output of the DP bridge that's attached to the
>> encoder.
>
> Thanks! I'll update the commit log when pushing the patches.
Please correct if i am missing something here.
You are right that the eDP panel's panel bridge attaches to the encoder
in dp_drm_connector_init() which happens before msm_dp_bridge_init() and
hence it will attach directly to the encoder.
But we are talking about different encoders here. DP's dp_display has a
different encoder compared to the EDP's dp_display.
So DP's bridge will still be attached to its encoder's root.
So what are we achieving with this change?
>
>>
>>>
>>> Fixes: 8a3b4c17f863 ("drm/msm/dp: employ bridge mechanism for display
>>> enable and disable")
>>> Cc: Kuogee Hsieh <quic_khsieh at quicinc.com>
>>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
>>> ---
>>
>> Reviewed-by: Stephen Boyd <swboyd at chromium.org>
>>
>>> drivers/gpu/drm/msm/dp/dp_drm.c | 21 +++++++++++----------
>>> 1 file changed, 11 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c
>>> b/drivers/gpu/drm/msm/dp/dp_drm.c
>>> index d4d360d19eba..26ef41a4c1b6 100644
>>> --- a/drivers/gpu/drm/msm/dp/dp_drm.c
>>> +++ b/drivers/gpu/drm/msm/dp/dp_drm.c
>>> @@ -169,16 +169,6 @@ struct drm_connector
>>> *dp_drm_connector_init(struct msm_dp *dp_display)
>>>
>>> drm_connector_attach_encoder(connector, dp_display->encoder);
>>>
>>> - if (dp_display->panel_bridge) {
>>> - ret = drm_bridge_attach(dp_display->encoder,
>>> - dp_display->panel_bridge, NULL,
>>> - DRM_BRIDGE_ATTACH_NO_CONNECTOR);
>>> - if (ret < 0) {
>>> - DRM_ERROR("failed to attach panel bridge:
>>> %d\n", ret);
>>> - return ERR_PTR(ret);
>>> - }
>>> - }
>>> -
>>> return connector;
>>> }
>>>
>>> @@ -246,5 +236,16 @@ struct drm_bridge *msm_dp_bridge_init(struct
>>> msm_dp *dp_display, struct drm_devi
>>> return ERR_PTR(rc);
>>> }
>>>
>>> + if (dp_display->panel_bridge) {
>>> + rc = drm_bridge_attach(dp_display->encoder,
>>> + dp_display->panel_bridge,
>>> bridge,
>>> + DRM_BRIDGE_ATTACH_NO_CONNECTOR);
>>> + if (rc < 0) {
>>> + DRM_ERROR("failed to attach panel bridge:
>>> %d\n", rc);
>>> + drm_bridge_remove(bridge);
>>> + return ERR_PTR(rc);
>>> + }
>>> + }
>>> +
>>> return bridge;
>>
>> Not a problem with this patch, but what is this pointer used for? I see
>> it's assigned to priv->bridges and num_bridges is incremented but nobody
>> seems to look at that.
>
>
> That's on my todo list. to remove connectors array and to destroy
> created bridges during drm device destruction.
>
More information about the Freedreno
mailing list