diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-06-18 20:54:35 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-06-18 20:54:35 -0400 |
| commit | 884d6147ba19640a40fb45efe64360cdf92cac27 (patch) | |
| tree | cf09a5ff5fb13474aba4eef7a68e56f46ca19381 | |
| parent | fb54918af7e7a607af8b70ba052a35ff8acb8620 (diff) | |
| parent | 223a6f2b975ab35d93270ea1d4fb6e0ac6b27fe6 (diff) | |
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
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.c | 3 | ||||
| -rw-r--r-- | drivers/tty/vt/vt.c | 24 | ||||
| -rw-r--r-- | drivers/video/console/dummycon.c | 1 | ||||
| -rw-r--r-- | drivers/video/console/vgacon.c | 1 |
12 files changed, 92 insertions, 34 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 4c22a5b7f4c5..6c656392d67d 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -36,6 +36,8 @@ | |||
| 36 | #include "i915_drv.h" | 36 | #include "i915_drv.h" |
| 37 | #include "i915_trace.h" | 37 | #include "i915_trace.h" |
| 38 | #include <linux/pci.h> | 38 | #include <linux/pci.h> |
| 39 | #include <linux/console.h> | ||
| 40 | #include <linux/vt.h> | ||
| 39 | #include <linux/vgaarb.h> | 41 | #include <linux/vgaarb.h> |
| 40 | #include <linux/acpi.h> | 42 | #include <linux/acpi.h> |
| 41 | #include <linux/pnp.h> | 43 | #include <linux/pnp.h> |
| @@ -1386,7 +1388,6 @@ cleanup_gem: | |||
| 1386 | i915_gem_context_fini(dev); | 1388 | i915_gem_context_fini(dev); |
| 1387 | mutex_unlock(&dev->struct_mutex); | 1389 | mutex_unlock(&dev->struct_mutex); |
| 1388 | WARN_ON(dev_priv->mm.aliasing_ppgtt); | 1390 | WARN_ON(dev_priv->mm.aliasing_ppgtt); |
| 1389 | drm_mm_takedown(&dev_priv->gtt.base.mm); | ||
| 1390 | cleanup_irq: | 1391 | cleanup_irq: |
| 1391 | drm_irq_uninstall(dev); | 1392 | drm_irq_uninstall(dev); |
| 1392 | cleanup_gem_stolen: | 1393 | cleanup_gem_stolen: |
| @@ -1450,6 +1451,38 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) | |||
| 1450 | } | 1451 | } |
| 1451 | #endif | 1452 | #endif |
| 1452 | 1453 | ||
| 1454 | #if !defined(CONFIG_VGA_CONSOLE) | ||
| 1455 | static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv) | ||
| 1456 | { | ||
| 1457 | return 0; | ||
| 1458 | } | ||
| 1459 | #elif !defined(CONFIG_DUMMY_CONSOLE) | ||
| 1460 | static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv) | ||
| 1461 | { | ||
| 1462 | return -ENODEV; | ||
| 1463 | } | ||
| 1464 | #else | ||
| 1465 | static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv) | ||
| 1466 | { | ||
| 1467 | int ret; | ||
| 1468 | |||
| 1469 | DRM_INFO("Replacing VGA console driver\n"); | ||
| 1470 | |||
| 1471 | console_lock(); | ||
| 1472 | ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1); | ||
| 1473 | if (ret == 0) { | ||
| 1474 | ret = do_unregister_con_driver(&vga_con); | ||
| 1475 | |||
| 1476 | /* Ignore "already unregistered". */ | ||
| 1477 | if (ret == -ENODEV) | ||
| 1478 | ret = 0; | ||
| 1479 | } | ||
| 1480 | console_unlock(); | ||
| 1481 | |||
| 1482 | return ret; | ||
| 1483 | } | ||
| 1484 | #endif | ||
| 1485 | |||
| 1453 | static void i915_dump_device_info(struct drm_i915_private *dev_priv) | 1486 | static void i915_dump_device_info(struct drm_i915_private *dev_priv) |
| 1454 | { | 1487 | { |
| 1455 | const struct intel_device_info *info = &dev_priv->info; | 1488 | const struct intel_device_info *info = &dev_priv->info; |
| @@ -1623,8 +1656,15 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1623 | if (ret) | 1656 | if (ret) |
| 1624 | goto out_regs; | 1657 | goto out_regs; |
| 1625 | 1658 | ||
| 1626 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 1659 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
| 1660 | ret = i915_kick_out_vgacon(dev_priv); | ||
| 1661 | if (ret) { | ||
| 1662 | DRM_ERROR("failed to remove conflicting VGA console\n"); | ||
| 1663 | goto out_gtt; | ||
| 1664 | } | ||
| 1665 | |||
| 1627 | i915_kick_out_firmware_fb(dev_priv); | 1666 | i915_kick_out_firmware_fb(dev_priv); |
| 1667 | } | ||
| 1628 | 1668 | ||
| 1629 | pci_set_master(dev->pdev); | 1669 | pci_set_master(dev->pdev); |
| 1630 | 1670 | ||
| @@ -1756,8 +1796,6 @@ out_mtrrfree: | |||
| 1756 | arch_phys_wc_del(dev_priv->gtt.mtrr); | 1796 | arch_phys_wc_del(dev_priv->gtt.mtrr); |
| 1757 | io_mapping_free(dev_priv->gtt.mappable); | 1797 | io_mapping_free(dev_priv->gtt.mappable); |
| 1758 | out_gtt: | 1798 | out_gtt: |
| 1759 | list_del(&dev_priv->gtt.base.global_link); | ||
| 1760 | drm_mm_takedown(&dev_priv->gtt.base.mm); | ||
| 1761 | dev_priv->gtt.base.cleanup(&dev_priv->gtt.base); | 1799 | dev_priv->gtt.base.cleanup(&dev_priv->gtt.base); |
| 1762 | out_regs: | 1800 | out_regs: |
| 1763 | intel_uncore_fini(dev); | 1801 | intel_uncore_fini(dev); |
| @@ -1846,7 +1884,6 @@ int i915_driver_unload(struct drm_device *dev) | |||
| 1846 | i915_free_hws(dev); | 1884 | i915_free_hws(dev); |
| 1847 | } | 1885 | } |
| 1848 | 1886 | ||
| 1849 | list_del(&dev_priv->gtt.base.global_link); | ||
| 1850 | WARN_ON(!list_empty(&dev_priv->vm_list)); | 1887 | WARN_ON(!list_empty(&dev_priv->vm_list)); |
| 1851 | 1888 | ||
| 1852 | drm_vblank_cleanup(dev); | 1889 | drm_vblank_cleanup(dev); |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index eec820aec022..8b3cde703364 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -1992,7 +1992,10 @@ static void gen6_gmch_remove(struct i915_address_space *vm) | |||
| 1992 | 1992 | ||
| 1993 | struct i915_gtt *gtt = container_of(vm, struct i915_gtt, base); | 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 | iounmap(gtt->gsm); | 1999 | iounmap(gtt->gsm); |
| 1997 | teardown_scratch_page(vm->dev); | 2000 | teardown_scratch_page(vm->dev); |
| 1998 | } | 2001 | } |
| @@ -2025,6 +2028,10 @@ static int i915_gmch_probe(struct drm_device *dev, | |||
| 2025 | 2028 | ||
| 2026 | static void i915_gmch_remove(struct i915_address_space *vm) | 2029 | static void i915_gmch_remove(struct i915_address_space *vm) |
| 2027 | { | 2030 | { |
| 2031 | if (drm_mm_initialized(&vm->mm)) { | ||
| 2032 | drm_mm_takedown(&vm->mm); | ||
| 2033 | list_del(&vm->global_link); | ||
| 2034 | } | ||
| 2028 | intel_gmch_remove(); | 2035 | intel_gmch_remove(); |
| 2029 | } | 2036 | } |
| 2030 | 2037 | ||
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 87ec60e181a7..66cf41765bf9 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
| @@ -888,6 +888,8 @@ static void i915_gem_record_rings(struct drm_device *dev, | |||
| 888 | for (i = 0; i < I915_NUM_RINGS; i++) { | 888 | for (i = 0; i < I915_NUM_RINGS; i++) { |
| 889 | struct intel_engine_cs *ring = &dev_priv->ring[i]; | 889 | struct intel_engine_cs *ring = &dev_priv->ring[i]; |
| 890 | 890 | ||
| 891 | error->ring[i].pid = -1; | ||
| 892 | |||
| 891 | if (ring->dev == NULL) | 893 | if (ring->dev == NULL) |
| 892 | continue; | 894 | continue; |
| 893 | 895 | ||
| @@ -895,7 +897,6 @@ static void i915_gem_record_rings(struct drm_device *dev, | |||
| 895 | 897 | ||
| 896 | i915_record_ring_state(dev, ring, &error->ring[i]); | 898 | i915_record_ring_state(dev, ring, &error->ring[i]); |
| 897 | 899 | ||
| 898 | error->ring[i].pid = -1; | ||
| 899 | request = i915_gem_find_active_request(ring); | 900 | request = i915_gem_find_active_request(ring); |
| 900 | if (request) { | 901 | if (request) { |
| 901 | /* We need to copy these to an anonymous buffer | 902 | /* We need to copy these to an anonymous buffer |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 6f8017a7e937..267f069765ad 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -2847,10 +2847,14 @@ static int semaphore_passed(struct intel_engine_cs *ring) | |||
| 2847 | struct intel_engine_cs *signaller; | 2847 | struct intel_engine_cs *signaller; |
| 2848 | u32 seqno, ctl; | 2848 | u32 seqno, ctl; |
| 2849 | 2849 | ||
| 2850 | ring->hangcheck.deadlock = true; | 2850 | ring->hangcheck.deadlock++; |
| 2851 | 2851 | ||
| 2852 | signaller = semaphore_waits_for(ring, &seqno); | 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 | return -1; | 2858 | return -1; |
| 2855 | 2859 | ||
| 2856 | /* cursory check for an unkickable deadlock */ | 2860 | /* cursory check for an unkickable deadlock */ |
| @@ -2858,7 +2862,13 @@ static int semaphore_passed(struct intel_engine_cs *ring) | |||
| 2858 | if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0) | 2862 | if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0) |
| 2859 | return -1; | 2863 | return -1; |
| 2860 | 2864 | ||
| 2861 | return i915_seqno_passed(signaller->get_seqno(signaller, false), seqno); | 2865 | if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno)) |
| 2866 | return 1; | ||
| 2867 | |||
| 2868 | if (signaller->hangcheck.deadlock) | ||
| 2869 | return -1; | ||
| 2870 | |||
| 2871 | return 0; | ||
| 2862 | } | 2872 | } |
| 2863 | 2873 | ||
| 2864 | static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) | 2874 | static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) |
| @@ -2867,7 +2877,7 @@ static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) | |||
| 2867 | int i; | 2877 | int i; |
| 2868 | 2878 | ||
| 2869 | for_each_ring(ring, dev_priv, i) | 2879 | for_each_ring(ring, dev_priv, i) |
| 2870 | ring->hangcheck.deadlock = false; | 2880 | ring->hangcheck.deadlock = 0; |
| 2871 | } | 2881 | } |
| 2872 | 2882 | ||
| 2873 | static enum intel_ring_hangcheck_action | 2883 | static enum intel_ring_hangcheck_action |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 5e6c888b4928..38a98570d10c 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -798,9 +798,6 @@ static void i965_enable_backlight(struct intel_connector *connector) | |||
| 798 | ctl = freq << 16; | 798 | ctl = freq << 16; |
| 799 | I915_WRITE(BLC_PWM_CTL, ctl); | 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 | ctl2 = BLM_PIPE(pipe); | 801 | ctl2 = BLM_PIPE(pipe); |
| 805 | if (panel->backlight.combination_mode) | 802 | if (panel->backlight.combination_mode) |
| 806 | ctl2 |= BLM_COMBINATION_MODE; | 803 | ctl2 |= BLM_COMBINATION_MODE; |
| @@ -809,6 +806,8 @@ static void i965_enable_backlight(struct intel_connector *connector) | |||
| 809 | I915_WRITE(BLC_PWM_CTL2, ctl2); | 806 | I915_WRITE(BLC_PWM_CTL2, ctl2); |
| 810 | POSTING_READ(BLC_PWM_CTL2); | 807 | POSTING_READ(BLC_PWM_CTL2); |
| 811 | I915_WRITE(BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE); | 808 | I915_WRITE(BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE); |
| 809 | |||
| 810 | intel_panel_actually_set_backlight(connector, panel->backlight.level); | ||
| 812 | } | 811 | } |
| 813 | 812 | ||
| 814 | static void vlv_enable_backlight(struct intel_connector *connector) | 813 | static void vlv_enable_backlight(struct intel_connector *connector) |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index d1e53abec1b5..769caea97c21 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -511,8 +511,7 @@ void intel_update_fbc(struct drm_device *dev) | |||
| 511 | obj = intel_fb->obj; | 511 | obj = intel_fb->obj; |
| 512 | adjusted_mode = &intel_crtc->config.adjusted_mode; | 512 | adjusted_mode = &intel_crtc->config.adjusted_mode; |
| 513 | 513 | ||
| 514 | if (i915.enable_fbc < 0 && | 514 | if (i915.enable_fbc < 0) { |
| 515 | INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) { | ||
| 516 | if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT)) | 515 | if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT)) |
| 517 | DRM_DEBUG_KMS("disabled per chip default\n"); | 516 | DRM_DEBUG_KMS("disabled per chip default\n"); |
| 518 | goto out_disable; | 517 | goto out_disable; |
| @@ -3506,15 +3505,11 @@ static void gen8_enable_rps(struct drm_device *dev) | |||
| 3506 | 3505 | ||
| 3507 | I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); | 3506 | I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); |
| 3508 | 3507 | ||
| 3509 | /* WaDisablePwrmtrEvent:chv (pre-production hw) */ | ||
| 3510 | I915_WRITE(0xA80C, I915_READ(0xA80C) & 0x00ffffff); | ||
| 3511 | I915_WRITE(0xA810, I915_READ(0xA810) & 0xffffff00); | ||
| 3512 | |||
| 3513 | /* 5: Enable RPS */ | 3508 | /* 5: Enable RPS */ |
| 3514 | I915_WRITE(GEN6_RP_CONTROL, | 3509 | I915_WRITE(GEN6_RP_CONTROL, |
| 3515 | GEN6_RP_MEDIA_TURBO | | 3510 | GEN6_RP_MEDIA_TURBO | |
| 3516 | GEN6_RP_MEDIA_HW_NORMAL_MODE | | 3511 | GEN6_RP_MEDIA_HW_NORMAL_MODE | |
| 3517 | GEN6_RP_MEDIA_IS_GFX | /* WaSetMaskForGfxBusyness:chv (pre-production hw ?) */ | 3512 | GEN6_RP_MEDIA_IS_GFX | |
| 3518 | GEN6_RP_ENABLE | | 3513 | GEN6_RP_ENABLE | |
| 3519 | GEN6_RP_UP_BUSY_AVG | | 3514 | GEN6_RP_UP_BUSY_AVG | |
| 3520 | GEN6_RP_DOWN_IDLE_AVG); | 3515 | GEN6_RP_DOWN_IDLE_AVG); |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 910c83cf7d44..e72017bdcd7f 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
| @@ -55,7 +55,7 @@ struct intel_ring_hangcheck { | |||
| 55 | u32 seqno; | 55 | u32 seqno; |
| 56 | int score; | 56 | int score; |
| 57 | enum intel_ring_hangcheck_action action; | 57 | enum intel_ring_hangcheck_action action; |
| 58 | bool deadlock; | 58 | int deadlock; |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | struct intel_ringbuffer { | 61 | struct intel_ringbuffer { |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 6a4d5bc17697..20375cc7f82d 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1385,7 +1385,9 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder, | |||
| 1385 | >> SDVO_PORT_MULTIPLY_SHIFT) + 1; | 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 | if (HAS_PCH_SPLIT(dev)) | 1392 | if (HAS_PCH_SPLIT(dev)) |
| 1391 | ironlake_check_encoder_dotclock(pipe_config, dotclock); | 1393 | ironlake_check_encoder_dotclock(pipe_config, dotclock); |
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index 79cba593df0d..4f6fef7ac069 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c | |||
| @@ -320,7 +320,8 @@ static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore) | |||
| 320 | struct drm_i915_private *dev_priv = dev->dev_private; | 320 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 321 | unsigned long irqflags; | 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 | /* Hold uncore.lock across reset to prevent any register access | 326 | /* Hold uncore.lock across reset to prevent any register access |
| 326 | * with forcewake not set correctly | 327 | * with forcewake not set correctly |
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 5e0f6ff2e2f5..b33b00b386de 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
| @@ -3226,8 +3226,7 @@ int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt | |||
| 3226 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { | 3226 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { |
| 3227 | con_back = ®istered_con_driver[i]; | 3227 | con_back = ®istered_con_driver[i]; |
| 3228 | 3228 | ||
| 3229 | if (con_back->con && | 3229 | if (con_back->con && con_back->con != csw) { |
| 3230 | !(con_back->flag & CON_DRIVER_FLAG_MODULE)) { | ||
| 3231 | defcsw = con_back->con; | 3230 | defcsw = con_back->con; |
| 3232 | retval = 0; | 3231 | retval = 0; |
| 3233 | break; | 3232 | break; |
| @@ -3332,6 +3331,7 @@ static int vt_unbind(struct con_driver *con) | |||
| 3332 | { | 3331 | { |
| 3333 | const struct consw *csw = NULL; | 3332 | const struct consw *csw = NULL; |
| 3334 | int i, more = 1, first = -1, last = -1, deflt = 0; | 3333 | int i, more = 1, first = -1, last = -1, deflt = 0; |
| 3334 | int ret; | ||
| 3335 | 3335 | ||
| 3336 | if (!con->con || !(con->flag & CON_DRIVER_FLAG_MODULE) || | 3336 | if (!con->con || !(con->flag & CON_DRIVER_FLAG_MODULE) || |
| 3337 | con_is_graphics(con->con, con->first, con->last)) | 3337 | con_is_graphics(con->con, con->first, con->last)) |
| @@ -3357,8 +3357,10 @@ static int vt_unbind(struct con_driver *con) | |||
| 3357 | 3357 | ||
| 3358 | if (first != -1) { | 3358 | if (first != -1) { |
| 3359 | console_lock(); | 3359 | console_lock(); |
| 3360 | do_unbind_con_driver(csw, first, last, deflt); | 3360 | ret = do_unbind_con_driver(csw, first, last, deflt); |
| 3361 | console_unlock(); | 3361 | console_unlock(); |
| 3362 | if (ret != 0) | ||
| 3363 | return ret; | ||
| 3362 | } | 3364 | } |
| 3363 | 3365 | ||
| 3364 | first = -1; | 3366 | first = -1; |
| @@ -3645,17 +3647,20 @@ err: | |||
| 3645 | */ | 3647 | */ |
| 3646 | int do_unregister_con_driver(const struct consw *csw) | 3648 | int do_unregister_con_driver(const struct consw *csw) |
| 3647 | { | 3649 | { |
| 3648 | int i, retval = -ENODEV; | 3650 | int i; |
| 3649 | 3651 | ||
| 3650 | /* cannot unregister a bound driver */ | 3652 | /* cannot unregister a bound driver */ |
| 3651 | if (con_is_bound(csw)) | 3653 | if (con_is_bound(csw)) |
| 3652 | goto err; | 3654 | return -EBUSY; |
| 3655 | |||
| 3656 | if (csw == conswitchp) | ||
| 3657 | return -EINVAL; | ||
| 3653 | 3658 | ||
| 3654 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { | 3659 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { |
| 3655 | struct con_driver *con_driver = ®istered_con_driver[i]; | 3660 | struct con_driver *con_driver = ®istered_con_driver[i]; |
| 3656 | 3661 | ||
| 3657 | if (con_driver->con == csw && | 3662 | if (con_driver->con == csw && |
| 3658 | con_driver->flag & CON_DRIVER_FLAG_MODULE) { | 3663 | con_driver->flag & CON_DRIVER_FLAG_INIT) { |
| 3659 | vtconsole_deinit_device(con_driver); | 3664 | vtconsole_deinit_device(con_driver); |
| 3660 | device_destroy(vtconsole_class, | 3665 | device_destroy(vtconsole_class, |
| 3661 | MKDEV(0, con_driver->node)); | 3666 | MKDEV(0, con_driver->node)); |
| @@ -3666,12 +3671,11 @@ int do_unregister_con_driver(const struct consw *csw) | |||
| 3666 | con_driver->flag = 0; | 3671 | con_driver->flag = 0; |
| 3667 | con_driver->first = 0; | 3672 | con_driver->first = 0; |
| 3668 | con_driver->last = 0; | 3673 | con_driver->last = 0; |
| 3669 | retval = 0; | 3674 | return 0; |
| 3670 | break; | ||
| 3671 | } | 3675 | } |
| 3672 | } | 3676 | } |
| 3673 | err: | 3677 | |
| 3674 | return retval; | 3678 | return -ENODEV; |
| 3675 | } | 3679 | } |
| 3676 | EXPORT_SYMBOL_GPL(do_unregister_con_driver); | 3680 | EXPORT_SYMBOL_GPL(do_unregister_con_driver); |
| 3677 | 3681 | ||
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c index b63860f7beab..40bec8d64b0a 100644 --- a/drivers/video/console/dummycon.c +++ b/drivers/video/console/dummycon.c | |||
| @@ -77,3 +77,4 @@ const struct consw dummy_con = { | |||
| 77 | .con_set_palette = DUMMY, | 77 | .con_set_palette = DUMMY, |
| 78 | .con_scrolldelta = DUMMY, | 78 | .con_scrolldelta = DUMMY, |
| 79 | }; | 79 | }; |
| 80 | EXPORT_SYMBOL_GPL(dummy_con); | ||
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index f267284b423b..6e6aa704fe84 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c | |||
| @@ -1441,5 +1441,6 @@ const struct consw vga_con = { | |||
| 1441 | .con_build_attr = vgacon_build_attr, | 1441 | .con_build_attr = vgacon_build_attr, |
| 1442 | .con_invert_region = vgacon_invert_region, | 1442 | .con_invert_region = vgacon_invert_region, |
| 1443 | }; | 1443 | }; |
| 1444 | EXPORT_SYMBOL(vga_con); | ||
| 1444 | 1445 | ||
| 1445 | MODULE_LICENSE("GPL"); | 1446 | MODULE_LICENSE("GPL"); |
