summaryrefslogtreecommitdiff
path: root/sys/dev/pci/drm/intel_ddi.c
diff options
context:
space:
mode:
authorJonathan Gray <jsg@jsg.id.au>2013-03-07 11:40:00 +1100
committerJonathan Gray <jsg@jsg.id.au>2013-03-07 11:40:00 +1100
commitb1eebaa3c34e225793793b38f963d94c4e14f961 (patch)
tree3d748132db93fc121e6db569d07e5d4d8af523f3 /sys/dev/pci/drm/intel_ddi.c
parent4e2951907921f60f176fc48b727f7db775fbe6b4 (diff)
sync intel modesetting code with 3.8.2
Diffstat (limited to 'sys/dev/pci/drm/intel_ddi.c')
-rw-r--r--sys/dev/pci/drm/intel_ddi.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/dev/pci/drm/intel_ddi.c b/sys/dev/pci/drm/intel_ddi.c
index 3e21da6c1e4..4be53565ac5 100644
--- a/sys/dev/pci/drm/intel_ddi.c
+++ b/sys/dev/pci/drm/intel_ddi.c
@@ -201,10 +201,8 @@ hsw_fdi_link_train(struct drm_crtc *crtc)
FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
/* Enable the PCH Receiver FDI PLL */
- rx_ctl_val = FDI_RX_PLL_ENABLE | FDI_RX_ENHANCE_FRAME_ENABLE |
- ((intel_crtc->fdi_lanes - 1) << 19);
- if (dev_priv->fdi_rx_polarity_reversed)
- rx_ctl_val |= FDI_RX_POLARITY_REVERSED_LPT;
+ rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
+ FDI_RX_PLL_ENABLE | ((intel_crtc->fdi_lanes - 1) << 19);
I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
POSTING_READ(_FDI_RXA_CTL);
DELAY(220);
@@ -226,7 +224,10 @@ hsw_fdi_link_train(struct drm_crtc *crtc)
DP_TP_CTL_LINK_TRAIN_PAT1 |
DP_TP_CTL_ENABLE);
- /* Configure and enable DDI_BUF_CTL for DDI E with next voltage */
+ /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
+ * DDI E does not support port reversal, the functionality is
+ * achieved on the PCH side in FDI_RX_CTL, so no need to set the
+ * port reversal bit */
I915_WRITE(DDI_BUF_CTL(PORT_E),
DDI_BUF_CTL_ENABLE |
((intel_crtc->fdi_lanes - 1) << 1) |
@@ -701,8 +702,11 @@ intel_ddi_mode_set(struct drm_encoder *encoder,
if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+ struct intel_digital_port *intel_dig_port =
+ enc_to_dig_port(encoder);
- intel_dp->DP = DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
+ intel_dp->DP = intel_dig_port->port_reversal |
+ DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
switch (intel_dp->lane_count) {
case 1:
intel_dp->DP |= DDI_PORT_WIDTH_X1;
@@ -1330,11 +1334,15 @@ intel_enable_ddi(struct intel_encoder *intel_encoder)
int type = intel_encoder->type;
if (type == INTEL_OUTPUT_HDMI) {
+ struct intel_digital_port *intel_dig_port =
+ enc_to_dig_port(encoder);
+
/* In HDMI/DVI mode, the port width, and swing/emphasis values
* are ignored so nothing special needs to be done besides
* enabling the port.
*/
- I915_WRITE(DDI_BUF_CTL(port), DDI_BUF_CTL_ENABLE);
+ I915_WRITE(DDI_BUF_CTL(port),
+ intel_dig_port->port_reversal | DDI_BUF_CTL_ENABLE);
} else if (type == INTEL_OUTPUT_EDP) {
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
@@ -1507,6 +1515,7 @@ static const struct drm_encoder_helper_funcs intel_ddi_helper_funcs = {
void
intel_ddi_init(struct drm_device *dev, enum port port)
{
+ drm_i915_private_t *dev_priv = dev->dev_private;
struct intel_digital_port *intel_dig_port;
struct intel_encoder *intel_encoder;
struct drm_encoder *encoder;
@@ -1549,6 +1558,8 @@ intel_ddi_init(struct drm_device *dev, enum port port)
intel_encoder->get_hw_state = intel_ddi_get_hw_state;
intel_dig_port->port = port;
+ intel_dig_port->port_reversal = I915_READ(DDI_BUF_CTL(port)) &
+ DDI_BUF_PORT_REVERSAL;
if (hdmi_connector)
intel_dig_port->hdmi.sdvox_reg = DDI_BUF_CTL(port);
else