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

Merge tag 'drm-intel-fixes-2014-06-17' of git://anongit.freedesktop.org/drm-intel into drm-next

First round of fixes for 3.16-rc, mostly cc: stable, and the vt/vgacon
fixes from Daniel [1] to avoid hangs and unclaimed register errors on
module load/reload.

* tag 'drm-intel-fixes-2014-06-17' of git://anongit.freedesktop.org/drm-intel:
drm/i915/bdw: remove erroneous chv specific workarounds from bdw code
drm/i915: fix possible refcount leak when resetting forcewake
drm/i915: Reorder semaphore deadlock check
drm/i95: Initialize active ring->pid to -1
drm/i915: set backlight duty cycle after backlight enable for gen4
drm/i915: Avoid div-by-zero when pixel_multiplier is zero
drm/i915: Disable FBC by default also on Haswell and later
drm/i915: Kick out vga console
drm/i915: Fixup global gtt cleanup
vt: Don't ignore unbind errors in vt_unbind
vt: Fix up unregistration of vt drivers
vt: Fix replacement console check when unbinding

+92 -34
+42 -5
drivers/gpu/drm/i915/i915_dma.c
··· 36 36 #include "i915_drv.h" 37 37 #include "i915_trace.h" 38 38 #include <linux/pci.h> 39 + #include <linux/console.h> 40 + #include <linux/vt.h> 39 41 #include <linux/vgaarb.h> 40 42 #include <linux/acpi.h> 41 43 #include <linux/pnp.h> ··· 1388 1386 i915_gem_context_fini(dev); 1389 1387 mutex_unlock(&dev->struct_mutex); 1390 1388 WARN_ON(dev_priv->mm.aliasing_ppgtt); 1391 - drm_mm_takedown(&dev_priv->gtt.base.mm); 1392 1389 cleanup_irq: 1393 1390 drm_irq_uninstall(dev); 1394 1391 cleanup_gem_stolen: ··· 1448 1447 #else 1449 1448 static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) 1450 1449 { 1450 + } 1451 + #endif 1452 + 1453 + #if !defined(CONFIG_VGA_CONSOLE) 1454 + static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv) 1455 + { 1456 + return 0; 1457 + } 1458 + #elif !defined(CONFIG_DUMMY_CONSOLE) 1459 + static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv) 1460 + { 1461 + return -ENODEV; 1462 + } 1463 + #else 1464 + static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv) 1465 + { 1466 + int ret; 1467 + 1468 + DRM_INFO("Replacing VGA console driver\n"); 1469 + 1470 + console_lock(); 1471 + ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1); 1472 + if (ret == 0) { 1473 + ret = do_unregister_con_driver(&vga_con); 1474 + 1475 + /* Ignore "already unregistered". */ 1476 + if (ret == -ENODEV) 1477 + ret = 0; 1478 + } 1479 + console_unlock(); 1480 + 1481 + return ret; 1451 1482 } 1452 1483 #endif 1453 1484 ··· 1656 1623 if (ret) 1657 1624 goto out_regs; 1658 1625 1659 - if (drm_core_check_feature(dev, DRIVER_MODESET)) 1626 + if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1627 + ret = i915_kick_out_vgacon(dev_priv); 1628 + if (ret) { 1629 + DRM_ERROR("failed to remove conflicting VGA console\n"); 1630 + goto out_gtt; 1631 + } 1632 + 1660 1633 i915_kick_out_firmware_fb(dev_priv); 1634 + } 1661 1635 1662 1636 pci_set_master(dev->pdev); 1663 1637 ··· 1796 1756 arch_phys_wc_del(dev_priv->gtt.mtrr); 1797 1757 io_mapping_free(dev_priv->gtt.mappable); 1798 1758 out_gtt: 1799 - list_del(&dev_priv->gtt.base.global_link); 1800 - drm_mm_takedown(&dev_priv->gtt.base.mm); 1801 1759 dev_priv->gtt.base.cleanup(&dev_priv->gtt.base); 1802 1760 out_regs: 1803 1761 intel_uncore_fini(dev); ··· 1884 1846 i915_free_hws(dev); 1885 1847 } 1886 1848 1887 - list_del(&dev_priv->gtt.base.global_link); 1888 1849 WARN_ON(!list_empty(&dev_priv->vm_list)); 1889 1850 1890 1851 drm_vblank_cleanup(dev);
+8 -1
drivers/gpu/drm/i915/i915_gem_gtt.c
··· 1992 1992 1993 1993 struct i915_gtt *gtt = container_of(vm, struct i915_gtt, base); 1994 1994 1995 - drm_mm_takedown(&vm->mm); 1995 + if (drm_mm_initialized(&vm->mm)) { 1996 + drm_mm_takedown(&vm->mm); 1997 + list_del(&vm->global_link); 1998 + } 1996 1999 iounmap(gtt->gsm); 1997 2000 teardown_scratch_page(vm->dev); 1998 2001 } ··· 2028 2025 2029 2026 static void i915_gmch_remove(struct i915_address_space *vm) 2030 2027 { 2028 + if (drm_mm_initialized(&vm->mm)) { 2029 + drm_mm_takedown(&vm->mm); 2030 + list_del(&vm->global_link); 2031 + } 2031 2032 intel_gmch_remove(); 2032 2033 } 2033 2034
+2 -1
drivers/gpu/drm/i915/i915_gpu_error.c
··· 888 888 for (i = 0; i < I915_NUM_RINGS; i++) { 889 889 struct intel_engine_cs *ring = &dev_priv->ring[i]; 890 890 891 + error->ring[i].pid = -1; 892 + 891 893 if (ring->dev == NULL) 892 894 continue; 893 895 ··· 897 895 898 896 i915_record_ring_state(dev, ring, &error->ring[i]); 899 897 900 - error->ring[i].pid = -1; 901 898 request = i915_gem_find_active_request(ring); 902 899 if (request) { 903 900 /* We need to copy these to an anonymous buffer
+14 -4
drivers/gpu/drm/i915/i915_irq.c
··· 2847 2847 struct intel_engine_cs *signaller; 2848 2848 u32 seqno, ctl; 2849 2849 2850 - ring->hangcheck.deadlock = true; 2850 + ring->hangcheck.deadlock++; 2851 2851 2852 2852 signaller = semaphore_waits_for(ring, &seqno); 2853 - if (signaller == NULL || signaller->hangcheck.deadlock) 2853 + if (signaller == NULL) 2854 + return -1; 2855 + 2856 + /* Prevent pathological recursion due to driver bugs */ 2857 + if (signaller->hangcheck.deadlock >= I915_NUM_RINGS) 2854 2858 return -1; 2855 2859 2856 2860 /* cursory check for an unkickable deadlock */ ··· 2862 2858 if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0) 2863 2859 return -1; 2864 2860 2865 - return i915_seqno_passed(signaller->get_seqno(signaller, false), seqno); 2861 + if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno)) 2862 + return 1; 2863 + 2864 + if (signaller->hangcheck.deadlock) 2865 + return -1; 2866 + 2867 + return 0; 2866 2868 } 2867 2869 2868 2870 static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) ··· 2877 2867 int i; 2878 2868 2879 2869 for_each_ring(ring, dev_priv, i) 2880 - ring->hangcheck.deadlock = false; 2870 + ring->hangcheck.deadlock = 0; 2881 2871 } 2882 2872 2883 2873 static enum intel_ring_hangcheck_action
+2 -3
drivers/gpu/drm/i915/intel_panel.c
··· 798 798 ctl = freq << 16; 799 799 I915_WRITE(BLC_PWM_CTL, ctl); 800 800 801 - /* XXX: combine this into above write? */ 802 - intel_panel_actually_set_backlight(connector, panel->backlight.level); 803 - 804 801 ctl2 = BLM_PIPE(pipe); 805 802 if (panel->backlight.combination_mode) 806 803 ctl2 |= BLM_COMBINATION_MODE; ··· 806 809 I915_WRITE(BLC_PWM_CTL2, ctl2); 807 810 POSTING_READ(BLC_PWM_CTL2); 808 811 I915_WRITE(BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE); 812 + 813 + intel_panel_actually_set_backlight(connector, panel->backlight.level); 809 814 } 810 815 811 816 static void vlv_enable_backlight(struct intel_connector *connector)
+2 -7
drivers/gpu/drm/i915/intel_pm.c
··· 511 511 obj = intel_fb->obj; 512 512 adjusted_mode = &intel_crtc->config.adjusted_mode; 513 513 514 - if (i915.enable_fbc < 0 && 515 - INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) { 514 + if (i915.enable_fbc < 0) { 516 515 if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT)) 517 516 DRM_DEBUG_KMS("disabled per chip default\n"); 518 517 goto out_disable; ··· 3505 3506 3506 3507 I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); 3507 3508 3508 - /* WaDisablePwrmtrEvent:chv (pre-production hw) */ 3509 - I915_WRITE(0xA80C, I915_READ(0xA80C) & 0x00ffffff); 3510 - I915_WRITE(0xA810, I915_READ(0xA810) & 0xffffff00); 3511 - 3512 3509 /* 5: Enable RPS */ 3513 3510 I915_WRITE(GEN6_RP_CONTROL, 3514 3511 GEN6_RP_MEDIA_TURBO | 3515 3512 GEN6_RP_MEDIA_HW_NORMAL_MODE | 3516 - GEN6_RP_MEDIA_IS_GFX | /* WaSetMaskForGfxBusyness:chv (pre-production hw ?) */ 3513 + GEN6_RP_MEDIA_IS_GFX | 3517 3514 GEN6_RP_ENABLE | 3518 3515 GEN6_RP_UP_BUSY_AVG | 3519 3516 GEN6_RP_DOWN_IDLE_AVG);
+1 -1
drivers/gpu/drm/i915/intel_ringbuffer.h
··· 55 55 u32 seqno; 56 56 int score; 57 57 enum intel_ring_hangcheck_action action; 58 - bool deadlock; 58 + int deadlock; 59 59 }; 60 60 61 61 struct intel_ringbuffer {
+3 -1
drivers/gpu/drm/i915/intel_sdvo.c
··· 1385 1385 >> SDVO_PORT_MULTIPLY_SHIFT) + 1; 1386 1386 } 1387 1387 1388 - dotclock = pipe_config->port_clock / pipe_config->pixel_multiplier; 1388 + dotclock = pipe_config->port_clock; 1389 + if (pipe_config->pixel_multiplier) 1390 + dotclock /= pipe_config->pixel_multiplier; 1389 1391 1390 1392 if (HAS_PCH_SPLIT(dev)) 1391 1393 ironlake_check_encoder_dotclock(pipe_config, dotclock);
+2 -1
drivers/gpu/drm/i915/intel_uncore.c
··· 320 320 struct drm_i915_private *dev_priv = dev->dev_private; 321 321 unsigned long irqflags; 322 322 323 - del_timer_sync(&dev_priv->uncore.force_wake_timer); 323 + if (del_timer_sync(&dev_priv->uncore.force_wake_timer)) 324 + gen6_force_wake_timer((unsigned long)dev_priv); 324 325 325 326 /* Hold uncore.lock across reset to prevent any register access 326 327 * with forcewake not set correctly
+14 -10
drivers/tty/vt/vt.c
··· 3226 3226 for (i = 0; i < MAX_NR_CON_DRIVER; i++) { 3227 3227 con_back = &registered_con_driver[i]; 3228 3228 3229 - if (con_back->con && 3230 - !(con_back->flag & CON_DRIVER_FLAG_MODULE)) { 3229 + if (con_back->con && con_back->con != csw) { 3231 3230 defcsw = con_back->con; 3232 3231 retval = 0; 3233 3232 break; ··· 3331 3332 { 3332 3333 const struct consw *csw = NULL; 3333 3334 int i, more = 1, first = -1, last = -1, deflt = 0; 3335 + int ret; 3334 3336 3335 3337 if (!con->con || !(con->flag & CON_DRIVER_FLAG_MODULE) || 3336 3338 con_is_graphics(con->con, con->first, con->last)) ··· 3357 3357 3358 3358 if (first != -1) { 3359 3359 console_lock(); 3360 - do_unbind_con_driver(csw, first, last, deflt); 3360 + ret = do_unbind_con_driver(csw, first, last, deflt); 3361 3361 console_unlock(); 3362 + if (ret != 0) 3363 + return ret; 3362 3364 } 3363 3365 3364 3366 first = -1; ··· 3647 3645 */ 3648 3646 int do_unregister_con_driver(const struct consw *csw) 3649 3647 { 3650 - int i, retval = -ENODEV; 3648 + int i; 3651 3649 3652 3650 /* cannot unregister a bound driver */ 3653 3651 if (con_is_bound(csw)) 3654 - goto err; 3652 + return -EBUSY; 3653 + 3654 + if (csw == conswitchp) 3655 + return -EINVAL; 3655 3656 3656 3657 for (i = 0; i < MAX_NR_CON_DRIVER; i++) { 3657 3658 struct con_driver *con_driver = &registered_con_driver[i]; 3658 3659 3659 3660 if (con_driver->con == csw && 3660 - con_driver->flag & CON_DRIVER_FLAG_MODULE) { 3661 + con_driver->flag & CON_DRIVER_FLAG_INIT) { 3661 3662 vtconsole_deinit_device(con_driver); 3662 3663 device_destroy(vtconsole_class, 3663 3664 MKDEV(0, con_driver->node)); ··· 3671 3666 con_driver->flag = 0; 3672 3667 con_driver->first = 0; 3673 3668 con_driver->last = 0; 3674 - retval = 0; 3675 - break; 3669 + return 0; 3676 3670 } 3677 3671 } 3678 - err: 3679 - return retval; 3672 + 3673 + return -ENODEV; 3680 3674 } 3681 3675 EXPORT_SYMBOL_GPL(do_unregister_con_driver); 3682 3676
+1
drivers/video/console/dummycon.c
··· 77 77 .con_set_palette = DUMMY, 78 78 .con_scrolldelta = DUMMY, 79 79 }; 80 + EXPORT_SYMBOL_GPL(dummy_con);
+1
drivers/video/console/vgacon.c
··· 1441 1441 .con_build_attr = vgacon_build_attr, 1442 1442 .con_invert_region = vgacon_invert_region, 1443 1443 }; 1444 + EXPORT_SYMBOL(vga_con); 1444 1445 1445 1446 MODULE_LICENSE("GPL");