[PATCH v3 3/4] drm/dp: Add DisplayPort link helpers

Alex Deucher alexdeucher at gmail.com
Tue Jan 14 07:52:55 PST 2014


On Tue, Jan 14, 2014 at 9:55 AM, Thierry Reding
<thierry.reding at gmail.com> wrote:
> Add a helper to probe a DP link (read out the supported DPCD revision,
> maximum rate, link count and capabilities) as well as power up the DP
> link and configure it accordingly.
>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
> Changes in v3:
> - split into drm_dp_link_power_up() and drm_dp_link_configure()
> - do not change sink state for DPCD versions earlier than 1.1
> - sleep for 1-2 ms after setting local sink to D0 state
> - read and write consecutive registers where possible
> - read DPCD revision when link is probed
> - remove duplicate kerneldoc
>
>  drivers/gpu/drm/drm_dp_helper.c | 94 +++++++++++++++++++++++++++++++++++++++++
>  include/drm/drm_dp_helper.h     | 17 ++++++++
>  2 files changed, 111 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> index 572637456713..ac2e12789634 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -472,3 +472,97 @@ int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux,
>                                 DP_LINK_STATUS_SIZE);
>  }
>  EXPORT_SYMBOL(drm_dp_dpcd_read_link_status);
> +
> +/**
> + * drm_dp_link_probe() - probe a DisplayPort link for capabilities
> + * @aux: DisplayPort AUX channel
> + * @link: pointer to structure in which to return link capabilities
> + *
> + * The structure filled in by this function can usually be passed directly
> + * into drm_dp_link_power_up() and drm_dp_link_configure() to power up and
> + * configure the link based on the link's capabilities.
> + *
> + * Returns 0 on success or a negative error code on failure.
> + */
> +int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link)
> +{
> +       u8 values[3];
> +       int err;
> +
> +       memset(link, 0, sizeof(*link));
> +
> +       err = drm_dp_dpcd_read(aux, DP_DPCD_REV, values, sizeof(values));
> +       if (err < 0)
> +               return err;
> +
> +       link->revision = values[0];
> +       link->rate = drm_dp_bw_code_to_link_rate(values[1]);
> +       link->num_lanes = values[2] & DP_MAX_LANE_COUNT_MASK;
> +
> +       if (values[2] & DP_ENHANCED_FRAME_CAP)
> +               link->capabilities |= DP_LINK_CAP_ENHANCED_FRAMING;
> +
> +       return 0;
> +}
> +
> +/**
> + * drm_dp_link_power_up() - power up a DisplayPort link
> + * @aux: DisplayPort AUX channel
> + * @link: pointer to a structure containing the link configuration
> + *
> + * Returns 0 on success or a negative error code on failure.
> + */
> +int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link)
> +{
> +       u8 value;
> +       int err;
> +
> +       /* DP_SET_POWER register is only available on DPCD v1.1 and later */
> +       if (link->revision < 0x11)
> +               return 0;
> +
> +       err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
> +       if (err < 0)
> +               return err;
> +
> +       value &= ~DP_SET_POWER_MASK;
> +       value |= DP_SET_POWER_D0;
> +
> +       err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
> +       if (err < 0)
> +               return err;
> +
> +       /*
> +        * According to the DP 1.1 specification, a "Sink Device must exit the
> +        * power saving state within 1 ms" (Section 2.5.3.1, Table 5-52, "Sink
> +        * Control Field" (register 0x600).
> +        */
> +       usleep_range(1000, 2000);
> +
> +       return 0;
> +}
> +
> +/**
> + * drm_dp_link_configure() - configure a DisplayPort link
> + * @aux: DisplayPort AUX cahnnel
> + * @link: pointer to a structure containing the link configuration
> + *
> + * Returns 0 on seccuss or a negative error code on failure.

spelling.  success.


Alex


More information about the dri-devel mailing list