Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-fixes-2015-10-01' of git://anongit.freedesktop.org/drm-intel into drm-fixes

a few i915 fixes for v4.3.

* tag 'drm-intel-fixes-2015-10-01' of git://anongit.freedesktop.org/drm-intel:
drm/i915: Call non-locking version of drm_kms_helper_poll_enable(), v2
drm: Add a non-locking version of drm_kms_helper_poll_enable(), v2
drm/i915: Consider HW CSB write pointer before resetting the sw read pointer
drm/i915/skl: Don't call intel_prepare_ddi when encoder list isn't yet initialized.

+54 -12
+16 -3
drivers/gpu/drm/drm_probe_helper.c
··· 94 94 } 95 95 96 96 #define DRM_OUTPUT_POLL_PERIOD (10*HZ) 97 - static void __drm_kms_helper_poll_enable(struct drm_device *dev) 97 + /** 98 + * drm_kms_helper_poll_enable_locked - re-enable output polling. 99 + * @dev: drm_device 100 + * 101 + * This function re-enables the output polling work without 102 + * locking the mode_config mutex. 103 + * 104 + * This is like drm_kms_helper_poll_enable() however it is to be 105 + * called from a context where the mode_config mutex is locked 106 + * already. 107 + */ 108 + void drm_kms_helper_poll_enable_locked(struct drm_device *dev) 98 109 { 99 110 bool poll = false; 100 111 struct drm_connector *connector; ··· 124 113 if (poll) 125 114 schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); 126 115 } 116 + EXPORT_SYMBOL(drm_kms_helper_poll_enable_locked); 117 + 127 118 128 119 static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector, 129 120 uint32_t maxX, uint32_t maxY, bool merge_type_bits) ··· 187 174 188 175 /* Re-enable polling in case the global poll config changed. */ 189 176 if (drm_kms_helper_poll != dev->mode_config.poll_running) 190 - __drm_kms_helper_poll_enable(dev); 177 + drm_kms_helper_poll_enable_locked(dev); 191 178 192 179 dev->mode_config.poll_running = drm_kms_helper_poll; 193 180 ··· 441 428 void drm_kms_helper_poll_enable(struct drm_device *dev) 442 429 { 443 430 mutex_lock(&dev->mode_config.mutex); 444 - __drm_kms_helper_poll_enable(dev); 431 + drm_kms_helper_poll_enable_locked(dev); 445 432 mutex_unlock(&dev->mode_config.mutex); 446 433 } 447 434 EXPORT_SYMBOL(drm_kms_helper_poll_enable);
+1 -1
drivers/gpu/drm/i915/intel_hotplug.c
··· 180 180 181 181 /* Enable polling and queue hotplug re-enabling. */ 182 182 if (hpd_disabled) { 183 - drm_kms_helper_poll_enable(dev); 183 + drm_kms_helper_poll_enable_locked(dev); 184 184 mod_delayed_work(system_wq, &dev_priv->hotplug.reenable_work, 185 185 msecs_to_jiffies(HPD_STORM_REENABLE_DELAY)); 186 186 }
+32 -7
drivers/gpu/drm/i915/intel_lrc.c
··· 484 484 status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(ring)); 485 485 486 486 read_pointer = ring->next_context_status_buffer; 487 - write_pointer = status_pointer & 0x07; 487 + write_pointer = status_pointer & GEN8_CSB_PTR_MASK; 488 488 if (read_pointer > write_pointer) 489 - write_pointer += 6; 489 + write_pointer += GEN8_CSB_ENTRIES; 490 490 491 491 spin_lock(&ring->execlist_lock); 492 492 493 493 while (read_pointer < write_pointer) { 494 494 read_pointer++; 495 495 status = I915_READ(RING_CONTEXT_STATUS_BUF(ring) + 496 - (read_pointer % 6) * 8); 496 + (read_pointer % GEN8_CSB_ENTRIES) * 8); 497 497 status_id = I915_READ(RING_CONTEXT_STATUS_BUF(ring) + 498 - (read_pointer % 6) * 8 + 4); 498 + (read_pointer % GEN8_CSB_ENTRIES) * 8 + 4); 499 499 500 500 if (status & GEN8_CTX_STATUS_IDLE_ACTIVE) 501 501 continue; ··· 521 521 spin_unlock(&ring->execlist_lock); 522 522 523 523 WARN(submit_contexts > 2, "More than two context complete events?\n"); 524 - ring->next_context_status_buffer = write_pointer % 6; 524 + ring->next_context_status_buffer = write_pointer % GEN8_CSB_ENTRIES; 525 525 526 526 I915_WRITE(RING_CONTEXT_STATUS_PTR(ring), 527 - _MASKED_FIELD(0x07 << 8, ((u32)ring->next_context_status_buffer & 0x07) << 8)); 527 + _MASKED_FIELD(GEN8_CSB_PTR_MASK << 8, 528 + ((u32)ring->next_context_status_buffer & 529 + GEN8_CSB_PTR_MASK) << 8)); 528 530 } 529 531 530 532 static int execlists_context_queue(struct drm_i915_gem_request *request) ··· 1424 1422 { 1425 1423 struct drm_device *dev = ring->dev; 1426 1424 struct drm_i915_private *dev_priv = dev->dev_private; 1425 + u8 next_context_status_buffer_hw; 1427 1426 1428 1427 I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask)); 1429 1428 I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff); ··· 1439 1436 _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | 1440 1437 _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE)); 1441 1438 POSTING_READ(RING_MODE_GEN7(ring)); 1442 - ring->next_context_status_buffer = 0; 1439 + 1440 + /* 1441 + * Instead of resetting the Context Status Buffer (CSB) read pointer to 1442 + * zero, we need to read the write pointer from hardware and use its 1443 + * value because "this register is power context save restored". 1444 + * Effectively, these states have been observed: 1445 + * 1446 + * | Suspend-to-idle (freeze) | Suspend-to-RAM (mem) | 1447 + * BDW | CSB regs not reset | CSB regs reset | 1448 + * CHT | CSB regs not reset | CSB regs not reset | 1449 + */ 1450 + next_context_status_buffer_hw = (I915_READ(RING_CONTEXT_STATUS_PTR(ring)) 1451 + & GEN8_CSB_PTR_MASK); 1452 + 1453 + /* 1454 + * When the CSB registers are reset (also after power-up / gpu reset), 1455 + * CSB write pointer is set to all 1's, which is not valid, use '5' in 1456 + * this special case, so the first element read is CSB[0]. 1457 + */ 1458 + if (next_context_status_buffer_hw == GEN8_CSB_PTR_MASK) 1459 + next_context_status_buffer_hw = (GEN8_CSB_ENTRIES - 1); 1460 + 1461 + ring->next_context_status_buffer = next_context_status_buffer_hw; 1443 1462 DRM_DEBUG_DRIVER("Execlists enabled for %s\n", ring->name); 1444 1463 1445 1464 memset(&ring->hangcheck, 0, sizeof(ring->hangcheck));
+2
drivers/gpu/drm/i915/intel_lrc.h
··· 25 25 #define _INTEL_LRC_H_ 26 26 27 27 #define GEN8_LR_CONTEXT_ALIGN 4096 28 + #define GEN8_CSB_ENTRIES 6 29 + #define GEN8_CSB_PTR_MASK 0x07 28 30 29 31 /* Execlists regs */ 30 32 #define RING_ELSP(ring) ((ring)->mmio_base+0x230)
+2 -1
drivers/gpu/drm/i915/intel_runtime_pm.c
··· 246 246 } 247 247 248 248 if (power_well->data == SKL_DISP_PW_1) { 249 - intel_prepare_ddi(dev); 249 + if (!dev_priv->power_domains.initializing) 250 + intel_prepare_ddi(dev); 250 251 gen8_irq_power_well_post_enable(dev_priv, 1 << PIPE_A); 251 252 } 252 253 }
+1
include/drm/drm_crtc_helper.h
··· 240 240 241 241 extern void drm_kms_helper_poll_disable(struct drm_device *dev); 242 242 extern void drm_kms_helper_poll_enable(struct drm_device *dev); 243 + extern void drm_kms_helper_poll_enable_locked(struct drm_device *dev); 243 244 244 245 #endif