diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
commit | 1f16f116b01c110db20ab808562c8b8bc3ee3d6e (patch) | |
tree | 44db563f64cf5f8d62af8f99a61e2b248c44ea3a /drivers/gpu/drm/i915 | |
parent | 03724ac3d48f8f0e3caf1d30fa134f8fd96c94e2 (diff) | |
parent | f9eccf24615672896dc13251410c3f2f33a14f95 (diff) |
Merge branches 'clockevents/4.4-fixes' and 'clockevents/4.5-fixes' of http://git.linaro.org/people/daniel.lezcano/linux into timers/urgent
Pull in fixes from Daniel Lezcano:
- Fix the vt8500 timer leading to a system lock up when dealing with too
small delta (Roman Volkov)
- Select the CLKSRC_MMIO when the fsl_ftm_timer is enabled with COMPILE_TEST
(Daniel Lezcano)
- Prevent to compile timers using the 'iomem' API when the architecture has
not HAS_IOMEM set (Richard Weinberger)
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 123 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_fence.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 123 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 51 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 34 |
14 files changed, 282 insertions, 155 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index a3b22bdacd44..8aab974b0564 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -2734,6 +2734,8 @@ static const char *power_domain_str(enum intel_display_power_domain domain) | |||
2734 | return "AUX_C"; | 2734 | return "AUX_C"; |
2735 | case POWER_DOMAIN_AUX_D: | 2735 | case POWER_DOMAIN_AUX_D: |
2736 | return "AUX_D"; | 2736 | return "AUX_D"; |
2737 | case POWER_DOMAIN_GMBUS: | ||
2738 | return "GMBUS"; | ||
2737 | case POWER_DOMAIN_INIT: | 2739 | case POWER_DOMAIN_INIT: |
2738 | return "INIT"; | 2740 | return "INIT"; |
2739 | default: | 2741 | default: |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 95bb27de774f..f4af19a0d569 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -199,6 +199,7 @@ enum intel_display_power_domain { | |||
199 | POWER_DOMAIN_AUX_B, | 199 | POWER_DOMAIN_AUX_B, |
200 | POWER_DOMAIN_AUX_C, | 200 | POWER_DOMAIN_AUX_C, |
201 | POWER_DOMAIN_AUX_D, | 201 | POWER_DOMAIN_AUX_D, |
202 | POWER_DOMAIN_GMBUS, | ||
202 | POWER_DOMAIN_INIT, | 203 | POWER_DOMAIN_INIT, |
203 | 204 | ||
204 | POWER_DOMAIN_NUM, | 205 | POWER_DOMAIN_NUM, |
@@ -2192,8 +2193,17 @@ struct drm_i915_gem_request { | |||
2192 | struct drm_i915_private *i915; | 2193 | struct drm_i915_private *i915; |
2193 | struct intel_engine_cs *ring; | 2194 | struct intel_engine_cs *ring; |
2194 | 2195 | ||
2195 | /** GEM sequence number associated with this request. */ | 2196 | /** GEM sequence number associated with the previous request, |
2196 | uint32_t seqno; | 2197 | * when the HWS breadcrumb is equal to this the GPU is processing |
2198 | * this request. | ||
2199 | */ | ||
2200 | u32 previous_seqno; | ||
2201 | |||
2202 | /** GEM sequence number associated with this request, | ||
2203 | * when the HWS breadcrumb is equal or greater than this the GPU | ||
2204 | * has finished processing this request. | ||
2205 | */ | ||
2206 | u32 seqno; | ||
2197 | 2207 | ||
2198 | /** Position in the ringbuffer of the start of the request */ | 2208 | /** Position in the ringbuffer of the start of the request */ |
2199 | u32 head; | 2209 | u32 head; |
@@ -2838,6 +2848,7 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj, | |||
2838 | 2848 | ||
2839 | int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level, | 2849 | int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level, |
2840 | u32 flags); | 2850 | u32 flags); |
2851 | void __i915_vma_set_map_and_fenceable(struct i915_vma *vma); | ||
2841 | int __must_check i915_vma_unbind(struct i915_vma *vma); | 2852 | int __must_check i915_vma_unbind(struct i915_vma *vma); |
2842 | /* | 2853 | /* |
2843 | * BEWARE: Do not use the function below unless you can _absolutely_ | 2854 | * BEWARE: Do not use the function below unless you can _absolutely_ |
@@ -2909,15 +2920,17 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2) | |||
2909 | return (int32_t)(seq1 - seq2) >= 0; | 2920 | return (int32_t)(seq1 - seq2) >= 0; |
2910 | } | 2921 | } |
2911 | 2922 | ||
2923 | static inline bool i915_gem_request_started(struct drm_i915_gem_request *req, | ||
2924 | bool lazy_coherency) | ||
2925 | { | ||
2926 | u32 seqno = req->ring->get_seqno(req->ring, lazy_coherency); | ||
2927 | return i915_seqno_passed(seqno, req->previous_seqno); | ||
2928 | } | ||
2929 | |||
2912 | static inline bool i915_gem_request_completed(struct drm_i915_gem_request *req, | 2930 | static inline bool i915_gem_request_completed(struct drm_i915_gem_request *req, |
2913 | bool lazy_coherency) | 2931 | bool lazy_coherency) |
2914 | { | 2932 | { |
2915 | u32 seqno; | 2933 | u32 seqno = req->ring->get_seqno(req->ring, lazy_coherency); |
2916 | |||
2917 | BUG_ON(req == NULL); | ||
2918 | |||
2919 | seqno = req->ring->get_seqno(req->ring, lazy_coherency); | ||
2920 | |||
2921 | return i915_seqno_passed(seqno, req->seqno); | 2934 | return i915_seqno_passed(seqno, req->seqno); |
2922 | } | 2935 | } |
2923 | 2936 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 91bb1fc27420..f56af0aaafde 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1146,23 +1146,74 @@ static bool missed_irq(struct drm_i915_private *dev_priv, | |||
1146 | return test_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings); | 1146 | return test_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings); |
1147 | } | 1147 | } |
1148 | 1148 | ||
1149 | static int __i915_spin_request(struct drm_i915_gem_request *req) | 1149 | static unsigned long local_clock_us(unsigned *cpu) |
1150 | { | ||
1151 | unsigned long t; | ||
1152 | |||
1153 | /* Cheaply and approximately convert from nanoseconds to microseconds. | ||
1154 | * The result and subsequent calculations are also defined in the same | ||
1155 | * approximate microseconds units. The principal source of timing | ||
1156 | * error here is from the simple truncation. | ||
1157 | * | ||
1158 | * Note that local_clock() is only defined wrt to the current CPU; | ||
1159 | * the comparisons are no longer valid if we switch CPUs. Instead of | ||
1160 | * blocking preemption for the entire busywait, we can detect the CPU | ||
1161 | * switch and use that as indicator of system load and a reason to | ||
1162 | * stop busywaiting, see busywait_stop(). | ||
1163 | */ | ||
1164 | *cpu = get_cpu(); | ||
1165 | t = local_clock() >> 10; | ||
1166 | put_cpu(); | ||
1167 | |||
1168 | return t; | ||
1169 | } | ||
1170 | |||
1171 | static bool busywait_stop(unsigned long timeout, unsigned cpu) | ||
1172 | { | ||
1173 | unsigned this_cpu; | ||
1174 | |||
1175 | if (time_after(local_clock_us(&this_cpu), timeout)) | ||
1176 | return true; | ||
1177 | |||
1178 | return this_cpu != cpu; | ||
1179 | } | ||
1180 | |||
1181 | static int __i915_spin_request(struct drm_i915_gem_request *req, int state) | ||
1150 | { | 1182 | { |
1151 | unsigned long timeout; | 1183 | unsigned long timeout; |
1184 | unsigned cpu; | ||
1185 | |||
1186 | /* When waiting for high frequency requests, e.g. during synchronous | ||
1187 | * rendering split between the CPU and GPU, the finite amount of time | ||
1188 | * required to set up the irq and wait upon it limits the response | ||
1189 | * rate. By busywaiting on the request completion for a short while we | ||
1190 | * can service the high frequency waits as quick as possible. However, | ||
1191 | * if it is a slow request, we want to sleep as quickly as possible. | ||
1192 | * The tradeoff between waiting and sleeping is roughly the time it | ||
1193 | * takes to sleep on a request, on the order of a microsecond. | ||
1194 | */ | ||
1152 | 1195 | ||
1153 | if (i915_gem_request_get_ring(req)->irq_refcount) | 1196 | if (req->ring->irq_refcount) |
1154 | return -EBUSY; | 1197 | return -EBUSY; |
1155 | 1198 | ||
1156 | timeout = jiffies + 1; | 1199 | /* Only spin if we know the GPU is processing this request */ |
1200 | if (!i915_gem_request_started(req, true)) | ||
1201 | return -EAGAIN; | ||
1202 | |||
1203 | timeout = local_clock_us(&cpu) + 5; | ||
1157 | while (!need_resched()) { | 1204 | while (!need_resched()) { |
1158 | if (i915_gem_request_completed(req, true)) | 1205 | if (i915_gem_request_completed(req, true)) |
1159 | return 0; | 1206 | return 0; |
1160 | 1207 | ||
1161 | if (time_after_eq(jiffies, timeout)) | 1208 | if (signal_pending_state(state, current)) |
1209 | break; | ||
1210 | |||
1211 | if (busywait_stop(timeout, cpu)) | ||
1162 | break; | 1212 | break; |
1163 | 1213 | ||
1164 | cpu_relax_lowlatency(); | 1214 | cpu_relax_lowlatency(); |
1165 | } | 1215 | } |
1216 | |||
1166 | if (i915_gem_request_completed(req, false)) | 1217 | if (i915_gem_request_completed(req, false)) |
1167 | return 0; | 1218 | return 0; |
1168 | 1219 | ||
@@ -1197,6 +1248,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, | |||
1197 | struct drm_i915_private *dev_priv = dev->dev_private; | 1248 | struct drm_i915_private *dev_priv = dev->dev_private; |
1198 | const bool irq_test_in_progress = | 1249 | const bool irq_test_in_progress = |
1199 | ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring); | 1250 | ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring); |
1251 | int state = interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE; | ||
1200 | DEFINE_WAIT(wait); | 1252 | DEFINE_WAIT(wait); |
1201 | unsigned long timeout_expire; | 1253 | unsigned long timeout_expire; |
1202 | s64 before, now; | 1254 | s64 before, now; |
@@ -1210,8 +1262,16 @@ int __i915_wait_request(struct drm_i915_gem_request *req, | |||
1210 | if (i915_gem_request_completed(req, true)) | 1262 | if (i915_gem_request_completed(req, true)) |
1211 | return 0; | 1263 | return 0; |
1212 | 1264 | ||
1213 | timeout_expire = timeout ? | 1265 | timeout_expire = 0; |
1214 | jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0; | 1266 | if (timeout) { |
1267 | if (WARN_ON(*timeout < 0)) | ||
1268 | return -EINVAL; | ||
1269 | |||
1270 | if (*timeout == 0) | ||
1271 | return -ETIME; | ||
1272 | |||
1273 | timeout_expire = jiffies + nsecs_to_jiffies_timeout(*timeout); | ||
1274 | } | ||
1215 | 1275 | ||
1216 | if (INTEL_INFO(dev_priv)->gen >= 6) | 1276 | if (INTEL_INFO(dev_priv)->gen >= 6) |
1217 | gen6_rps_boost(dev_priv, rps, req->emitted_jiffies); | 1277 | gen6_rps_boost(dev_priv, rps, req->emitted_jiffies); |
@@ -1221,7 +1281,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, | |||
1221 | before = ktime_get_raw_ns(); | 1281 | before = ktime_get_raw_ns(); |
1222 | 1282 | ||
1223 | /* Optimistic spin for the next jiffie before touching IRQs */ | 1283 | /* Optimistic spin for the next jiffie before touching IRQs */ |
1224 | ret = __i915_spin_request(req); | 1284 | ret = __i915_spin_request(req, state); |
1225 | if (ret == 0) | 1285 | if (ret == 0) |
1226 | goto out; | 1286 | goto out; |
1227 | 1287 | ||
@@ -1233,8 +1293,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, | |||
1233 | for (;;) { | 1293 | for (;;) { |
1234 | struct timer_list timer; | 1294 | struct timer_list timer; |
1235 | 1295 | ||
1236 | prepare_to_wait(&ring->irq_queue, &wait, | 1296 | prepare_to_wait(&ring->irq_queue, &wait, state); |
1237 | interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE); | ||
1238 | 1297 | ||
1239 | /* We need to check whether any gpu reset happened in between | 1298 | /* We need to check whether any gpu reset happened in between |
1240 | * the caller grabbing the seqno and now ... */ | 1299 | * the caller grabbing the seqno and now ... */ |
@@ -1252,7 +1311,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, | |||
1252 | break; | 1311 | break; |
1253 | } | 1312 | } |
1254 | 1313 | ||
1255 | if (interruptible && signal_pending(current)) { | 1314 | if (signal_pending_state(state, current)) { |
1256 | ret = -ERESTARTSYS; | 1315 | ret = -ERESTARTSYS; |
1257 | break; | 1316 | break; |
1258 | } | 1317 | } |
@@ -2546,6 +2605,7 @@ void __i915_add_request(struct drm_i915_gem_request *request, | |||
2546 | request->batch_obj = obj; | 2605 | request->batch_obj = obj; |
2547 | 2606 | ||
2548 | request->emitted_jiffies = jiffies; | 2607 | request->emitted_jiffies = jiffies; |
2608 | request->previous_seqno = ring->last_submitted_seqno; | ||
2549 | ring->last_submitted_seqno = request->seqno; | 2609 | ring->last_submitted_seqno = request->seqno; |
2550 | list_add_tail(&request->list, &ring->request_list); | 2610 | list_add_tail(&request->list, &ring->request_list); |
2551 | 2611 | ||
@@ -4072,6 +4132,29 @@ i915_vma_misplaced(struct i915_vma *vma, uint32_t alignment, uint64_t flags) | |||
4072 | return false; | 4132 | return false; |
4073 | } | 4133 | } |
4074 | 4134 | ||
4135 | void __i915_vma_set_map_and_fenceable(struct i915_vma *vma) | ||
4136 | { | ||
4137 | struct drm_i915_gem_object *obj = vma->obj; | ||
4138 | bool mappable, fenceable; | ||
4139 | u32 fence_size, fence_alignment; | ||
4140 | |||
4141 | fence_size = i915_gem_get_gtt_size(obj->base.dev, | ||
4142 | obj->base.size, | ||
4143 | obj->tiling_mode); | ||
4144 | fence_alignment = i915_gem_get_gtt_alignment(obj->base.dev, | ||
4145 | obj->base.size, | ||
4146 | obj->tiling_mode, | ||
4147 | true); | ||
4148 | |||
4149 | fenceable = (vma->node.size == fence_size && | ||
4150 | (vma->node.start & (fence_alignment - 1)) == 0); | ||
4151 | |||
4152 | mappable = (vma->node.start + fence_size <= | ||
4153 | to_i915(obj->base.dev)->gtt.mappable_end); | ||
4154 | |||
4155 | obj->map_and_fenceable = mappable && fenceable; | ||
4156 | } | ||
4157 | |||
4075 | static int | 4158 | static int |
4076 | i915_gem_object_do_pin(struct drm_i915_gem_object *obj, | 4159 | i915_gem_object_do_pin(struct drm_i915_gem_object *obj, |
4077 | struct i915_address_space *vm, | 4160 | struct i915_address_space *vm, |
@@ -4139,25 +4222,7 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj, | |||
4139 | 4222 | ||
4140 | if (ggtt_view && ggtt_view->type == I915_GGTT_VIEW_NORMAL && | 4223 | if (ggtt_view && ggtt_view->type == I915_GGTT_VIEW_NORMAL && |
4141 | (bound ^ vma->bound) & GLOBAL_BIND) { | 4224 | (bound ^ vma->bound) & GLOBAL_BIND) { |
4142 | bool mappable, fenceable; | 4225 | __i915_vma_set_map_and_fenceable(vma); |
4143 | u32 fence_size, fence_alignment; | ||
4144 | |||
4145 | fence_size = i915_gem_get_gtt_size(obj->base.dev, | ||
4146 | obj->base.size, | ||
4147 | obj->tiling_mode); | ||
4148 | fence_alignment = i915_gem_get_gtt_alignment(obj->base.dev, | ||
4149 | obj->base.size, | ||
4150 | obj->tiling_mode, | ||
4151 | true); | ||
4152 | |||
4153 | fenceable = (vma->node.size == fence_size && | ||
4154 | (vma->node.start & (fence_alignment - 1)) == 0); | ||
4155 | |||
4156 | mappable = (vma->node.start + fence_size <= | ||
4157 | dev_priv->gtt.mappable_end); | ||
4158 | |||
4159 | obj->map_and_fenceable = mappable && fenceable; | ||
4160 | |||
4161 | WARN_ON(flags & PIN_MAPPABLE && !obj->map_and_fenceable); | 4226 | WARN_ON(flags & PIN_MAPPABLE && !obj->map_and_fenceable); |
4162 | } | 4227 | } |
4163 | 4228 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 8c688a5f1589..02ceb7a4b481 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -141,8 +141,6 @@ static void i915_gem_context_clean(struct intel_context *ctx) | |||
141 | if (!ppgtt) | 141 | if (!ppgtt) |
142 | return; | 142 | return; |
143 | 143 | ||
144 | WARN_ON(!list_empty(&ppgtt->base.active_list)); | ||
145 | |||
146 | list_for_each_entry_safe(vma, next, &ppgtt->base.inactive_list, | 144 | list_for_each_entry_safe(vma, next, &ppgtt->base.inactive_list, |
147 | mm_list) { | 145 | mm_list) { |
148 | if (WARN_ON(__i915_vma_unbind_no_wait(vma))) | 146 | if (WARN_ON(__i915_vma_unbind_no_wait(vma))) |
diff --git a/drivers/gpu/drm/i915/i915_gem_fence.c b/drivers/gpu/drm/i915/i915_gem_fence.c index 40a10b25956c..f010391b87f5 100644 --- a/drivers/gpu/drm/i915/i915_gem_fence.c +++ b/drivers/gpu/drm/i915/i915_gem_fence.c | |||
@@ -642,11 +642,10 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
642 | } | 642 | } |
643 | 643 | ||
644 | /* check for L-shaped memory aka modified enhanced addressing */ | 644 | /* check for L-shaped memory aka modified enhanced addressing */ |
645 | if (IS_GEN4(dev)) { | 645 | if (IS_GEN4(dev) && |
646 | uint32_t ddc2 = I915_READ(DCC2); | 646 | !(I915_READ(DCC2) & DCC2_MODIFIED_ENHANCED_DISABLE)) { |
647 | 647 | swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; | |
648 | if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) | 648 | swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; |
649 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; | ||
650 | } | 649 | } |
651 | 650 | ||
652 | if (dcc == 0xffffffff) { | 651 | if (dcc == 0xffffffff) { |
@@ -675,16 +674,35 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
675 | * matching, which was the case for the swizzling required in | 674 | * matching, which was the case for the swizzling required in |
676 | * the table above, or from the 1-ch value being less than | 675 | * the table above, or from the 1-ch value being less than |
677 | * the minimum size of a rank. | 676 | * the minimum size of a rank. |
677 | * | ||
678 | * Reports indicate that the swizzling actually | ||
679 | * varies depending upon page placement inside the | ||
680 | * channels, i.e. we see swizzled pages where the | ||
681 | * banks of memory are paired and unswizzled on the | ||
682 | * uneven portion, so leave that as unknown. | ||
678 | */ | 683 | */ |
679 | if (I915_READ16(C0DRB3) != I915_READ16(C1DRB3)) { | 684 | if (I915_READ16(C0DRB3) == I915_READ16(C1DRB3)) { |
680 | swizzle_x = I915_BIT_6_SWIZZLE_NONE; | ||
681 | swizzle_y = I915_BIT_6_SWIZZLE_NONE; | ||
682 | } else { | ||
683 | swizzle_x = I915_BIT_6_SWIZZLE_9_10; | 685 | swizzle_x = I915_BIT_6_SWIZZLE_9_10; |
684 | swizzle_y = I915_BIT_6_SWIZZLE_9; | 686 | swizzle_y = I915_BIT_6_SWIZZLE_9; |
685 | } | 687 | } |
686 | } | 688 | } |
687 | 689 | ||
690 | if (swizzle_x == I915_BIT_6_SWIZZLE_UNKNOWN || | ||
691 | swizzle_y == I915_BIT_6_SWIZZLE_UNKNOWN) { | ||
692 | /* Userspace likes to explode if it sees unknown swizzling, | ||
693 | * so lie. We will finish the lie when reporting through | ||
694 | * the get-tiling-ioctl by reporting the physical swizzle | ||
695 | * mode as unknown instead. | ||
696 | * | ||
697 | * As we don't strictly know what the swizzling is, it may be | ||
698 | * bit17 dependent, and so we need to also prevent the pages | ||
699 | * from being moved. | ||
700 | */ | ||
701 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; | ||
702 | swizzle_x = I915_BIT_6_SWIZZLE_NONE; | ||
703 | swizzle_y = I915_BIT_6_SWIZZLE_NONE; | ||
704 | } | ||
705 | |||
688 | dev_priv->mm.bit_6_swizzle_x = swizzle_x; | 706 | dev_priv->mm.bit_6_swizzle_x = swizzle_x; |
689 | dev_priv->mm.bit_6_swizzle_y = swizzle_y; | 707 | dev_priv->mm.bit_6_swizzle_y = swizzle_y; |
690 | } | 708 | } |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 43f35d12b677..86c7500454b4 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -2676,6 +2676,7 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev, | |||
2676 | return ret; | 2676 | return ret; |
2677 | } | 2677 | } |
2678 | vma->bound |= GLOBAL_BIND; | 2678 | vma->bound |= GLOBAL_BIND; |
2679 | __i915_vma_set_map_and_fenceable(vma); | ||
2679 | list_add_tail(&vma->mm_list, &ggtt_vm->inactive_list); | 2680 | list_add_tail(&vma->mm_list, &ggtt_vm->inactive_list); |
2680 | } | 2681 | } |
2681 | 2682 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index cdacf3f5b77a..87e919a06b27 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
@@ -687,6 +687,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, | |||
687 | } | 687 | } |
688 | 688 | ||
689 | vma->bound |= GLOBAL_BIND; | 689 | vma->bound |= GLOBAL_BIND; |
690 | __i915_vma_set_map_and_fenceable(vma); | ||
690 | list_add_tail(&vma->mm_list, &ggtt->inactive_list); | 691 | list_add_tail(&vma->mm_list, &ggtt->inactive_list); |
691 | } | 692 | } |
692 | 693 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 71860f8680f9..beb0374a19f1 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -116,6 +116,7 @@ static void skylake_pfit_enable(struct intel_crtc *crtc); | |||
116 | static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force); | 116 | static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force); |
117 | static void ironlake_pfit_enable(struct intel_crtc *crtc); | 117 | static void ironlake_pfit_enable(struct intel_crtc *crtc); |
118 | static void intel_modeset_setup_hw_state(struct drm_device *dev); | 118 | static void intel_modeset_setup_hw_state(struct drm_device *dev); |
119 | static void intel_pre_disable_primary(struct drm_crtc *crtc); | ||
119 | 120 | ||
120 | typedef struct { | 121 | typedef struct { |
121 | int min, max; | 122 | int min, max; |
@@ -2607,6 +2608,8 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, | |||
2607 | struct drm_i915_gem_object *obj; | 2608 | struct drm_i915_gem_object *obj; |
2608 | struct drm_plane *primary = intel_crtc->base.primary; | 2609 | struct drm_plane *primary = intel_crtc->base.primary; |
2609 | struct drm_plane_state *plane_state = primary->state; | 2610 | struct drm_plane_state *plane_state = primary->state; |
2611 | struct drm_crtc_state *crtc_state = intel_crtc->base.state; | ||
2612 | struct intel_plane *intel_plane = to_intel_plane(primary); | ||
2610 | struct drm_framebuffer *fb; | 2613 | struct drm_framebuffer *fb; |
2611 | 2614 | ||
2612 | if (!plane_config->fb) | 2615 | if (!plane_config->fb) |
@@ -2643,6 +2646,18 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, | |||
2643 | } | 2646 | } |
2644 | } | 2647 | } |
2645 | 2648 | ||
2649 | /* | ||
2650 | * We've failed to reconstruct the BIOS FB. Current display state | ||
2651 | * indicates that the primary plane is visible, but has a NULL FB, | ||
2652 | * which will lead to problems later if we don't fix it up. The | ||
2653 | * simplest solution is to just disable the primary plane now and | ||
2654 | * pretend the BIOS never had it enabled. | ||
2655 | */ | ||
2656 | to_intel_plane_state(plane_state)->visible = false; | ||
2657 | crtc_state->plane_mask &= ~(1 << drm_plane_index(primary)); | ||
2658 | intel_pre_disable_primary(&intel_crtc->base); | ||
2659 | intel_plane->disable_plane(primary, &intel_crtc->base); | ||
2660 | |||
2646 | return; | 2661 | return; |
2647 | 2662 | ||
2648 | valid_fb: | 2663 | valid_fb: |
@@ -5194,11 +5209,31 @@ static enum intel_display_power_domain port_to_power_domain(enum port port) | |||
5194 | case PORT_E: | 5209 | case PORT_E: |
5195 | return POWER_DOMAIN_PORT_DDI_E_2_LANES; | 5210 | return POWER_DOMAIN_PORT_DDI_E_2_LANES; |
5196 | default: | 5211 | default: |
5197 | WARN_ON_ONCE(1); | 5212 | MISSING_CASE(port); |
5198 | return POWER_DOMAIN_PORT_OTHER; | 5213 | return POWER_DOMAIN_PORT_OTHER; |
5199 | } | 5214 | } |
5200 | } | 5215 | } |
5201 | 5216 | ||
5217 | static enum intel_display_power_domain port_to_aux_power_domain(enum port port) | ||
5218 | { | ||
5219 | switch (port) { | ||
5220 | case PORT_A: | ||
5221 | return POWER_DOMAIN_AUX_A; | ||
5222 | case PORT_B: | ||
5223 | return POWER_DOMAIN_AUX_B; | ||
5224 | case PORT_C: | ||
5225 | return POWER_DOMAIN_AUX_C; | ||
5226 | case PORT_D: | ||
5227 | return POWER_DOMAIN_AUX_D; | ||
5228 | case PORT_E: | ||
5229 | /* FIXME: Check VBT for actual wiring of PORT E */ | ||
5230 | return POWER_DOMAIN_AUX_D; | ||
5231 | default: | ||
5232 | MISSING_CASE(port); | ||
5233 | return POWER_DOMAIN_AUX_A; | ||
5234 | } | ||
5235 | } | ||
5236 | |||
5202 | #define for_each_power_domain(domain, mask) \ | 5237 | #define for_each_power_domain(domain, mask) \ |
5203 | for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \ | 5238 | for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \ |
5204 | if ((1 << (domain)) & (mask)) | 5239 | if ((1 << (domain)) & (mask)) |
@@ -5230,6 +5265,36 @@ intel_display_port_power_domain(struct intel_encoder *intel_encoder) | |||
5230 | } | 5265 | } |
5231 | } | 5266 | } |
5232 | 5267 | ||
5268 | enum intel_display_power_domain | ||
5269 | intel_display_port_aux_power_domain(struct intel_encoder *intel_encoder) | ||
5270 | { | ||
5271 | struct drm_device *dev = intel_encoder->base.dev; | ||
5272 | struct intel_digital_port *intel_dig_port; | ||
5273 | |||
5274 | switch (intel_encoder->type) { | ||
5275 | case INTEL_OUTPUT_UNKNOWN: | ||
5276 | case INTEL_OUTPUT_HDMI: | ||
5277 | /* | ||
5278 | * Only DDI platforms should ever use these output types. | ||
5279 | * We can get here after the HDMI detect code has already set | ||
5280 | * the type of the shared encoder. Since we can't be sure | ||
5281 | * what's the status of the given connectors, play safe and | ||
5282 | * run the DP detection too. | ||
5283 | */ | ||
5284 | WARN_ON_ONCE(!HAS_DDI(dev)); | ||
5285 | case INTEL_OUTPUT_DISPLAYPORT: | ||
5286 | case INTEL_OUTPUT_EDP: | ||
5287 | intel_dig_port = enc_to_dig_port(&intel_encoder->base); | ||
5288 | return port_to_aux_power_domain(intel_dig_port->port); | ||
5289 | case INTEL_OUTPUT_DP_MST: | ||
5290 | intel_dig_port = enc_to_mst(&intel_encoder->base)->primary; | ||
5291 | return port_to_aux_power_domain(intel_dig_port->port); | ||
5292 | default: | ||
5293 | MISSING_CASE(intel_encoder->type); | ||
5294 | return POWER_DOMAIN_AUX_A; | ||
5295 | } | ||
5296 | } | ||
5297 | |||
5233 | static unsigned long get_crtc_power_domains(struct drm_crtc *crtc) | 5298 | static unsigned long get_crtc_power_domains(struct drm_crtc *crtc) |
5234 | { | 5299 | { |
5235 | struct drm_device *dev = crtc->dev; | 5300 | struct drm_device *dev = crtc->dev; |
@@ -6259,9 +6324,11 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc) | |||
6259 | if (to_intel_plane_state(crtc->primary->state)->visible) { | 6324 | if (to_intel_plane_state(crtc->primary->state)->visible) { |
6260 | intel_crtc_wait_for_pending_flips(crtc); | 6325 | intel_crtc_wait_for_pending_flips(crtc); |
6261 | intel_pre_disable_primary(crtc); | 6326 | intel_pre_disable_primary(crtc); |
6327 | |||
6328 | intel_crtc_disable_planes(crtc, 1 << drm_plane_index(crtc->primary)); | ||
6329 | to_intel_plane_state(crtc->primary->state)->visible = false; | ||
6262 | } | 6330 | } |
6263 | 6331 | ||
6264 | intel_crtc_disable_planes(crtc, crtc->state->plane_mask); | ||
6265 | dev_priv->display.crtc_disable(crtc); | 6332 | dev_priv->display.crtc_disable(crtc); |
6266 | intel_crtc->active = false; | 6333 | intel_crtc->active = false; |
6267 | intel_update_watermarks(crtc); | 6334 | intel_update_watermarks(crtc); |
@@ -9858,14 +9925,14 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc, | |||
9858 | return true; | 9925 | return true; |
9859 | } | 9926 | } |
9860 | 9927 | ||
9861 | static void i845_update_cursor(struct drm_crtc *crtc, u32 base) | 9928 | static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on) |
9862 | { | 9929 | { |
9863 | struct drm_device *dev = crtc->dev; | 9930 | struct drm_device *dev = crtc->dev; |
9864 | struct drm_i915_private *dev_priv = dev->dev_private; | 9931 | struct drm_i915_private *dev_priv = dev->dev_private; |
9865 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 9932 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
9866 | uint32_t cntl = 0, size = 0; | 9933 | uint32_t cntl = 0, size = 0; |
9867 | 9934 | ||
9868 | if (base) { | 9935 | if (on) { |
9869 | unsigned int width = intel_crtc->base.cursor->state->crtc_w; | 9936 | unsigned int width = intel_crtc->base.cursor->state->crtc_w; |
9870 | unsigned int height = intel_crtc->base.cursor->state->crtc_h; | 9937 | unsigned int height = intel_crtc->base.cursor->state->crtc_h; |
9871 | unsigned int stride = roundup_pow_of_two(width) * 4; | 9938 | unsigned int stride = roundup_pow_of_two(width) * 4; |
@@ -9920,16 +9987,15 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base) | |||
9920 | } | 9987 | } |
9921 | } | 9988 | } |
9922 | 9989 | ||
9923 | static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base) | 9990 | static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on) |
9924 | { | 9991 | { |
9925 | struct drm_device *dev = crtc->dev; | 9992 | struct drm_device *dev = crtc->dev; |
9926 | struct drm_i915_private *dev_priv = dev->dev_private; | 9993 | struct drm_i915_private *dev_priv = dev->dev_private; |
9927 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 9994 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
9928 | int pipe = intel_crtc->pipe; | 9995 | int pipe = intel_crtc->pipe; |
9929 | uint32_t cntl; | 9996 | uint32_t cntl = 0; |
9930 | 9997 | ||
9931 | cntl = 0; | 9998 | if (on) { |
9932 | if (base) { | ||
9933 | cntl = MCURSOR_GAMMA_ENABLE; | 9999 | cntl = MCURSOR_GAMMA_ENABLE; |
9934 | switch (intel_crtc->base.cursor->state->crtc_w) { | 10000 | switch (intel_crtc->base.cursor->state->crtc_w) { |
9935 | case 64: | 10001 | case 64: |
@@ -9980,18 +10046,17 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc, | |||
9980 | int y = cursor_state->crtc_y; | 10046 | int y = cursor_state->crtc_y; |
9981 | u32 base = 0, pos = 0; | 10047 | u32 base = 0, pos = 0; |
9982 | 10048 | ||
9983 | if (on) | 10049 | base = intel_crtc->cursor_addr; |
9984 | base = intel_crtc->cursor_addr; | ||
9985 | 10050 | ||
9986 | if (x >= intel_crtc->config->pipe_src_w) | 10051 | if (x >= intel_crtc->config->pipe_src_w) |
9987 | base = 0; | 10052 | on = false; |
9988 | 10053 | ||
9989 | if (y >= intel_crtc->config->pipe_src_h) | 10054 | if (y >= intel_crtc->config->pipe_src_h) |
9990 | base = 0; | 10055 | on = false; |
9991 | 10056 | ||
9992 | if (x < 0) { | 10057 | if (x < 0) { |
9993 | if (x + cursor_state->crtc_w <= 0) | 10058 | if (x + cursor_state->crtc_w <= 0) |
9994 | base = 0; | 10059 | on = false; |
9995 | 10060 | ||
9996 | pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT; | 10061 | pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT; |
9997 | x = -x; | 10062 | x = -x; |
@@ -10000,16 +10065,13 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc, | |||
10000 | 10065 | ||
10001 | if (y < 0) { | 10066 | if (y < 0) { |
10002 | if (y + cursor_state->crtc_h <= 0) | 10067 | if (y + cursor_state->crtc_h <= 0) |
10003 | base = 0; | 10068 | on = false; |
10004 | 10069 | ||
10005 | pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT; | 10070 | pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT; |
10006 | y = -y; | 10071 | y = -y; |
10007 | } | 10072 | } |
10008 | pos |= y << CURSOR_Y_SHIFT; | 10073 | pos |= y << CURSOR_Y_SHIFT; |
10009 | 10074 | ||
10010 | if (base == 0 && intel_crtc->cursor_base == 0) | ||
10011 | return; | ||
10012 | |||
10013 | I915_WRITE(CURPOS(pipe), pos); | 10075 | I915_WRITE(CURPOS(pipe), pos); |
10014 | 10076 | ||
10015 | /* ILK+ do this automagically */ | 10077 | /* ILK+ do this automagically */ |
@@ -10020,9 +10082,9 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc, | |||
10020 | } | 10082 | } |
10021 | 10083 | ||
10022 | if (IS_845G(dev) || IS_I865G(dev)) | 10084 | if (IS_845G(dev) || IS_I865G(dev)) |
10023 | i845_update_cursor(crtc, base); | 10085 | i845_update_cursor(crtc, base, on); |
10024 | else | 10086 | else |
10025 | i9xx_update_cursor(crtc, base); | 10087 | i9xx_update_cursor(crtc, base, on); |
10026 | } | 10088 | } |
10027 | 10089 | ||
10028 | static bool cursor_size_ok(struct drm_device *dev, | 10090 | static bool cursor_size_ok(struct drm_device *dev, |
@@ -12460,7 +12522,6 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
12460 | if (INTEL_INFO(dev)->gen < 8) { | 12522 | if (INTEL_INFO(dev)->gen < 8) { |
12461 | PIPE_CONF_CHECK_M_N(dp_m_n); | 12523 | PIPE_CONF_CHECK_M_N(dp_m_n); |
12462 | 12524 | ||
12463 | PIPE_CONF_CHECK_I(has_drrs); | ||
12464 | if (current_config->has_drrs) | 12525 | if (current_config->has_drrs) |
12465 | PIPE_CONF_CHECK_M_N(dp_m2_n2); | 12526 | PIPE_CONF_CHECK_M_N(dp_m2_n2); |
12466 | } else | 12527 | } else |
@@ -13667,6 +13728,7 @@ intel_check_cursor_plane(struct drm_plane *plane, | |||
13667 | struct drm_crtc *crtc = crtc_state->base.crtc; | 13728 | struct drm_crtc *crtc = crtc_state->base.crtc; |
13668 | struct drm_framebuffer *fb = state->base.fb; | 13729 | struct drm_framebuffer *fb = state->base.fb; |
13669 | struct drm_i915_gem_object *obj = intel_fb_obj(fb); | 13730 | struct drm_i915_gem_object *obj = intel_fb_obj(fb); |
13731 | enum pipe pipe = to_intel_plane(plane)->pipe; | ||
13670 | unsigned stride; | 13732 | unsigned stride; |
13671 | int ret; | 13733 | int ret; |
13672 | 13734 | ||
@@ -13700,6 +13762,22 @@ intel_check_cursor_plane(struct drm_plane *plane, | |||
13700 | return -EINVAL; | 13762 | return -EINVAL; |
13701 | } | 13763 | } |
13702 | 13764 | ||
13765 | /* | ||
13766 | * There's something wrong with the cursor on CHV pipe C. | ||
13767 | * If it straddles the left edge of the screen then | ||
13768 | * moving it away from the edge or disabling it often | ||
13769 | * results in a pipe underrun, and often that can lead to | ||
13770 | * dead pipe (constant underrun reported, and it scans | ||
13771 | * out just a solid color). To recover from that, the | ||
13772 | * display power well must be turned off and on again. | ||
13773 | * Refuse the put the cursor into that compromised position. | ||
13774 | */ | ||
13775 | if (IS_CHERRYVIEW(plane->dev) && pipe == PIPE_C && | ||
13776 | state->visible && state->base.crtc_x < 0) { | ||
13777 | DRM_DEBUG_KMS("CHV cursor C not allowed to straddle the left screen edge\n"); | ||
13778 | return -EINVAL; | ||
13779 | } | ||
13780 | |||
13703 | return 0; | 13781 | return 0; |
13704 | } | 13782 | } |
13705 | 13783 | ||
@@ -13723,9 +13801,6 @@ intel_commit_cursor_plane(struct drm_plane *plane, | |||
13723 | crtc = crtc ? crtc : plane->crtc; | 13801 | crtc = crtc ? crtc : plane->crtc; |
13724 | intel_crtc = to_intel_crtc(crtc); | 13802 | intel_crtc = to_intel_crtc(crtc); |
13725 | 13803 | ||
13726 | if (intel_crtc->cursor_bo == obj) | ||
13727 | goto update; | ||
13728 | |||
13729 | if (!obj) | 13804 | if (!obj) |
13730 | addr = 0; | 13805 | addr = 0; |
13731 | else if (!INTEL_INFO(dev)->cursor_needs_physical) | 13806 | else if (!INTEL_INFO(dev)->cursor_needs_physical) |
@@ -13734,9 +13809,7 @@ intel_commit_cursor_plane(struct drm_plane *plane, | |||
13734 | addr = obj->phys_handle->busaddr; | 13809 | addr = obj->phys_handle->busaddr; |
13735 | 13810 | ||
13736 | intel_crtc->cursor_addr = addr; | 13811 | intel_crtc->cursor_addr = addr; |
13737 | intel_crtc->cursor_bo = obj; | ||
13738 | 13812 | ||
13739 | update: | ||
13740 | if (crtc->state->active) | 13813 | if (crtc->state->active) |
13741 | intel_crtc_update_cursor(crtc, state->visible); | 13814 | intel_crtc_update_cursor(crtc, state->visible); |
13742 | } | 13815 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 09bdd94ca3ba..78b8ec84d576 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -277,7 +277,7 @@ static void pps_lock(struct intel_dp *intel_dp) | |||
277 | * See vlv_power_sequencer_reset() why we need | 277 | * See vlv_power_sequencer_reset() why we need |
278 | * a power domain reference here. | 278 | * a power domain reference here. |
279 | */ | 279 | */ |
280 | power_domain = intel_display_port_power_domain(encoder); | 280 | power_domain = intel_display_port_aux_power_domain(encoder); |
281 | intel_display_power_get(dev_priv, power_domain); | 281 | intel_display_power_get(dev_priv, power_domain); |
282 | 282 | ||
283 | mutex_lock(&dev_priv->pps_mutex); | 283 | mutex_lock(&dev_priv->pps_mutex); |
@@ -293,7 +293,7 @@ static void pps_unlock(struct intel_dp *intel_dp) | |||
293 | 293 | ||
294 | mutex_unlock(&dev_priv->pps_mutex); | 294 | mutex_unlock(&dev_priv->pps_mutex); |
295 | 295 | ||
296 | power_domain = intel_display_port_power_domain(encoder); | 296 | power_domain = intel_display_port_aux_power_domain(encoder); |
297 | intel_display_power_put(dev_priv, power_domain); | 297 | intel_display_power_put(dev_priv, power_domain); |
298 | } | 298 | } |
299 | 299 | ||
@@ -816,8 +816,6 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
816 | 816 | ||
817 | intel_dp_check_edp(intel_dp); | 817 | intel_dp_check_edp(intel_dp); |
818 | 818 | ||
819 | intel_aux_display_runtime_get(dev_priv); | ||
820 | |||
821 | /* Try to wait for any previous AUX channel activity */ | 819 | /* Try to wait for any previous AUX channel activity */ |
822 | for (try = 0; try < 3; try++) { | 820 | for (try = 0; try < 3; try++) { |
823 | status = I915_READ_NOTRACE(ch_ctl); | 821 | status = I915_READ_NOTRACE(ch_ctl); |
@@ -926,7 +924,6 @@ done: | |||
926 | ret = recv_bytes; | 924 | ret = recv_bytes; |
927 | out: | 925 | out: |
928 | pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE); | 926 | pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE); |
929 | intel_aux_display_runtime_put(dev_priv); | ||
930 | 927 | ||
931 | if (vdd) | 928 | if (vdd) |
932 | edp_panel_vdd_off(intel_dp, false); | 929 | edp_panel_vdd_off(intel_dp, false); |
@@ -1784,7 +1781,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp) | |||
1784 | if (edp_have_panel_vdd(intel_dp)) | 1781 | if (edp_have_panel_vdd(intel_dp)) |
1785 | return need_to_disable; | 1782 | return need_to_disable; |
1786 | 1783 | ||
1787 | power_domain = intel_display_port_power_domain(intel_encoder); | 1784 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
1788 | intel_display_power_get(dev_priv, power_domain); | 1785 | intel_display_power_get(dev_priv, power_domain); |
1789 | 1786 | ||
1790 | DRM_DEBUG_KMS("Turning eDP port %c VDD on\n", | 1787 | DRM_DEBUG_KMS("Turning eDP port %c VDD on\n", |
@@ -1874,7 +1871,7 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) | |||
1874 | if ((pp & POWER_TARGET_ON) == 0) | 1871 | if ((pp & POWER_TARGET_ON) == 0) |
1875 | intel_dp->last_power_cycle = jiffies; | 1872 | intel_dp->last_power_cycle = jiffies; |
1876 | 1873 | ||
1877 | power_domain = intel_display_port_power_domain(intel_encoder); | 1874 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
1878 | intel_display_power_put(dev_priv, power_domain); | 1875 | intel_display_power_put(dev_priv, power_domain); |
1879 | } | 1876 | } |
1880 | 1877 | ||
@@ -2025,7 +2022,7 @@ static void edp_panel_off(struct intel_dp *intel_dp) | |||
2025 | wait_panel_off(intel_dp); | 2022 | wait_panel_off(intel_dp); |
2026 | 2023 | ||
2027 | /* We got a reference when we enabled the VDD. */ | 2024 | /* We got a reference when we enabled the VDD. */ |
2028 | power_domain = intel_display_port_power_domain(intel_encoder); | 2025 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
2029 | intel_display_power_put(dev_priv, power_domain); | 2026 | intel_display_power_put(dev_priv, power_domain); |
2030 | } | 2027 | } |
2031 | 2028 | ||
@@ -4765,26 +4762,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp) | |||
4765 | intel_dp->has_audio = false; | 4762 | intel_dp->has_audio = false; |
4766 | } | 4763 | } |
4767 | 4764 | ||
4768 | static enum intel_display_power_domain | ||
4769 | intel_dp_power_get(struct intel_dp *dp) | ||
4770 | { | ||
4771 | struct intel_encoder *encoder = &dp_to_dig_port(dp)->base; | ||
4772 | enum intel_display_power_domain power_domain; | ||
4773 | |||
4774 | power_domain = intel_display_port_power_domain(encoder); | ||
4775 | intel_display_power_get(to_i915(encoder->base.dev), power_domain); | ||
4776 | |||
4777 | return power_domain; | ||
4778 | } | ||
4779 | |||
4780 | static void | ||
4781 | intel_dp_power_put(struct intel_dp *dp, | ||
4782 | enum intel_display_power_domain power_domain) | ||
4783 | { | ||
4784 | struct intel_encoder *encoder = &dp_to_dig_port(dp)->base; | ||
4785 | intel_display_power_put(to_i915(encoder->base.dev), power_domain); | ||
4786 | } | ||
4787 | |||
4788 | static enum drm_connector_status | 4765 | static enum drm_connector_status |
4789 | intel_dp_detect(struct drm_connector *connector, bool force) | 4766 | intel_dp_detect(struct drm_connector *connector, bool force) |
4790 | { | 4767 | { |
@@ -4808,7 +4785,8 @@ intel_dp_detect(struct drm_connector *connector, bool force) | |||
4808 | return connector_status_disconnected; | 4785 | return connector_status_disconnected; |
4809 | } | 4786 | } |
4810 | 4787 | ||
4811 | power_domain = intel_dp_power_get(intel_dp); | 4788 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
4789 | intel_display_power_get(to_i915(dev), power_domain); | ||
4812 | 4790 | ||
4813 | /* Can't disconnect eDP, but you can close the lid... */ | 4791 | /* Can't disconnect eDP, but you can close the lid... */ |
4814 | if (is_edp(intel_dp)) | 4792 | if (is_edp(intel_dp)) |
@@ -4853,7 +4831,7 @@ intel_dp_detect(struct drm_connector *connector, bool force) | |||
4853 | } | 4831 | } |
4854 | 4832 | ||
4855 | out: | 4833 | out: |
4856 | intel_dp_power_put(intel_dp, power_domain); | 4834 | intel_display_power_put(to_i915(dev), power_domain); |
4857 | return status; | 4835 | return status; |
4858 | } | 4836 | } |
4859 | 4837 | ||
@@ -4862,6 +4840,7 @@ intel_dp_force(struct drm_connector *connector) | |||
4862 | { | 4840 | { |
4863 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 4841 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
4864 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; | 4842 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; |
4843 | struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); | ||
4865 | enum intel_display_power_domain power_domain; | 4844 | enum intel_display_power_domain power_domain; |
4866 | 4845 | ||
4867 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | 4846 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", |
@@ -4871,11 +4850,12 @@ intel_dp_force(struct drm_connector *connector) | |||
4871 | if (connector->status != connector_status_connected) | 4850 | if (connector->status != connector_status_connected) |
4872 | return; | 4851 | return; |
4873 | 4852 | ||
4874 | power_domain = intel_dp_power_get(intel_dp); | 4853 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
4854 | intel_display_power_get(dev_priv, power_domain); | ||
4875 | 4855 | ||
4876 | intel_dp_set_edid(intel_dp); | 4856 | intel_dp_set_edid(intel_dp); |
4877 | 4857 | ||
4878 | intel_dp_power_put(intel_dp, power_domain); | 4858 | intel_display_power_put(dev_priv, power_domain); |
4879 | 4859 | ||
4880 | if (intel_encoder->type != INTEL_OUTPUT_EDP) | 4860 | if (intel_encoder->type != INTEL_OUTPUT_EDP) |
4881 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; | 4861 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; |
@@ -5091,7 +5071,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) | |||
5091 | * indefinitely. | 5071 | * indefinitely. |
5092 | */ | 5072 | */ |
5093 | DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n"); | 5073 | DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n"); |
5094 | power_domain = intel_display_port_power_domain(&intel_dig_port->base); | 5074 | power_domain = intel_display_port_aux_power_domain(&intel_dig_port->base); |
5095 | intel_display_power_get(dev_priv, power_domain); | 5075 | intel_display_power_get(dev_priv, power_domain); |
5096 | 5076 | ||
5097 | edp_panel_vdd_schedule_off(intel_dp); | 5077 | edp_panel_vdd_schedule_off(intel_dp); |
@@ -5153,7 +5133,8 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
5153 | enum intel_display_power_domain power_domain; | 5133 | enum intel_display_power_domain power_domain; |
5154 | enum irqreturn ret = IRQ_NONE; | 5134 | enum irqreturn ret = IRQ_NONE; |
5155 | 5135 | ||
5156 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP) | 5136 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP && |
5137 | intel_dig_port->base.type != INTEL_OUTPUT_HDMI) | ||
5157 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; | 5138 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; |
5158 | 5139 | ||
5159 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { | 5140 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { |
@@ -5172,7 +5153,7 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
5172 | port_name(intel_dig_port->port), | 5153 | port_name(intel_dig_port->port), |
5173 | long_hpd ? "long" : "short"); | 5154 | long_hpd ? "long" : "short"); |
5174 | 5155 | ||
5175 | power_domain = intel_display_port_power_domain(intel_encoder); | 5156 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
5176 | intel_display_power_get(dev_priv, power_domain); | 5157 | intel_display_power_get(dev_priv, power_domain); |
5177 | 5158 | ||
5178 | if (long_hpd) { | 5159 | if (long_hpd) { |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 0598932ce623..0d00f07b7163 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -550,7 +550,6 @@ struct intel_crtc { | |||
550 | int adjusted_x; | 550 | int adjusted_x; |
551 | int adjusted_y; | 551 | int adjusted_y; |
552 | 552 | ||
553 | struct drm_i915_gem_object *cursor_bo; | ||
554 | uint32_t cursor_addr; | 553 | uint32_t cursor_addr; |
555 | uint32_t cursor_cntl; | 554 | uint32_t cursor_cntl; |
556 | uint32_t cursor_size; | 555 | uint32_t cursor_size; |
@@ -1169,6 +1168,8 @@ void hsw_enable_ips(struct intel_crtc *crtc); | |||
1169 | void hsw_disable_ips(struct intel_crtc *crtc); | 1168 | void hsw_disable_ips(struct intel_crtc *crtc); |
1170 | enum intel_display_power_domain | 1169 | enum intel_display_power_domain |
1171 | intel_display_port_power_domain(struct intel_encoder *intel_encoder); | 1170 | intel_display_port_power_domain(struct intel_encoder *intel_encoder); |
1171 | enum intel_display_power_domain | ||
1172 | intel_display_port_aux_power_domain(struct intel_encoder *intel_encoder); | ||
1172 | void intel_mode_from_pipe_config(struct drm_display_mode *mode, | 1173 | void intel_mode_from_pipe_config(struct drm_display_mode *mode, |
1173 | struct intel_crtc_state *pipe_config); | 1174 | struct intel_crtc_state *pipe_config); |
1174 | void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc); | 1175 | void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc); |
@@ -1377,8 +1378,6 @@ void intel_display_power_get(struct drm_i915_private *dev_priv, | |||
1377 | enum intel_display_power_domain domain); | 1378 | enum intel_display_power_domain domain); |
1378 | void intel_display_power_put(struct drm_i915_private *dev_priv, | 1379 | void intel_display_power_put(struct drm_i915_private *dev_priv, |
1379 | enum intel_display_power_domain domain); | 1380 | enum intel_display_power_domain domain); |
1380 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); | ||
1381 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); | ||
1382 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv); | 1381 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv); |
1383 | void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); | 1382 | void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); |
1384 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv); | 1383 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 9eafa191cee2..64086f2d4e26 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -1335,21 +1335,17 @@ intel_hdmi_set_edid(struct drm_connector *connector, bool force) | |||
1335 | { | 1335 | { |
1336 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | 1336 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
1337 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | 1337 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); |
1338 | struct intel_encoder *intel_encoder = | ||
1339 | &hdmi_to_dig_port(intel_hdmi)->base; | ||
1340 | enum intel_display_power_domain power_domain; | ||
1341 | struct edid *edid = NULL; | 1338 | struct edid *edid = NULL; |
1342 | bool connected = false; | 1339 | bool connected = false; |
1343 | 1340 | ||
1344 | power_domain = intel_display_port_power_domain(intel_encoder); | 1341 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
1345 | intel_display_power_get(dev_priv, power_domain); | ||
1346 | 1342 | ||
1347 | if (force) | 1343 | if (force) |
1348 | edid = drm_get_edid(connector, | 1344 | edid = drm_get_edid(connector, |
1349 | intel_gmbus_get_adapter(dev_priv, | 1345 | intel_gmbus_get_adapter(dev_priv, |
1350 | intel_hdmi->ddc_bus)); | 1346 | intel_hdmi->ddc_bus)); |
1351 | 1347 | ||
1352 | intel_display_power_put(dev_priv, power_domain); | 1348 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); |
1353 | 1349 | ||
1354 | to_intel_connector(connector)->detect_edid = edid; | 1350 | to_intel_connector(connector)->detect_edid = edid; |
1355 | if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { | 1351 | if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { |
@@ -1378,15 +1374,18 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) | |||
1378 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | 1374 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); |
1379 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | 1375 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
1380 | bool live_status = false; | 1376 | bool live_status = false; |
1381 | unsigned int retry = 3; | 1377 | unsigned int try; |
1382 | 1378 | ||
1383 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | 1379 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", |
1384 | connector->base.id, connector->name); | 1380 | connector->base.id, connector->name); |
1385 | 1381 | ||
1386 | while (!live_status && --retry) { | 1382 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
1383 | |||
1384 | for (try = 0; !live_status && try < 4; try++) { | ||
1385 | if (try) | ||
1386 | msleep(10); | ||
1387 | live_status = intel_digital_port_connected(dev_priv, | 1387 | live_status = intel_digital_port_connected(dev_priv, |
1388 | hdmi_to_dig_port(intel_hdmi)); | 1388 | hdmi_to_dig_port(intel_hdmi)); |
1389 | mdelay(10); | ||
1390 | } | 1389 | } |
1391 | 1390 | ||
1392 | if (!live_status) | 1391 | if (!live_status) |
@@ -1402,6 +1401,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) | |||
1402 | } else | 1401 | } else |
1403 | status = connector_status_disconnected; | 1402 | status = connector_status_disconnected; |
1404 | 1403 | ||
1404 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); | ||
1405 | |||
1405 | return status; | 1406 | return status; |
1406 | } | 1407 | } |
1407 | 1408 | ||
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 1369fc41d039..8324654037b6 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
@@ -483,7 +483,7 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
483 | int i = 0, inc, try = 0; | 483 | int i = 0, inc, try = 0; |
484 | int ret = 0; | 484 | int ret = 0; |
485 | 485 | ||
486 | intel_aux_display_runtime_get(dev_priv); | 486 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
487 | mutex_lock(&dev_priv->gmbus_mutex); | 487 | mutex_lock(&dev_priv->gmbus_mutex); |
488 | 488 | ||
489 | if (bus->force_bit) { | 489 | if (bus->force_bit) { |
@@ -595,7 +595,9 @@ timeout: | |||
595 | 595 | ||
596 | out: | 596 | out: |
597 | mutex_unlock(&dev_priv->gmbus_mutex); | 597 | mutex_unlock(&dev_priv->gmbus_mutex); |
598 | intel_aux_display_runtime_put(dev_priv); | 598 | |
599 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); | ||
600 | |||
599 | return ret; | 601 | return ret; |
600 | } | 602 | } |
601 | 603 | ||
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 071a76b9ac52..f091ad12d694 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -4782,8 +4782,7 @@ static void gen9_enable_rc6(struct drm_device *dev) | |||
4782 | /* 2b: Program RC6 thresholds.*/ | 4782 | /* 2b: Program RC6 thresholds.*/ |
4783 | 4783 | ||
4784 | /* WaRsDoubleRc6WrlWithCoarsePowerGating: Doubling WRL only when CPG is enabled */ | 4784 | /* WaRsDoubleRc6WrlWithCoarsePowerGating: Doubling WRL only when CPG is enabled */ |
4785 | if (IS_SKYLAKE(dev) && !((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && | 4785 | if (IS_SKYLAKE(dev)) |
4786 | (INTEL_REVID(dev) <= SKL_REVID_E0))) | ||
4787 | I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 108 << 16); | 4786 | I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 108 << 16); |
4788 | else | 4787 | else |
4789 | I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16); | 4788 | I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16); |
@@ -4825,7 +4824,7 @@ static void gen9_enable_rc6(struct drm_device *dev) | |||
4825 | * WaRsDisableCoarsePowerGating:skl,bxt - Render/Media PG need to be disabled with RC6. | 4824 | * WaRsDisableCoarsePowerGating:skl,bxt - Render/Media PG need to be disabled with RC6. |
4826 | */ | 4825 | */ |
4827 | if ((IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) || | 4826 | if ((IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) || |
4828 | ((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && (INTEL_REVID(dev) <= SKL_REVID_E0))) | 4827 | ((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && (INTEL_REVID(dev) <= SKL_REVID_F0))) |
4829 | I915_WRITE(GEN9_PG_ENABLE, 0); | 4828 | I915_WRITE(GEN9_PG_ENABLE, 0); |
4830 | else | 4829 | else |
4831 | I915_WRITE(GEN9_PG_ENABLE, (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ? | 4830 | I915_WRITE(GEN9_PG_ENABLE, (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ? |
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index d89c1d0aa1b7..7e23d65c9b24 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -362,6 +362,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv, | |||
362 | BIT(POWER_DOMAIN_AUX_C) | \ | 362 | BIT(POWER_DOMAIN_AUX_C) | \ |
363 | BIT(POWER_DOMAIN_AUDIO) | \ | 363 | BIT(POWER_DOMAIN_AUDIO) | \ |
364 | BIT(POWER_DOMAIN_VGA) | \ | 364 | BIT(POWER_DOMAIN_VGA) | \ |
365 | BIT(POWER_DOMAIN_GMBUS) | \ | ||
365 | BIT(POWER_DOMAIN_INIT)) | 366 | BIT(POWER_DOMAIN_INIT)) |
366 | #define BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS ( \ | 367 | #define BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS ( \ |
367 | BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ | 368 | BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ |
@@ -1483,6 +1484,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, | |||
1483 | BIT(POWER_DOMAIN_AUX_B) | \ | 1484 | BIT(POWER_DOMAIN_AUX_B) | \ |
1484 | BIT(POWER_DOMAIN_AUX_C) | \ | 1485 | BIT(POWER_DOMAIN_AUX_C) | \ |
1485 | BIT(POWER_DOMAIN_AUX_D) | \ | 1486 | BIT(POWER_DOMAIN_AUX_D) | \ |
1487 | BIT(POWER_DOMAIN_GMBUS) | \ | ||
1486 | BIT(POWER_DOMAIN_INIT)) | 1488 | BIT(POWER_DOMAIN_INIT)) |
1487 | #define HSW_DISPLAY_POWER_DOMAINS ( \ | 1489 | #define HSW_DISPLAY_POWER_DOMAINS ( \ |
1488 | (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ | 1490 | (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ |
@@ -1845,6 +1847,8 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) | |||
1845 | i915.disable_power_well = sanitize_disable_power_well_option(dev_priv, | 1847 | i915.disable_power_well = sanitize_disable_power_well_option(dev_priv, |
1846 | i915.disable_power_well); | 1848 | i915.disable_power_well); |
1847 | 1849 | ||
1850 | BUILD_BUG_ON(POWER_DOMAIN_NUM > 31); | ||
1851 | |||
1848 | mutex_init(&power_domains->lock); | 1852 | mutex_init(&power_domains->lock); |
1849 | 1853 | ||
1850 | /* | 1854 | /* |
@@ -2064,36 +2068,6 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv) | |||
2064 | } | 2068 | } |
2065 | 2069 | ||
2066 | /** | 2070 | /** |
2067 | * intel_aux_display_runtime_get - grab an auxiliary power domain reference | ||
2068 | * @dev_priv: i915 device instance | ||
2069 | * | ||
2070 | * This function grabs a power domain reference for the auxiliary power domain | ||
2071 | * (for access to the GMBUS and DP AUX blocks) and ensures that it and all its | ||
2072 | * parents are powered up. Therefore users should only grab a reference to the | ||
2073 | * innermost power domain they need. | ||
2074 | * | ||
2075 | * Any power domain reference obtained by this function must have a symmetric | ||
2076 | * call to intel_aux_display_runtime_put() to release the reference again. | ||
2077 | */ | ||
2078 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) | ||
2079 | { | ||
2080 | intel_runtime_pm_get(dev_priv); | ||
2081 | } | ||
2082 | |||
2083 | /** | ||
2084 | * intel_aux_display_runtime_put - release an auxiliary power domain reference | ||
2085 | * @dev_priv: i915 device instance | ||
2086 | * | ||
2087 | * This function drops the auxiliary power domain reference obtained by | ||
2088 | * intel_aux_display_runtime_get() and might power down the corresponding | ||
2089 | * hardware block right away if this is the last reference. | ||
2090 | */ | ||
2091 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) | ||
2092 | { | ||
2093 | intel_runtime_pm_put(dev_priv); | ||
2094 | } | ||
2095 | |||
2096 | /** | ||
2097 | * intel_runtime_pm_get - grab a runtime pm reference | 2071 | * intel_runtime_pm_get - grab a runtime pm reference |
2098 | * @dev_priv: i915 device instance | 2072 | * @dev_priv: i915 device instance |
2099 | * | 2073 | * |