diff options
| -rw-r--r-- | drivers/char/agp/intel-gtt.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 76 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 98 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 30 | ||||
| -rw-r--r-- | include/drm/i915_drm.h | 2 |
9 files changed, 178 insertions, 75 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 9272c38dd3c6..16a2847b7cdb 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
| @@ -812,8 +812,10 @@ static int intel_fake_agp_fetch_size(void) | |||
| 812 | 812 | ||
| 813 | static void i830_cleanup(void) | 813 | static void i830_cleanup(void) |
| 814 | { | 814 | { |
| 815 | kunmap(intel_private.i8xx_page); | 815 | if (intel_private.i8xx_flush_page) { |
| 816 | intel_private.i8xx_flush_page = NULL; | 816 | kunmap(intel_private.i8xx_flush_page); |
| 817 | intel_private.i8xx_flush_page = NULL; | ||
| 818 | } | ||
| 817 | 819 | ||
| 818 | __free_page(intel_private.i8xx_page); | 820 | __free_page(intel_private.i8xx_page); |
| 819 | intel_private.i8xx_page = NULL; | 821 | intel_private.i8xx_page = NULL; |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 7a26f4dd21ae..e6800819bca8 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -767,6 +767,9 @@ static int i915_getparam(struct drm_device *dev, void *data, | |||
| 767 | case I915_PARAM_HAS_BLT: | 767 | case I915_PARAM_HAS_BLT: |
| 768 | value = HAS_BLT(dev); | 768 | value = HAS_BLT(dev); |
| 769 | break; | 769 | break; |
| 770 | case I915_PARAM_HAS_COHERENT_RINGS: | ||
| 771 | value = 1; | ||
| 772 | break; | ||
| 770 | default: | 773 | default: |
| 771 | DRM_DEBUG_DRIVER("Unknown parameter %d\n", | 774 | DRM_DEBUG_DRIVER("Unknown parameter %d\n", |
| 772 | param->param); | 775 | param->param); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5e54821af996..275ec6ed43ae 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -4374,10 +4374,20 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
| 4374 | * use this buffer rather sooner than later, so issuing the required | 4374 | * use this buffer rather sooner than later, so issuing the required |
| 4375 | * flush earlier is beneficial. | 4375 | * flush earlier is beneficial. |
| 4376 | */ | 4376 | */ |
| 4377 | if (obj->write_domain & I915_GEM_GPU_DOMAINS) | 4377 | if (obj->write_domain & I915_GEM_GPU_DOMAINS) { |
| 4378 | i915_gem_flush_ring(dev, file_priv, | 4378 | i915_gem_flush_ring(dev, file_priv, |
| 4379 | obj_priv->ring, | 4379 | obj_priv->ring, |
| 4380 | 0, obj->write_domain); | 4380 | 0, obj->write_domain); |
| 4381 | } else if (obj_priv->ring->outstanding_lazy_request) { | ||
| 4382 | /* This ring is not being cleared by active usage, | ||
| 4383 | * so emit a request to do so. | ||
| 4384 | */ | ||
| 4385 | u32 seqno = i915_add_request(dev, | ||
| 4386 | NULL, NULL, | ||
| 4387 | obj_priv->ring); | ||
| 4388 | if (seqno == 0) | ||
| 4389 | ret = -ENOMEM; | ||
| 4390 | } | ||
| 4381 | 4391 | ||
| 4382 | /* Update the active list for the hardware's current position. | 4392 | /* Update the active list for the hardware's current position. |
| 4383 | * Otherwise this only updates on a delayed timer or when irqs | 4393 | * Otherwise this only updates on a delayed timer or when irqs |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 25ed911a3112..878fc766a12c 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3033,6 +3033,7 @@ | |||
| 3033 | #define TRANS_DP_10BPC (1<<9) | 3033 | #define TRANS_DP_10BPC (1<<9) |
| 3034 | #define TRANS_DP_6BPC (2<<9) | 3034 | #define TRANS_DP_6BPC (2<<9) |
| 3035 | #define TRANS_DP_12BPC (3<<9) | 3035 | #define TRANS_DP_12BPC (3<<9) |
| 3036 | #define TRANS_DP_BPC_MASK (3<<9) | ||
| 3036 | #define TRANS_DP_VSYNC_ACTIVE_HIGH (1<<4) | 3037 | #define TRANS_DP_VSYNC_ACTIVE_HIGH (1<<4) |
| 3037 | #define TRANS_DP_VSYNC_ACTIVE_LOW 0 | 3038 | #define TRANS_DP_VSYNC_ACTIVE_LOW 0 |
| 3038 | #define TRANS_DP_HSYNC_ACTIVE_HIGH (1<<3) | 3039 | #define TRANS_DP_HSYNC_ACTIVE_HIGH (1<<3) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 255b52ee0091..d9b7092439ef 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -2120,9 +2120,11 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | |||
| 2120 | reg = TRANS_DP_CTL(pipe); | 2120 | reg = TRANS_DP_CTL(pipe); |
| 2121 | temp = I915_READ(reg); | 2121 | temp = I915_READ(reg); |
| 2122 | temp &= ~(TRANS_DP_PORT_SEL_MASK | | 2122 | temp &= ~(TRANS_DP_PORT_SEL_MASK | |
| 2123 | TRANS_DP_SYNC_MASK); | 2123 | TRANS_DP_SYNC_MASK | |
| 2124 | TRANS_DP_BPC_MASK); | ||
| 2124 | temp |= (TRANS_DP_OUTPUT_ENABLE | | 2125 | temp |= (TRANS_DP_OUTPUT_ENABLE | |
| 2125 | TRANS_DP_ENH_FRAMING); | 2126 | TRANS_DP_ENH_FRAMING); |
| 2127 | temp |= TRANS_DP_8BPC; | ||
| 2126 | 2128 | ||
| 2127 | if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC) | 2129 | if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC) |
| 2128 | temp |= TRANS_DP_HSYNC_ACTIVE_HIGH; | 2130 | temp |= TRANS_DP_HSYNC_ACTIVE_HIGH; |
| @@ -2712,27 +2714,19 @@ fdi_reduce_ratio(u32 *num, u32 *den) | |||
| 2712 | } | 2714 | } |
| 2713 | } | 2715 | } |
| 2714 | 2716 | ||
| 2715 | #define DATA_N 0x800000 | ||
| 2716 | #define LINK_N 0x80000 | ||
| 2717 | |||
| 2718 | static void | 2717 | static void |
| 2719 | ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, | 2718 | ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, |
| 2720 | int link_clock, struct fdi_m_n *m_n) | 2719 | int link_clock, struct fdi_m_n *m_n) |
| 2721 | { | 2720 | { |
| 2722 | u64 temp; | ||
| 2723 | |||
| 2724 | m_n->tu = 64; /* default size */ | 2721 | m_n->tu = 64; /* default size */ |
| 2725 | 2722 | ||
| 2726 | temp = (u64) DATA_N * pixel_clock; | 2723 | /* BUG_ON(pixel_clock > INT_MAX / 36); */ |
| 2727 | temp = div_u64(temp, link_clock); | 2724 | m_n->gmch_m = bits_per_pixel * pixel_clock; |
| 2728 | m_n->gmch_m = div_u64(temp * bits_per_pixel, nlanes); | 2725 | m_n->gmch_n = link_clock * nlanes * 8; |
| 2729 | m_n->gmch_m >>= 3; /* convert to bytes_per_pixel */ | ||
| 2730 | m_n->gmch_n = DATA_N; | ||
| 2731 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); | 2726 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); |
| 2732 | 2727 | ||
| 2733 | temp = (u64) LINK_N * pixel_clock; | 2728 | m_n->link_m = pixel_clock; |
| 2734 | m_n->link_m = div_u64(temp, link_clock); | 2729 | m_n->link_n = link_clock; |
| 2735 | m_n->link_n = LINK_N; | ||
| 2736 | fdi_reduce_ratio(&m_n->link_m, &m_n->link_n); | 2730 | fdi_reduce_ratio(&m_n->link_m, &m_n->link_n); |
| 2737 | } | 2731 | } |
| 2738 | 2732 | ||
| @@ -3716,6 +3710,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 3716 | 3710 | ||
| 3717 | /* FDI link */ | 3711 | /* FDI link */ |
| 3718 | if (HAS_PCH_SPLIT(dev)) { | 3712 | if (HAS_PCH_SPLIT(dev)) { |
| 3713 | int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode); | ||
| 3719 | int lane = 0, link_bw, bpp; | 3714 | int lane = 0, link_bw, bpp; |
| 3720 | /* CPU eDP doesn't require FDI link, so just set DP M/N | 3715 | /* CPU eDP doesn't require FDI link, so just set DP M/N |
| 3721 | according to current link config */ | 3716 | according to current link config */ |
| @@ -3799,6 +3794,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 3799 | 3794 | ||
| 3800 | intel_crtc->fdi_lanes = lane; | 3795 | intel_crtc->fdi_lanes = lane; |
| 3801 | 3796 | ||
| 3797 | if (pixel_multiplier > 1) | ||
| 3798 | link_bw *= pixel_multiplier; | ||
| 3802 | ironlake_compute_m_n(bpp, lane, target_clock, link_bw, &m_n); | 3799 | ironlake_compute_m_n(bpp, lane, target_clock, link_bw, &m_n); |
| 3803 | } | 3800 | } |
| 3804 | 3801 | ||
| @@ -5236,6 +5233,55 @@ static const struct drm_crtc_funcs intel_crtc_funcs = { | |||
| 5236 | .page_flip = intel_crtc_page_flip, | 5233 | .page_flip = intel_crtc_page_flip, |
| 5237 | }; | 5234 | }; |
| 5238 | 5235 | ||
| 5236 | static void intel_sanitize_modesetting(struct drm_device *dev, | ||
| 5237 | int pipe, int plane) | ||
| 5238 | { | ||
| 5239 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 5240 | u32 reg, val; | ||
| 5241 | |||
| 5242 | if (HAS_PCH_SPLIT(dev)) | ||
| 5243 | return; | ||
| 5244 | |||
| 5245 | /* Who knows what state these registers were left in by the BIOS or | ||
| 5246 | * grub? | ||
| 5247 | * | ||
| 5248 | * If we leave the registers in a conflicting state (e.g. with the | ||
| 5249 | * display plane reading from the other pipe than the one we intend | ||
| 5250 | * to use) then when we attempt to teardown the active mode, we will | ||
| 5251 | * not disable the pipes and planes in the correct order -- leaving | ||
| 5252 | * a plane reading from a disabled pipe and possibly leading to | ||
| 5253 | * undefined behaviour. | ||
| 5254 | */ | ||
| 5255 | |||
| 5256 | reg = DSPCNTR(plane); | ||
