diff options
Diffstat (limited to 'drivers/gpu/drm/i915')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 14 | 
3 files changed, 49 insertions, 17 deletions
| diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index c3afb783cb9d..03c53fcf8653 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3028,6 +3028,20 @@ | |||
| 3028 | #define DISP_TILE_SURFACE_SWIZZLING (1<<13) | 3028 | #define DISP_TILE_SURFACE_SWIZZLING (1<<13) | 
| 3029 | #define DISP_FBC_WM_DIS (1<<15) | 3029 | #define DISP_FBC_WM_DIS (1<<15) | 
| 3030 | 3030 | ||
| 3031 | /* GEN7 chicken */ | ||
| 3032 | #define GEN7_COMMON_SLICE_CHICKEN1 0x7010 | ||
| 3033 | # define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) | ||
| 3034 | |||
| 3035 | #define GEN7_L3CNTLREG1 0xB01C | ||
| 3036 | #define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C4FFF8C | ||
| 3037 | |||
| 3038 | #define GEN7_L3_CHICKEN_MODE_REGISTER 0xB030 | ||
| 3039 | #define GEN7_WA_L3_CHICKEN_MODE 0x20000000 | ||
| 3040 | |||
| 3041 | /* WaCatErrorRejectionIssue */ | ||
| 3042 | #define GEN7_SQ_CHICKEN_MBCUNIT_CONFIG 0x9030 | ||
| 3043 | #define GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB (1<<11) | ||
| 3044 | |||
| 3031 | /* PCH */ | 3045 | /* PCH */ | 
| 3032 | 3046 | ||
| 3033 | /* south display engine interrupt */ | 3047 | /* south display engine interrupt */ | 
| @@ -3618,6 +3632,7 @@ | |||
| 3618 | #define GT_FIFO_NUM_RESERVED_ENTRIES 20 | 3632 | #define GT_FIFO_NUM_RESERVED_ENTRIES 20 | 
| 3619 | 3633 | ||
| 3620 | #define GEN6_UCGCTL2 0x9404 | 3634 | #define GEN6_UCGCTL2 0x9404 | 
| 3635 | # define GEN6_RCZUNIT_CLOCK_GATE_DISABLE (1 << 13) | ||
| 3621 | # define GEN6_RCPBUNIT_CLOCK_GATE_DISABLE (1 << 12) | 3636 | # define GEN6_RCPBUNIT_CLOCK_GATE_DISABLE (1 << 12) | 
| 3622 | # define GEN6_RCCUNIT_CLOCK_GATE_DISABLE (1 << 11) | 3637 | # define GEN6_RCCUNIT_CLOCK_GATE_DISABLE (1 << 11) | 
| 3623 | 3638 | ||
| diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 00fbff5ddd81..f851db7be2cc 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -4680,8 +4680,17 @@ sandybridge_compute_sprite_srwm(struct drm_device *dev, int plane, | |||
| 4680 | 4680 | ||
| 4681 | crtc = intel_get_crtc_for_plane(dev, plane); | 4681 | crtc = intel_get_crtc_for_plane(dev, plane); | 
| 4682 | clock = crtc->mode.clock; | 4682 | clock = crtc->mode.clock; | 
| 4683 | if (!clock) { | ||
| 4684 | *sprite_wm = 0; | ||
| 4685 | return false; | ||
| 4686 | } | ||
| 4683 | 4687 | ||
| 4684 | line_time_us = (sprite_width * 1000) / clock; | 4688 | line_time_us = (sprite_width * 1000) / clock; | 
| 4689 | if (!line_time_us) { | ||
| 4690 | *sprite_wm = 0; | ||
| 4691 | return false; | ||
| 4692 | } | ||
| 4693 | |||
| 4685 | line_count = (latency_ns / line_time_us + 1000) / 1000; | 4694 | line_count = (latency_ns / line_time_us + 1000) / 1000; | 
| 4686 | line_size = sprite_width * pixel_size; | 4695 | line_size = sprite_width * pixel_size; | 
| 4687 | 4696 | ||
| @@ -6175,7 +6184,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc) | |||
| 6175 | int i; | 6184 | int i; | 
| 6176 | 6185 | ||
| 6177 | /* The clocks have to be on to load the palette. */ | 6186 | /* The clocks have to be on to load the palette. */ | 
| 6178 | if (!crtc->enabled) | 6187 | if (!crtc->enabled || !intel_crtc->active) | 
| 6179 | return; | 6188 | return; | 
| 6180 | 6189 | ||
| 6181 | /* use legacy palette for Ironlake */ | 6190 | /* use legacy palette for Ironlake */ | 
| @@ -6561,7 +6570,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev, | |||
| 6561 | mode_cmd.height = mode->vdisplay; | 6570 | mode_cmd.height = mode->vdisplay; | 
| 6562 | mode_cmd.pitches[0] = intel_framebuffer_pitch_for_width(mode_cmd.width, | 6571 | mode_cmd.pitches[0] = intel_framebuffer_pitch_for_width(mode_cmd.width, | 
| 6563 | bpp); | 6572 | bpp); | 
| 6564 | mode_cmd.pixel_format = 0; | 6573 | mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth); | 
| 6565 | 6574 | ||
| 6566 | return intel_framebuffer_create(dev, &mode_cmd, obj); | 6575 | return intel_framebuffer_create(dev, &mode_cmd, obj); | 
| 6567 | } | 6576 | } | 
| @@ -8184,8 +8193,8 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
| 8184 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 8193 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 
| 8185 | 8194 | ||
| 8186 | if (intel_enable_rc6(dev_priv->dev)) | 8195 | if (intel_enable_rc6(dev_priv->dev)) | 
| 8187 | rc6_mask = GEN6_RC_CTL_RC6p_ENABLE | | 8196 | rc6_mask = GEN6_RC_CTL_RC6_ENABLE | | 
| 8188 | GEN6_RC_CTL_RC6_ENABLE; | 8197 | ((IS_GEN7(dev_priv->dev)) ? GEN6_RC_CTL_RC6p_ENABLE : 0); | 
| 8189 | 8198 | ||
| 8190 | I915_WRITE(GEN6_RC_CONTROL, | 8199 | I915_WRITE(GEN6_RC_CONTROL, | 
| 8191 | rc6_mask | | 8200 | rc6_mask | | 
| @@ -8463,12 +8472,32 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
| 8463 | I915_WRITE(WM2_LP_ILK, 0); | 8472 | I915_WRITE(WM2_LP_ILK, 0); | 
| 8464 | I915_WRITE(WM1_LP_ILK, 0); | 8473 | I915_WRITE(WM1_LP_ILK, 0); | 
| 8465 | 8474 | ||
| 8475 | /* According to the spec, bit 13 (RCZUNIT) must be set on IVB. | ||
| 8476 | * This implements the WaDisableRCZUnitClockGating workaround. | ||
| 8477 | */ | ||
| 8478 | I915_WRITE(GEN6_UCGCTL2, GEN6_RCZUNIT_CLOCK_GATE_DISABLE); | ||
| 8479 | |||
| 8466 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); | 8480 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); | 
| 8467 | 8481 | ||
| 8468 | I915_WRITE(IVB_CHICKEN3, | 8482 | I915_WRITE(IVB_CHICKEN3, | 
| 8469 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | | 8483 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | | 
| 8470 | CHICKEN3_DGMG_DONE_FIX_DISABLE); | 8484 | CHICKEN3_DGMG_DONE_FIX_DISABLE); | 
| 8471 | 8485 | ||
| 8486 | /* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */ | ||
| 8487 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, | ||
| 8488 | GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); | ||
| 8489 | |||
| 8490 | /* WaApplyL3ControlAndL3ChickenMode requires those two on Ivy Bridge */ | ||
| 8491 | I915_WRITE(GEN7_L3CNTLREG1, | ||
| 8492 | GEN7_WA_FOR_GEN7_L3_CONTROL); | ||
| 8493 | I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, | ||
| 8494 | GEN7_WA_L3_CHICKEN_MODE); | ||
| 8495 | |||
| 8496 | /* This is required by WaCatErrorRejectionIssue */ | ||
| 8497 | I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, | ||
| 8498 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | | ||
| 8499 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); | ||
| 8500 | |||
| 8472 | for_each_pipe(pipe) { | 8501 | for_each_pipe(pipe) { | 
| 8473 | I915_WRITE(DSPCNTR(pipe), | 8502 | I915_WRITE(DSPCNTR(pipe), | 
| 8474 | I915_READ(DSPCNTR(pipe)) | | 8503 | I915_READ(DSPCNTR(pipe)) | | 
| diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 1ab842c6032e..536191540b03 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -301,7 +301,7 @@ static int init_ring_common(struct intel_ring_buffer *ring) | |||
| 301 | 301 | ||
| 302 | I915_WRITE_CTL(ring, | 302 | I915_WRITE_CTL(ring, | 
| 303 | ((ring->size - PAGE_SIZE) & RING_NR_PAGES) | 303 | ((ring->size - PAGE_SIZE) & RING_NR_PAGES) | 
| 304 | | RING_REPORT_64K | RING_VALID); | 304 | | RING_VALID); | 
| 305 | 305 | ||
| 306 | /* If the head is still not zero, the ring is dead */ | 306 | /* If the head is still not zero, the ring is dead */ | 
| 307 | if ((I915_READ_CTL(ring) & RING_VALID) == 0 || | 307 | if ((I915_READ_CTL(ring) & RING_VALID) == 0 || | 
| @@ -1132,18 +1132,6 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | |||
| 1132 | struct drm_device *dev = ring->dev; | 1132 | struct drm_device *dev = ring->dev; | 
| 1133 | struct drm_i915_private *dev_priv = dev->dev_private; | 1133 | struct drm_i915_private *dev_priv = dev->dev_private; | 
| 1134 | unsigned long end; | 1134 | unsigned long end; | 
| 1135 | u32 head; | ||
| 1136 | |||
| 1137 | /* If the reported head position has wrapped or hasn't advanced, | ||
| 1138 | * fallback to the slow and accurate path. | ||
| 1139 | */ | ||
| 1140 | head = intel_read_status_page(ring, 4); | ||
| 1141 | if (head > ring->head) { | ||
| 1142 | ring->head = head; | ||
| 1143 | ring->space = ring_space(ring); | ||
| 1144 | if (ring->space >= n) | ||
| 1145 | return 0; | ||
| 1146 | } | ||
| 1147 | 1135 | ||
| 1148 | trace_i915_ring_wait_begin(ring); | 1136 | trace_i915_ring_wait_begin(ring); | 
| 1149 | if (drm_core_check_feature(dev, DRIVER_GEM)) | 1137 | if (drm_core_check_feature(dev, DRIVER_GEM)) | 
