diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-11 14:02:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-11 14:02:51 -0400 |
commit | 9cb1680c20037e54f202956adabc446c499b9b1e (patch) | |
tree | f7fc0f6f89db3b8e15f1c3cfa3b61e94de734fed | |
parent | 2278cb0bb3a177d3a3ef0bd332916180cb2f2121 (diff) | |
parent | 2d28b633c3fa8f53b919a5de86eb1c8e78dde818 (diff) |
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"A bunch of fixes for radeon, intel, omap and one amdkfd fix.
Radeon fixes are all over, but it does fix some cursor corruption
across suspend/resume. i915 should fix the second warn you were
seeing, so let us know if not. omap is a bunch of small fixes"
* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (28 commits)
drm/radeon: disable vce init on cayman (v2)
drm/amdgpu: fix timeout calculation
drm/radeon: check if BO_VA is set before adding it to the invalidation list
drm/radeon: allways add the VM clear duplicate
Revert "Revert "drm/radeon: dont switch vt on suspend""
drm/radeon: Fold radeon_set_cursor() into radeon_show_cursor()
drm/radeon: unpin cursor BOs on suspend and pin them again on resume (v2)
drm/radeon: Clean up reference counting and pinning of the cursor BOs
drm/amdkfd: validate pdd where it acquired first
Revert "drm/i915: Allocate context objects from stolen"
drm/i915: Declare the swizzling unknown for L-shaped configurations
drm/radeon: fix underflow in r600_cp_dispatch_texture()
drm/radeon: default to 2048 MB GART size on SI+
drm/radeon: fix HDP flushing
drm/radeon: use RCU query for GEM_BUSY syscall
drm/amdgpu: Handle irqs only based on irq ring, not irq status regs.
drm/radeon: Handle irqs only based on irq ring, not irq status regs.
drm/i915: Use crtc_state->active in primary check_plane func
drm/i915: Check crtc->active in intel_crtc_disable_planes
drm/i915: Restore all GGTT VMAs on resume
...
27 files changed, 964 insertions, 717 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 975edb1000a2..ae43b58c9733 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -352,7 +352,7 @@ unsigned long amdgpu_gem_timeout(uint64_t timeout_ns) | |||
352 | if (((int64_t)timeout_ns) < 0) | 352 | if (((int64_t)timeout_ns) < 0) |
353 | return MAX_SCHEDULE_TIMEOUT; | 353 | return MAX_SCHEDULE_TIMEOUT; |
354 | 354 | ||
355 | timeout = ktime_sub_ns(ktime_get(), timeout_ns); | 355 | timeout = ktime_sub(ns_to_ktime(timeout_ns), ktime_get()); |
356 | if (ktime_to_ns(timeout) < 0) | 356 | if (ktime_to_ns(timeout) < 0) |
357 | return 0; | 357 | return 0; |
358 | 358 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index 5cde635978f9..6e77964f1b64 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | |||
@@ -3403,19 +3403,25 @@ static int dce_v10_0_crtc_irq(struct amdgpu_device *adev, | |||
3403 | 3403 | ||
3404 | switch (entry->src_data) { | 3404 | switch (entry->src_data) { |
3405 | case 0: /* vblank */ | 3405 | case 0: /* vblank */ |
3406 | if (disp_int & interrupt_status_offsets[crtc].vblank) { | 3406 | if (disp_int & interrupt_status_offsets[crtc].vblank) |
3407 | dce_v10_0_crtc_vblank_int_ack(adev, crtc); | 3407 | dce_v10_0_crtc_vblank_int_ack(adev, crtc); |
3408 | if (amdgpu_irq_enabled(adev, source, irq_type)) { | 3408 | else |
3409 | drm_handle_vblank(adev->ddev, crtc); | 3409 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
3410 | } | 3410 | |
3411 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); | 3411 | if (amdgpu_irq_enabled(adev, source, irq_type)) { |
3412 | drm_handle_vblank(adev->ddev, crtc); | ||
3412 | } | 3413 | } |
3414 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); | ||
3415 | |||
3413 | break; | 3416 | break; |
3414 | case 1: /* vline */ | 3417 | case 1: /* vline */ |
3415 | if (disp_int & interrupt_status_offsets[crtc].vline) { | 3418 | if (disp_int & interrupt_status_offsets[crtc].vline) |
3416 | dce_v10_0_crtc_vline_int_ack(adev, crtc); | 3419 | dce_v10_0_crtc_vline_int_ack(adev, crtc); |
3417 | DRM_DEBUG("IH: D%d vline\n", crtc + 1); | 3420 | else |
3418 | } | 3421 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
3422 | |||
3423 | DRM_DEBUG("IH: D%d vline\n", crtc + 1); | ||
3424 | |||
3419 | break; | 3425 | break; |
3420 | default: | 3426 | default: |
3421 | DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); | 3427 | DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); |
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index 95efd98b202d..7f7abb0e0be5 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | |||
@@ -3402,19 +3402,25 @@ static int dce_v11_0_crtc_irq(struct amdgpu_device *adev, | |||
3402 | 3402 | ||
3403 | switch (entry->src_data) { | 3403 | switch (entry->src_data) { |
3404 | case 0: /* vblank */ | 3404 | case 0: /* vblank */ |
3405 | if (disp_int & interrupt_status_offsets[crtc].vblank) { | 3405 | if (disp_int & interrupt_status_offsets[crtc].vblank) |
3406 | dce_v11_0_crtc_vblank_int_ack(adev, crtc); | 3406 | dce_v11_0_crtc_vblank_int_ack(adev, crtc); |
3407 | if (amdgpu_irq_enabled(adev, source, irq_type)) { | 3407 | else |
3408 | drm_handle_vblank(adev->ddev, crtc); | 3408 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
3409 | } | 3409 | |
3410 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); | 3410 | if (amdgpu_irq_enabled(adev, source, irq_type)) { |
3411 | drm_handle_vblank(adev->ddev, crtc); | ||
3411 | } | 3412 | } |
3413 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); | ||
3414 | |||
3412 | break; | 3415 | break; |
3413 | case 1: /* vline */ | 3416 | case 1: /* vline */ |
3414 | if (disp_int & interrupt_status_offsets[crtc].vline) { | 3417 | if (disp_int & interrupt_status_offsets[crtc].vline) |
3415 | dce_v11_0_crtc_vline_int_ack(adev, crtc); | 3418 | dce_v11_0_crtc_vline_int_ack(adev, crtc); |
3416 | DRM_DEBUG("IH: D%d vline\n", crtc + 1); | 3419 | else |
3417 | } | 3420 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
3421 | |||
3422 | DRM_DEBUG("IH: D%d vline\n", crtc + 1); | ||
3423 | |||
3418 | break; | 3424 | break; |
3419 | default: | 3425 | default: |
3420 | DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); | 3426 | DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); |
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index aaca8d663f2c..08387dfd98a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | |||
@@ -3237,19 +3237,25 @@ static int dce_v8_0_crtc_irq(struct amdgpu_device *adev, | |||
3237 | 3237 | ||
3238 | switch (entry->src_data) { | 3238 | switch (entry->src_data) { |
3239 | case 0: /* vblank */ | 3239 | case 0: /* vblank */ |
3240 | if (disp_int & interrupt_status_offsets[crtc].vblank) { | 3240 | if (disp_int & interrupt_status_offsets[crtc].vblank) |
3241 | WREG32(mmLB_VBLANK_STATUS + crtc_offsets[crtc], LB_VBLANK_STATUS__VBLANK_ACK_MASK); | 3241 | WREG32(mmLB_VBLANK_STATUS + crtc_offsets[crtc], LB_VBLANK_STATUS__VBLANK_ACK_MASK); |
3242 | if (amdgpu_irq_enabled(adev, source, irq_type)) { | 3242 | else |
3243 | drm_handle_vblank(adev->ddev, crtc); | 3243 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
3244 | } | 3244 | |
3245 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); | 3245 | if (amdgpu_irq_enabled(adev, source, irq_type)) { |
3246 | drm_handle_vblank(adev->ddev, crtc); | ||
3246 | } | 3247 | } |
3248 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); | ||
3249 | |||
3247 | break; | 3250 | break; |
3248 | case 1: /* vline */ | 3251 | case 1: /* vline */ |
3249 | if (disp_int & interrupt_status_offsets[crtc].vline) { | 3252 | if (disp_int & interrupt_status_offsets[crtc].vline) |
3250 | WREG32(mmLB_VLINE_STATUS + crtc_offsets[crtc], LB_VLINE_STATUS__VLINE_ACK_MASK); | 3253 | WREG32(mmLB_VLINE_STATUS + crtc_offsets[crtc], LB_VLINE_STATUS__VLINE_ACK_MASK); |
3251 | DRM_DEBUG("IH: D%d vline\n", crtc + 1); | 3254 | else |
3252 | } | 3255 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
3256 | |||
3257 | DRM_DEBUG("IH: D%d vline\n", crtc + 1); | ||
3258 | |||
3253 | break; | 3259 | break; |
3254 | default: | 3260 | default: |
3255 | DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); | 3261 | DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index 8a1f999daa24..9be007081b72 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c | |||
@@ -420,6 +420,12 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid) | |||
420 | pqm_uninit(&p->pqm); | 420 | pqm_uninit(&p->pqm); |
421 | 421 | ||
422 | pdd = kfd_get_process_device_data(dev, p); | 422 | pdd = kfd_get_process_device_data(dev, p); |
423 | |||
424 | if (!pdd) { | ||
425 | mutex_unlock(&p->mutex); | ||
426 | return; | ||
427 | } | ||
428 | |||
423 | if (pdd->reset_wavefronts) { | 429 | if (pdd->reset_wavefronts) { |
424 | dbgdev_wave_reset_wavefronts(pdd->dev, p); | 430 | dbgdev_wave_reset_wavefronts(pdd->dev, p); |
425 | pdd->reset_wavefronts = false; | 431 | pdd->reset_wavefronts = false; |
@@ -431,8 +437,7 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid) | |||
431 | * We don't call amd_iommu_unbind_pasid() here | 437 | * We don't call amd_iommu_unbind_pasid() here |
432 | * because the IOMMU called us. | 438 | * because the IOMMU called us. |
433 | */ | 439 | */ |
434 | if (pdd) | 440 | pdd->bound = false; |
435 | pdd->bound = false; | ||
436 | 441 | ||
437 | mutex_unlock(&p->mutex); | 442 | mutex_unlock(&p->mutex); |
438 | } | 443 | } |
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 8867818b1401..d65cbe6afb92 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -157,9 +157,7 @@ i915_gem_alloc_context_obj(struct drm_device *dev, size_t size) | |||
157 | struct drm_i915_gem_object *obj; | 157 | struct drm_i915_gem_object *obj; |
158 | int ret; | 158 | int ret; |
159 | 159 | ||
160 | obj = i915_gem_object_create_stolen(dev, size); | 160 | obj = i915_gem_alloc_object(dev, size); |
161 | if (obj == NULL) | ||
162 | obj = i915_gem_alloc_object(dev, size); | ||
163 | if (obj == NULL) | 161 | if (obj == NULL) |
164 | return ERR_PTR(-ENOMEM); | 162 | return ERR_PTR(-ENOMEM); |
165 | 163 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 9daa2883ac18..dcc6a88c560e 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -2546,6 +2546,8 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) | |||
2546 | struct drm_i915_private *dev_priv = dev->dev_private; | 2546 | struct drm_i915_private *dev_priv = dev->dev_private; |
2547 | struct drm_i915_gem_object *obj; | 2547 | struct drm_i915_gem_object *obj; |
2548 | struct i915_address_space *vm; | 2548 | struct i915_address_space *vm; |
2549 | struct i915_vma *vma; | ||
2550 | bool flush; | ||
2549 | 2551 | ||
2550 | i915_check_and_clear_faults(dev); | 2552 | i915_check_and_clear_faults(dev); |
2551 | 2553 | ||
@@ -2555,16 +2557,23 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) | |||
2555 | dev_priv->gtt.base.total, | 2557 | dev_priv->gtt.base.total, |
2556 | true); | 2558 | true); |
2557 | 2559 | ||
2560 | /* Cache flush objects bound into GGTT and rebind them. */ | ||
2561 | vm = &dev_priv->gtt.base; | ||
2558 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { | 2562 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { |
2559 | struct i915_vma *vma = i915_gem_obj_to_vma(obj, | 2563 | flush = false; |
2560 | &dev_priv->gtt.base); | 2564 | list_for_each_entry(vma, &obj->vma_list, vma_link) { |
2561 | if (!vma) | 2565 | if (vma->vm != vm) |
2562 | continue; | 2566 | continue; |
2563 | 2567 | ||
2564 | i915_gem_clflush_object(obj, obj->pin_display); | 2568 | WARN_ON(i915_vma_bind(vma, obj->cache_level, |
2565 | WARN_ON(i915_vma_bind(vma, obj->cache_level, PIN_UPDATE)); | 2569 | PIN_UPDATE)); |
2566 | } | ||
2567 | 2570 | ||
2571 | flush = true; | ||
2572 | } | ||
2573 | |||
2574 | if (flush) | ||
2575 | i915_gem_clflush_object(obj, obj->pin_display); | ||
2576 | } | ||
2568 | 2577 | ||
2569 | if (INTEL_INFO(dev)->gen >= 8) { | 2578 | if (INTEL_INFO(dev)->gen >= 8) { |
2570 | if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev)) | 2579 | if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev)) |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 633bd1fcab69..d61e74a08f82 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
@@ -183,8 +183,18 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
183 | if (IS_GEN4(dev)) { | 183 | if (IS_GEN4(dev)) { |
184 | uint32_t ddc2 = I915_READ(DCC2); | 184 | uint32_t ddc2 = I915_READ(DCC2); |
185 | 185 | ||
186 | if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) | 186 | if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) { |
187 | /* Since the swizzling may vary within an | ||
188 | * object, we have no idea what the swizzling | ||
189 | * is for any page in particular. Thus we | ||
190 | * cannot migrate tiled pages using the GPU, | ||
191 | * nor can we tell userspace what the exact | ||
192 | * swizzling is for any object. | ||
193 | */ | ||
187 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; | 194 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; |
195 | swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; | ||
196 | swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; | ||
197 | } | ||
188 | } | 198 | } |
189 | 199 | ||
190 | if (dcc == 0xffffffff) { | 200 | if (dcc == 0xffffffff) { |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 1b61f9810387..ba9321998a41 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -4854,6 +4854,9 @@ static void intel_crtc_disable_planes(struct drm_crtc *crtc) | |||
4854 | struct intel_plane *intel_plane; | 4854 | struct intel_plane *intel_plane; |
4855 | int pipe = intel_crtc->pipe; | 4855 | int pipe = intel_crtc->pipe; |
4856 | 4856 | ||
4857 | if (!intel_crtc->active) | ||
4858 | return; | ||
4859 | |||
4857 | intel_crtc_wait_for_pending_flips(crtc); | 4860 | intel_crtc_wait_for_pending_flips(crtc); |
4858 | 4861 | ||
4859 | intel_pre_disable_primary(crtc); | 4862 | intel_pre_disable_primary(crtc); |
@@ -7887,7 +7890,7 @@ static void chv_crtc_clock_get(struct intel_crtc *crtc, | |||
7887 | int pipe = pipe_config->cpu_transcoder; | 7890 | int pipe = pipe_config->cpu_transcoder; |
7888 | enum dpio_channel port = vlv_pipe_to_channel(pipe); | 7891 | enum dpio_channel port = vlv_pipe_to_channel(pipe); |
7889 | intel_clock_t clock; | 7892 | intel_clock_t clock; |
7890 | u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2; | 7893 | u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2, pll_dw3; |
7891 | int refclk = 100000; | 7894 | int refclk = 100000; |
7892 | 7895 | ||
7893 | mutex_lock(&dev_priv->sb_lock); | 7896 | mutex_lock(&dev_priv->sb_lock); |
@@ -7895,10 +7898,13 @@ static void chv_crtc_clock_get(struct intel_crtc *crtc, | |||
7895 | pll_dw0 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW0(port)); | 7898 | pll_dw0 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW0(port)); |
7896 | pll_dw1 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW1(port)); | 7899 | pll_dw1 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW1(port)); |
7897 | pll_dw2 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW2(port)); | 7900 | pll_dw2 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW2(port)); |
7901 | pll_dw3 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port)); | ||
7898 | mutex_unlock(&dev_priv->sb_lock); | 7902 | mutex_unlock(&dev_priv->sb_lock); |
7899 | 7903 | ||
7900 | clock.m1 = (pll_dw1 & 0x7) == DPIO_CHV_M1_DIV_BY_2 ? 2 : 0; | 7904 | clock.m1 = (pll_dw1 & 0x7) == DPIO_CHV_M1_DIV_BY_2 ? 2 : 0; |
7901 | clock.m2 = ((pll_dw0 & 0xff) << 22) | (pll_dw2 & 0x3fffff); | 7905 | clock.m2 = (pll_dw0 & 0xff) << 22; |
7906 | if (pll_dw3 & DPIO_CHV_FRAC_DIV_EN) | ||
7907 | clock.m2 |= pll_dw2 & 0x3fffff; | ||
7902 | clock.n = (pll_dw1 >> DPIO_CHV_N_DIV_SHIFT) & 0xf; | 7908 | clock.n = (pll_dw1 >> DPIO_CHV_N_DIV_SHIFT) & 0xf; |
7903 | clock.p1 = (cmn_dw13 >> DPIO_CHV_P1_DIV_SHIFT) & 0x7; | 7909 | clock.p1 = (cmn_dw13 >> DPIO_CHV_P1_DIV_SHIFT) & 0x7; |
7904 | clock.p2 = (cmn_dw13 >> DPIO_CHV_P2_DIV_SHIFT) & 0x1f; | 7910 | clock.p2 = (cmn_dw13 >> DPIO_CHV_P2_DIV_SHIFT) & 0x1f; |
@@ -13270,7 +13276,7 @@ intel_check_primary_plane(struct drm_plane *plane, | |||
13270 | if (ret) | 13276 | if (ret) |
13271 | return ret; | 13277 | return ret; |
13272 | 13278 | ||
13273 | if (intel_crtc->active) { | 13279 | if (crtc_state->base.active) { |
13274 | struct intel_plane_state *old_state = | 13280 | struct intel_plane_state *old_state = |
13275 | to_intel_plane_state(plane->state); | 13281 | to_intel_plane_state(plane->state); |
13276 | 13282 | ||
diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c index f2daad8c3d96..7841970de48d 100644 --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | |||
@@ -285,7 +285,7 @@ static int dmm_txn_commit(struct dmm_txn *txn, bool wait) | |||
285 | 285 | ||
286 | if (wait) { | 286 | if (wait) { |
287 | if (!wait_for_completion_timeout(&engine->compl, | 287 | if (!wait_for_completion_timeout(&engine->compl, |
288 | msecs_to_jiffies(1))) { | 288 | msecs_to_jiffies(100))) { |
289 | dev_err(dmm->dev, "timed out waiting for done\n"); | 289 | dev_err(dmm->dev, "timed out waiting for done\n"); |
290 | ret = -ETIMEDOUT; | 290 | ret = -ETIMEDOUT; |
291 | } | 291 | } |
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h index ae2df41f216f..12081e61d45a 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h | |||
@@ -177,7 +177,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, | |||
177 | struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); | 177 | struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); |
178 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p); | 178 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p); |
179 | int omap_framebuffer_pin(struct drm_framebuffer *fb); | 179 | int omap_framebuffer_pin(struct drm_framebuffer *fb); |
180 | int omap_framebuffer_unpin(struct drm_framebuffer *fb); | 180 | void omap_framebuffer_unpin(struct drm_framebuffer *fb); |
181 | void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, | 181 | void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, |
182 | struct omap_drm_window *win, struct omap_overlay_info *info); | 182 | struct omap_drm_window *win, struct omap_overlay_info *info); |
183 | struct drm_connector *omap_framebuffer_get_next_connector( | 183 | struct drm_connector *omap_framebuffer_get_next_connector( |
@@ -211,7 +211,7 @@ void omap_gem_dma_sync(struct drm_gem_object *obj, | |||
211 | enum dma_data_direction dir); | 211 | enum dma_data_direction dir); |
212 | int omap_gem_get_paddr(struct drm_gem_object *obj, | 212 | int omap_gem_get_paddr(struct drm_gem_object *obj, |
213 | dma_addr_t *paddr, bool remap); | 213 | dma_addr_t *paddr, bool remap); |
214 | int omap_gem_put_paddr(struct drm_gem_object *obj); | 214 | void omap_gem_put_paddr(struct drm_gem_object *obj); |
215 | int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages, | 215 | int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages, |
216 | bool remap); | 216 | bool remap); |
217 | int omap_gem_put_pages(struct drm_gem_object *obj); | 217 | int omap_gem_put_pages(struct drm_gem_object *obj); |
@@ -236,7 +236,7 @@ static inline int align_pitch(int pitch, int width, int bpp) | |||
236 | /* PVR needs alignment to 8 pixels.. right now that is the most | 236 | /* PVR needs alignment to 8 pixels.. right now that is the most |
237 | * restrictive stride requirement.. | 237 | * restrictive stride requirement.. |
238 | */ | 238 | */ |
239 | return ALIGN(pitch, 8 * bytespp); | 239 | return roundup(pitch, 8 * bytespp); |
240 | } | 240 | } |
241 | 241 | ||
242 | /* map crtc to vblank mask */ | 242 | /* map crtc to vblank mask */ |
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index 0b967e76df1a..51b1219af87f 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c | |||
@@ -287,10 +287,10 @@ fail: | |||
287 | } | 287 | } |
288 | 288 | ||
289 | /* unpin, no longer being scanned out: */ | 289 | /* unpin, no longer being scanned out: */ |
290 | int omap_framebuffer_unpin(struct drm_framebuffer *fb) | 290 | void omap_framebuffer_unpin(struct drm_framebuffer *fb) |
291 | { | 291 | { |
292 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); | 292 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); |
293 | int ret, i, n = drm_format_num_planes(fb->pixel_format); | 293 | int i, n = drm_format_num_planes(fb->pixel_format); |
294 | 294 | ||
295 | mutex_lock(&omap_fb->lock); | 295 | mutex_lock(&omap_fb->lock); |
296 | 296 | ||
@@ -298,24 +298,16 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) | |||
298 | 298 | ||
299 | if (omap_fb->pin_count > 0) { | 299 | if (omap_fb->pin_count > 0) { |
300 | mutex_unlock(&omap_fb->lock); | 300 | mutex_unlock(&omap_fb->lock); |
301 | return 0; | 301 | return; |
302 | } | 302 | } |
303 | 303 | ||
304 | for (i = 0; i < n; i++) { | 304 | for (i = 0; i < n; i++) { |
305 | struct plane *plane = &omap_fb->planes[i]; | 305 | struct plane *plane = &omap_fb->planes[i]; |
306 | ret = omap_gem_put_paddr(plane->bo); | 306 | omap_gem_put_paddr(plane->bo); |
307 | if (ret) | ||
308 | goto fail; | ||
309 | plane->paddr = 0; | 307 | plane->paddr = 0; |
310 | } | 308 | } |
311 | 309 | ||
312 | mutex_unlock(&omap_fb->lock); | 310 | mutex_unlock(&omap_fb->lock); |
313 | |||
314 | return 0; | ||
315 | |||
316 | fail: | ||
317 | mutex_unlock(&omap_fb->lock); | ||
318 | return ret; | ||
319 | } | 311 | } |
320 | 312 | ||
321 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) | 313 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) |
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c index 23b5a84389e3..720d16bce7e8 100644 --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c | |||
@@ -135,7 +135,7 @@ static int omap_fbdev_create(struct drm_fb_helper *helper, | |||
135 | fbdev->ywrap_enabled = priv->has_dmm && ywrap_enabled; | 135 | fbdev->ywrap_enabled = priv->has_dmm && ywrap_enabled; |
136 | if (fbdev->ywrap_enabled) { | 136 | if (fbdev->ywrap_enabled) { |
137 | /* need to align pitch to page size if using DMM scrolling */ | 137 | /* need to align pitch to page size if using DMM scrolling */ |
138 | mode_cmd.pitches[0] = ALIGN(mode_cmd.pitches[0], PAGE_SIZE); | 138 | mode_cmd.pitches[0] = PAGE_ALIGN(mode_cmd.pitches[0]); |
139 | } | 139 | } |
140 | 140 | ||
141 | /* allocate backing bo */ | 141 | /* allocate backing bo */ |
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index 2ab77801cf5f..7ed08fdc4c42 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c | |||
@@ -808,10 +808,10 @@ fail: | |||
808 | /* Release physical address, when DMA is no longer being performed.. this | 808 | /* Release physical address, when DMA is no longer being performed.. this |
809 | * could potentially unpin and unmap buffers from TILER | 809 | * could potentially unpin and unmap buffers from TILER |
810 | */ | 810 | */ |
811 | int omap_gem_put_paddr(struct drm_gem_object *obj) | 811 | void omap_gem_put_paddr(struct drm_gem_object *obj) |
812 | { | 812 | { |
813 | struct omap_gem_object *omap_obj = to_omap_bo(obj); | 813 | struct omap_gem_object *omap_obj = to_omap_bo(obj); |
814 | int ret = 0; | 814 | int ret; |
815 | 815 | ||
816 | mutex_lock(&obj->dev->struct_mutex); | 816 | mutex_lock(&obj->dev->struct_mutex); |
817 | if (omap_obj->paddr_cnt > 0) { | 817 | if (omap_obj->paddr_cnt > 0) { |
@@ -821,7 +821,6 @@ int omap_gem_put_paddr(struct drm_gem_object *obj) | |||
821 | if (ret) { | 821 | if (ret) { |
822 | dev_err(obj->dev->dev, | 822 | dev_err(obj->dev->dev, |
823 | "could not unpin pages: %d\n", ret); | 823 | "could not unpin pages: %d\n", ret); |
824 | goto fail; | ||
825 | } | 824 | } |
826 | ret = tiler_release(omap_obj->block); | 825 | ret = tiler_release(omap_obj->block); |
827 | if (ret) { | 826 | if (ret) { |
@@ -832,9 +831,8 @@ int omap_gem_put_paddr(struct drm_gem_object *obj) | |||
832 | omap_obj->block = NULL; | 831 | omap_obj->block = NULL; |
833 | } | 832 | } |
834 | } | 833 | } |
835 | fail: | 834 | |
836 | mutex_unlock(&obj->dev->struct_mutex); | 835 | mutex_unlock(&obj->dev->struct_mutex); |
837 | return ret; | ||
838 | } | 836 | } |
839 | 837 | ||
840 | /* Get rotated scanout address (only valid if already pinned), at the | 838 | /* Get rotated scanout address (only valid if already pinned), at the |
@@ -1378,11 +1376,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
1378 | 1376 | ||
1379 | omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); | 1377 | omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); |
1380 | if (!omap_obj) | 1378 | if (!omap_obj) |
1381 | goto fail; | 1379 | return NULL; |
1382 | |||
1383 | spin_lock(&priv->list_lock); | ||
1384 | list_add(&omap_obj->mm_list, &priv->obj_list); | ||
1385 | spin_unlock(&priv->list_lock); | ||
1386 | 1380 | ||
1387 | obj = &omap_obj->base; | 1381 | obj = &omap_obj->base; |
1388 | 1382 | ||
@@ -1392,11 +1386,19 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
1392 | */ | 1386 | */ |
1393 | omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size, | 1387 | omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size, |
1394 | &omap_obj->paddr, GFP_KERNEL); | 1388 | &omap_obj->paddr, GFP_KERNEL); |
1395 | if (omap_obj->vaddr) | 1389 | if (!omap_obj->vaddr) { |
1396 | flags |= OMAP_BO_DMA; | 1390 | kfree(omap_obj); |
1391 | |||
1392 | return NULL; | ||
1393 | } | ||
1397 | 1394 | ||
1395 | flags |= OMAP_BO_DMA; | ||
1398 | } | 1396 | } |
1399 | 1397 | ||
1398 | spin_lock(&priv->list_lock); | ||
1399 | list_add(&omap_obj->mm_list, &priv->obj_list); | ||
1400 | spin_unlock(&priv->list_lock); | ||
1401 | |||
1400 | omap_obj->flags = flags; | 1402 | omap_obj->flags = flags; |
1401 | 1403 | ||
1402 | if (flags & OMAP_BO_TILED) { | 1404 | if (flags & OMAP_BO_TILED) { |
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c index cfa8276c4deb..098904696a5c 100644 --- a/drivers/gpu/drm/omapdrm/omap_plane.c +++ b/drivers/gpu/drm/omapdrm/omap_plane.c | |||
@@ -17,6 +17,7 @@ | |||
17 | * this program. If not, see <http://www.gnu.org/licenses/>. | 17 | * this program. If not, see <http://www.gnu.org/licenses/>. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <drm/drm_atomic.h> | ||
20 | #include <drm/drm_atomic_helper.h> | 21 | #include <drm/drm_atomic_helper.h> |
21 | #include <drm/drm_plane_helper.h> | 22 | #include <drm/drm_plane_helper.h> |
22 | 23 | ||
@@ -153,9 +154,34 @@ static void omap_plane_atomic_disable(struct drm_plane *plane, | |||
153 | dispc_ovl_enable(omap_plane->id, false); | 154 | dispc_ovl_enable(omap_plane->id, false); |
154 | } | 155 | } |
155 | 156 | ||
157 | static int omap_plane_atomic_check(struct drm_plane *plane, | ||
158 | struct drm_plane_state *state) | ||
159 | { | ||
160 | struct drm_crtc_state *crtc_state; | ||
161 | |||
162 | if (!state->crtc) | ||
163 | return 0; | ||
164 | |||
165 | crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc); | ||
166 | if (IS_ERR(crtc_state)) | ||
167 | return PTR_ERR(crtc_state); | ||
168 | |||
169 | if (state->crtc_x < 0 || state->crtc_y < 0) | ||
170 | return -EINVAL; | ||
171 | |||
172 | if (state->crtc_x + state->crtc_w > crtc_state->adjusted_mode.hdisplay) | ||
173 | return -EINVAL; | ||
174 | |||
175 | if (state->crtc_y + state->crtc_h > crtc_state->adjusted_mode.vdisplay) | ||
176 | return -EINVAL; | ||
177 | |||
178 | return 0; | ||
179 | } | ||
180 | |||
156 | static const struct drm_plane_helper_funcs omap_plane_helper_funcs = { | 181 | static const struct drm_plane_helper_funcs omap_plane_helper_funcs = { |
157 | .prepare_fb = omap_plane_prepare_fb, | 182 | .prepare_fb = omap_plane_prepare_fb, |
158 | .cleanup_fb = omap_plane_cleanup_fb, | 183 | .cleanup_fb = omap_plane_cleanup_fb, |
184 | .atomic_check = omap_plane_atomic_check, | ||
159 | .atomic_update = omap_plane_atomic_update, | 185 | .atomic_update = omap_plane_atomic_update, |
160 | .atomic_disable = omap_plane_atomic_disable, | 186 | .atomic_disable = omap_plane_atomic_disable, |
161 | }; | 187 | }; |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 4ecf5caa8c6d..248953d2fdb7 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -7964,23 +7964,27 @@ restart_ih: | |||
7964 | case 1: /* D1 vblank/vline */ | 7964 | case 1: /* D1 vblank/vline */ |
7965 | switch (src_data) { | 7965 | switch (src_data) { |
7966 | case 0: /* D1 vblank */ | 7966 | case 0: /* D1 vblank */ |
7967 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) { | 7967 | if (!(rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)) |
7968 | if (rdev->irq.crtc_vblank_int[0]) { | 7968 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
7969 | drm_handle_vblank(rdev->ddev, 0); | 7969 | |
7970 | rdev->pm.vblank_sync = true; | 7970 | if (rdev->irq.crtc_vblank_int[0]) { |
7971 | wake_up(&rdev->irq.vblank_queue); | 7971 | drm_handle_vblank(rdev->ddev, 0); |
7972 | } | 7972 | rdev->pm.vblank_sync = true; |
7973 | if (atomic_read(&rdev->irq.pflip[0])) | 7973 | wake_up(&rdev->irq.vblank_queue); |
7974 | radeon_crtc_handle_vblank(rdev, 0); | ||
7975 | rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
7976 | DRM_DEBUG("IH: D1 vblank\n"); | ||
7977 | } | 7974 | } |
7975 | if (atomic_read(&rdev->irq.pflip[0])) | ||
7976 | radeon_crtc_handle_vblank(rdev, 0); | ||
7977 | rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
7978 | DRM_DEBUG("IH: D1 vblank\n"); | ||
7979 | |||
7978 | break; | 7980 | break; |
7979 | case 1: /* D1 vline */ | 7981 | case 1: /* D1 vline */ |
7980 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) { | 7982 | if (!(rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)) |
7981 | rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT; | 7983 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
7982 | DRM_DEBUG("IH: D1 vline\n"); | 7984 | |
7983 | } | 7985 | rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
7986 | DRM_DEBUG("IH: D1 vline\n"); | ||
7987 | |||
7984 | break; | 7988 | break; |
7985 | default: | 7989 | default: |
7986 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 7990 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -7990,23 +7994,27 @@ restart_ih: | |||
7990 | case 2: /* D2 vblank/vline */ | 7994 | case 2: /* D2 vblank/vline */ |
7991 | switch (src_data) { | 7995 | switch (src_data) { |
7992 | case 0: /* D2 vblank */ | 7996 | case 0: /* D2 vblank */ |
7993 | if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT) { | 7997 | if (!(rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT)) |
7994 | if (rdev->irq.crtc_vblank_int[1]) { | 7998 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
7995 | drm_handle_vblank(rdev->ddev, 1); | 7999 | |
7996 | rdev->pm.vblank_sync = true; | 8000 | if (rdev->irq.crtc_vblank_int[1]) { |
7997 | wake_up(&rdev->irq.vblank_queue); | 8001 | drm_handle_vblank(rdev->ddev, 1); |
7998 | } | 8002 | rdev->pm.vblank_sync = true; |
7999 | if (atomic_read(&rdev->irq.pflip[1])) | 8003 | wake_up(&rdev->irq.vblank_queue); |
8000 | radeon_crtc_handle_vblank(rdev, 1); | ||
8001 | rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
8002 | DRM_DEBUG("IH: D2 vblank\n"); | ||
8003 | } | 8004 | } |
8005 | if (atomic_read(&rdev->irq.pflip[1])) | ||
8006 | radeon_crtc_handle_vblank(rdev, 1); | ||
8007 | rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
8008 | DRM_DEBUG("IH: D2 vblank\n"); | ||
8009 | |||
8004 | break; | 8010 | break; |
8005 | case 1: /* D2 vline */ | 8011 | case 1: /* D2 vline */ |
8006 | if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT) { | 8012 | if (!(rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT)) |
8007 | rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; | 8013 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8008 | DRM_DEBUG("IH: D2 vline\n"); | 8014 | |
8009 | } | 8015 | rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; |
8016 | DRM_DEBUG("IH: D2 vline\n"); | ||
8017 | |||
8010 | break; | 8018 | break; |
8011 | default: | 8019 | default: |
8012 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 8020 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -8016,23 +8024,27 @@ restart_ih: | |||
8016 | case 3: /* D3 vblank/vline */ | 8024 | case 3: /* D3 vblank/vline */ |
8017 | switch (src_data) { | 8025 | switch (src_data) { |
8018 | case 0: /* D3 vblank */ | 8026 | case 0: /* D3 vblank */ |
8019 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { | 8027 | if (!(rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)) |
8020 | if (rdev->irq.crtc_vblank_int[2]) { | 8028 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8021 | drm_handle_vblank(rdev->ddev, 2); | 8029 | |
8022 | rdev->pm.vblank_sync = true; | 8030 | if (rdev->irq.crtc_vblank_int[2]) { |
8023 | wake_up(&rdev->irq.vblank_queue); | 8031 | drm_handle_vblank(rdev->ddev, 2); |
8024 | } | 8032 | rdev->pm.vblank_sync = true; |
8025 | if (atomic_read(&rdev->irq.pflip[2])) | 8033 | wake_up(&rdev->irq.vblank_queue); |
8026 | radeon_crtc_handle_vblank(rdev, 2); | ||
8027 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
8028 | DRM_DEBUG("IH: D3 vblank\n"); | ||
8029 | } | 8034 | } |
8035 | if (atomic_read(&rdev->irq.pflip[2])) | ||
8036 | radeon_crtc_handle_vblank(rdev, 2); | ||
8037 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
8038 | DRM_DEBUG("IH: D3 vblank\n"); | ||
8039 | |||
8030 | break; | 8040 | break; |
8031 | case 1: /* D3 vline */ | 8041 | case 1: /* D3 vline */ |
8032 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { | 8042 | if (!(rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)) |
8033 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; | 8043 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8034 | DRM_DEBUG("IH: D3 vline\n"); | 8044 | |
8035 | } | 8045 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; |
8046 | DRM_DEBUG("IH: D3 vline\n"); | ||
8047 | |||
8036 | break; | 8048 | break; |
8037 | default: | 8049 | default: |
8038 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 8050 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -8042,23 +8054,27 @@ restart_ih: | |||
8042 | case 4: /* D4 vblank/vline */ | 8054 | case 4: /* D4 vblank/vline */ |
8043 | switch (src_data) { | 8055 | switch (src_data) { |
8044 | case 0: /* D4 vblank */ | 8056 | case 0: /* D4 vblank */ |
8045 | if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { | 8057 | if (!(rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)) |
8046 | if (rdev->irq.crtc_vblank_int[3]) { | 8058 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8047 | drm_handle_vblank(rdev->ddev, 3); | 8059 | |
8048 | rdev->pm.vblank_sync = true; | 8060 | if (rdev->irq.crtc_vblank_int[3]) { |
8049 | wake_up(&rdev->irq.vblank_queue); | 8061 | drm_handle_vblank(rdev->ddev, 3); |
8050 | } | 8062 | rdev->pm.vblank_sync = true; |
8051 | if (atomic_read(&rdev->irq.pflip[3])) | 8063 | wake_up(&rdev->irq.vblank_queue); |
8052 | radeon_crtc_handle_vblank(rdev, 3); | ||
8053 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
8054 | DRM_DEBUG("IH: D4 vblank\n"); | ||
8055 | } | 8064 | } |
8065 | if (atomic_read(&rdev->irq.pflip[3])) | ||
8066 | radeon_crtc_handle_vblank(rdev, 3); | ||
8067 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
8068 | DRM_DEBUG("IH: D4 vblank\n"); | ||
8069 | |||
8056 | break; | 8070 | break; |
8057 | case 1: /* D4 vline */ | 8071 | case 1: /* D4 vline */ |
8058 | if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { | 8072 | if (!(rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)) |
8059 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; | 8073 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8060 | DRM_DEBUG("IH: D4 vline\n"); | 8074 | |
8061 | } | 8075 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; |
8076 | DRM_DEBUG("IH: D4 vline\n"); | ||
8077 | |||
8062 | break; | 8078 | break; |
8063 | default: | 8079 | default: |
8064 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 8080 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -8068,23 +8084,27 @@ restart_ih: | |||
8068 | case 5: /* D5 vblank/vline */ | 8084 | case 5: /* D5 vblank/vline */ |
8069 | switch (src_data) { | 8085 | switch (src_data) { |
8070 | case 0: /* D5 vblank */ | 8086 | case 0: /* D5 vblank */ |
8071 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { | 8087 | if (!(rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)) |
8072 | if (rdev->irq.crtc_vblank_int[4]) { | 8088 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8073 | drm_handle_vblank(rdev->ddev, 4); | 8089 | |
8074 | rdev->pm.vblank_sync = true; | 8090 | if (rdev->irq.crtc_vblank_int[4]) { |
8075 | wake_up(&rdev->irq.vblank_queue); | 8091 | drm_handle_vblank(rdev->ddev, 4); |
8076 | } | 8092 | rdev->pm.vblank_sync = true; |
8077 | if (atomic_read(&rdev->irq.pflip[4])) | 8093 | wake_up(&rdev->irq.vblank_queue); |
8078 | radeon_crtc_handle_vblank(rdev, 4); | ||
8079 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
8080 | DRM_DEBUG("IH: D5 vblank\n"); | ||
8081 | } | 8094 | } |
8095 | if (atomic_read(&rdev->irq.pflip[4])) | ||
8096 | radeon_crtc_handle_vblank(rdev, 4); | ||
8097 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
8098 | DRM_DEBUG("IH: D5 vblank\n"); | ||
8099 | |||
8082 | break; | 8100 | break; |
8083 | case 1: /* D5 vline */ | 8101 | case 1: /* D5 vline */ |
8084 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { | 8102 | if (!(rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)) |
8085 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; | 8103 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8086 | DRM_DEBUG("IH: D5 vline\n"); | 8104 | |
8087 | } | 8105 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; |
8106 | DRM_DEBUG("IH: D5 vline\n"); | ||
8107 | |||
8088 | break; | 8108 | break; |
8089 | default: | 8109 | default: |
8090 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 8110 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -8094,23 +8114,27 @@ restart_ih: | |||
8094 | case 6: /* D6 vblank/vline */ | 8114 | case 6: /* D6 vblank/vline */ |
8095 | switch (src_data) { | 8115 | switch (src_data) { |
8096 | case 0: /* D6 vblank */ | 8116 | case 0: /* D6 vblank */ |
8097 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { | 8117 | if (!(rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)) |
8098 | if (rdev->irq.crtc_vblank_int[5]) { | 8118 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8099 | drm_handle_vblank(rdev->ddev, 5); | 8119 | |
8100 | rdev->pm.vblank_sync = true; | 8120 | if (rdev->irq.crtc_vblank_int[5]) { |
8101 | wake_up(&rdev->irq.vblank_queue); | 8121 | drm_handle_vblank(rdev->ddev, 5); |
8102 | } | 8122 | rdev->pm.vblank_sync = true; |
8103 | if (atomic_read(&rdev->irq.pflip[5])) | 8123 | wake_up(&rdev->irq.vblank_queue); |
8104 | radeon_crtc_handle_vblank(rdev, 5); | ||
8105 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
8106 | DRM_DEBUG("IH: D6 vblank\n"); | ||
8107 | } | 8124 | } |
8125 | if (atomic_read(&rdev->irq.pflip[5])) | ||
8126 | radeon_crtc_handle_vblank(rdev, 5); | ||
8127 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
8128 | DRM_DEBUG("IH: D6 vblank\n"); | ||
8129 | |||
8108 | break; | 8130 | break; |
8109 | case 1: /* D6 vline */ | 8131 | case 1: /* D6 vline */ |
8110 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { | 8132 | if (!(rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)) |
8111 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; | 8133 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8112 | DRM_DEBUG("IH: D6 vline\n"); | 8134 | |
8113 | } | 8135 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; |
8136 | DRM_DEBUG("IH: D6 vline\n"); | ||
8137 | |||
8114 | break; | 8138 | break; |
8115 | default: | 8139 | default: |
8116 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 8140 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -8130,88 +8154,112 @@ restart_ih: | |||
8130 | case 42: /* HPD hotplug */ | 8154 | case 42: /* HPD hotplug */ |
8131 | switch (src_data) { | 8155 | switch (src_data) { |
8132 | case 0: | 8156 | case 0: |
8133 | if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) { | 8157 | if (!(rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT)) |
8134 | rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT; | 8158 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8135 | queue_hotplug = true; | 8159 | |
8136 | DRM_DEBUG("IH: HPD1\n"); | 8160 | rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT; |
8137 | } | 8161 | queue_hotplug = true; |
8162 | DRM_DEBUG("IH: HPD1\n"); | ||
8163 | |||
8138 | break; | 8164 | break; |
8139 | case 1: | 8165 | case 1: |
8140 | if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) { | 8166 | if (!(rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT)) |
8141 | rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT; | 8167 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8142 | queue_hotplug = true; | 8168 | |
8143 | DRM_DEBUG("IH: HPD2\n"); | 8169 | rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT; |
8144 | } | 8170 | queue_hotplug = true; |
8171 | DRM_DEBUG("IH: HPD2\n"); | ||
8172 | |||
8145 | break; | 8173 | break; |
8146 | case 2: | 8174 | case 2: |
8147 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) { | 8175 | if (!(rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT)) |
8148 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; | 8176 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8149 | queue_hotplug = true; | 8177 | |
8150 | DRM_DEBUG("IH: HPD3\n"); | 8178 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; |
8151 | } | 8179 | queue_hotplug = true; |
8180 | DRM_DEBUG("IH: HPD3\n"); | ||
8181 | |||
8152 | break; | 8182 | break; |
8153 | case 3: | 8183 | case 3: |
8154 | if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) { | 8184 | if (!(rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT)) |
8155 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; | 8185 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8156 | queue_hotplug = true; | 8186 | |
8157 | DRM_DEBUG("IH: HPD4\n"); | 8187 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; |
8158 | } | 8188 | queue_hotplug = true; |
8189 | DRM_DEBUG("IH: HPD4\n"); | ||
8190 | |||
8159 | break; | 8191 | break; |
8160 | case 4: | 8192 | case 4: |
8161 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) { | 8193 | if (!(rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT)) |
8162 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; | 8194 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8163 | queue_hotplug = true; | 8195 | |
8164 | DRM_DEBUG("IH: HPD5\n"); | 8196 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; |
8165 | } | 8197 | queue_hotplug = true; |
8198 | DRM_DEBUG("IH: HPD5\n"); | ||
8199 | |||
8166 | break; | 8200 | break; |
8167 | case 5: | 8201 | case 5: |
8168 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) { | 8202 | if (!(rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT)) |
8169 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; | 8203 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8170 | queue_hotplug = true; | 8204 | |
8171 | DRM_DEBUG("IH: HPD6\n"); | 8205 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; |
8172 | } | 8206 | queue_hotplug = true; |
8207 | DRM_DEBUG("IH: HPD6\n"); | ||
8208 | |||
8173 | break; | 8209 | break; |
8174 | case 6: | 8210 | case 6: |
8175 | if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_RX_INTERRUPT) { | 8211 | if (!(rdev->irq.stat_regs.cik.disp_int & DC_HPD1_RX_INTERRUPT)) |
8176 | rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_RX_INTERRUPT; | 8212 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8177 | queue_dp = true; | 8213 | |
8178 | DRM_DEBUG("IH: HPD_RX 1\n"); | 8214 | rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_RX_INTERRUPT; |
8179 | } | 8215 | queue_dp = true; |
8216 | DRM_DEBUG("IH: HPD_RX 1\n"); | ||
8217 | |||
8180 | break; | 8218 | break; |
8181 | case 7: | 8219 | case 7: |
8182 | if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_RX_INTERRUPT) { | 8220 | if (!(rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_RX_INTERRUPT)) |
8183 | rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; | 8221 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8184 | queue_dp = true; | 8222 | |
8185 | DRM_DEBUG("IH: HPD_RX 2\n"); | 8223 | rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; |
8186 | } | 8224 | queue_dp = true; |
8225 | DRM_DEBUG("IH: HPD_RX 2\n"); | ||
8226 | |||
8187 | break; | 8227 | break; |
8188 | case 8: | 8228 | case 8: |
8189 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) { | 8229 | if (!(rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_RX_INTERRUPT)) |
8190 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; | 8230 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8191 | queue_dp = true; | 8231 | |
8192 | DRM_DEBUG("IH: HPD_RX 3\n"); | 8232 | rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; |
8193 | } | 8233 | queue_dp = true; |
8234 | DRM_DEBUG("IH: HPD_RX 3\n"); | ||
8235 | |||
8194 | break; | 8236 | break; |
8195 | case 9: | 8237 | case 9: |
8196 | if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) { | 8238 | if (!(rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_RX_INTERRUPT)) |
8197 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; | 8239 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8198 | queue_dp = true; | 8240 | |
8199 | DRM_DEBUG("IH: HPD_RX 4\n"); | 8241 | rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; |
8200 | } | 8242 | queue_dp = true; |
8243 | DRM_DEBUG("IH: HPD_RX 4\n"); | ||
8244 | |||
8201 | break; | 8245 | break; |
8202 | case 10: | 8246 | case 10: |
8203 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) { | 8247 | if (!(rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_RX_INTERRUPT)) |
8204 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; | 8248 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8205 | queue_dp = true; | 8249 | |
8206 | DRM_DEBUG("IH: HPD_RX 5\n"); | 8250 | rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; |
8207 | } | 8251 | queue_dp = true; |
8252 | DRM_DEBUG("IH: HPD_RX 5\n"); | ||
8253 | |||
8208 | break; | 8254 | break; |
8209 | case 11: | 8255 | case 11: |
8210 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | 8256 | if (!(rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_RX_INTERRUPT)) |
8211 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; | 8257 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
8212 | queue_dp = true; | 8258 | |
8213 | DRM_DEBUG("IH: HPD_RX 6\n"); | 8259 | rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; |
8214 | } | 8260 | queue_dp = true; |
8261 | DRM_DEBUG("IH: HPD_RX 6\n"); | ||
8262 | |||
8215 | break; | 8263 | break; |
8216 | default: | 8264 | default: |
8217 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 8265 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 3a6d483a2c36..0acde1949c18 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -4924,7 +4924,7 @@ restart_ih: | |||
4924 | return IRQ_NONE; | 4924 | return IRQ_NONE; |
4925 | 4925 | ||
4926 | rptr = rdev->ih.rptr; | 4926 | rptr = rdev->ih.rptr; |
4927 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | 4927 | DRM_DEBUG("evergreen_irq_process start: rptr %d, wptr %d\n", rptr, wptr); |
4928 | 4928 | ||
4929 | /* Order reading of wptr vs. reading of IH ring data */ | 4929 | /* Order reading of wptr vs. reading of IH ring data */ |
4930 | rmb(); | 4930 | rmb(); |
@@ -4942,23 +4942,27 @@ restart_ih: | |||
4942 | case 1: /* D1 vblank/vline */ | 4942 | case 1: /* D1 vblank/vline */ |
4943 | switch (src_data) { | 4943 | switch (src_data) { |
4944 | case 0: /* D1 vblank */ | 4944 | case 0: /* D1 vblank */ |
4945 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) { | 4945 | if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)) |
4946 | if (rdev->irq.crtc_vblank_int[0]) { | 4946 | DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n"); |
4947 | drm_handle_vblank(rdev->ddev, 0); | 4947 | |
4948 | rdev->pm.vblank_sync = true; | 4948 | if (rdev->irq.crtc_vblank_int[0]) { |
4949 | wake_up(&rdev->irq.vblank_queue); | 4949 | drm_handle_vblank(rdev->ddev, 0); |
4950 | } | 4950 | rdev->pm.vblank_sync = true; |
4951 | if (atomic_read(&rdev->irq.pflip[0])) | 4951 | wake_up(&rdev->irq.vblank_queue); |
4952 | radeon_crtc_handle_vblank(rdev, 0); | ||
4953 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
4954 | DRM_DEBUG("IH: D1 vblank\n"); | ||
4955 | } | 4952 | } |
4953 | if (atomic_read(&rdev->irq.pflip[0])) | ||
4954 | radeon_crtc_handle_vblank(rdev, 0); | ||
4955 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
4956 | DRM_DEBUG("IH: D1 vblank\n"); | ||
4957 | |||
4956 | break; | 4958 | break; |
4957 | case 1: /* D1 vline */ | 4959 | case 1: /* D1 vline */ |
4958 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) { | 4960 | if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)) |
4959 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; | 4961 | DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n"); |
4960 | DRM_DEBUG("IH: D1 vline\n"); | 4962 | |
4961 | } | 4963 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
4964 | DRM_DEBUG("IH: D1 vline\n"); | ||
4965 | |||
4962 | break; | 4966 | break; |
4963 | default: | 4967 | default: |
4964 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4968 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -4968,23 +4972,27 @@ restart_ih: | |||
4968 | case 2: /* D2 vblank/vline */ | 4972 | case 2: /* D2 vblank/vline */ |
4969 | switch (src_data) { | 4973 | switch (src_data) { |
4970 | case 0: /* D2 vblank */ | 4974 | case 0: /* D2 vblank */ |
4971 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) { | 4975 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)) |
4972 | if (rdev->irq.crtc_vblank_int[1]) { | 4976 | DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n"); |
4973 | drm_handle_vblank(rdev->ddev, 1); | 4977 | |
4974 | rdev->pm.vblank_sync = true; | 4978 | if (rdev->irq.crtc_vblank_int[1]) { |
4975 | wake_up(&rdev->irq.vblank_queue); | 4979 | drm_handle_vblank(rdev->ddev, 1); |
4976 | } | 4980 | rdev->pm.vblank_sync = true; |
4977 | if (atomic_read(&rdev->irq.pflip[1])) | 4981 | wake_up(&rdev->irq.vblank_queue); |
4978 | radeon_crtc_handle_vblank(rdev, 1); | ||
4979 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
4980 | DRM_DEBUG("IH: D2 vblank\n"); | ||
4981 | } | 4982 | } |
4983 | if (atomic_read(&rdev->irq.pflip[1])) | ||
4984 | radeon_crtc_handle_vblank(rdev, 1); | ||
4985 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
4986 | DRM_DEBUG("IH: D2 vblank\n"); | ||
4987 | |||
4982 | break; | 4988 | break; |
4983 | case 1: /* D2 vline */ | 4989 | case 1: /* D2 vline */ |
4984 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) { | 4990 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)) |
4985 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; | 4991 | DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n"); |
4986 | DRM_DEBUG("IH: D2 vline\n"); | 4992 | |
4987 | } | 4993 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; |
4994 | DRM_DEBUG("IH: D2 vline\n"); | ||
4995 | |||
4988 | break; | 4996 | break; |
4989 | default: | 4997 | default: |
4990 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4998 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -4994,23 +5002,27 @@ restart_ih: | |||
4994 | case 3: /* D3 vblank/vline */ | 5002 | case 3: /* D3 vblank/vline */ |
4995 | switch (src_data) { | 5003 | switch (src_data) { |
4996 | case 0: /* D3 vblank */ | 5004 | case 0: /* D3 vblank */ |
4997 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { | 5005 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)) |
4998 | if (rdev->irq.crtc_vblank_int[2]) { | 5006 | DRM_DEBUG("IH: D3 vblank - IH event w/o asserted irq bit?\n"); |
4999 | drm_handle_vblank(rdev->ddev, 2); | 5007 | |
5000 | rdev->pm.vblank_sync = true; | 5008 | if (rdev->irq.crtc_vblank_int[2]) { |
5001 | wake_up(&rdev->irq.vblank_queue); | 5009 | drm_handle_vblank(rdev->ddev, 2); |
5002 | } | 5010 | rdev->pm.vblank_sync = true; |
5003 | if (atomic_read(&rdev->irq.pflip[2])) | 5011 | wake_up(&rdev->irq.vblank_queue); |
5004 | radeon_crtc_handle_vblank(rdev, 2); | ||
5005 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
5006 | DRM_DEBUG("IH: D3 vblank\n"); | ||
5007 | } | 5012 | } |
5013 | if (atomic_read(&rdev->irq.pflip[2])) | ||
5014 | radeon_crtc_handle_vblank(rdev, 2); | ||
5015 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
5016 | DRM_DEBUG("IH: D3 vblank\n"); | ||
5017 | |||
5008 | break; | 5018 | break; |
5009 | case 1: /* D3 vline */ | 5019 | case 1: /* D3 vline */ |
5010 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { | 5020 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)) |
5011 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; | 5021 | DRM_DEBUG("IH: D3 vline - IH event w/o asserted irq bit?\n"); |
5012 | DRM_DEBUG("IH: D3 vline\n"); | 5022 | |
5013 | } | 5023 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; |
5024 | DRM_DEBUG("IH: D3 vline\n"); | ||
5025 | |||
5014 | break; | 5026 | break; |
5015 | default: | 5027 | default: |
5016 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 5028 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -5020,23 +5032,27 @@ restart_ih: | |||
5020 | case 4: /* D4 vblank/vline */ | 5032 | case 4: /* D4 vblank/vline */ |
5021 | switch (src_data) { | 5033 | switch (src_data) { |
5022 | case 0: /* D4 vblank */ | 5034 | case 0: /* D4 vblank */ |
5023 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { | 5035 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)) |
5024 | if (rdev->irq.crtc_vblank_int[3]) { | 5036 | DRM_DEBUG("IH: D4 vblank - IH event w/o asserted irq bit?\n"); |
5025 | drm_handle_vblank(rdev->ddev, 3); | 5037 | |
5026 | rdev->pm.vblank_sync = true; | 5038 | if (rdev->irq.crtc_vblank_int[3]) { |
5027 | wake_up(&rdev->irq.vblank_queue); | 5039 | drm_handle_vblank(rdev->ddev, 3); |
5028 | } | 5040 | rdev->pm.vblank_sync = true; |
5029 | if (atomic_read(&rdev->irq.pflip[3])) | 5041 | wake_up(&rdev->irq.vblank_queue); |
5030 | radeon_crtc_handle_vblank(rdev, 3); | ||
5031 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
5032 | DRM_DEBUG("IH: D4 vblank\n"); | ||
5033 | } | 5042 | } |
5043 | if (atomic_read(&rdev->irq.pflip[3])) | ||
5044 | radeon_crtc_handle_vblank(rdev, 3); | ||
5045 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
5046 | DRM_DEBUG("IH: D4 vblank\n"); | ||
5047 | |||
5034 | break; | 5048 | break; |
5035 | case 1: /* D4 vline */ | 5049 | case 1: /* D4 vline */ |
5036 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { | 5050 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)) |
5037 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; | 5051 | DRM_DEBUG("IH: D4 vline - IH event w/o asserted irq bit?\n"); |
5038 | DRM_DEBUG("IH: D4 vline\n"); | 5052 | |
5039 | } | 5053 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; |
5054 | DRM_DEBUG("IH: D4 vline\n"); | ||
5055 | |||
5040 | break; | 5056 | break; |
5041 | default: | 5057 | default: |
5042 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 5058 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -5046,23 +5062,27 @@ restart_ih: | |||
5046 | case 5: /* D5 vblank/vline */ | 5062 | case 5: /* D5 vblank/vline */ |
5047 | switch (src_data) { | 5063 | switch (src_data) { |
5048 | case 0: /* D5 vblank */ | 5064 | case 0: /* D5 vblank */ |
5049 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { | 5065 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)) |
5050 | if (rdev->irq.crtc_vblank_int[4]) { | 5066 | DRM_DEBUG("IH: D5 vblank - IH event w/o asserted irq bit?\n"); |
5051 | drm_handle_vblank(rdev->ddev, 4); | 5067 | |
5052 | rdev->pm.vblank_sync = true; | 5068 | if (rdev->irq.crtc_vblank_int[4]) { |
5053 | wake_up(&rdev->irq.vblank_queue); | 5069 | drm_handle_vblank(rdev->ddev, 4); |
5054 | } | 5070 | rdev->pm.vblank_sync = true; |
5055 | if (atomic_read(&rdev->irq.pflip[4])) | 5071 | wake_up(&rdev->irq.vblank_queue); |
5056 | radeon_crtc_handle_vblank(rdev, 4); | ||
5057 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
5058 | DRM_DEBUG("IH: D5 vblank\n"); | ||
5059 | } | 5072 | } |
5073 | if (atomic_read(&rdev->irq.pflip[4])) | ||
5074 | radeon_crtc_handle_vblank(rdev, 4); | ||
5075 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
5076 | DRM_DEBUG("IH: D5 vblank\n"); | ||
5077 | |||
5060 | break; | 5078 | break; |
5061 | case 1: /* D5 vline */ | 5079 | case 1: /* D5 vline */ |
5062 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { | 5080 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)) |
5063 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; | 5081 | DRM_DEBUG("IH: D5 vline - IH event w/o asserted irq bit?\n"); |
5064 | DRM_DEBUG("IH: D5 vline\n"); | 5082 | |
5065 | } | 5083 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; |
5084 | DRM_DEBUG("IH: D5 vline\n"); | ||
5085 | |||
5066 | break; | 5086 | break; |
5067 | default: | 5087 | default: |
5068 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 5088 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -5072,23 +5092,27 @@ restart_ih: | |||
5072 | case 6: /* D6 vblank/vline */ | 5092 | case 6: /* D6 vblank/vline */ |
5073 | switch (src_data) { | 5093 | switch (src_data) { |
5074 | case 0: /* D6 vblank */ | 5094 | case 0: /* D6 vblank */ |
5075 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { | 5095 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)) |
5076 | if (rdev->irq.crtc_vblank_int[5]) { | 5096 | DRM_DEBUG("IH: D6 vblank - IH event w/o asserted irq bit?\n"); |
5077 | drm_handle_vblank(rdev->ddev, 5); | 5097 | |
5078 | rdev->pm.vblank_sync = true; | 5098 | if (rdev->irq.crtc_vblank_int[5]) { |
5079 | wake_up(&rdev->irq.vblank_queue); | 5099 | drm_handle_vblank(rdev->ddev, 5); |
5080 | } | 5100 | rdev->pm.vblank_sync = true; |
5081 | if (atomic_read(&rdev->irq.pflip[5])) | 5101 | wake_up(&rdev->irq.vblank_queue); |
5082 | radeon_crtc_handle_vblank(rdev, 5); | ||
5083 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
5084 | DRM_DEBUG("IH: D6 vblank\n"); | ||
5085 | } | 5102 | } |
5103 | if (atomic_read(&rdev->irq.pflip[5])) | ||
5104 | radeon_crtc_handle_vblank(rdev, 5); | ||
5105 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
5106 | DRM_DEBUG("IH: D6 vblank\n"); | ||
5107 | |||
5086 | break; | 5108 | break; |
5087 | case 1: /* D6 vline */ | 5109 | case 1: /* D6 vline */ |
5088 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { | 5110 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)) |
5089 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; | 5111 | DRM_DEBUG("IH: D6 vline - IH event w/o asserted irq bit?\n"); |
5090 | DRM_DEBUG("IH: D6 vline\n"); | 5112 | |
5091 | } | 5113 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; |
5114 | DRM_DEBUG("IH: D6 vline\n"); | ||
5115 | |||
5092 | break; | 5116 | break; |
5093 | default: | 5117 | default: |
5094 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 5118 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -5108,88 +5132,100 @@ restart_ih: | |||
5108 | case 42: /* HPD hotplug */ | 5132 | case 42: /* HPD hotplug */ |
5109 | switch (src_data) { | 5133 | switch (src_data) { |
5110 | case 0: | 5134 | case 0: |
5111 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { | 5135 | if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT)) |
5112 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; | 5136 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5113 | queue_hotplug = true; | 5137 | |
5114 | DRM_DEBUG("IH: HPD1\n"); | 5138 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
5115 | } | 5139 | queue_hotplug = true; |
5140 | DRM_DEBUG("IH: HPD1\n"); | ||
5116 | break; | 5141 | break; |
5117 | case 1: | 5142 | case 1: |
5118 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) { | 5143 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT)) |
5119 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; | 5144 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5120 | queue_hotplug = true; | 5145 | |
5121 | DRM_DEBUG("IH: HPD2\n"); | 5146 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; |
5122 | } | 5147 | queue_hotplug = true; |
5148 | DRM_DEBUG("IH: HPD2\n"); | ||
5123 | break; | 5149 | break; |
5124 | case 2: | 5150 | case 2: |
5125 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) { | 5151 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT)) |
5126 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; | 5152 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5127 | queue_hotplug = true; | 5153 | |
5128 | DRM_DEBUG("IH: HPD3\n"); | 5154 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; |
5129 | } | 5155 | queue_hotplug = true; |
5156 | DRM_DEBUG("IH: HPD3\n"); | ||
5130 | break; | 5157 | break; |
5131 | case 3: | 5158 | case 3: |
5132 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) { | 5159 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT)) |
5133 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; | 5160 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5134 | queue_hotplug = true; | 5161 | |
5135 | DRM_DEBUG("IH: HPD4\n"); | 5162 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; |
5136 | } | 5163 | queue_hotplug = true; |
5164 | DRM_DEBUG("IH: HPD4\n"); | ||
5137 | break; | 5165 | break; |
5138 | case 4: | 5166 | case 4: |
5139 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) { | 5167 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT)) |
5140 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; | 5168 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5141 | queue_hotplug = true; | 5169 | |
5142 | DRM_DEBUG("IH: HPD5\n"); | 5170 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; |
5143 | } | 5171 | queue_hotplug = true; |
5172 | DRM_DEBUG("IH: HPD5\n"); | ||
5144 | break; | 5173 | break; |
5145 | case 5: | 5174 | case 5: |
5146 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { | 5175 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT)) |
5147 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; | 5176 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5148 | queue_hotplug = true; | 5177 | |
5149 | DRM_DEBUG("IH: HPD6\n"); | 5178 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; |
5150 | } | 5179 | queue_hotplug = true; |
5180 | DRM_DEBUG("IH: HPD6\n"); | ||
5151 | break; | 5181 | break; |
5152 | case 6: | 5182 | case 6: |
5153 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) { | 5183 | if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT)) |
5154 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT; | 5184 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5155 | queue_dp = true; | 5185 | |
5156 | DRM_DEBUG("IH: HPD_RX 1\n"); | 5186 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT; |
5157 | } | 5187 | queue_dp = true; |
5188 | DRM_DEBUG("IH: HPD_RX 1\n"); | ||
5158 | break; | 5189 | break; |
5159 | case 7: | 5190 | case 7: |
5160 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) { | 5191 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT)) |
5161 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; | 5192 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5162 | queue_dp = true; | 5193 | |
5163 | DRM_DEBUG("IH: HPD_RX 2\n"); | 5194 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; |
5164 | } | 5195 | queue_dp = true; |
5196 | DRM_DEBUG("IH: HPD_RX 2\n"); | ||
5165 | break; | 5197 | break; |
5166 | case 8: | 5198 | case 8: |
5167 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) { | 5199 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT)) |
5168 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; | 5200 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5169 | queue_dp = true; | 5201 | |
5170 | DRM_DEBUG("IH: HPD_RX 3\n"); | 5202 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; |
5171 | } | 5203 | queue_dp = true; |
5204 | DRM_DEBUG("IH: HPD_RX 3\n"); | ||
5172 | break; | 5205 | break; |
5173 | case 9: | 5206 | case 9: |
5174 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) { | 5207 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT)) |
5175 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; | 5208 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5176 | queue_dp = true; | 5209 | |
5177 | DRM_DEBUG("IH: HPD_RX 4\n"); | 5210 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; |
5178 | } | 5211 | queue_dp = true; |
5212 | DRM_DEBUG("IH: HPD_RX 4\n"); | ||
5179 | break; | 5213 | break; |
5180 | case 10: | 5214 | case 10: |
5181 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) { | 5215 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT)) |
5182 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; | 5216 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5183 | queue_dp = true; | 5217 | |
5184 | DRM_DEBUG("IH: HPD_RX 5\n"); | 5218 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; |
5185 | } | 5219 | queue_dp = true; |
5220 | DRM_DEBUG("IH: HPD_RX 5\n"); | ||
5186 | break; | 5221 | break; |
5187 | case 11: | 5222 | case 11: |
5188 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | 5223 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT)) |
5189 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; | 5224 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5190 | queue_dp = true; | 5225 | |
5191 | DRM_DEBUG("IH: HPD_RX 6\n"); | 5226 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; |
5192 | } | 5227 | queue_dp = true; |
5228 | DRM_DEBUG("IH: HPD_RX 6\n"); | ||
5193 | break; | 5229 | break; |
5194 | default: | 5230 | default: |
5195 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 5231 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -5199,46 +5235,52 @@ restart_ih: | |||
5199 | case 44: /* hdmi */ | 5235 | case 44: /* hdmi */ |
5200 | switch (src_data) { | 5236 | switch (src_data) { |
5201 | case 0: | 5237 | case 0: |
5202 | if (rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG) { | 5238 | if (!(rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG)) |
5203 | rdev->irq.stat_regs.evergreen.afmt_status1 &= ~AFMT_AZ_FORMAT_WTRIG; | 5239 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5204 | queue_hdmi = true; | 5240 | |
5205 | DRM_DEBUG("IH: HDMI0\n"); | 5241 | rdev->irq.stat_regs.evergreen.afmt_status1 &= ~AFMT_AZ_FORMAT_WTRIG; |
5206 | } | 5242 | queue_hdmi = true; |
5243 | DRM_DEBUG("IH: HDMI0\n"); | ||
5207 | break; | 5244 | break; |
5208 | case 1: | 5245 | case 1: |
5209 | if (rdev->irq.stat_regs.evergreen.afmt_status2 & AFMT_AZ_FORMAT_WTRIG) { | 5246 | if (!(rdev->irq.stat_regs.evergreen.afmt_status2 & AFMT_AZ_FORMAT_WTRIG)) |
5210 | rdev->irq.stat_regs.evergreen.afmt_status2 &= ~AFMT_AZ_FORMAT_WTRIG; | 5247 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5211 | queue_hdmi = true; | 5248 | |
5212 | DRM_DEBUG("IH: HDMI1\n"); | 5249 | rdev->irq.stat_regs.evergreen.afmt_status2 &= ~AFMT_AZ_FORMAT_WTRIG; |
5213 | } | 5250 | queue_hdmi = true; |
5251 | DRM_DEBUG("IH: HDMI1\n"); | ||
5214 | break; | 5252 | break; |
5215 | case 2: | 5253 | case 2: |
5216 | if (rdev->irq.stat_regs.evergreen.afmt_status3 & AFMT_AZ_FORMAT_WTRIG) { | 5254 | if (!(rdev->irq.stat_regs.evergreen.afmt_status3 & AFMT_AZ_FORMAT_WTRIG)) |
5217 | rdev->irq.stat_regs.evergreen.afmt_status3 &= ~AFMT_AZ_FORMAT_WTRIG; | 5255 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5218 | queue_hdmi = true; | 5256 | |
5219 | DRM_DEBUG("IH: HDMI2\n"); | 5257 | rdev->irq.stat_regs.evergreen.afmt_status3 &= ~AFMT_AZ_FORMAT_WTRIG; |
5220 | } | 5258 | queue_hdmi = true; |
5259 | DRM_DEBUG("IH: HDMI2\n"); | ||
5221 | break; | 5260 | break; |
5222 | case 3: | 5261 | case 3: |
5223 | if (rdev->irq.stat_regs.evergreen.afmt_status4 & AFMT_AZ_FORMAT_WTRIG) { | 5262 | if (!(rdev->irq.stat_regs.evergreen.afmt_status4 & AFMT_AZ_FORMAT_WTRIG)) |
5224 | rdev->irq.stat_regs.evergreen.afmt_status4 &= ~AFMT_AZ_FORMAT_WTRIG; | 5263 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5225 | queue_hdmi = true; | 5264 | |
5226 | DRM_DEBUG("IH: HDMI3\n"); | 5265 | rdev->irq.stat_regs.evergreen.afmt_status4 &= ~AFMT_AZ_FORMAT_WTRIG; |
5227 | } | 5266 | queue_hdmi = true; |
5267 | DRM_DEBUG("IH: HDMI3\n"); | ||
5228 | break; | 5268 | break; |
5229 | case 4: | 5269 | case 4: |
5230 | if (rdev->irq.stat_regs.evergreen.afmt_status5 & AFMT_AZ_FORMAT_WTRIG) { | 5270 | if (!(rdev->irq.stat_regs.evergreen.afmt_status5 & AFMT_AZ_FORMAT_WTRIG)) |
5231 | rdev->irq.stat_regs.evergreen.afmt_status5 &= ~AFMT_AZ_FORMAT_WTRIG; | 5271 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5232 | queue_hdmi = true; | 5272 | |
5233 | DRM_DEBUG("IH: HDMI4\n"); | 5273 | rdev->irq.stat_regs.evergreen.afmt_status5 &= ~AFMT_AZ_FORMAT_WTRIG; |
5234 | } | 5274 | queue_hdmi = true; |
5275 | DRM_DEBUG("IH: HDMI4\n"); | ||
5235 | break; | 5276 | break; |
5236 | case 5: | 5277 | case 5: |
5237 | if (rdev->irq.stat_regs.evergreen.afmt_status6 & AFMT_AZ_FORMAT_WTRIG) { | 5278 | if (!(rdev->irq.stat_regs.evergreen.afmt_status6 & AFMT_AZ_FORMAT_WTRIG)) |
5238 | rdev->irq.stat_regs.evergreen.afmt_status6 &= ~AFMT_AZ_FORMAT_WTRIG; | 5279 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
5239 | queue_hdmi = true; | 5280 | |
5240 | DRM_DEBUG("IH: HDMI5\n"); | 5281 | rdev->irq.stat_regs.evergreen.afmt_status6 &= ~AFMT_AZ_FORMAT_WTRIG; |
5241 | } | 5282 | queue_hdmi = true; |
5283 | DRM_DEBUG("IH: HDMI5\n"); | ||
5242 | break; | 5284 | break; |
5243 | default: | 5285 | default: |
5244 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); | 5286 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 8e5aeeb058a5..158872eb78e4 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -2162,18 +2162,20 @@ static int cayman_startup(struct radeon_device *rdev) | |||
2162 | DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); | 2162 | DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); |
2163 | } | 2163 | } |
2164 | 2164 | ||
2165 | ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; | 2165 | if (rdev->family == CHIP_ARUBA) { |
2166 | if (ring->ring_size) | 2166 | ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; |
2167 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); | 2167 | if (ring->ring_size) |
2168 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); | ||
2168 | 2169 | ||
2169 | ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; | 2170 | ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; |
2170 | if (ring->ring_size) | 2171 | if (ring->ring_size) |
2171 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); | 2172 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); |
2172 | 2173 | ||
2173 | if (!r) | 2174 | if (!r) |
2174 | r = vce_v1_0_init(rdev); | 2175 | r = vce_v1_0_init(rdev); |
2175 | else if (r != -ENOENT) | 2176 | if (r) |
2176 | DRM_ERROR("radeon: failed initializing VCE (%d).\n", r); | 2177 | DRM_ERROR("radeon: failed initializing VCE (%d).\n", r); |
2178 | } | ||
2177 | 2179 | ||
2178 | r = radeon_ib_pool_init(rdev); | 2180 | r = radeon_ib_pool_init(rdev); |
2179 | if (r) { | 2181 | if (r) { |
@@ -2396,7 +2398,8 @@ void cayman_fini(struct radeon_device *rdev) | |||
2396 | radeon_irq_kms_fini(rdev); | 2398 | radeon_irq_kms_fini(rdev); |
2397 | uvd_v1_0_fini(rdev); | 2399 | uvd_v1_0_fini(rdev); |
2398 | radeon_uvd_fini(rdev); | 2400 | radeon_uvd_fini(rdev); |
2399 | radeon_vce_fini(rdev); | 2401 | if (rdev->family == CHIP_ARUBA) |
2402 | radeon_vce_fini(rdev); | ||
2400 | cayman_pcie_gart_fini(rdev); | 2403 | cayman_pcie_gart_fini(rdev); |
2401 | r600_vram_scratch_fini(rdev); | 2404 | r600_vram_scratch_fini(rdev); |
2402 | radeon_gem_fini(rdev); | 2405 | radeon_gem_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 35dafd77a639..4ea5b10ff5f4 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -4086,23 +4086,27 @@ restart_ih: | |||
4086 | case 1: /* D1 vblank/vline */ | 4086 | case 1: /* D1 vblank/vline */ |
4087 | switch (src_data) { | 4087 | switch (src_data) { |
4088 | case 0: /* D1 vblank */ | 4088 | case 0: /* D1 vblank */ |
4089 | if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT) { | 4089 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT)) |
4090 | if (rdev->irq.crtc_vblank_int[0]) { | 4090 | DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n"); |
4091 | drm_handle_vblank(rdev->ddev, 0); | 4091 | |
4092 | rdev->pm.vblank_sync = true; | 4092 | if (rdev->irq.crtc_vblank_int[0]) { |
4093 | wake_up(&rdev->irq.vblank_queue); | 4093 | drm_handle_vblank(rdev->ddev, 0); |
4094 | } | 4094 | rdev->pm.vblank_sync = true; |
4095 | if (atomic_read(&rdev->irq.pflip[0])) | 4095 | wake_up(&rdev->irq.vblank_queue); |
4096 | radeon_crtc_handle_vblank(rdev, 0); | ||
4097 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
4098 | DRM_DEBUG("IH: D1 vblank\n"); | ||
4099 | } | 4096 | } |
4097 | if (atomic_read(&rdev->irq.pflip[0])) | ||
4098 | radeon_crtc_handle_vblank(rdev, 0); | ||
4099 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
4100 | DRM_DEBUG("IH: D1 vblank\n"); | ||
4101 | |||
4100 | break; | 4102 | break; |
4101 | case 1: /* D1 vline */ | 4103 | case 1: /* D1 vline */ |
4102 | if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT) { | 4104 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT)) |
4103 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT; | 4105 | DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n"); |
4104 | DRM_DEBUG("IH: D1 vline\n"); | 4106 | |
4105 | } | 4107 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
4108 | DRM_DEBUG("IH: D1 vline\n"); | ||
4109 | |||
4106 | break; | 4110 | break; |
4107 | default: | 4111 | default: |
4108 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4112 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -4112,23 +4116,27 @@ restart_ih: | |||
4112 | case 5: /* D2 vblank/vline */ | 4116 | case 5: /* D2 vblank/vline */ |
4113 | switch (src_data) { | 4117 | switch (src_data) { |
4114 | case 0: /* D2 vblank */ | 4118 | case 0: /* D2 vblank */ |
4115 | if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT) { | 4119 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT)) |
4116 | if (rdev->irq.crtc_vblank_int[1]) { | 4120 | DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n"); |
4117 | drm_handle_vblank(rdev->ddev, 1); | 4121 | |
4118 | rdev->pm.vblank_sync = true; | 4122 | if (rdev->irq.crtc_vblank_int[1]) { |
4119 | wake_up(&rdev->irq.vblank_queue); | 4123 | drm_handle_vblank(rdev->ddev, 1); |
4120 | } | 4124 | rdev->pm.vblank_sync = true; |
4121 | if (atomic_read(&rdev->irq.pflip[1])) | 4125 | wake_up(&rdev->irq.vblank_queue); |
4122 | radeon_crtc_handle_vblank(rdev, 1); | ||
4123 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT; | ||
4124 | DRM_DEBUG("IH: D2 vblank\n"); | ||
4125 | } | 4126 | } |
4127 | if (atomic_read(&rdev->irq.pflip[1])) | ||
4128 | radeon_crtc_handle_vblank(rdev, 1); | ||
4129 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT; | ||
4130 | DRM_DEBUG("IH: D2 vblank\n"); | ||
4131 | |||
4126 | break; | 4132 | break; |
4127 | case 1: /* D1 vline */ | 4133 | case 1: /* D1 vline */ |
4128 | if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT) { | 4134 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT)) |
4129 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT; | 4135 | DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n"); |
4130 | DRM_DEBUG("IH: D2 vline\n"); | 4136 | |
4131 | } | 4137 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT; |
4138 | DRM_DEBUG("IH: D2 vline\n"); | ||
4139 | |||
4132 | break; | 4140 | break; |
4133 | default: | 4141 | default: |
4134 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4142 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -4148,46 +4156,53 @@ restart_ih: | |||
4148 | case 19: /* HPD/DAC hotplug */ | 4156 | case 19: /* HPD/DAC hotplug */ |
4149 | switch (src_data) { | 4157 | switch (src_data) { |
4150 | case 0: | 4158 | case 0: |
4151 | if (rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT) { | 4159 | if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT)) |
4152 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT; | 4160 | DRM_DEBUG("IH: HPD1 - IH event w/o asserted irq bit?\n"); |
4153 | queue_hotplug = true; | 4161 | |
4154 | DRM_DEBUG("IH: HPD1\n"); | 4162 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT; |
4155 | } | 4163 | queue_hotplug = true; |
4164 | DRM_DEBUG("IH: HPD1\n"); | ||
4156 | break; | 4165 | break; |
4157 | case 1: | 4166 | case 1: |
4158 | if (rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT) { | 4167 | if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT)) |
4159 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT; | 4168 | DRM_DEBUG("IH: HPD2 - IH event w/o asserted irq bit?\n"); |
4160 | queue_hotplug = true; | 4169 | |
4161 | DRM_DEBUG("IH: HPD2\n"); | 4170 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT; |
4162 | } | 4171 | queue_hotplug = true; |
4172 | DRM_DEBUG("IH: HPD2\n"); | ||
4163 | break; | 4173 | break; |
4164 | case 4: | 4174 | case 4: |
4165 | if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT) { | 4175 | if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT)) |
4166 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT; | 4176 | DRM_DEBUG("IH: HPD3 - IH event w/o asserted irq bit?\n"); |
4167 | queue_hotplug = true; | 4177 | |
4168 | DRM_DEBUG("IH: HPD3\n"); | 4178 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT; |
4169 | } | 4179 | queue_hotplug = true; |
4180 | DRM_DEBUG("IH: HPD3\n"); | ||
4170 | break; | 4181 | break; |
4171 | case 5: | 4182 | case 5: |
4172 | if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT) { | 4183 | if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT)) |
4173 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT; | 4184 | DRM_DEBUG("IH: HPD4 - IH event w/o asserted irq bit?\n"); |
4174 | queue_hotplug = true; | 4185 | |
4175 | DRM_DEBUG("IH: HPD4\n"); | 4186 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT; |
4176 | } | 4187 | queue_hotplug = true; |
4188 | DRM_DEBUG("IH: HPD4\n"); | ||
4177 | break; | 4189 | break; |
4178 | case 10: | 4190 | case 10: |
4179 | if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT) { | 4191 | if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT)) |
4180 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT; | 4192 | DRM_DEBUG("IH: HPD5 - IH event w/o asserted irq bit?\n"); |
4181 | queue_hotplug = true; | 4193 | |
4182 | DRM_DEBUG("IH: HPD5\n"); | 4194 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT; |
4183 | } | 4195 | queue_hotplug = true; |
4196 | DRM_DEBUG("IH: HPD5\n"); | ||
4184 | break; | 4197 | break; |
4185 | case 12: | 4198 | case 12: |
4186 | if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) { | 4199 | if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT)) |
4187 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT; | 4200 | DRM_DEBUG("IH: HPD6 - IH event w/o asserted irq bit?\n"); |
4188 | queue_hotplug = true; | 4201 | |
4189 | DRM_DEBUG("IH: HPD6\n"); | 4202 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT; |
4190 | } | 4203 | queue_hotplug = true; |
4204 | DRM_DEBUG("IH: HPD6\n"); | ||
4205 | |||
4191 | break; | 4206 | break; |
4192 | default: | 4207 | default: |
4193 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4208 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -4197,18 +4212,22 @@ restart_ih: | |||
4197 | case 21: /* hdmi */ | 4212 | case 21: /* hdmi */ |
4198 | switch (src_data) { | 4213 | switch (src_data) { |
4199 | case 4: | 4214 | case 4: |
4200 | if (rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG) { | 4215 | if (!(rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG)) |
4201 | rdev->irq.stat_regs.r600.hdmi0_status &= ~HDMI0_AZ_FORMAT_WTRIG; | 4216 | DRM_DEBUG("IH: HDMI0 - IH event w/o asserted irq bit?\n"); |
4202 | queue_hdmi = true; | 4217 | |
4203 | DRM_DEBUG("IH: HDMI0\n"); | 4218 | rdev->irq.stat_regs.r600.hdmi0_status &= ~HDMI0_AZ_FORMAT_WTRIG; |
4204 | } | 4219 | queue_hdmi = true; |
4220 | DRM_DEBUG("IH: HDMI0\n"); | ||
4221 | |||
4205 | break; | 4222 | break; |
4206 | case 5: | 4223 | case 5: |
4207 | if (rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG) { | 4224 | if (!(rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG)) |
4208 | rdev->irq.stat_regs.r600.hdmi1_status &= ~HDMI0_AZ_FORMAT_WTRIG; | 4225 | DRM_DEBUG("IH: HDMI1 - IH event w/o asserted irq bit?\n"); |
4209 | queue_hdmi = true; | 4226 | |
4210 | DRM_DEBUG("IH: HDMI1\n"); | 4227 | rdev->irq.stat_regs.r600.hdmi1_status &= ~HDMI0_AZ_FORMAT_WTRIG; |
4211 | } | 4228 | queue_hdmi = true; |
4229 | DRM_DEBUG("IH: HDMI1\n"); | ||
4230 | |||
4212 | break; | 4231 | break; |
4213 | default: | 4232 | default: |
4214 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); | 4233 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); |
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c index 09e3f39925fa..98f9adaccc3d 100644 --- a/drivers/gpu/drm/radeon/r600_cp.c +++ b/drivers/gpu/drm/radeon/r600_cp.c | |||
@@ -2483,7 +2483,7 @@ int r600_cp_dispatch_texture(struct drm_device *dev, | |||
2483 | struct drm_buf *buf; | 2483 | struct drm_buf *buf; |
2484 | u32 *buffer; | 2484 | u32 *buffer; |
2485 | const u8 __user *data; | 2485 | const u8 __user *data; |
2486 | int size, pass_size; | 2486 | unsigned int size, pass_size; |
2487 | u64 src_offset, dst_offset; | 2487 | u64 src_offset, dst_offset; |
2488 | 2488 | ||
2489 | if (!radeon_check_offset(dev_priv, tex->offset)) { | 2489 | if (!radeon_check_offset(dev_priv, tex->offset)) { |
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index 45e54060ee97..afaf346bd50e 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
@@ -91,15 +91,34 @@ static void radeon_show_cursor(struct drm_crtc *crtc) | |||
91 | struct radeon_device *rdev = crtc->dev->dev_private; | 91 | struct radeon_device *rdev = crtc->dev->dev_private; |
92 | 92 | ||
93 | if (ASIC_IS_DCE4(rdev)) { | 93 | if (ASIC_IS_DCE4(rdev)) { |
94 | WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, | ||
95 | upper_32_bits(radeon_crtc->cursor_addr)); | ||
96 | WREG32(EVERGREEN_CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | ||
97 | lower_32_bits(radeon_crtc->cursor_addr)); | ||
94 | WREG32(RADEON_MM_INDEX, EVERGREEN_CUR_CONTROL + radeon_crtc->crtc_offset); | 98 | WREG32(RADEON_MM_INDEX, EVERGREEN_CUR_CONTROL + radeon_crtc->crtc_offset); |
95 | WREG32(RADEON_MM_DATA, EVERGREEN_CURSOR_EN | | 99 | WREG32(RADEON_MM_DATA, EVERGREEN_CURSOR_EN | |
96 | EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT) | | 100 | EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT) | |
97 | EVERGREEN_CURSOR_URGENT_CONTROL(EVERGREEN_CURSOR_URGENT_1_2)); | 101 | EVERGREEN_CURSOR_URGENT_CONTROL(EVERGREEN_CURSOR_URGENT_1_2)); |
98 | } else if (ASIC_IS_AVIVO(rdev)) { | 102 | } else if (ASIC_IS_AVIVO(rdev)) { |
103 | if (rdev->family >= CHIP_RV770) { | ||
104 | if (radeon_crtc->crtc_id) | ||
105 | WREG32(R700_D2CUR_SURFACE_ADDRESS_HIGH, | ||
106 | upper_32_bits(radeon_crtc->cursor_addr)); | ||
107 | else | ||
108 | WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, | ||
109 | upper_32_bits(radeon_crtc->cursor_addr)); | ||
110 | } | ||
111 | |||
112 | WREG32(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | ||
113 | lower_32_bits(radeon_crtc->cursor_addr)); | ||
99 | WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset); | 114 | WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset); |
100 | WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN | | 115 | WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN | |
101 | (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); | 116 | (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); |
102 | } else { | 117 | } else { |
118 | /* offset is from DISP(2)_BASE_ADDRESS */ | ||
119 | WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, | ||
120 | radeon_crtc->cursor_addr - radeon_crtc->legacy_display_base_addr); | ||
121 | |||
103 | switch (radeon_crtc->crtc_id) { | 122 | switch (radeon_crtc->crtc_id) { |
104 | case 0: | 123 | case 0: |
105 | WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL); | 124 | WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL); |
@@ -205,8 +224,9 @@ static int radeon_cursor_move_locked(struct drm_crtc *crtc, int x, int y) | |||
205 | | (x << 16) | 224 | | (x << 16) |
206 | | y)); | 225 | | y)); |
207 | /* offset is from DISP(2)_BASE_ADDRESS */ | 226 | /* offset is from DISP(2)_BASE_ADDRESS */ |
208 | WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, (radeon_crtc->legacy_cursor_offset + | 227 | WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, |
209 | (yorigin * 256))); | 228 | radeon_crtc->cursor_addr - radeon_crtc->legacy_display_base_addr + |
229 | yorigin * 256); | ||
210 | } | 230 | } |
211 | 231 | ||
212 | radeon_crtc->cursor_x = x; | 232 | radeon_crtc->cursor_x = x; |
@@ -227,53 +247,6 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | |||
227 | return ret; | 247 | return ret; |
228 | } | 248 | } |
229 | 249 | ||
230 | static int radeon_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj) | ||
231 | { | ||
232 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
233 | struct radeon_device *rdev = crtc->dev->dev_private; | ||
234 | struct radeon_bo *robj = gem_to_radeon_bo(obj); | ||
235 | uint64_t gpu_addr; | ||
236 | int ret; | ||
237 | |||
238 | ret = radeon_bo_reserve(robj, false); | ||
239 | if (unlikely(ret != 0)) | ||
240 | goto fail; | ||
241 | /* Only 27 bit offset for legacy cursor */ | ||
242 | ret = radeon_bo_pin_restricted(robj, RADEON_GEM_DOMAIN_VRAM, | ||
243 | ASIC_IS_AVIVO(rdev) ? 0 : 1 << 27, | ||
244 | &gpu_addr); | ||
245 | radeon_bo_unreserve(robj); | ||
246 | if (ret) | ||
247 | goto fail; | ||
248 | |||
249 | if (ASIC_IS_DCE4(rdev)) { | ||
250 | WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, | ||
251 | upper_32_bits(gpu_addr)); | ||
252 | WREG32(EVERGREEN_CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | ||
253 | gpu_addr & 0xffffffff); | ||
254 | } else if (ASIC_IS_AVIVO(rdev)) { | ||
255 | if (rdev->family >= CHIP_RV770) { | ||
256 | if (radeon_crtc->crtc_id) | ||
257 | WREG32(R700_D2CUR_SURFACE_ADDRESS_HIGH, upper_32_bits(gpu_addr)); | ||
258 | else | ||
259 | WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, upper_32_bits(gpu_addr)); | ||
260 | } | ||
261 | WREG32(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | ||
262 | gpu_addr & 0xffffffff); | ||
263 | } else { | ||
264 | radeon_crtc->legacy_cursor_offset = gpu_addr - radeon_crtc->legacy_display_base_addr; | ||
265 | /* offset is from DISP(2)_BASE_ADDRESS */ | ||
266 | WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, radeon_crtc->legacy_cursor_offset); | ||
267 | } | ||
268 | |||
269 | return 0; | ||
270 | |||
271 | fail: | ||
272 | drm_gem_object_unreference_unlocked(obj); | ||
273 | |||
274 | return ret; | ||
275 | } | ||
276 | |||
277 | int radeon_crtc_cursor_set2(struct drm_crtc *crtc, | 250 | int radeon_crtc_cursor_set2(struct drm_crtc *crtc, |
278 | struct drm_file *file_priv, | 251 | struct drm_file *file_priv, |
279 | uint32_t handle, | 252 | uint32_t handle, |
@@ -283,7 +256,9 @@ int radeon_crtc_cursor_set2(struct drm_crtc *crtc, | |||
283 | int32_t hot_y) | 256 | int32_t hot_y) |
284 | { | 257 | { |
285 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 258 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
259 | struct radeon_device *rdev = crtc->dev->dev_private; | ||
286 | struct drm_gem_object *obj; | 260 | struct drm_gem_object *obj; |
261 | struct radeon_bo *robj; | ||
287 | int ret; | 262 | int ret; |
288 | 263 | ||
289 | if (!handle) { | 264 | if (!handle) { |
@@ -305,6 +280,23 @@ int radeon_crtc_cursor_set2(struct drm_crtc *crtc, | |||
305 | return -ENOENT; | 280 | return -ENOENT; |
306 | } | 281 | } |
307 | 282 | ||
283 | robj = gem_to_radeon_bo(obj); | ||
284 | ret = radeon_bo_reserve(robj, false); | ||
285 | if (ret != 0) { | ||
286 | drm_gem_object_unreference_unlocked(obj); | ||
287 | return ret; | ||
288 | } | ||
289 | /* Only 27 bit offset for legacy cursor */ | ||
290 | ret = radeon_bo_pin_restricted(robj, RADEON_GEM_DOMAIN_VRAM, | ||
291 | ASIC_IS_AVIVO(rdev) ? 0 : 1 << 27, | ||
292 | &radeon_crtc->cursor_addr); | ||
293 | radeon_bo_unreserve(robj); | ||
294 | if (ret) { | ||
295 | DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret); | ||
296 | drm_gem_object_unreference_unlocked(obj); | ||
297 | return ret; | ||
298 | } | ||
299 | |||
308 | radeon_crtc->cursor_width = width; | 300 | radeon_crtc->cursor_width = width; |
309 | radeon_crtc->cursor_height = height; | 301 | radeon_crtc->cursor_height = height; |
310 | 302 | ||
@@ -323,13 +315,7 @@ int radeon_crtc_cursor_set2(struct drm_crtc *crtc, | |||
323 | radeon_crtc->cursor_hot_y = hot_y; | 315 | radeon_crtc->cursor_hot_y = hot_y; |
324 | } | 316 | } |
325 | 317 | ||
326 | ret = radeon_set_cursor(crtc, obj); | 318 | radeon_show_cursor(crtc); |
327 | |||
328 | if (ret) | ||
329 | DRM_ERROR("radeon_set_cursor returned %d, not changing cursor\n", | ||
330 | ret); | ||
331 | else | ||
332 | radeon_show_cursor(crtc); | ||
333 | 319 | ||
334 | radeon_lock_cursor(crtc, false); | 320 | radeon_lock_cursor(crtc, false); |
335 | 321 | ||
@@ -341,8 +327,7 @@ unpin: | |||
341 | radeon_bo_unpin(robj); | 327 | radeon_bo_unpin(robj); |
342 | radeon_bo_unreserve(robj); | 328 | radeon_bo_unreserve(robj); |
343 | } | 329 | } |
344 | if (radeon_crtc->cursor_bo != obj) | 330 | drm_gem_object_unreference_unlocked(radeon_crtc->cursor_bo); |
345 | drm_gem_object_unreference_unlocked(radeon_crtc->cursor_bo); | ||
346 | } | 331 | } |
347 | 332 | ||
348 | radeon_crtc->cursor_bo = obj; | 333 | radeon_crtc->cursor_bo = obj; |
@@ -360,7 +345,6 @@ unpin: | |||
360 | void radeon_cursor_reset(struct drm_crtc *crtc) | 345 | void radeon_cursor_reset(struct drm_crtc *crtc) |
361 | { | 346 | { |
362 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 347 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
363 | int ret; | ||
364 | 348 | ||
365 | if (radeon_crtc->cursor_bo) { | 349 | if (radeon_crtc->cursor_bo) { |
366 | radeon_lock_cursor(crtc, true); | 350 | radeon_lock_cursor(crtc, true); |
@@ -368,12 +352,7 @@ void radeon_cursor_reset(struct drm_crtc *crtc) | |||
368 | radeon_cursor_move_locked(crtc, radeon_crtc->cursor_x, | 352 | radeon_cursor_move_locked(crtc, radeon_crtc->cursor_x, |
369 | radeon_crtc->cursor_y); | 353 | radeon_crtc->cursor_y); |
370 | 354 | ||
371 | ret = radeon_set_cursor(crtc, radeon_crtc->cursor_bo); | 355 | radeon_show_cursor(crtc); |
372 | if (ret) | ||
373 | DRM_ERROR("radeon_set_cursor returned %d, not showing " | ||
374 | "cursor\n", ret); | ||
375 | else | ||
376 | radeon_show_cursor(crtc); | ||
377 | 356 | ||
378 | radeon_lock_cursor(crtc, false); | 357 | radeon_lock_cursor(crtc, false); |
379 | } | 358 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 2593b1168bd6..d8319dae8358 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -1080,6 +1080,22 @@ static bool radeon_check_pot_argument(int arg) | |||
1080 | } | 1080 | } |
1081 | 1081 | ||
1082 | /** | 1082 | /** |
1083 | * Determine a sensible default GART size according to ASIC family. | ||
1084 | * | ||
1085 | * @family ASIC family name | ||
1086 | */ | ||
1087 | static int radeon_gart_size_auto(enum radeon_family family) | ||
1088 | { | ||
1089 | /* default to a larger gart size on newer asics */ | ||
1090 | if (family >= CHIP_TAHITI) | ||
1091 | return 2048; | ||
1092 | else if (family >= CHIP_RV770) | ||
1093 | return 1024; | ||
1094 | else | ||
1095 | return 512; | ||
1096 | } | ||
1097 | |||
1098 | /** | ||
1083 | * radeon_check_arguments - validate module params | 1099 | * radeon_check_arguments - validate module params |
1084 | * | 1100 | * |
1085 | * @rdev: radeon_device pointer | 1101 | * @rdev: radeon_device pointer |
@@ -1097,27 +1113,17 @@ static void radeon_check_arguments(struct radeon_device *rdev) | |||
1097 | } | 1113 | } |
1098 | 1114 | ||
1099 | if (radeon_gart_size == -1) { | 1115 | if (radeon_gart_size == -1) { |
1100 | /* default to a larger gart size on newer asics */ | 1116 | radeon_gart_size = radeon_gart_size_auto(rdev->family); |
1101 | if (rdev->family >= CHIP_RV770) | ||
1102 | radeon_gart_size = 1024; | ||
1103 | else | ||
1104 | radeon_gart_size = 512; | ||
1105 | } | 1117 | } |
1106 | /* gtt size must be power of two and greater or equal to 32M */ | 1118 | /* gtt size must be power of two and greater or equal to 32M */ |
1107 | if (radeon_gart_size < 32) { | 1119 | if (radeon_gart_size < 32) { |
1108 | dev_warn(rdev->dev, "gart size (%d) too small\n", | 1120 | dev_warn(rdev->dev, "gart size (%d) too small\n", |
1109 | radeon_gart_size); | 1121 | radeon_gart_size); |
1110 | if (rdev->family >= CHIP_RV770) | 1122 | radeon_gart_size = radeon_gart_size_auto(rdev->family); |
1111 | radeon_gart_size = 1024; | ||
1112 | else | ||
1113 | radeon_gart_size = 512; | ||
1114 | } else if (!radeon_check_pot_argument(radeon_gart_size)) { | 1123 | } else if (!radeon_check_pot_argument(radeon_gart_size)) { |
1115 | dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n", | 1124 | dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n", |
1116 | radeon_gart_size); | 1125 | radeon_gart_size); |
1117 | if (rdev->family >= CHIP_RV770) | 1126 | radeon_gart_size = radeon_gart_size_auto(rdev->family); |
1118 | radeon_gart_size = 1024; | ||
1119 | else | ||
1120 | radeon_gart_size = 512; | ||
1121 | } | 1127 | } |
1122 | rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20; | 1128 | rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20; |
1123 | 1129 | ||
@@ -1572,11 +1578,21 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon) | |||
1572 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | 1578 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
1573 | } | 1579 | } |
1574 | 1580 | ||
1575 | /* unpin the front buffers */ | 1581 | /* unpin the front buffers and cursors */ |
1576 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 1582 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
1583 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
1577 | struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->primary->fb); | 1584 | struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->primary->fb); |
1578 | struct radeon_bo *robj; | 1585 | struct radeon_bo *robj; |
1579 | 1586 | ||
1587 | if (radeon_crtc->cursor_bo) { | ||
1588 | struct radeon_bo *robj = gem_to_radeon_bo(radeon_crtc->cursor_bo); | ||
1589 | r = radeon_bo_reserve(robj, false); | ||
1590 | if (r == 0) { | ||
1591 | radeon_bo_unpin(robj); | ||
1592 | radeon_bo_unreserve(robj); | ||
1593 | } | ||
1594 | } | ||
1595 | |||
1580 | if (rfb == NULL || rfb->obj == NULL) { | 1596 | if (rfb == NULL || rfb->obj == NULL) { |
1581 | continue; | 1597 | continue; |
1582 | } | 1598 | } |
@@ -1639,6 +1655,7 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | |||
1639 | { | 1655 | { |
1640 | struct drm_connector *connector; | 1656 | struct drm_connector *connector; |
1641 | struct radeon_device *rdev = dev->dev_private; | 1657 | struct radeon_device *rdev = dev->dev_private; |
1658 | struct drm_crtc *crtc; | ||
1642 | int r; | 1659 | int r; |
1643 | 1660 | ||
1644 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 1661 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
@@ -1678,6 +1695,27 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | |||
1678 | 1695 | ||
1679 | radeon_restore_bios_scratch_regs(rdev); | 1696 | radeon_restore_bios_scratch_regs(rdev); |
1680 | 1697 | ||
1698 | /* pin cursors */ | ||
1699 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
1700 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
1701 | |||
1702 | if (radeon_crtc->cursor_bo) { | ||
1703 | struct radeon_bo *robj = gem_to_radeon_bo(radeon_crtc->cursor_bo); | ||
1704 | r = radeon_bo_reserve(robj, false); | ||
1705 | if (r == 0) { | ||
1706 | /* Only 27 bit offset for legacy cursor */ | ||
1707 | r = radeon_bo_pin_restricted(robj, | ||
1708 | RADEON_GEM_DOMAIN_VRAM, | ||
1709 | ASIC_IS_AVIVO(rdev) ? | ||
1710 | 0 : 1 << 27, | ||
1711 | &radeon_crtc->cursor_addr); | ||
1712 | if (r != 0) | ||
1713 | DRM_ERROR("Failed to pin cursor BO (%d)\n", r); | ||
1714 | radeon_bo_unreserve(robj); | ||
1715 | } | ||
1716 | } | ||
1717 | } | ||
1718 | |||
1681 | /* init dig PHYs, disp eng pll */ | 1719 | /* init dig PHYs, disp eng pll */ |
1682 | if (rdev->is_atom_bios) { | 1720 | if (rdev->is_atom_bios) { |
1683 | radeon_atom_encoder_init(rdev); | 1721 | radeon_atom_encoder_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 634793ea8418..aeb676708e60 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -257,6 +257,7 @@ static int radeonfb_create(struct drm_fb_helper *helper, | |||
257 | } | 257 | } |
258 | 258 | ||
259 | info->par = rfbdev; | 259 | info->par = rfbdev; |
260 | info->skip_vt_switch = true; | ||
260 | 261 | ||
261 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); | 262 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); |
262 | if (ret) { | 263 | if (ret) { |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index ac3c1310b953..013ec7106e55 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -428,7 +428,6 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, | |||
428 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | 428 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
429 | struct drm_file *filp) | 429 | struct drm_file *filp) |
430 | { | 430 | { |
431 | struct radeon_device *rdev = dev->dev_private; | ||
432 | struct drm_radeon_gem_busy *args = data; | 431 | struct drm_radeon_gem_busy *args = data; |
433 | struct drm_gem_object *gobj; | 432 | struct drm_gem_object *gobj; |
434 | struct radeon_bo *robj; | 433 | struct radeon_bo *robj; |
@@ -440,10 +439,16 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
440 | return -ENOENT; | 439 | return -ENOENT; |
441 | } | 440 | } |
442 | robj = gem_to_radeon_bo(gobj); | 441 | robj = gem_to_radeon_bo(gobj); |
443 | r = radeon_bo_wait(robj, &cur_placement, true); | 442 | |
443 | r = reservation_object_test_signaled_rcu(robj->tbo.resv, true); | ||
444 | if (r == 0) | ||
445 | r = -EBUSY; | ||
446 | else | ||
447 | r = 0; | ||
448 | |||
449 | cur_placement = ACCESS_ONCE(robj->tbo.mem.mem_type); | ||
444 | args->domain = radeon_mem_type_to_domain(cur_placement); | 450 | args->domain = radeon_mem_type_to_domain(cur_placement); |
445 | drm_gem_object_unreference_unlocked(gobj); | 451 | drm_gem_object_unreference_unlocked(gobj); |
446 | r = radeon_gem_handle_lockup(rdev, r); | ||
447 | return r; | 452 | return r; |
448 | } | 453 | } |
449 | 454 | ||
@@ -471,6 +476,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | |||
471 | r = ret; | 476 | r = ret; |
472 | 477 | ||
473 | /* Flush HDP cache via MMIO if necessary */ | 478 | /* Flush HDP cache via MMIO if necessary */ |
479 | cur_placement = ACCESS_ONCE(robj->tbo.mem.mem_type); | ||
474 | if (rdev->asic->mmio_hdp_flush && | 480 | if (rdev->asic->mmio_hdp_flush && |
475 | radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM) | 481 | radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM) |
476 | robj->rdev->asic->mmio_hdp_flush(rdev); | 482 | robj->rdev->asic->mmio_hdp_flush(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 6de5459316b5..07909d817381 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -343,7 +343,6 @@ struct radeon_crtc { | |||
343 | int max_cursor_width; | 343 | int max_cursor_width; |
344 | int max_cursor_height; | 344 | int max_cursor_height; |
345 | uint32_t legacy_display_base_addr; | 345 | uint32_t legacy_display_base_addr; |
346 | uint32_t legacy_cursor_offset; | ||
347 | enum radeon_rmx_type rmx_type; | 346 | enum radeon_rmx_type rmx_type; |
348 | u8 h_border; | 347 | u8 h_border; |
349 | u8 v_border; | 348 | u8 v_border; |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index ec10533a49b8..48d97c040f49 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
@@ -493,38 +493,35 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
493 | } | 493 | } |
494 | 494 | ||
495 | if (bo_va->it.start || bo_va->it.last) { | 495 | if (bo_va->it.start || bo_va->it.last) { |
496 | spin_lock(&vm->status_lock); | 496 | /* add a clone of the bo_va to clear the old address */ |
497 | if (list_empty(&bo_va->vm_status)) { | 497 | struct radeon_bo_va *tmp; |
498 | /* add a clone of the bo_va to clear the old address */ | 498 | tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); |
499 | struct radeon_bo_va *tmp; | 499 | if (!tmp) { |
500 | spin_unlock(&vm->status_lock); | 500 | mutex_unlock(&vm->mutex); |
501 | tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); | 501 | r = -ENOMEM; |
502 | if (!tmp) { | 502 | goto error_unreserve; |
503 | mutex_unlock(&vm->mutex); | ||
504 | r = -ENOMEM; | ||
505 | goto error_unreserve; | ||
506 | } | ||
507 | tmp->it.start = bo_va->it.start; | ||
508 | tmp->it.last = bo_va->it.last; | ||
509 | tmp->vm = vm; | ||
510 | tmp->bo = radeon_bo_ref(bo_va->bo); | ||
511 | spin_lock(&vm->status_lock); | ||
512 | list_add(&tmp->vm_status, &vm->freed); | ||
513 | } | 503 | } |
514 | spin_unlock(&vm->status_lock); | 504 | tmp->it.start = bo_va->it.start; |
505 | tmp->it.last = bo_va->it.last; | ||
506 | tmp->vm = vm; | ||
507 | tmp->bo = radeon_bo_ref(bo_va->bo); | ||
515 | 508 | ||
516 | interval_tree_remove(&bo_va->it, &vm->va); | 509 | interval_tree_remove(&bo_va->it, &vm->va); |
510 | spin_lock(&vm->status_lock); | ||
517 | bo_va->it.start = 0; | 511 | bo_va->it.start = 0; |
518 | bo_va->it.last = 0; | 512 | bo_va->it.last = 0; |
513 | list_del_init(&bo_va->vm_status); | ||
514 | list_add(&tmp->vm_status, &vm->freed); | ||
515 | spin_unlock(&vm->status_lock); | ||
519 | } | 516 | } |
520 | 517 | ||
521 | if (soffset || eoffset) { | 518 | if (soffset || eoffset) { |
519 | spin_lock(&vm->status_lock); | ||
522 | bo_va->it.start = soffset; | 520 | bo_va->it.start = soffset; |
523 | bo_va->it.last = eoffset - 1; | 521 | bo_va->it.last = eoffset - 1; |
524 | interval_tree_insert(&bo_va->it, &vm->va); | ||
525 | spin_lock(&vm->status_lock); | ||
526 | list_add(&bo_va->vm_status, &vm->cleared); | 522 | list_add(&bo_va->vm_status, &vm->cleared); |
527 | spin_unlock(&vm->status_lock); | 523 | spin_unlock(&vm->status_lock); |
524 | interval_tree_insert(&bo_va->it, &vm->va); | ||
528 | } | 525 | } |
529 | 526 | ||
530 | bo_va->flags = flags; | 527 | bo_va->flags = flags; |
@@ -1158,7 +1155,8 @@ void radeon_vm_bo_invalidate(struct radeon_device *rdev, | |||
1158 | 1155 | ||
1159 | list_for_each_entry(bo_va, &bo->va, bo_list) { | 1156 | list_for_each_entry(bo_va, &bo->va, bo_list) { |
1160 | spin_lock(&bo_va->vm->status_lock); | 1157 | spin_lock(&bo_va->vm->status_lock); |
1161 | if (list_empty(&bo_va->vm_status)) | 1158 | if (list_empty(&bo_va->vm_status) && |
1159 | (bo_va->it.start || bo_va->it.last)) | ||
1162 | list_add(&bo_va->vm_status, &bo_va->vm->invalidated); | 1160 | list_add(&bo_va->vm_status, &bo_va->vm->invalidated); |
1163 | spin_unlock(&bo_va->vm->status_lock); | 1161 | spin_unlock(&bo_va->vm->status_lock); |
1164 | } | 1162 | } |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 26388b5dd6ed..07037e32dea3 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -6466,23 +6466,27 @@ restart_ih: | |||
6466 | case 1: /* D1 vblank/vline */ | 6466 | case 1: /* D1 vblank/vline */ |
6467 | switch (src_data) { | 6467 | switch (src_data) { |
6468 | case 0: /* D1 vblank */ | 6468 | case 0: /* D1 vblank */ |
6469 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) { | 6469 | if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)) |
6470 | if (rdev->irq.crtc_vblank_int[0]) { | 6470 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6471 | drm_handle_vblank(rdev->ddev, 0); | 6471 | |
6472 | rdev->pm.vblank_sync = true; | 6472 | if (rdev->irq.crtc_vblank_int[0]) { |
6473 | wake_up(&rdev->irq.vblank_queue); | 6473 | drm_handle_vblank(rdev->ddev, 0); |
6474 | } | 6474 | rdev->pm.vblank_sync = true; |
6475 | if (atomic_read(&rdev->irq.pflip[0])) | 6475 | wake_up(&rdev->irq.vblank_queue); |
6476 | radeon_crtc_handle_vblank(rdev, 0); | ||
6477 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
6478 | DRM_DEBUG("IH: D1 vblank\n"); | ||
6479 | } | 6476 | } |
6477 | if (atomic_read(&rdev->irq.pflip[0])) | ||
6478 | radeon_crtc_handle_vblank(rdev, 0); | ||
6479 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
6480 | DRM_DEBUG("IH: D1 vblank\n"); | ||
6481 | |||
6480 | break; | 6482 | break; |
6481 | case 1: /* D1 vline */ | 6483 | case 1: /* D1 vline */ |
6482 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) { | 6484 | if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)) |
6483 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; | 6485 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6484 | DRM_DEBUG("IH: D1 vline\n"); | 6486 | |
6485 | } | 6487 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
6488 | DRM_DEBUG("IH: D1 vline\n"); | ||
6489 | |||
6486 | break; | 6490 | break; |
6487 | default: | 6491 | default: |
6488 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6492 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -6492,23 +6496,27 @@ restart_ih: | |||
6492 | case 2: /* D2 vblank/vline */ | 6496 | case 2: /* D2 vblank/vline */ |
6493 | switch (src_data) { | 6497 | switch (src_data) { |
6494 | case 0: /* D2 vblank */ | 6498 | case 0: /* D2 vblank */ |
6495 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) { | 6499 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)) |
6496 | if (rdev->irq.crtc_vblank_int[1]) { | 6500 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6497 | drm_handle_vblank(rdev->ddev, 1); | 6501 | |
6498 | rdev->pm.vblank_sync = true; | 6502 | if (rdev->irq.crtc_vblank_int[1]) { |
6499 | wake_up(&rdev->irq.vblank_queue); | 6503 | drm_handle_vblank(rdev->ddev, 1); |
6500 | } | 6504 | rdev->pm.vblank_sync = true; |
6501 | if (atomic_read(&rdev->irq.pflip[1])) | 6505 | wake_up(&rdev->irq.vblank_queue); |
6502 | radeon_crtc_handle_vblank(rdev, 1); | ||
6503 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
6504 | DRM_DEBUG("IH: D2 vblank\n"); | ||
6505 | } | 6506 | } |
6507 | if (atomic_read(&rdev->irq.pflip[1])) | ||
6508 | radeon_crtc_handle_vblank(rdev, 1); | ||
6509 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
6510 | DRM_DEBUG("IH: D2 vblank\n"); | ||
6511 | |||
6506 | break; | 6512 | break; |
6507 | case 1: /* D2 vline */ | 6513 | case 1: /* D2 vline */ |
6508 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) { | 6514 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)) |
6509 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; | 6515 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6510 | DRM_DEBUG("IH: D2 vline\n"); | 6516 | |
6511 | } | 6517 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; |
6518 | DRM_DEBUG("IH: D2 vline\n"); | ||
6519 | |||
6512 | break; | 6520 | break; |
6513 | default: | 6521 | default: |
6514 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6522 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -6518,23 +6526,27 @@ restart_ih: | |||
6518 | case 3: /* D3 vblank/vline */ | 6526 | case 3: /* D3 vblank/vline */ |
6519 | switch (src_data) { | 6527 | switch (src_data) { |
6520 | case 0: /* D3 vblank */ | 6528 | case 0: /* D3 vblank */ |
6521 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { | 6529 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)) |
6522 | if (rdev->irq.crtc_vblank_int[2]) { | 6530 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6523 | drm_handle_vblank(rdev->ddev, 2); | 6531 | |
6524 | rdev->pm.vblank_sync = true; | 6532 | if (rdev->irq.crtc_vblank_int[2]) { |
6525 | wake_up(&rdev->irq.vblank_queue); | 6533 | drm_handle_vblank(rdev->ddev, 2); |
6526 | } | 6534 | rdev->pm.vblank_sync = true; |
6527 | if (atomic_read(&rdev->irq.pflip[2])) | 6535 | wake_up(&rdev->irq.vblank_queue); |
6528 | radeon_crtc_handle_vblank(rdev, 2); | ||
6529 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
6530 | DRM_DEBUG("IH: D3 vblank\n"); | ||
6531 | } | 6536 | } |
6537 | if (atomic_read(&rdev->irq.pflip[2])) | ||
6538 | radeon_crtc_handle_vblank(rdev, 2); | ||
6539 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
6540 | DRM_DEBUG("IH: D3 vblank\n"); | ||
6541 | |||
6532 | break; | 6542 | break; |
6533 | case 1: /* D3 vline */ | 6543 | case 1: /* D3 vline */ |
6534 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { | 6544 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)) |
6535 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; | 6545 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6536 | DRM_DEBUG("IH: D3 vline\n"); | 6546 | |
6537 | } | 6547 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; |
6548 | DRM_DEBUG("IH: D3 vline\n"); | ||
6549 | |||
6538 | break; | 6550 | break; |
6539 | default: | 6551 | default: |
6540 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6552 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -6544,23 +6556,27 @@ restart_ih: | |||
6544 | case 4: /* D4 vblank/vline */ | 6556 | case 4: /* D4 vblank/vline */ |
6545 | switch (src_data) { | 6557 | switch (src_data) { |
6546 | case 0: /* D4 vblank */ | 6558 | case 0: /* D4 vblank */ |
6547 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { | 6559 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)) |
6548 | if (rdev->irq.crtc_vblank_int[3]) { | 6560 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6549 | drm_handle_vblank(rdev->ddev, 3); | 6561 | |
6550 | rdev->pm.vblank_sync = true; | 6562 | if (rdev->irq.crtc_vblank_int[3]) { |
6551 | wake_up(&rdev->irq.vblank_queue); | 6563 | drm_handle_vblank(rdev->ddev, 3); |
6552 | } | 6564 | rdev->pm.vblank_sync = true; |
6553 | if (atomic_read(&rdev->irq.pflip[3])) | 6565 | wake_up(&rdev->irq.vblank_queue); |
6554 | radeon_crtc_handle_vblank(rdev, 3); | ||
6555 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
6556 | DRM_DEBUG("IH: D4 vblank\n"); | ||
6557 | } | 6566 | } |
6567 | if (atomic_read(&rdev->irq.pflip[3])) | ||
6568 | radeon_crtc_handle_vblank(rdev, 3); | ||
6569 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
6570 | DRM_DEBUG("IH: D4 vblank\n"); | ||
6571 | |||
6558 | break; | 6572 | break; |
6559 | case 1: /* D4 vline */ | 6573 | case 1: /* D4 vline */ |
6560 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { | 6574 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)) |
6561 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; | 6575 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6562 | DRM_DEBUG("IH: D4 vline\n"); | 6576 | |
6563 | } | 6577 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; |
6578 | DRM_DEBUG("IH: D4 vline\n"); | ||
6579 | |||
6564 | break; | 6580 | break; |
6565 | default: | 6581 | default: |
6566 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6582 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -6570,23 +6586,27 @@ restart_ih: | |||
6570 | case 5: /* D5 vblank/vline */ | 6586 | case 5: /* D5 vblank/vline */ |
6571 | switch (src_data) { | 6587 | switch (src_data) { |
6572 | case 0: /* D5 vblank */ | 6588 | case 0: /* D5 vblank */ |
6573 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { | 6589 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)) |
6574 | if (rdev->irq.crtc_vblank_int[4]) { | 6590 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6575 | drm_handle_vblank(rdev->ddev, 4); | 6591 | |
6576 | rdev->pm.vblank_sync = true; | 6592 | if (rdev->irq.crtc_vblank_int[4]) { |
6577 | wake_up(&rdev->irq.vblank_queue); | 6593 | drm_handle_vblank(rdev->ddev, 4); |
6578 | } | 6594 | rdev->pm.vblank_sync = true; |
6579 | if (atomic_read(&rdev->irq.pflip[4])) | 6595 | wake_up(&rdev->irq.vblank_queue); |
6580 | radeon_crtc_handle_vblank(rdev, 4); | ||
6581 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
6582 | DRM_DEBUG("IH: D5 vblank\n"); | ||
6583 | } | 6596 | } |
6597 | if (atomic_read(&rdev->irq.pflip[4])) | ||
6598 | radeon_crtc_handle_vblank(rdev, 4); | ||
6599 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
6600 | DRM_DEBUG("IH: D5 vblank\n"); | ||
6601 | |||
6584 | break; | 6602 | break; |
6585 | case 1: /* D5 vline */ | 6603 | case 1: /* D5 vline */ |
6586 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { | 6604 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)) |
6587 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; | 6605 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6588 | DRM_DEBUG("IH: D5 vline\n"); | 6606 | |
6589 | } | 6607 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; |
6608 | DRM_DEBUG("IH: D5 vline\n"); | ||
6609 | |||
6590 | break; | 6610 | break; |
6591 | default: | 6611 | default: |
6592 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6612 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -6596,23 +6616,27 @@ restart_ih: | |||
6596 | case 6: /* D6 vblank/vline */ | 6616 | case 6: /* D6 vblank/vline */ |
6597 | switch (src_data) { | 6617 | switch (src_data) { |
6598 | case 0: /* D6 vblank */ | 6618 | case 0: /* D6 vblank */ |
6599 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { | 6619 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)) |
6600 | if (rdev->irq.crtc_vblank_int[5]) { | 6620 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6601 | drm_handle_vblank(rdev->ddev, 5); | 6621 | |
6602 | rdev->pm.vblank_sync = true; | 6622 | if (rdev->irq.crtc_vblank_int[5]) { |
6603 | wake_up(&rdev->irq.vblank_queue); | 6623 | drm_handle_vblank(rdev->ddev, 5); |
6604 | } | 6624 | rdev->pm.vblank_sync = true; |
6605 | if (atomic_read(&rdev->irq.pflip[5])) | 6625 | wake_up(&rdev->irq.vblank_queue); |
6606 | radeon_crtc_handle_vblank(rdev, 5); | ||
6607 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
6608 | DRM_DEBUG("IH: D6 vblank\n"); | ||
6609 | } | 6626 | } |
6627 | if (atomic_read(&rdev->irq.pflip[5])) | ||
6628 | radeon_crtc_handle_vblank(rdev, 5); | ||
6629 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
6630 | DRM_DEBUG("IH: D6 vblank\n"); | ||
6631 | |||
6610 | break; | 6632 | break; |
6611 | case 1: /* D6 vline */ | 6633 | case 1: /* D6 vline */ |
6612 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { | 6634 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)) |
6613 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; | 6635 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6614 | DRM_DEBUG("IH: D6 vline\n"); | 6636 | |
6615 | } | 6637 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; |
6638 | DRM_DEBUG("IH: D6 vline\n"); | ||
6639 | |||
6616 | break; | 6640 | break; |
6617 | default: | 6641 | default: |
6618 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6642 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
@@ -6632,88 +6656,112 @@ restart_ih: | |||
6632 | case 42: /* HPD hotplug */ | 6656 | case 42: /* HPD hotplug */ |
6633 | switch (src_data) { | 6657 | switch (src_data) { |
6634 | case 0: | 6658 | case 0: |
6635 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { | 6659 | if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT)) |
6636 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; | 6660 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6637 | queue_hotplug = true; | 6661 | |
6638 | DRM_DEBUG("IH: HPD1\n"); | 6662 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
6639 | } | 6663 | queue_hotplug = true; |
6664 | DRM_DEBUG("IH: HPD1\n"); | ||
6665 | |||
6640 | break; | 6666 | break; |
6641 | case 1: | 6667 | case 1: |
6642 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) { | 6668 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT)) |
6643 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; | 6669 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6644 | queue_hotplug = true; | 6670 | |
6645 | DRM_DEBUG("IH: HPD2\n"); | 6671 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; |
6646 | } | 6672 | queue_hotplug = true; |
6673 | DRM_DEBUG("IH: HPD2\n"); | ||
6674 | |||
6647 | break; | 6675 | break; |
6648 | case 2: | 6676 | case 2: |
6649 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) { | 6677 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT)) |
6650 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; | 6678 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6651 | queue_hotplug = true; | 6679 | |
6652 | DRM_DEBUG("IH: HPD3\n"); | 6680 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; |
6653 | } | 6681 | queue_hotplug = true; |
6682 | DRM_DEBUG("IH: HPD3\n"); | ||
6683 | |||
6654 | break; | 6684 | break; |
6655 | case 3: | 6685 | case 3: |
6656 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) { | 6686 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT)) |
6657 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; | 6687 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6658 | queue_hotplug = true; | 6688 | |
6659 | DRM_DEBUG("IH: HPD4\n"); | 6689 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; |
6660 | } | 6690 | queue_hotplug = true; |
6691 | DRM_DEBUG("IH: HPD4\n"); | ||
6692 | |||
6661 | break; | 6693 | break; |
6662 | case 4: | 6694 | case 4: |
6663 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) { | 6695 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT)) |
6664 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; | 6696 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6665 | queue_hotplug = true; | 6697 | |
6666 | DRM_DEBUG("IH: HPD5\n"); | 6698 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; |
6667 | } | 6699 | queue_hotplug = true; |
6700 | DRM_DEBUG("IH: HPD5\n"); | ||
6701 | |||
6668 | break; | 6702 | break; |
6669 | case 5: | 6703 | case 5: |
6670 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { | 6704 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT)) |
6671 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; | 6705 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6672 | queue_hotplug = true; | 6706 | |
6673 | DRM_DEBUG("IH: HPD6\n"); | 6707 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; |
6674 | } | 6708 | queue_hotplug = true; |
6709 | DRM_DEBUG("IH: HPD6\n"); | ||
6710 | |||
6675 | break; | 6711 | break; |
6676 | case 6: | 6712 | case 6: |
6677 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) { | 6713 | if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT)) |
6678 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT; | 6714 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6679 | queue_dp = true; | 6715 | |
6680 | DRM_DEBUG("IH: HPD_RX 1\n"); | 6716 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT; |
6681 | } | 6717 | queue_dp = true; |
6718 | DRM_DEBUG("IH: HPD_RX 1\n"); | ||
6719 | |||
6682 | break; | 6720 | break; |
6683 | case 7: | 6721 | case 7: |
6684 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) { | 6722 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT)) |
6685 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; | 6723 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6686 | queue_dp = true; | 6724 | |
6687 | DRM_DEBUG("IH: HPD_RX 2\n"); | 6725 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; |
6688 | } | 6726 | queue_dp = true; |
6727 | DRM_DEBUG("IH: HPD_RX 2\n"); | ||
6728 | |||
6689 | break; | 6729 | break; |
6690 | case 8: | 6730 | case 8: |
6691 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) { | 6731 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT)) |
6692 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; | 6732 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6693 | queue_dp = true; | 6733 | |
6694 | DRM_DEBUG("IH: HPD_RX 3\n"); | 6734 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; |
6695 | } | 6735 | queue_dp = true; |
6736 | DRM_DEBUG("IH: HPD_RX 3\n"); | ||
6737 | |||
6696 | break; | 6738 | break; |
6697 | case 9: | 6739 | case 9: |
6698 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) { | 6740 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT)) |
6699 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; | 6741 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6700 | queue_dp = true; | 6742 | |
6701 | DRM_DEBUG("IH: HPD_RX 4\n"); | 6743 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; |
6702 | } | 6744 | queue_dp = true; |
6745 | DRM_DEBUG("IH: HPD_RX 4\n"); | ||
6746 | |||
6703 | break; | 6747 | break; |
6704 | case 10: | 6748 | case 10: |
6705 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) { | 6749 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT)) |
6706 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; | 6750 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6707 | queue_dp = true; | 6751 | |
6708 | DRM_DEBUG("IH: HPD_RX 5\n"); | 6752 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; |
6709 | } | 6753 | queue_dp = true; |
6754 | DRM_DEBUG("IH: HPD_RX 5\n"); | ||
6755 | |||
6710 | break; | 6756 | break; |
6711 | case 11: | 6757 | case 11: |
6712 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | 6758 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT)) |
6713 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; | 6759 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
6714 | queue_dp = true; | 6760 | |
6715 | DRM_DEBUG("IH: HPD_RX 6\n"); | 6761 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; |
6716 | } | 6762 | queue_dp = true; |
6763 | DRM_DEBUG("IH: HPD_RX 6\n"); | ||
6764 | |||
6717 | break; | 6765 | break; |
6718 | default: | 6766 | default: |
6719 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 6767 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |