Skip to content

Commit 1985330

Browse files
committed
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "It's like a grab bag of one liners: - core: fix page flip error path, reorder object teardown. - usb: fix the drm_usb module license. - i915: VT switch on SNB with non-native modes fix, and a regression fix from 3.3. - radeon: missing unreserve on SI, AGP/VRAM setup fix (fixes radeon on IA64, but its a generic bug), an rn50 regression from 3.3, turn off MSIs on rv515 (it loses rearms every so often)." * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: nouveau: Set special lane map for the right chipset drm/radeon: fix load detect on rn50 with hardcoded EDIDs. drm: Releasing FBs before releasing GEM objects during drm_release drm/nouveau/pm: don't read/write beyond end of stack buffer drivers: gpu: drm: gma500: mdfld_dsi_output.h: Remove not unneeded include of version.h radeon: fix r600/agp when vram is after AGP (v3) drm: fix page_flip error handling drm/radeon/kms: fix the regression of DVI connector check drm/usb: fix module license on drm/usb layer. drm/i915: Do not set "Enable Panel Fitter" on SNB pageflips drm/i915: Hold mode_config lock whilst changing mode for lastclose() drm/radeon/si: add missing radeon_bo_unreserve in si_rlc_init() v2 drm/radeon: disable MSI on RV515 drm/i915: don't clobber the special upscaling lvds timings
2 parents 9e01297 + 273a50f commit 1985330

File tree

16 files changed

+56
-24
lines changed

16 files changed

+56
-24
lines changed

drivers/gpu/drm/drm_crtc.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3335,10 +3335,12 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
33353335

33363336
ret = crtc->funcs->page_flip(crtc, fb, e);
33373337
if (ret) {
3338-
spin_lock_irqsave(&dev->event_lock, flags);
3339-
file_priv->event_space += sizeof e->event;
3340-
spin_unlock_irqrestore(&dev->event_lock, flags);
3341-
kfree(e);
3338+
if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) {
3339+
spin_lock_irqsave(&dev->event_lock, flags);
3340+
file_priv->event_space += sizeof e->event;
3341+
spin_unlock_irqrestore(&dev->event_lock, flags);
3342+
kfree(e);
3343+
}
33423344
}
33433345

33443346
out:

drivers/gpu/drm/drm_fops.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -507,12 +507,12 @@ int drm_release(struct inode *inode, struct file *filp)
507507

508508
drm_events_release(file_priv);
509509

510-
if (dev->driver->driver_features & DRIVER_GEM)
511-
drm_gem_release(dev, file_priv);
512-
513510
if (dev->driver->driver_features & DRIVER_MODESET)
514511
drm_fb_release(file_priv);
515512

513+
if (dev->driver->driver_features & DRIVER_GEM)
514+
drm_gem_release(dev, file_priv);
515+
516516
mutex_lock(&dev->ctxlist_mutex);
517517
if (!list_empty(&dev->ctxlist)) {
518518
struct drm_ctx_list *pos, *n;

drivers/gpu/drm/drm_usb.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "drmP.h"
22
#include <linux/usb.h>
3-
#include <linux/export.h>
3+
#include <linux/module.h>
44

55
int drm_get_usb_dev(struct usb_interface *interface,
66
const struct usb_device_id *id,
@@ -114,3 +114,7 @@ void drm_usb_exit(struct drm_driver *driver,
114114
usb_deregister(udriver);
115115
}
116116
EXPORT_SYMBOL(drm_usb_exit);
117+
118+
MODULE_AUTHOR("David Airlie");
119+
MODULE_DESCRIPTION("USB DRM support");
120+
MODULE_LICENSE("GPL and additional rights");

drivers/gpu/drm/gma500/mdfld_dsi_output.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#define __MDFLD_DSI_OUTPUT_H__
3030

3131
#include <linux/backlight.h>
32-
#include <linux/version.h>
3332
#include <drm/drmP.h>
3433
#include <drm/drm.h>
3534
#include <drm/drm_crtc.h>

drivers/gpu/drm/i915/intel_display.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3478,8 +3478,11 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
34783478
return false;
34793479
}
34803480

3481-
/* All interlaced capable intel hw wants timings in frames. */
3482-
drm_mode_set_crtcinfo(adjusted_mode, 0);
3481+
/* All interlaced capable intel hw wants timings in frames. Note though
3482+
* that intel_lvds_mode_fixup does some funny tricks with the crtc
3483+
* timings, so we need to be careful not to clobber these.*/
3484+
if (!(adjusted_mode->private_flags & INTEL_MODE_CRTC_TIMINGS_SET))
3485+
drm_mode_set_crtcinfo(adjusted_mode, 0);
34833486

34843487
return true;
34853488
}
@@ -7465,7 +7468,13 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
74657468
OUT_RING(fb->pitches[0] | obj->tiling_mode);
74667469
OUT_RING(obj->gtt_offset);
74677470

7468-
pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
7471+
/* Contrary to the suggestions in the documentation,
7472+
* "Enable Panel Fitter" does not seem to be required when page
7473+
* flipping with a non-native mode, and worse causes a normal
7474+
* modeset to fail.
7475+
* pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
7476+
*/
7477+
pf = 0;
74697478
pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
74707479
OUT_RING(pf | pipesrc);
74717480
ADVANCE_LP_RING();

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@
105105
#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
106106
#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
107107
#define INTEL_MODE_DP_FORCE_6BPC (0x10)
108+
/* This flag must be set by the encoder's mode_fixup if it changes the crtc
109+
* timings in the mode to prevent the crtc fixup from overwriting them.
110+
* Currently only lvds needs that. */
111+
#define INTEL_MODE_CRTC_TIMINGS_SET (0x20)
108112

109113
static inline void
110114
intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,

drivers/gpu/drm/i915/intel_fb.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,15 @@ void intel_fb_restore_mode(struct drm_device *dev)
279279
struct drm_mode_config *config = &dev->mode_config;
280280
struct drm_plane *plane;
281281

282+
mutex_lock(&dev->mode_config.mutex);
283+
282284
ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
283285
if (ret)
284286
DRM_DEBUG("failed to restore crtc mode\n");
285287

286288
/* Be sure to shut off any planes that may be active */
287289
list_for_each_entry(plane, &config->plane_list, head)
288290
plane->funcs->disable_plane(plane);
291+
292+
mutex_unlock(&dev->mode_config.mutex);
289293
}

drivers/gpu/drm/i915/intel_lvds.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ centre_horizontally(struct drm_display_mode *mode,
187187

188188
mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos;
189189
mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width;
190+
191+
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
190192
}
191193

192194
static void
@@ -208,6 +210,8 @@ centre_vertically(struct drm_display_mode *mode,
208210

209211
mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos;
210212
mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width;
213+
214+
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
211215
}
212216

213217
static inline u32 panel_fitter_scaling(u32 source, u32 target)
@@ -283,6 +287,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
283287
for_each_pipe(pipe)
284288
I915_WRITE(BCLRPAT(pipe), 0);
285289

290+
drm_mode_set_crtcinfo(adjusted_mode, 0);
291+
286292
switch (intel_lvds->fitting_mode) {
287293
case DRM_MODE_SCALE_CENTER:
288294
/*

drivers/gpu/drm/i915/intel_panel.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
4747
adjusted_mode->vtotal = fixed_mode->vtotal;
4848

4949
adjusted_mode->clock = fixed_mode->clock;
50-
51-
drm_mode_set_crtcinfo(adjusted_mode, 0);
5250
}
5351

5452
/* adjusted_mode has been preset to be the panel's fixed mode */

drivers/gpu/drm/nouveau/nouveau_pm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ nouveau_pm_profile_set(struct drm_device *dev, const char *profile)
235235
return -EPERM;
236236

237237
strncpy(string, profile, sizeof(string));
238+
string[sizeof(string) - 1] = 0;
238239
if ((ptr = strchr(string, '\n')))
239240
*ptr = '\0';
240241

drivers/gpu/drm/nouveau/nv50_sor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ nv50_sor_dp_lane_map(struct drm_device *dev, struct dcb_entry *dcb, u8 lane)
4242
struct drm_nouveau_private *dev_priv = dev->dev_private;
4343
static const u8 nvaf[] = { 24, 16, 8, 0 }; /* thanks, apple.. */
4444
static const u8 nv50[] = { 16, 8, 0, 24 };
45-
if (dev_priv->card_type == 0xaf)
45+
if (dev_priv->chipset == 0xaf)
4646
return nvaf[lane];
4747
return nv50[lane];
4848
}

drivers/gpu/drm/radeon/r600.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,7 +1135,7 @@ static void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc
11351135
}
11361136
if (rdev->flags & RADEON_IS_AGP) {
11371137
size_bf = mc->gtt_start;
1138-
size_af = 0xFFFFFFFF - mc->gtt_end + 1;
1138+
size_af = 0xFFFFFFFF - mc->gtt_end;
11391139
if (size_bf > size_af) {
11401140
if (mc->mc_vram_size > size_bf) {
11411141
dev_warn(rdev->dev, "limiting VRAM\n");
@@ -1149,7 +1149,7 @@ static void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc
11491149
mc->real_vram_size = size_af;
11501150
mc->mc_vram_size = size_af;
11511151
}
1152-
mc->vram_start = mc->gtt_end;
1152+
mc->vram_start = mc->gtt_end + 1;
11531153
}
11541154
mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
11551155
dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",

drivers/gpu/drm/radeon/radeon_connectors.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
970970

971971
encoder = obj_to_encoder(obj);
972972

973-
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC ||
973+
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
974974
encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
975975
continue;
976976

@@ -1000,14 +1000,14 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
10001000
* cases the DVI port is actually a virtual KVM port connected to the service
10011001
* processor.
10021002
*/
1003+
out:
10031004
if ((!rdev->is_atom_bios) &&
10041005
(ret == connector_status_disconnected) &&
10051006
rdev->mode_info.bios_hardcoded_edid_size) {
10061007
radeon_connector->use_digital = true;
10071008
ret = connector_status_connected;
10081009
}
10091010

1010-
out:
10111011
/* updated in get modes as well since we need to know if it's analog or digital */
10121012
radeon_connector_update_scratch_regs(connector, ret);
10131013
return ret;

drivers/gpu/drm/radeon/radeon_irq_kms.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
147147
(rdev->pdev->subsystem_device == 0x01fd))
148148
return true;
149149

150+
/* RV515 seems to have MSI issues where it loses
151+
* MSI rearms occasionally. This leads to lockups and freezes.
152+
* disable it by default.
153+
*/
154+
if (rdev->family == CHIP_RV515)
155+
return false;
150156
if (rdev->flags & RADEON_IS_IGP) {
151157
/* APUs work fine with MSIs */
152158
if (rdev->family >= CHIP_PALM)

drivers/gpu/drm/radeon/rv770.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,7 @@ void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
969969
}
970970
if (rdev->flags & RADEON_IS_AGP) {
971971
size_bf = mc->gtt_start;
972-
size_af = 0xFFFFFFFF - mc->gtt_end + 1;
972+
size_af = 0xFFFFFFFF - mc->gtt_end;
973973
if (size_bf > size_af) {
974974
if (mc->mc_vram_size > size_bf) {
975975
dev_warn(rdev->dev, "limiting VRAM\n");
@@ -983,7 +983,7 @@ void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
983983
mc->real_vram_size = size_af;
984984
mc->mc_vram_size = size_af;
985985
}
986-
mc->vram_start = mc->gtt_end;
986+
mc->vram_start = mc->gtt_end + 1;
987987
}
988988
mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
989989
dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",

drivers/gpu/drm/radeon/si.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2999,8 +2999,8 @@ int si_rlc_init(struct radeon_device *rdev)
29992999
}
30003000
r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
30013001
&rdev->rlc.save_restore_gpu_addr);
3002+
radeon_bo_unreserve(rdev->rlc.save_restore_obj);
30023003
if (r) {
3003-
radeon_bo_unreserve(rdev->rlc.save_restore_obj);
30043004
dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
30053005
si_rlc_fini(rdev);
30063006
return r;
@@ -3023,9 +3023,8 @@ int si_rlc_init(struct radeon_device *rdev)
30233023
}
30243024
r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
30253025
&rdev->rlc.clear_state_gpu_addr);
3026+
radeon_bo_unreserve(rdev->rlc.clear_state_obj);
30263027
if (r) {
3027-
3028-
radeon_bo_unreserve(rdev->rlc.clear_state_obj);
30293028
dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
30303029
si_rlc_fini(rdev);
30313030
return r;

0 commit comments

Comments
 (0)