diff options
| author | Dave Airlie <airlied@redhat.com> | 2010-12-15 19:03:47 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2010-12-15 19:03:47 -0500 |
| commit | 044102798ddb0a0e5f43ef7fe0ad0e84b0b5e3a0 (patch) | |
| tree | fd3a6692ca2aae38d9c86988a95bd1983ea81ebf | |
| parent | a4851d8f7d6351a395d36ae8fdcf41745a832d76 (diff) | |
| parent | 448f53a1ede54eb854d036abf54573281412d650 (diff) | |
Merge remote branch 'intel/drm-intel-fixes' of /ssd/git/drm-next into drm-fixes
* 'intel/drm-intel-fixes' of /ssd/git/drm-next:
drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks
agp/intel: Fix missed cached memory flags setting in i965_write_entry()
drm/i915/sdvo: Only use the SDVO pin if it is in the valid range
drm/i915/ringbuffer: Handle wrapping of the autoreported HEAD
drm/i915/dp: Fix I2C/EDID handling with active DisplayPort to DVI converter
| -rw-r--r-- | drivers/char/agp/intel-gtt.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 9 |
6 files changed, 57 insertions, 26 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 16a2847b7cdb..29ac6d499fa6 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
| @@ -1192,12 +1192,19 @@ static void i9xx_chipset_flush(void) | |||
| 1192 | writel(1, intel_private.i9xx_flush_page); | 1192 | writel(1, intel_private.i9xx_flush_page); |
| 1193 | } | 1193 | } |
| 1194 | 1194 | ||
| 1195 | static void i965_write_entry(dma_addr_t addr, unsigned int entry, | 1195 | static void i965_write_entry(dma_addr_t addr, |
| 1196 | unsigned int entry, | ||
| 1196 | unsigned int flags) | 1197 | unsigned int flags) |
| 1197 | { | 1198 | { |
| 1199 | u32 pte_flags; | ||
| 1200 | |||
| 1201 | pte_flags = I810_PTE_VALID; | ||
| 1202 | if (flags == AGP_USER_CACHED_MEMORY) | ||
| 1203 | pte_flags |= I830_PTE_SYSTEM_CACHED; | ||
| 1204 | |||
| 1198 | /* Shift high bits down */ | 1205 | /* Shift high bits down */ |
| 1199 | addr |= (addr >> 28) & 0xf0; | 1206 | addr |= (addr >> 28) & 0xf0; |
| 1200 | writel(addr | I810_PTE_VALID, intel_private.gtt + entry); | 1207 | writel(addr | pte_flags, intel_private.gtt + entry); |
| 1201 | } | 1208 | } |
| 1202 | 1209 | ||
| 1203 | static bool gen6_check_flags(unsigned int flags) | 1210 | static bool gen6_check_flags(unsigned int flags) |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index b0b1200ed650..2b2078695d2a 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -270,7 +270,7 @@ parse_general_features(struct drm_i915_private *dev_priv, | |||
| 270 | general->ssc_freq ? 66 : 48; | 270 | general->ssc_freq ? 66 : 48; |
| 271 | else if (IS_GEN5(dev) || IS_GEN6(dev)) | 271 | else if (IS_GEN5(dev) || IS_GEN6(dev)) |
| 272 | dev_priv->lvds_ssc_freq = | 272 | dev_priv->lvds_ssc_freq = |
| 273 | general->ssc_freq ? 100 : 120; | 273 | general->ssc_freq ? 120 : 100; |
| 274 | else | 274 | else |
| 275 | dev_priv->lvds_ssc_freq = | 275 | dev_priv->lvds_ssc_freq = |
| 276 | general->ssc_freq ? 100 : 96; | 276 | general->ssc_freq ? 100 : 96; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index df648cb4c296..864417cffe9a 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -479,6 +479,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
| 479 | uint16_t address = algo_data->address; | 479 | uint16_t address = algo_data->address; |
| 480 | uint8_t msg[5]; | 480 | uint8_t msg[5]; |
| 481 | uint8_t reply[2]; | 481 | uint8_t reply[2]; |
| 482 | unsigned retry; | ||
| 482 | int msg_bytes; | 483 | int msg_bytes; |
| 483 | int reply_bytes; | 484 | int reply_bytes; |
| 484 | int ret; | 485 | int ret; |
| @@ -513,14 +514,33 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
| 513 | break; | 514 | break; |
| 514 | } | 515 | } |
| 515 | 516 | ||
| 516 | for (;;) { | 517 | for (retry = 0; retry < 5; retry++) { |
| 517 | ret = intel_dp_aux_ch(intel_dp, | 518 | ret = intel_dp_aux_ch(intel_dp, |
| 518 | msg, msg_bytes, | 519 | msg, msg_bytes, |
| 519 | reply, reply_bytes); | 520 | reply, reply_bytes); |
| 520 | if (ret < 0) { | 521 | if (ret < 0) { |
| 521 | DRM_DEBUG_KMS("aux_ch failed %d\n", ret); | 522 | DRM_DEBUG_KMS("aux_ch failed %d\n", ret); |
| 522 | return ret; | 523 | return ret; |
| 523 | } | 524 | } |
| 525 | |||
| 526 | switch (reply[0] & AUX_NATIVE_REPLY_MASK) { | ||
| 527 | case AUX_NATIVE_REPLY_ACK: | ||
| 528 | /* I2C-over-AUX Reply field is only valid | ||
| 529 | * when paired with AUX ACK. | ||
| 530 | */ | ||
| 531 | break; | ||
| 532 | case AUX_NATIVE_REPLY_NACK: | ||
| 533 | DRM_DEBUG_KMS("aux_ch native nack\n"); | ||
| 534 | return -EREMOTEIO; | ||
| 535 | case AUX_NATIVE_REPLY_DEFER: | ||
| 536 | udelay(100); | ||
| 537 | continue; | ||
| 538 | default: | ||
| 539 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", | ||
| 540 | reply[0]); | ||
| 541 | return -EREMOTEIO; | ||
| 542 | } | ||
| 543 | |||
| 524 | switch (reply[0] & AUX_I2C_REPLY_MASK) { | 544 | switch (reply[0] & AUX_I2C_REPLY_MASK) { |
| 525 | case AUX_I2C_REPLY_ACK: | 545 | case AUX_I2C_REPLY_ACK: |
| 526 | if (mode == MODE_I2C_READ) { | 546 | if (mode == MODE_I2C_READ) { |
| @@ -528,17 +548,20 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
| 528 | } | 548 | } |
| 529 | return reply_bytes - 1; | 549 | return reply_bytes - 1; |
| 530 | case AUX_I2C_REPLY_NACK: | 550 | case AUX_I2C_REPLY_NACK: |
| 531 | DRM_DEBUG_KMS("aux_ch nack\n"); | 551 | DRM_DEBUG_KMS("aux_i2c nack\n"); |
| 532 | return -EREMOTEIO; | 552 | return -EREMOTEIO; |
| 533 | case AUX_I2C_REPLY_DEFER: | 553 | case AUX_I2C_REPLY_DEFER: |
| 534 | DRM_DEBUG_KMS("aux_ch defer\n"); | 554 | DRM_DEBUG_KMS("aux_i2c defer\n"); |
| 535 | udelay(100); | 555 | udelay(100); |
| 536 | break; | 556 | break; |
| 537 | default: | 557 | default: |
| 538 | DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]); | 558 | DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]); |
| 539 | return -EREMOTEIO; | 559 | return -EREMOTEIO; |
| 540 | } | 560 | } |
| 541 | } | 561 | } |
| 562 | |||
| 563 | DRM_ERROR("too many retries, giving up\n"); | ||
| 564 | return -EREMOTEIO; | ||
| 542 | } | 565 | } |
| 543 | 566 | ||
| 544 | static int | 567 | static int |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 89a65be8a3f3..31cd7e33e820 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -696,20 +696,17 @@ int intel_wait_ring_buffer(struct drm_device *dev, | |||
| 696 | drm_i915_private_t *dev_priv = dev->dev_private; | 696 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 697 | u32 head; | 697 | u32 head; |
| 698 | 698 | ||
| 699 | head = intel_read_status_page(ring, 4); | ||
| 700 | if (head) { | ||
| 701 | ring->head = head & HEAD_ADDR; | ||
| 702 | ring->space = ring->head - (ring->tail + 8); | ||
| 703 | if (ring->space < 0) | ||
| 704 | ring->space += ring->size; | ||
| 705 | if (ring->space >= n) | ||
| 706 | return 0; | ||
| 707 | } | ||
| 708 | |||
| 709 | trace_i915_ring_wait_begin (dev); | 699 | trace_i915_ring_wait_begin (dev); |
| 710 | end = jiffies + 3 * HZ; | 700 | end = jiffies + 3 * HZ; |
| 711 | do { | 701 | do { |
| 712 | ring->head = I915_READ_HEAD(ring) & HEAD_ADDR; | 702 | /* If the reported head position has wrapped or hasn't advanced, |
| 703 | * fallback to the slow and accurate path. | ||
| 704 | */ | ||
| 705 | head = intel_read_status_page(ring, 4); | ||
| 706 | if (head < ring->actual_head) | ||
| 707 | head = I915_READ_HEAD(ring); | ||
| 708 | ring->actual_head = head; | ||
| 709 | ring->head = head & HEAD_ADDR; | ||
| 713 | ring->space = ring->head - (ring->tail + 8); | 710 | ring->space = ring->head - (ring->tail + 8); |
| 714 | if (ring->space < 0) | 711 | if (ring->space < 0) |
| 715 | ring->space += ring->size; | 712 | ring->space += ring->size; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 3126c2681983..d2cd0f1efeed 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
| @@ -30,8 +30,9 @@ struct intel_ring_buffer { | |||
| 30 | struct drm_device *dev; | 30 | struct drm_device *dev; |
| 31 | struct drm_gem_object *gem_object; | 31 | struct drm_gem_object *gem_object; |
| 32 | 32 | ||
| 33 | unsigned int head; | 33 | u32 actual_head; |
| 34 | unsigned int tail; | 34 | u32 head; |
| 35 | u32 tail; | ||
| 35 | int space; | 36 | int space; |
| 36 | struct intel_hw_status_page status_page; | 37 | struct intel_hw_status_page status_page; |
| 37 | 38 | ||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d97e6cb52d34..27e63abf2a73 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1908,9 +1908,12 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv, | |||
| 1908 | speed = mapping->i2c_speed; | 1908 | speed = mapping->i2c_speed; |
| 1909 | } | 1909 | } |
| 1910 | 1910 | ||
| 1911 | sdvo->i2c = &dev_priv->gmbus[pin].adapter; | 1911 | if (pin < GMBUS_NUM_PORTS) { |
| 1912 | intel_gmbus_set_speed(sdvo->i2c, speed); | 1912 | sdvo->i2c = &dev_priv->gmbus[pin].adapter; |
| 1913 | intel_gmbus_force_bit(sdvo->i2c, true); | 1913 | intel_gmbus_set_speed(sdvo->i2c, speed); |
| 1914 | intel_gmbus_force_bit(sdvo->i2c, true); | ||
| 1915 | } else | ||
| 1916 | sdvo->i2c = &dev_priv->gmbus[GMBUS_PORT_DPB].adapter; | ||
| 1914 | } | 1917 | } |
| 1915 | 1918 | ||
| 1916 | static bool | 1919 | static bool |
