Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 345281
b: refs/heads/master
c: 073f34d
h: refs/heads/master
i:
  345279: 461a9b4
v: v3
  • Loading branch information
Jesse Barnes authored and Daniel Vetter committed Nov 11, 2012
1 parent e30025b commit 12bc098
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a4da4fa4e55a8cea7fe603e7564e72db97b77a89
refs/heads/master: 073f34d9d49bdbadbea8198ddc3fbb7e736a94dd
3 changes: 3 additions & 0 deletions trunk/drivers/gpu/drm/i915/i915_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -1329,6 +1329,8 @@ static int i915_load_modeset_init(struct drm_device *dev)

intel_modeset_gem_init(dev);

INIT_WORK(&dev_priv->console_resume_work, intel_console_resume);

ret = drm_irq_install(dev);
if (ret)
goto cleanup_gem;
Expand Down Expand Up @@ -1723,6 +1725,7 @@ int i915_driver_unload(struct drm_device *dev)
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
intel_fbdev_fini(dev);
intel_modeset_cleanup(dev);
cancel_work_sync(&dev_priv->console_resume_work);

/*
* free the memory space allocated for the child device
Expand Down
27 changes: 24 additions & 3 deletions trunk/drivers/gpu/drm/i915/i915_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,18 @@ int i915_suspend(struct drm_device *dev, pm_message_t state)
return 0;
}

void intel_console_resume(struct work_struct *work)
{
struct drm_i915_private *dev_priv =
container_of(work, struct drm_i915_private,
console_resume_work);
struct drm_device *dev = dev_priv->dev;

console_lock();
intel_fbdev_set_suspend(dev, 0);
console_unlock();
}

static int i915_drm_thaw(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
Expand Down Expand Up @@ -559,9 +571,18 @@ static int i915_drm_thaw(struct drm_device *dev)

dev_priv->modeset_on_lid = 0;

console_lock();
intel_fbdev_set_suspend(dev, 0);
console_unlock();
/*
* The console lock can be pretty contented on resume due
* to all the printk activity. Try to keep it out of the hot
* path of resume if possible.
*/
if (console_trylock()) {
intel_fbdev_set_suspend(dev, 0);
console_unlock();
} else {
schedule_work(&dev_priv->console_resume_work);
}

return error;
}

Expand Down
7 changes: 7 additions & 0 deletions trunk/drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,12 @@ typedef struct drm_i915_private {
/* list of fbdev register on this device */
struct intel_fbdev *fbdev;

/*
* The console may be contended at resume, but we don't
* want it to block on it.
*/
struct work_struct console_resume_work;

struct backlight_device *backlight;

struct drm_property *broadcast_rgb_property;
Expand Down Expand Up @@ -1273,6 +1279,7 @@ extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);

extern void intel_console_resume(struct work_struct *work);

/* i915_irq.c */
void i915_hangcheck_elapsed(unsigned long data);
Expand Down

0 comments on commit 12bc098

Please sign in to comment.