diff options
| author | Dave Airlie <airlied@redhat.com> | 2013-03-20 20:17:38 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2013-03-20 20:17:38 -0400 |
| commit | b56fb70870ad76f8295a4e826dab9a9fbb0033f6 (patch) | |
| tree | 5f42c3e50c315f31d91747eb8a3d358159146fb8 | |
| parent | 260b3f1291a75a580d22ce8bfb1499c617272716 (diff) | |
| parent | c12aba5aa0e60b7947bc8b6ea25ef55c4acf81a4 (diff) | |
Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
Daniel writes:
Bunch of fixes, all pretty high-priority
- Fix execbuf argument checking (Kees Cook)
- Optionally obfuscate kernel addresses in dumps (Kees Cook)
- Two patches from Takashi Iwai to fix DP link training regressions he's
seen.
- intel-gfx is no longer subscribers-only (well, just no longer moderated
in an annoying way for non-subscribers), update MAINTAINERS
- gm45 gmbus irq fallout fix (Jiri Kosina)
* 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel:
drm/i915: stop using GMBUS IRQs on Gen4 chips
MAINTAINERS: intel-gfx is no longer subscribers-only
drm/i915: Use the fixed pixel clock for eDP in intel_dp_set_m_n()
Revert "drm/i915: try to train DP even harder"
drm/i915: bounds check execbuffer relocation count
drm/i915: restrict kernel address leak in debugfs
| -rw-r--r-- | MAINTAINERS | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 11 |
5 files changed, 32 insertions, 8 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index fb89be1281c6..ce424d7520f5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2623,7 +2623,7 @@ F: include/uapi/drm/ | |||
| 2623 | 2623 | ||
| 2624 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) | 2624 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) |
| 2625 | M: Daniel Vetter <daniel.vetter@ffwll.ch> | 2625 | M: Daniel Vetter <daniel.vetter@ffwll.ch> |
| 2626 | L: intel-gfx@lists.freedesktop.org (subscribers-only) | 2626 | L: intel-gfx@lists.freedesktop.org |
| 2627 | L: dri-devel@lists.freedesktop.org | 2627 | L: dri-devel@lists.freedesktop.org |
| 2628 | T: git git://people.freedesktop.org/~danvet/drm-intel | 2628 | T: git git://people.freedesktop.org/~danvet/drm-intel |
| 2629 | S: Supported | 2629 | S: Supported |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index aae31489c893..7299ea45dd03 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -103,7 +103,7 @@ static const char *cache_level_str(int type) | |||
| 103 | static void | 103 | static void |
| 104 | describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) | 104 | describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) |
| 105 | { | 105 | { |
| 106 | seq_printf(m, "%p: %s%s %8zdKiB %02x %02x %d %d %d%s%s%s", | 106 | seq_printf(m, "%pK: %s%s %8zdKiB %02x %02x %d %d %d%s%s%s", |
| 107 | &obj->base, | 107 | &obj->base, |
| 108 | get_pin_flag(obj), | 108 | get_pin_flag(obj), |
| 109 | get_tiling_flag(obj), | 109 | get_tiling_flag(obj), |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 2f2daebd0eef..3b11ab0fbc96 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
| @@ -732,6 +732,8 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec, | |||
| 732 | int count) | 732 | int count) |
| 733 | { | 733 | { |
| 734 | int i; | 734 | int i; |
| 735 | int relocs_total = 0; | ||
| 736 | int relocs_max = INT_MAX / sizeof(struct drm_i915_gem_relocation_entry); | ||
| 735 | 737 | ||
| 736 | for (i = 0; i < count; i++) { | 738 | for (i = 0; i < count; i++) { |
| 737 | char __user *ptr = (char __user *)(uintptr_t)exec[i].relocs_ptr; | 739 | char __user *ptr = (char __user *)(uintptr_t)exec[i].relocs_ptr; |
| @@ -740,10 +742,13 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec, | |||
| 740 | if (exec[i].flags & __EXEC_OBJECT_UNKNOWN_FLAGS) | 742 | if (exec[i].flags & __EXEC_OBJECT_UNKNOWN_FLAGS) |
| 741 | return -EINVAL; | 743 | return -EINVAL; |
| 742 | 744 | ||
| 743 | /* First check for malicious input causing overflow */ | 745 | /* First check for malicious input causing overflow in |
| 744 | if (exec[i].relocation_count > | 746 | * the worst case where we need to allocate the entire |
| 745 | INT_MAX / sizeof(struct drm_i915_gem_relocation_entry)) | 747 | * relocation tree as a single array. |
| 748 | */ | ||
| 749 | if (exec[i].relocation_count > relocs_max - relocs_total) | ||
| 746 | return -EINVAL; | 750 | return -EINVAL; |
| 751 | relocs_total += exec[i].relocation_count; | ||
| 747 | 752 | ||
| 748 | length = exec[i].relocation_count * | 753 | length = exec[i].relocation_count * |
| 749 | sizeof(struct drm_i915_gem_relocation_entry); | 754 | sizeof(struct drm_i915_gem_relocation_entry); |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 6f728e5ee793..d7d4afe01341 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -820,6 +820,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
| 820 | struct intel_link_m_n m_n; | 820 | struct intel_link_m_n m_n; |
| 821 | int pipe = intel_crtc->pipe; | 821 | int pipe = intel_crtc->pipe; |
| 822 | enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder; | 822 | enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder; |
| 823 | int target_clock; | ||
| 823 | 824 | ||
| 824 | /* | 825 | /* |
| 825 | * Find the lane count in the intel_encoder private | 826 | * Find the lane count in the intel_encoder private |
| @@ -835,13 +836,22 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
| 835 | } | 836 | } |
| 836 | } | 837 | } |
| 837 | 838 | ||
| 839 | target_clock = mode->clock; | ||
| 840 | for_each_encoder_on_crtc(dev, crtc, intel_encoder) { | ||
| 841 | if (intel_encoder->type == INTEL_OUTPUT_EDP) { | ||
| 842 | target_clock = intel_edp_target_clock(intel_encoder, | ||
| 843 | mode); | ||
| 844 | break; | ||
| 845 | } | ||
| 846 | } | ||
| 847 | |||
| 838 | /* | 848 | /* |
| 839 | * Compute the GMCH and Link ratios. The '3' here is | 849 | * Compute the GMCH and Link ratios. The '3' here is |
| 840 | * the number of bytes_per_pixel post-LUT, which we always | 850 | * the number of bytes_per_pixel post-LUT, which we always |
| 841 | * set up for 8-bits of R/G/B, or 3 bytes total. | 851 | * set up for 8-bits of R/G/B, or 3 bytes total. |
| 842 | */ | 852 | */ |
| 843 | intel_link_compute_m_n(intel_crtc->bpp, lane_count, | 853 | intel_link_compute_m_n(intel_crtc->bpp, lane_count, |
| 844 | mode->clock, adjusted_mode->clock, &m_n); | 854 | target_clock, adjusted_mode->clock, &m_n); |
| 845 | 855 | ||
| 846 | if (IS_HASWELL(dev)) { | 856 | if (IS_HASWELL(dev)) { |
| 847 | I915_WRITE(PIPE_DATA_M1(cpu_transcoder), | 857 | I915_WRITE(PIPE_DATA_M1(cpu_transcoder), |
| @@ -1930,7 +1940,7 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) | |||
| 1930 | for (i = 0; i < intel_dp->lane_count; i++) | 1940 | for (i = 0; i < intel_dp->lane_count; i++) |
| 1931 | if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) | 1941 | if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) |
| 1932 | break; | 1942 | break; |
| 1933 | if (i == intel_dp->lane_count && voltage_tries == 5) { | 1943 | if (i == intel_dp->lane_count) { |
| 1934 | ++loop_tries; | 1944 | ++loop_tries; |
| 1935 | if (loop_tries == 5) { | 1945 | if (loop_tries == 5) { |
| 1936 | DRM_DEBUG_KMS("too many full retries, give up\n"); | 1946 | DRM_DEBUG_KMS("too many full retries, give up\n"); |
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index acf8aec9ada7..ef4744e1bf0b 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
| @@ -203,7 +203,13 @@ intel_gpio_setup(struct intel_gmbus *bus, u32 pin) | |||
| 203 | algo->data = bus; | 203 | algo->data = bus; |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | #define HAS_GMBUS_IRQ(dev) (INTEL_INFO(dev)->gen >= 4) | 206 | /* |
| 207 | * gmbus on gen4 seems to be able to generate legacy interrupts even when in MSI | ||
| 208 | * mode. This results in spurious interrupt warnings if the legacy irq no. is | ||
| 209 | * shared with another device. The kernel then disables that interrupt source | ||
| 210 | * and so prevents the other device from working properly. | ||
| 211 | */ | ||
| 212 | #define HAS_GMBUS_IRQ(dev) (INTEL_INFO(dev)->gen >= 5) | ||
| 207 | static int | 213 | static int |
| 208 | gmbus_wait_hw_status(struct drm_i915_private *dev_priv, | 214 | gmbus_wait_hw_status(struct drm_i915_private *dev_priv, |
| 209 | u32 gmbus2_status, | 215 | u32 gmbus2_status, |
| @@ -214,6 +220,9 @@ gmbus_wait_hw_status(struct drm_i915_private *dev_priv, | |||
| 214 | u32 gmbus2 = 0; | 220 | u32 gmbus2 = 0; |
| 215 | DEFINE_WAIT(wait); | 221 | DEFINE_WAIT(wait); |
| 216 | 222 | ||
| 223 | if (!HAS_GMBUS_IRQ(dev_priv->dev)) | ||
| 224 | gmbus4_irq_en = 0; | ||
| 225 | |||
| 217 | /* Important: The hw handles only the first bit, so set only one! Since | 226 | /* Important: The hw handles only the first bit, so set only one! Since |
| 218 | * we also need to check for NAKs besides the hw ready/idle signal, we | 227 | * we also need to check for NAKs besides the hw ready/idle signal, we |
| 219 | * need to wake up periodically and check that ourselves. */ | 228 | * need to wake up periodically and check that ourselves. */ |
