Message ID | 20250319032435.1119469-6-shiyongbang@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add HPD, getting EDID, colorbar features in DP function | expand |
On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > From: Baihan Li <libaihan@huawei.com> > > Add registering drm_aux and use it to get connector edid with drm > functions. Add ddc channel in connector initialization to put drm_aux > in drm_connector. > > Signed-off-by: Baihan Li <libaihan@huawei.com> > Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> > Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > --- > ChangeLog: > v6 -> v7: > - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula I don't understand this, and I did not suggest such a thing. BR, Jani. > v5 -> v6: > - move the detect_ctx() to the patch 7/9. > v2 -> v3: > - Capitalized EDID and AUX, suggested by Dmitry Baryshkov. > v1 -> v2: > - deleting type conversion, suggested by Dmitry Baryshkov. > - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. > --- > drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 3 +- > .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 35 ++++++++++++++++--- > .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 +++ > 3 files changed, 37 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c > index ded9e7ce887a..e0bb9b14d9d8 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c > +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c > @@ -161,7 +161,8 @@ void hibmc_dp_aux_init(struct hibmc_dp *dp) > HIBMC_DP_MIN_PULSE_NUM); > > dp->aux.transfer = hibmc_dp_aux_xfer; > - dp->aux.is_remote = 0; > + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); > + dp->aux.drm_dev = dp->drm_dev; > drm_dp_aux_init(&dp->aux); > dp->dp_dev->aux = &dp->aux; > } > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c > index 603d6b198a54..0256724d8b9b 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c > @@ -15,11 +15,20 @@ > > static int hibmc_dp_connector_get_modes(struct drm_connector *connector) > { > + struct hibmc_dp *dp = to_hibmc_dp(connector); > + const struct drm_edid *drm_edid; > int count; > > - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, > - connector->dev->mode_config.max_height); > - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation > + if (!dp->aux.name) > + return 0; > + > + drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); > + > + drm_edid_connector_update(connector, drm_edid); > + > + count = drm_edid_connector_add_modes(connector); > + > + drm_edid_free(drm_edid); > > return count; > } > @@ -28,12 +37,28 @@ static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { > .get_modes = hibmc_dp_connector_get_modes, > }; > > +static int hibmc_dp_late_register(struct drm_connector *connector) > +{ > + struct hibmc_dp *dp = to_hibmc_dp(connector); > + > + return drm_dp_aux_register(&dp->aux); > +} > + > +static void hibmc_dp_early_unregister(struct drm_connector *connector) > +{ > + struct hibmc_dp *dp = to_hibmc_dp(connector); > + > + drm_dp_aux_unregister(&dp->aux); > +} > + > static const struct drm_connector_funcs hibmc_dp_conn_funcs = { > .reset = drm_atomic_helper_connector_reset, > .fill_modes = drm_helper_probe_single_connector_modes, > .destroy = drm_connector_cleanup, > .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > + .late_register = hibmc_dp_late_register, > + .early_unregister = hibmc_dp_early_unregister, > }; > > static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display_mode *mode) > @@ -103,8 +128,8 @@ int hibmc_dp_init(struct hibmc_drm_private *priv) > > drm_encoder_helper_add(encoder, &hibmc_dp_encoder_helper_funcs); > > - ret = drm_connector_init(dev, connector, &hibmc_dp_conn_funcs, > - DRM_MODE_CONNECTOR_DisplayPort); > + ret = drm_connector_init_with_ddc(dev, connector, &hibmc_dp_conn_funcs, > + DRM_MODE_CONNECTOR_DisplayPort, &dp->aux.ddc); > if (ret) { > drm_err(dev, "init dp connector failed: %d\n", ret); > return ret; > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > index d982f1e4b958..3ddd71aada66 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > @@ -47,6 +47,11 @@ static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector) > return container_of(connector, struct hibmc_vdac, connector); > } > > +static inline struct hibmc_dp *to_hibmc_dp(struct drm_connector *connector) > +{ > + return container_of(connector, struct hibmc_dp, connector); > +} > + > static inline struct hibmc_drm_private *to_hibmc_drm_private(struct drm_device *dev) > { > return container_of(dev, struct hibmc_drm_private, dev);
> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >> From: Baihan Li <libaihan@huawei.com> >> >> Add registering drm_aux and use it to get connector edid with drm >> functions. Add ddc channel in connector initialization to put drm_aux >> in drm_connector. >> >> Signed-off-by: Baihan Li <libaihan@huawei.com> >> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >> --- >> ChangeLog: >> v6 -> v7: >> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula > I don't understand this, and I did not suggest such a thing. > > BR, > Jani. > Hi Jani, Is the modification of v8 correct? >> v5 -> v6: >> - move the detect_ctx() to the patch 7/9. >> v2 -> v3: >> - Capitalized EDID and AUX, suggested by Dmitry Baryshkov. >> v1 -> v2: >> - deleting type conversion, suggested by Dmitry Baryshkov. >> - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. >> --- >> drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 3 +- >> .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 35 ++++++++++++++++--- >> .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 +++ >> 3 files changed, 37 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >> index ded9e7ce887a..e0bb9b14d9d8 100644 >> --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >> +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >> @@ -161,7 +161,8 @@ void hibmc_dp_aux_init(struct hibmc_dp *dp) >> HIBMC_DP_MIN_PULSE_NUM); >> >> dp->aux.transfer = hibmc_dp_aux_xfer; >> - dp->aux.is_remote = 0; >> + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); >> + dp->aux.drm_dev = dp->drm_dev; >> drm_dp_aux_init(&dp->aux); >> dp->dp_dev->aux = &dp->aux; >> } >> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >> index 603d6b198a54..0256724d8b9b 100644 >> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >> @@ -15,11 +15,20 @@ >> >> static int hibmc_dp_connector_get_modes(struct drm_connector *connector) >> { >> + struct hibmc_dp *dp = to_hibmc_dp(connector); >> + const struct drm_edid *drm_edid; >> int count; >> >> - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, >> - connector->dev->mode_config.max_height); >> - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation >> + if (!dp->aux.name) >> + return 0; >> + >> + drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); >> + >> + drm_edid_connector_update(connector, drm_edid); >> + >> + count = drm_edid_connector_add_modes(connector); >> + >> + drm_edid_free(drm_edid); >> >> return count; >> } >> @@ -28,12 +37,28 @@ static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { >> .get_modes = hibmc_dp_connector_get_modes, >> }; >> >> +static int hibmc_dp_late_register(struct drm_connector *connector) >> +{ >> + struct hibmc_dp *dp = to_hibmc_dp(connector); >> + >> + return drm_dp_aux_register(&dp->aux); >> +} >> + >> +static void hibmc_dp_early_unregister(struct drm_connector *connector) >> +{ >> + struct hibmc_dp *dp = to_hibmc_dp(connector); >> + >> + drm_dp_aux_unregister(&dp->aux); >> +} >> + >> static const struct drm_connector_funcs hibmc_dp_conn_funcs = { >> .reset = drm_atomic_helper_connector_reset, >> .fill_modes = drm_helper_probe_single_connector_modes, >> .destroy = drm_connector_cleanup, >> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, >> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, >> + .late_register = hibmc_dp_late_register, >> + .early_unregister = hibmc_dp_early_unregister, >> }; >> >> static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display_mode *mode) >> @@ -103,8 +128,8 @@ int hibmc_dp_init(struct hibmc_drm_private *priv) >> >> drm_encoder_helper_add(encoder, &hibmc_dp_encoder_helper_funcs); >> >> - ret = drm_connector_init(dev, connector, &hibmc_dp_conn_funcs, >> - DRM_MODE_CONNECTOR_DisplayPort); >> + ret = drm_connector_init_with_ddc(dev, connector, &hibmc_dp_conn_funcs, >> + DRM_MODE_CONNECTOR_DisplayPort, &dp->aux.ddc); >> if (ret) { >> drm_err(dev, "init dp connector failed: %d\n", ret); >> return ret; >> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >> index d982f1e4b958..3ddd71aada66 100644 >> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >> @@ -47,6 +47,11 @@ static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector) >> return container_of(connector, struct hibmc_vdac, connector); >> } >> >> +static inline struct hibmc_dp *to_hibmc_dp(struct drm_connector *connector) >> +{ >> + return container_of(connector, struct hibmc_dp, connector); >> +} >> + >> static inline struct hibmc_drm_private *to_hibmc_drm_private(struct drm_device *dev) >> { >> return container_of(dev, struct hibmc_drm_private, dev);
On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>> From: Baihan Li <libaihan@huawei.com> >>> >>> Add registering drm_aux and use it to get connector edid with drm >>> functions. Add ddc channel in connector initialization to put drm_aux >>> in drm_connector. >>> >>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>> --- >>> ChangeLog: >>> v6 -> v7: >>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >> I don't understand this, and I did not suggest such a thing. >> >> BR, >> Jani. >> > Hi Jani, > > Is the modification of v8 correct? I never received that for whatever reason. > > >>> v5 -> v6: >>> - move the detect_ctx() to the patch 7/9. >>> v2 -> v3: >>> - Capitalized EDID and AUX, suggested by Dmitry Baryshkov. >>> v1 -> v2: >>> - deleting type conversion, suggested by Dmitry Baryshkov. >>> - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. >>> --- >>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 3 +- >>> .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 35 ++++++++++++++++--- >>> .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 +++ >>> 3 files changed, 37 insertions(+), 6 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >>> index ded9e7ce887a..e0bb9b14d9d8 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >>> @@ -161,7 +161,8 @@ void hibmc_dp_aux_init(struct hibmc_dp *dp) >>> HIBMC_DP_MIN_PULSE_NUM); >>> >>> dp->aux.transfer = hibmc_dp_aux_xfer; >>> - dp->aux.is_remote = 0; >>> + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); >>> + dp->aux.drm_dev = dp->drm_dev; >>> drm_dp_aux_init(&dp->aux); >>> dp->dp_dev->aux = &dp->aux; >>> } >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>> index 603d6b198a54..0256724d8b9b 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>> @@ -15,11 +15,20 @@ >>> >>> static int hibmc_dp_connector_get_modes(struct drm_connector *connector) >>> { >>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>> + const struct drm_edid *drm_edid; >>> int count; >>> >>> - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, >>> - connector->dev->mode_config.max_height); >>> - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation >>> + if (!dp->aux.name) >>> + return 0; >>> + >>> + drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); >>> + >>> + drm_edid_connector_update(connector, drm_edid); >>> + >>> + count = drm_edid_connector_add_modes(connector); >>> + >>> + drm_edid_free(drm_edid); >>> >>> return count; >>> } >>> @@ -28,12 +37,28 @@ static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { >>> .get_modes = hibmc_dp_connector_get_modes, >>> }; >>> >>> +static int hibmc_dp_late_register(struct drm_connector *connector) >>> +{ >>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>> + >>> + return drm_dp_aux_register(&dp->aux); >>> +} >>> + >>> +static void hibmc_dp_early_unregister(struct drm_connector *connector) >>> +{ >>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>> + >>> + drm_dp_aux_unregister(&dp->aux); >>> +} >>> + >>> static const struct drm_connector_funcs hibmc_dp_conn_funcs = { >>> .reset = drm_atomic_helper_connector_reset, >>> .fill_modes = drm_helper_probe_single_connector_modes, >>> .destroy = drm_connector_cleanup, >>> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, >>> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, >>> + .late_register = hibmc_dp_late_register, >>> + .early_unregister = hibmc_dp_early_unregister, >>> }; >>> >>> static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display_mode *mode) >>> @@ -103,8 +128,8 @@ int hibmc_dp_init(struct hibmc_drm_private *priv) >>> >>> drm_encoder_helper_add(encoder, &hibmc_dp_encoder_helper_funcs); >>> >>> - ret = drm_connector_init(dev, connector, &hibmc_dp_conn_funcs, >>> - DRM_MODE_CONNECTOR_DisplayPort); >>> + ret = drm_connector_init_with_ddc(dev, connector, &hibmc_dp_conn_funcs, >>> + DRM_MODE_CONNECTOR_DisplayPort, &dp->aux.ddc); >>> if (ret) { >>> drm_err(dev, "init dp connector failed: %d\n", ret); >>> return ret; >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> index d982f1e4b958..3ddd71aada66 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> @@ -47,6 +47,11 @@ static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector) >>> return container_of(connector, struct hibmc_vdac, connector); >>> } >>> >>> +static inline struct hibmc_dp *to_hibmc_dp(struct drm_connector *connector) >>> +{ >>> + return container_of(connector, struct hibmc_dp, connector); >>> +} >>> + >>> static inline struct hibmc_drm_private *to_hibmc_drm_private(struct drm_device *dev) >>> { >>> return container_of(dev, struct hibmc_drm_private, dev);
> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>> From: Baihan Li <libaihan@huawei.com> >>>> >>>> Add registering drm_aux and use it to get connector edid with drm >>>> functions. Add ddc channel in connector initialization to put drm_aux >>>> in drm_connector. >>>> >>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>> --- >>>> ChangeLog: >>>> v6 -> v7: >>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>> I don't understand this, and I did not suggest such a thing. >>> >>> BR, >>> Jani. >>> >> Hi Jani, >> >> Is the modification of v8 correct? > I never received that for whatever reason. Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ >> >>>> v5 -> v6: >>>> - move the detect_ctx() to the patch 7/9. >>>> v2 -> v3: >>>> - Capitalized EDID and AUX, suggested by Dmitry Baryshkov. >>>> v1 -> v2: >>>> - deleting type conversion, suggested by Dmitry Baryshkov. >>>> - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. >>>> --- >>>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 3 +- >>>> .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 35 ++++++++++++++++--- >>>> .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 +++ >>>> 3 files changed, 37 insertions(+), 6 deletions(-) >>>> >>>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >>>> index ded9e7ce887a..e0bb9b14d9d8 100644 >>>> --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >>>> +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c >>>> @@ -161,7 +161,8 @@ void hibmc_dp_aux_init(struct hibmc_dp *dp) >>>> HIBMC_DP_MIN_PULSE_NUM); >>>> >>>> dp->aux.transfer = hibmc_dp_aux_xfer; >>>> - dp->aux.is_remote = 0; >>>> + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); >>>> + dp->aux.drm_dev = dp->drm_dev; >>>> drm_dp_aux_init(&dp->aux); >>>> dp->dp_dev->aux = &dp->aux; >>>> } >>>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>>> index 603d6b198a54..0256724d8b9b 100644 >>>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>>> @@ -15,11 +15,20 @@ >>>> >>>> static int hibmc_dp_connector_get_modes(struct drm_connector *connector) >>>> { >>>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>>> + const struct drm_edid *drm_edid; >>>> int count; >>>> >>>> - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, >>>> - connector->dev->mode_config.max_height); >>>> - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation >>>> + if (!dp->aux.name) >>>> + return 0; >>>> + >>>> + drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); >>>> + >>>> + drm_edid_connector_update(connector, drm_edid); >>>> + >>>> + count = drm_edid_connector_add_modes(connector); >>>> + >>>> + drm_edid_free(drm_edid); >>>> >>>> return count; >>>> } >>>> @@ -28,12 +37,28 @@ static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { >>>> .get_modes = hibmc_dp_connector_get_modes, >>>> }; >>>> >>>> +static int hibmc_dp_late_register(struct drm_connector *connector) >>>> +{ >>>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>>> + >>>> + return drm_dp_aux_register(&dp->aux); >>>> +} >>>> + >>>> +static void hibmc_dp_early_unregister(struct drm_connector *connector) >>>> +{ >>>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>>> + >>>> + drm_dp_aux_unregister(&dp->aux); >>>> +} >>>> + >>>> static const struct drm_connector_funcs hibmc_dp_conn_funcs = { >>>> .reset = drm_atomic_helper_connector_reset, >>>> .fill_modes = drm_helper_probe_single_connector_modes, >>>> .destroy = drm_connector_cleanup, >>>> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, >>>> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, >>>> + .late_register = hibmc_dp_late_register, >>>> + .early_unregister = hibmc_dp_early_unregister, >>>> }; >>>> >>>> static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display_mode *mode) >>>> @@ -103,8 +128,8 @@ int hibmc_dp_init(struct hibmc_drm_private *priv) >>>> >>>> drm_encoder_helper_add(encoder, &hibmc_dp_encoder_helper_funcs); >>>> >>>> - ret = drm_connector_init(dev, connector, &hibmc_dp_conn_funcs, >>>> - DRM_MODE_CONNECTOR_DisplayPort); >>>> + ret = drm_connector_init_with_ddc(dev, connector, &hibmc_dp_conn_funcs, >>>> + DRM_MODE_CONNECTOR_DisplayPort, &dp->aux.ddc); >>>> if (ret) { >>>> drm_err(dev, "init dp connector failed: %d\n", ret); >>>> return ret; >>>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>>> index d982f1e4b958..3ddd71aada66 100644 >>>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>>> @@ -47,6 +47,11 @@ static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector) >>>> return container_of(connector, struct hibmc_vdac, connector); >>>> } >>>> >>>> +static inline struct hibmc_dp *to_hibmc_dp(struct drm_connector *connector) >>>> +{ >>>> + return container_of(connector, struct hibmc_dp, connector); >>>> +} >>>> + >>>> static inline struct hibmc_drm_private *to_hibmc_drm_private(struct drm_device *dev) >>>> { >>>> return container_of(dev, struct hibmc_drm_private, dev);
On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>> From: Baihan Li <libaihan@huawei.com> >>>>> >>>>> Add registering drm_aux and use it to get connector edid with drm >>>>> functions. Add ddc channel in connector initialization to put drm_aux >>>>> in drm_connector. >>>>> >>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>>> --- >>>>> ChangeLog: >>>>> v6 -> v7: >>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>>> I don't understand this, and I did not suggest such a thing. >>>> >>>> BR, >>>> Jani. >>>> >>> Hi Jani, >>> >>> Is the modification of v8 correct? >> I never received that for whatever reason. > > Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ Thanks. The EDID handling looks fine. AFAICT you leak dp->aux.name though. BR, Jani.
在 2025/3/26 17:32, Jani Nikula 写道: > On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>> From: Baihan Li <libaihan@huawei.com> >>>>>> >>>>>> Add registering drm_aux and use it to get connector edid with drm >>>>>> functions. Add ddc channel in connector initialization to put drm_aux >>>>>> in drm_connector. >>>>>> >>>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>>>> --- >>>>>> ChangeLog: >>>>>> v6 -> v7: >>>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>>>> I don't understand this, and I did not suggest such a thing. >>>>> >>>>> BR, >>>>> Jani. >>>>> >>>> Hi Jani, >>>> >>>> Is the modification of v8 correct? >>> I never received that for whatever reason. >> Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ > Thanks. > > The EDID handling looks fine. > > AFAICT you leak dp->aux.name though. > > > BR, > Jani. Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, and I deleted it in V8. Thanks, Baihan. > >
On Thu, 27 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > 在 2025/3/26 17:32, Jani Nikula 写道: >> On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>> From: Baihan Li <libaihan@huawei.com> >>>>>>> >>>>>>> Add registering drm_aux and use it to get connector edid with drm >>>>>>> functions. Add ddc channel in connector initialization to put drm_aux >>>>>>> in drm_connector. >>>>>>> >>>>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>>>>> --- >>>>>>> ChangeLog: >>>>>>> v6 -> v7: >>>>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>>>>> I don't understand this, and I did not suggest such a thing. >>>>>> >>>>>> BR, >>>>>> Jani. >>>>>> >>>>> Hi Jani, >>>>> >>>>> Is the modification of v8 correct? >>>> I never received that for whatever reason. >>> Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ >> Thanks. >> >> The EDID handling looks fine. >> >> AFAICT you leak dp->aux.name though. >> >> >> BR, >> Jani. > > Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, > and I deleted it in V8. This is in the link you posted: + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); > > Thanks, > Baihan. > >> >>
> On Thu, 27 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >> 在 2025/3/26 17:32, Jani Nikula 写道: >>> On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>>> From: Baihan Li <libaihan@huawei.com> >>>>>>>> >>>>>>>> Add registering drm_aux and use it to get connector edid with drm >>>>>>>> functions. Add ddc channel in connector initialization to put drm_aux >>>>>>>> in drm_connector. >>>>>>>> >>>>>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>>>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>>>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>>>>>> --- >>>>>>>> ChangeLog: >>>>>>>> v6 -> v7: >>>>>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>>>>>> I don't understand this, and I did not suggest such a thing. >>>>>>> >>>>>>> BR, >>>>>>> Jani. >>>>>>> >>>>>> Hi Jani, >>>>>> >>>>>> Is the modification of v8 correct? >>>>> I never received that for whatever reason. >>>> Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ >>> Thanks. >>> >>> The EDID handling looks fine. >>> >>> AFAICT you leak dp->aux.name though. >>> >>> >>> BR, >>> Jani. >> Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, >> and I deleted it in V8. > This is in the link you posted: > > + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); > Hi Jani, I got it. I think I can change it to devm_kasprintf() in next bug fix patch, is that ok? > >> Thanks, >> Baihan. >> >>>
On Fri, 28 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >> On Thu, 27 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>> 在 2025/3/26 17:32, Jani Nikula 写道: >>>> On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>>>> From: Baihan Li <libaihan@huawei.com> >>>>>>>>> >>>>>>>>> Add registering drm_aux and use it to get connector edid with drm >>>>>>>>> functions. Add ddc channel in connector initialization to put drm_aux >>>>>>>>> in drm_connector. >>>>>>>>> >>>>>>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>>>>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>>>>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>>>>>>> --- >>>>>>>>> ChangeLog: >>>>>>>>> v6 -> v7: >>>>>>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>>>>>>> I don't understand this, and I did not suggest such a thing. >>>>>>>> >>>>>>>> BR, >>>>>>>> Jani. >>>>>>>> >>>>>>> Hi Jani, >>>>>>> >>>>>>> Is the modification of v8 correct? >>>>>> I never received that for whatever reason. >>>>> Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ >>>> Thanks. >>>> >>>> The EDID handling looks fine. >>>> >>>> AFAICT you leak dp->aux.name though. >>>> >>>> >>>> BR, >>>> Jani. >>> Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, >>> and I deleted it in V8. >> This is in the link you posted: >> >> + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); >> > Hi Jani, > > I got it. I think I can change it to devm_kasprintf() in next bug fix patch, is that ok? Maybe. I don't have the time to look into hibmc details. BR, Jani. > > >> >>> Thanks, >>> Baihan. >>> >>>>
On Fri, Mar 28, 2025 at 12:28:14PM +0200, Jani Nikula wrote: > On Fri, 28 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > >> On Thu, 27 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > >>> 在 2025/3/26 17:32, Jani Nikula 写道: > >>>> On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > >>>>>> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > >>>>>>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > >>>>>>>>> From: Baihan Li <libaihan@huawei.com> > >>>>>>>>> > >>>>>>>>> Add registering drm_aux and use it to get connector edid with drm > >>>>>>>>> functions. Add ddc channel in connector initialization to put drm_aux > >>>>>>>>> in drm_connector. > >>>>>>>>> > >>>>>>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> > >>>>>>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> > >>>>>>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > >>>>>>>>> --- > >>>>>>>>> ChangeLog: > >>>>>>>>> v6 -> v7: > >>>>>>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula > >>>>>>>> I don't understand this, and I did not suggest such a thing. > >>>>>>>> > >>>>>>>> BR, > >>>>>>>> Jani. > >>>>>>>> > >>>>>>> Hi Jani, > >>>>>>> > >>>>>>> Is the modification of v8 correct? > >>>>>> I never received that for whatever reason. > >>>>> Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ > >>>> Thanks. > >>>> > >>>> The EDID handling looks fine. > >>>> > >>>> AFAICT you leak dp->aux.name though. > >>>> > >>>> > >>>> BR, > >>>> Jani. > >>> Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, > >>> and I deleted it in V8. > >> This is in the link you posted: > >> > >> + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); > >> > > Hi Jani, > > > > I got it. I think I can change it to devm_kasprintf() in next bug fix patch, is that ok? > > Maybe. I don't have the time to look into hibmc details. I don't either, but it looks suspicious to me. devm_kasprintf will be freed when the device will be removed, but the DP Aux bus is probably staying for a bit longer? Maxime
> On Fri, Mar 28, 2025 at 12:28:14PM +0200, Jani Nikula wrote: >> On Fri, 28 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>> On Thu, 27 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>> 在 2025/3/26 17:32, Jani Nikula 写道: >>>>>> On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>>> On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>>>>> On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: >>>>>>>>>>> From: Baihan Li <libaihan@huawei.com> >>>>>>>>>>> >>>>>>>>>>> Add registering drm_aux and use it to get connector edid with drm >>>>>>>>>>> functions. Add ddc channel in connector initialization to put drm_aux >>>>>>>>>>> in drm_connector. >>>>>>>>>>> >>>>>>>>>>> Signed-off-by: Baihan Li <libaihan@huawei.com> >>>>>>>>>>> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> >>>>>>>>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >>>>>>>>>>> --- >>>>>>>>>>> ChangeLog: >>>>>>>>>>> v6 -> v7: >>>>>>>>>>> - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula >>>>>>>>>> I don't understand this, and I did not suggest such a thing. >>>>>>>>>> >>>>>>>>>> BR, >>>>>>>>>> Jani. >>>>>>>>>> >>>>>>>>> Hi Jani, >>>>>>>>> >>>>>>>>> Is the modification of v8 correct? >>>>>>>> I never received that for whatever reason. >>>>>>> Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ >>>>>> Thanks. >>>>>> >>>>>> The EDID handling looks fine. >>>>>> >>>>>> AFAICT you leak dp->aux.name though. >>>>>> >>>>>> >>>>>> BR, >>>>>> Jani. >>>>> Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, >>>>> and I deleted it in V8. >>>> This is in the link you posted: >>>> >>>> + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); >>>> >>> Hi Jani, >>> >>> I got it. I think I can change it to devm_kasprintf() in next bug fix patch, is that ok? >> Maybe. I don't have the time to look into hibmc details. > I don't either, but it looks suspicious to me. devm_kasprintf will be > freed when the device will be removed, but the DP Aux bus is probably > staying for a bit longer? > > Maxime Hi Ripard, I will bind it to my hibmc device, and aux_unregister is in early_unregister callback of dp's connector_funcs, which is before the hibmc_pci_remove(), so I think it work good.
On Sat, Mar 29, 2025 at 02:12:56PM +0800, Yongbang Shi wrote: > > On Fri, Mar 28, 2025 at 12:28:14PM +0200, Jani Nikula wrote: > > > On Fri, 28 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > > > > > On Thu, 27 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > > > > > > 在 2025/3/26 17:32, Jani Nikula 写道: > > > > > > > On Tue, 25 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > > > > > > > > > On Mon, 24 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > > > > > > > > > > > On Wed, 19 Mar 2025, Yongbang Shi <shiyongbang@huawei.com> wrote: > > > > > > > > > > > > From: Baihan Li <libaihan@huawei.com> > > > > > > > > > > > > > > > > > > > > > > > > Add registering drm_aux and use it to get connector edid with drm > > > > > > > > > > > > functions. Add ddc channel in connector initialization to put drm_aux > > > > > > > > > > > > in drm_connector. > > > > > > > > > > > > > > > > > > > > > > > > Signed-off-by: Baihan Li <libaihan@huawei.com> > > > > > > > > > > > > Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> > > > > > > > > > > > > Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > > > > > > > > > > > --- > > > > > > > > > > > > ChangeLog: > > > > > > > > > > > > v6 -> v7: > > > > > > > > > > > > - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula > > > > > > > > > > > I don't understand this, and I did not suggest such a thing. > > > > > > > > > > > > > > > > > > > > > > BR, > > > > > > > > > > > Jani. > > > > > > > > > > > > > > > > > > > > > Hi Jani, > > > > > > > > > > > > > > > > > > > > Is the modification of v8 correct? > > > > > > > > > I never received that for whatever reason. > > > > > > > > Here's the link: https://lore.kernel.org/all/20250320101455.2538835-1-shiyongbang@huawei.com/ > > > > > > > Thanks. > > > > > > > > > > > > > > The EDID handling looks fine. > > > > > > > > > > > > > > AFAICT you leak dp->aux.name though. > > > > > > > > > > > > > > > > > > > > > BR, > > > > > > > Jani. > > > > > > Thanks for for reminding me, actually the dp->aux.name was written because I misunderstood what you meant in V7, > > > > > > and I deleted it in V8. > > > > > This is in the link you posted: > > > > > > > > > > + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); > > > > > > > > > Hi Jani, > > > > > > > > I got it. I think I can change it to devm_kasprintf() in next bug fix patch, is that ok? > > > Maybe. I don't have the time to look into hibmc details. > > I don't either, but it looks suspicious to me. devm_kasprintf will be > > freed when the device will be removed, but the DP Aux bus is probably > > staying for a bit longer? > > > > Maxime > > Hi Ripard, > > I will bind it to my hibmc device, and aux_unregister is in early_unregister callback of dp's connector_funcs, > which is before the hibmc_pci_remove(), so I think it work good. No, DRM connectors are a part of the DRM framework and can potentially outlive the underlying device.
diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c index ded9e7ce887a..e0bb9b14d9d8 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c @@ -161,7 +161,8 @@ void hibmc_dp_aux_init(struct hibmc_dp *dp) HIBMC_DP_MIN_PULSE_NUM); dp->aux.transfer = hibmc_dp_aux_xfer; - dp->aux.is_remote = 0; + dp->aux.name = kasprintf(GFP_KERNEL, "HIBMC DRM dp aux"); + dp->aux.drm_dev = dp->drm_dev; drm_dp_aux_init(&dp->aux); dp->dp_dev->aux = &dp->aux; } diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c index 603d6b198a54..0256724d8b9b 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c @@ -15,11 +15,20 @@ static int hibmc_dp_connector_get_modes(struct drm_connector *connector) { + struct hibmc_dp *dp = to_hibmc_dp(connector); + const struct drm_edid *drm_edid; int count; - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, - connector->dev->mode_config.max_height); - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation + if (!dp->aux.name) + return 0; + + drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); + + drm_edid_connector_update(connector, drm_edid); + + count = drm_edid_connector_add_modes(connector); + + drm_edid_free(drm_edid); return count; } @@ -28,12 +37,28 @@ static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { .get_modes = hibmc_dp_connector_get_modes, }; +static int hibmc_dp_late_register(struct drm_connector *connector) +{ + struct hibmc_dp *dp = to_hibmc_dp(connector); + + return drm_dp_aux_register(&dp->aux); +} + +static void hibmc_dp_early_unregister(struct drm_connector *connector) +{ + struct hibmc_dp *dp = to_hibmc_dp(connector); + + drm_dp_aux_unregister(&dp->aux); +} + static const struct drm_connector_funcs hibmc_dp_conn_funcs = { .reset = drm_atomic_helper_connector_reset, .fill_modes = drm_helper_probe_single_connector_modes, .destroy = drm_connector_cleanup, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + .late_register = hibmc_dp_late_register, + .early_unregister = hibmc_dp_early_unregister, }; static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display_mode *mode) @@ -103,8 +128,8 @@ int hibmc_dp_init(struct hibmc_drm_private *priv) drm_encoder_helper_add(encoder, &hibmc_dp_encoder_helper_funcs); - ret = drm_connector_init(dev, connector, &hibmc_dp_conn_funcs, - DRM_MODE_CONNECTOR_DisplayPort); + ret = drm_connector_init_with_ddc(dev, connector, &hibmc_dp_conn_funcs, + DRM_MODE_CONNECTOR_DisplayPort, &dp->aux.ddc); if (ret) { drm_err(dev, "init dp connector failed: %d\n", ret); return ret; diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h index d982f1e4b958..3ddd71aada66 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h @@ -47,6 +47,11 @@ static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector) return container_of(connector, struct hibmc_vdac, connector); } +static inline struct hibmc_dp *to_hibmc_dp(struct drm_connector *connector) +{ + return container_of(connector, struct hibmc_dp, connector); +} + static inline struct hibmc_drm_private *to_hibmc_drm_private(struct drm_device *dev) { return container_of(dev, struct hibmc_drm_private, dev);