diff options
| author | Dave Airlie <airlied@redhat.com> | 2019-10-30 06:10:59 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2019-10-30 06:11:47 +1000 | 
| commit | a24e4b09dc75357492ca19d74b02e1edebc282e8 (patch) | |
| tree | d94d65004f9b9a2a5b6e1bc4a5d1f9c322645996 /drivers/gpu/drm/drm_dp_helper.c | |
| parent | 60845e34f0c5c19a9e86af477b429993952f585b (diff) | |
| parent | 9a42c7c647a9ad0f7ebb147a52eda3dcb7c84292 (diff) | |
Merge tag 'drm-misc-next-2019-10-24-2' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 5.5:
UAPI Changes:
-syncobj: allow querying the last submitted timeline value (David)
-fourcc: explicitly defineDRM_FORMAT_BIG_ENDIAN as unsigned (Adam)
-omap: revert the OMAP_BO_* flags that were added -- no userspace (Sean)
Cross-subsystem Changes:
-MAINTAINERS: add Mihail as komeda co-maintainer (Mihail)
Core Changes:
-edid: a few cleanups, add AVI infoframe bar info (Ville)
-todo: remove i915 device_link item and add difficulty levels (Daniel)
-dp_helpers: add a few new helpers to parse dpcd (Thierry)
Driver Changes:
-gma500: fix a few memory disclosure leaks (Kangjie)
-qxl: convert to use the new drm_gem_object_funcs.mmap (Gerd)
-various: open code dp_link helpers in preparation for helper removal (Thierry)
Cc: Chunming Zhou <david1.zhou@amd.com>
Cc: Adam Jackson <ajax@redhat.com>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Kangjie Lu <kjlu@umn.edu>
Cc: Mihail Atanassov <mihail.atanassov@arm.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Thierry Reding <treding@nvidia.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Sean Paul <sean@poorly.run>
Link: https://patchwork.freedesktop.org/patch/msgid/20191024155535.GA10294@art_vandelay
Diffstat (limited to 'drivers/gpu/drm/drm_dp_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_dp_helper.c | 169 | 
1 files changed, 28 insertions, 141 deletions
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index f373798d82f6..2c7870aef469 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -120,33 +120,49 @@ u8 drm_dp_get_adjust_request_pre_emphasis(const u8 link_status[DP_LINK_STATUS_SI  }  EXPORT_SYMBOL(drm_dp_get_adjust_request_pre_emphasis); -void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) { -	int rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & -			  DP_TRAINING_AUX_RD_MASK; +u8 drm_dp_get_adjust_request_post_cursor(const u8 link_status[DP_LINK_STATUS_SIZE], +					 unsigned int lane) +{ +	unsigned int offset = DP_ADJUST_REQUEST_POST_CURSOR2; +	u8 value = dp_link_status(link_status, offset); + +	return (value >> (lane << 1)) & 0x3; +} +EXPORT_SYMBOL(drm_dp_get_adjust_request_post_cursor); + +void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ +	unsigned long rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & +					 DP_TRAINING_AUX_RD_MASK;  	if (rd_interval > 4) -		DRM_DEBUG_KMS("AUX interval %d, out of range (max 4)\n", +		DRM_DEBUG_KMS("AUX interval %lu, out of range (max 4)\n",  			      rd_interval);  	if (rd_interval == 0 || dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14) -		udelay(100); +		rd_interval = 100;  	else -		mdelay(rd_interval * 4); +		rd_interval *= 4 * USEC_PER_MSEC; + +	usleep_range(rd_interval, rd_interval * 2);  }  EXPORT_SYMBOL(drm_dp_link_train_clock_recovery_delay); -void drm_dp_link_train_channel_eq_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) { -	int rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & -			  DP_TRAINING_AUX_RD_MASK; +void drm_dp_link_train_channel_eq_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ +	unsigned long rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & +					 DP_TRAINING_AUX_RD_MASK;  	if (rd_interval > 4) -		DRM_DEBUG_KMS("AUX interval %d, out of range (max 4)\n", +		DRM_DEBUG_KMS("AUX interval %lu, out of range (max 4)\n",  			      rd_interval);  	if (rd_interval == 0) -		udelay(400); +		rd_interval = 400;  	else -		mdelay(rd_interval * 4); +		rd_interval *= 4 * USEC_PER_MSEC; + +	usleep_range(rd_interval, rd_interval * 2);  }  EXPORT_SYMBOL(drm_dp_link_train_channel_eq_delay); @@ -220,7 +236,6 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request,  		}  		ret = aux->transfer(aux, &msg); -  		if (ret >= 0) {  			native_reply = msg.reply & DP_AUX_NATIVE_REPLY_MASK;  			if (native_reply == DP_AUX_NATIVE_REPLY_ACK) { @@ -337,134 +352,6 @@ int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux,  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; -} -EXPORT_SYMBOL(drm_dp_link_probe); - -/** - * 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; -} -EXPORT_SYMBOL(drm_dp_link_power_up); - -/** - * drm_dp_link_power_down() - power down 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_down(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_D3; - -	err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); -	if (err < 0) -		return err; - -	return 0; -} -EXPORT_SYMBOL(drm_dp_link_power_down); - -/** - * drm_dp_link_configure() - configure 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_configure(struct drm_dp_aux *aux, struct drm_dp_link *link) -{ -	u8 values[2]; -	int err; - -	values[0] = drm_dp_link_rate_to_bw_code(link->rate); -	values[1] = link->num_lanes; - -	if (link->capabilities & DP_LINK_CAP_ENHANCED_FRAMING) -		values[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; - -	err = drm_dp_dpcd_write(aux, DP_LINK_BW_SET, values, sizeof(values)); -	if (err < 0) -		return err; - -	return 0; -} -EXPORT_SYMBOL(drm_dp_link_configure); - -/**   * drm_dp_downstream_max_clock() - extract branch device max   *                                 pixel rate for legacy VGA   *                                 converter or max TMDS clock  | 
