diff options
Diffstat (limited to 'drivers/gpu/drm/i915')
39 files changed, 302 insertions, 277 deletions
diff --git a/drivers/gpu/drm/i915/dvo.h b/drivers/gpu/drm/i915/dvo.h index 74b5efccfdb..33a62ad8010 100644 --- a/drivers/gpu/drm/i915/dvo.h +++ b/drivers/gpu/drm/i915/dvo.h @@ -24,9 +24,8 @@  #define _INTEL_DVO_H  #include <linux/i2c.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h>  #include "intel_drv.h"  struct intel_dvo_device { diff --git a/drivers/gpu/drm/i915/dvo_ch7xxx.c b/drivers/gpu/drm/i915/dvo_ch7xxx.c index 38f3a6cb8c7..3edd981e077 100644 --- a/drivers/gpu/drm/i915/dvo_ch7xxx.c +++ b/drivers/gpu/drm/i915/dvo_ch7xxx.c @@ -303,10 +303,10 @@ static bool ch7xxx_get_hw_state(struct intel_dvo_device *dvo)  	ch7xxx_readb(dvo, CH7xxx_PM, &val); -	if (val & CH7xxx_PM_FPD) -		return false; -	else +	if (val & (CH7xxx_PM_DVIL | CH7xxx_PM_DVIP))  		return true; +	else +		return false;  }  static void ch7xxx_dump_regs(struct intel_dvo_device *dvo) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 3c5710f95a1..0e405e5278e 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -30,11 +30,10 @@  #include <linux/debugfs.h>  #include <linux/slab.h>  #include <linux/export.h> -#include "drmP.h" -#include "drm.h" +#include <drm/drmP.h>  #include "intel_drv.h"  #include "intel_ringbuffer.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #define DRM_I915_RING_DEBUG 1 diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 14271aab72b..d04facbbdc0 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -28,12 +28,11 @@  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -#include "drmP.h" -#include "drm.h" -#include "drm_crtc_helper.h" -#include "drm_fb_helper.h" +#include <drm/drmP.h> +#include <drm/drm_crtc_helper.h> +#include <drm/drm_fb_helper.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h"  #include <linux/pci.h> @@ -1871,8 +1870,8 @@ struct drm_ioctl_desc i915_ioctls[] = {  	DRM_IOCTL_DEF_DRV(I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),  	DRM_IOCTL_DEF_DRV(I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),  	DRM_IOCTL_DEF_DRV(I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED), -	DRM_IOCTL_DEF_DRV(I915_GEM_SET_CACHEING, i915_gem_set_cacheing_ioctl, DRM_UNLOCKED), -	DRM_IOCTL_DEF_DRV(I915_GEM_GET_CACHEING, i915_gem_get_cacheing_ioctl, DRM_UNLOCKED), +	DRM_IOCTL_DEF_DRV(I915_GEM_SET_CACHING, i915_gem_set_caching_ioctl, DRM_UNLOCKED), +	DRM_IOCTL_DEF_DRV(I915_GEM_GET_CACHING, i915_gem_get_caching_ioctl, DRM_UNLOCKED),  	DRM_IOCTL_DEF_DRV(I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH|DRM_UNLOCKED),  	DRM_IOCTL_DEF_DRV(I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),  	DRM_IOCTL_DEF_DRV(I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED), diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 9e7e6474ecf..59dc4817964 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -28,16 +28,15 @@   */  #include <linux/device.h> -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h"  #include "intel_drv.h"  #include <linux/console.h>  #include <linux/module.h> -#include "drm_crtc_helper.h" +#include <drm/drm_crtc_helper.h>  static int i915_modeset __read_mostly = -1;  module_param_named(modeset, i915_modeset, int, 0400); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 4728d300881..d478bd48480 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1310,10 +1310,10 @@ int i915_gem_unpin_ioctl(struct drm_device *dev, void *data,  			 struct drm_file *file_priv);  int i915_gem_busy_ioctl(struct drm_device *dev, void *data,  			struct drm_file *file_priv); -int i915_gem_get_cacheing_ioctl(struct drm_device *dev, void *data, -				struct drm_file *file); -int i915_gem_set_cacheing_ioctl(struct drm_device *dev, void *data, -				struct drm_file *file); +int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data, +			       struct drm_file *file); +int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, +			       struct drm_file *file);  int i915_gem_throttle_ioctl(struct drm_device *dev, void *data,  			    struct drm_file *file_priv);  int i915_gem_madvise_ioctl(struct drm_device *dev, void *data, @@ -1350,9 +1350,14 @@ int __must_check i915_gem_object_get_pages(struct drm_i915_gem_object *obj);  static inline struct page *i915_gem_object_get_page(struct drm_i915_gem_object *obj, int n)  {  	struct scatterlist *sg = obj->pages->sgl; -	while (n >= SG_MAX_SINGLE_ALLOC) { +	int nents = obj->pages->nents; +	while (nents > SG_MAX_SINGLE_ALLOC) { +		if (n < SG_MAX_SINGLE_ALLOC - 1) +			break; +  		sg = sg_chain_ptr(sg + SG_MAX_SINGLE_ALLOC - 1);  		n -= SG_MAX_SINGLE_ALLOC - 1; +		nents -= SG_MAX_SINGLE_ALLOC - 1;  	}  	return sg_page(sg+n);  } @@ -1436,7 +1441,7 @@ int __must_check i915_gpu_idle(struct drm_device *dev);  int __must_check i915_gem_idle(struct drm_device *dev);  int i915_add_request(struct intel_ring_buffer *ring,  		     struct drm_file *file, -		     struct drm_i915_gem_request *request); +		     u32 *seqno);  int __must_check i915_wait_seqno(struct intel_ring_buffer *ring,  				 uint32_t seqno);  int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index eb3316bb4c3..7dd103447b4 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -25,9 +25,8 @@   *   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h"  #include "intel_drv.h" @@ -1400,10 +1399,16 @@ out:  	case 0:  	case -ERESTARTSYS:  	case -EINTR: +	case -EBUSY: +		/* +		 * EBUSY is ok: this just means that another thread +		 * already did the job. +		 */  		return VM_FAULT_NOPAGE;  	case -ENOMEM:  		return VM_FAULT_OOM;  	default: +		WARN_ON_ONCE(ret);  		return VM_FAULT_SIGBUS;  	}  } @@ -1950,11 +1955,12 @@ i915_gem_next_request_seqno(struct intel_ring_buffer *ring)  int  i915_add_request(struct intel_ring_buffer *ring,  		 struct drm_file *file, -		 struct drm_i915_gem_request *request) +		 u32 *out_seqno)  {  	drm_i915_private_t *dev_priv = ring->dev->dev_private; -	uint32_t seqno; +	struct drm_i915_gem_request *request;  	u32 request_ring_position; +	u32 seqno;  	int was_empty;  	int ret; @@ -1969,11 +1975,9 @@ i915_add_request(struct intel_ring_buffer *ring,  	if (ret)  		return ret; -	if (request == NULL) { -		request = kmalloc(sizeof(*request), GFP_KERNEL); -		if (request == NULL) -			return -ENOMEM; -	} +	request = kmalloc(sizeof(*request), GFP_KERNEL); +	if (request == NULL) +		return -ENOMEM;  	seqno = i915_gem_next_request_seqno(ring); @@ -2025,6 +2029,8 @@ i915_add_request(struct intel_ring_buffer *ring,  		}  	} +	if (out_seqno) +		*out_seqno = seqno;  	return 0;  } @@ -3187,10 +3193,10 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,  	return 0;  } -int i915_gem_get_cacheing_ioctl(struct drm_device *dev, void *data, -				struct drm_file *file) +int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data, +			       struct drm_file *file)  { -	struct drm_i915_gem_cacheing *args = data; +	struct drm_i915_gem_caching *args = data;  	struct drm_i915_gem_object *obj;  	int ret; @@ -3204,7 +3210,7 @@ int i915_gem_get_cacheing_ioctl(struct drm_device *dev, void *data,  		goto unlock;  	} -	args->cacheing = obj->cache_level != I915_CACHE_NONE; +	args->caching = obj->cache_level != I915_CACHE_NONE;  	drm_gem_object_unreference(&obj->base);  unlock: @@ -3212,29 +3218,29 @@ unlock:  	return ret;  } -int i915_gem_set_cacheing_ioctl(struct drm_device *dev, void *data, -				struct drm_file *file) +int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, +			       struct drm_file *file)  { -	struct drm_i915_gem_cacheing *args = data; +	struct drm_i915_gem_caching *args = data;  	struct drm_i915_gem_object *obj;  	enum i915_cache_level level;  	int ret; -	ret = i915_mutex_lock_interruptible(dev); -	if (ret) -		return ret; - -	switch (args->cacheing) { -	case I915_CACHEING_NONE: +	switch (args->caching) { +	case I915_CACHING_NONE:  		level = I915_CACHE_NONE;  		break; -	case I915_CACHEING_CACHED: +	case I915_CACHING_CACHED:  		level = I915_CACHE_LLC;  		break;  	default:  		return -EINVAL;  	} +	ret = i915_mutex_lock_interruptible(dev); +	if (ret) +		return ret; +  	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));  	if (&obj->base == NULL) {  		ret = -ENOENT; @@ -3956,6 +3962,9 @@ i915_gem_init_hw(struct drm_device *dev)  	if (!intel_enable_gtt())  		return -EIO; +	if (IS_HASWELL(dev) && (I915_READ(0x120010) == 1)) +		I915_WRITE(0x9008, I915_READ(0x9008) | 0xf0000); +  	i915_gem_l3_remap(dev);  	i915_gem_init_swizzling(dev); @@ -4095,7 +4104,6 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,  	}  	BUG_ON(!list_empty(&dev_priv->mm.active_list)); -	BUG_ON(!list_empty(&dev_priv->mm.inactive_list));  	mutex_unlock(&dev->struct_mutex);  	ret = drm_irq_install(dev); diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 4aa7ecf77ed..05ed42f203d 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -85,8 +85,8 @@   *   */ -#include "drmP.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  /* This is a HW constraint. The value below is the largest known requirement @@ -328,7 +328,7 @@ mi_set_context(struct intel_ring_buffer *ring,  	 * itlb_before_ctx_switch.  	 */  	if (IS_GEN6(ring->dev) && ring->itlb_before_ctx_switch) { -		ret = ring->flush(ring, 0, 0); +		ret = ring->flush(ring, I915_GEM_GPU_DOMAINS, 0);  		if (ret)  			return ret;  	} diff --git a/drivers/gpu/drm/i915/i915_gem_debug.c b/drivers/gpu/drm/i915/i915_gem_debug.c index bddf7bed183..582e6a5f3da 100644 --- a/drivers/gpu/drm/i915/i915_gem_debug.c +++ b/drivers/gpu/drm/i915/i915_gem_debug.c @@ -25,9 +25,8 @@   *   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #if WATCH_LISTS diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index ca3497e1108..773ef77b6c2 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c @@ -23,7 +23,7 @@   * Authors:   *	Dave Airlie <airlied@redhat.com>   */ -#include "drmP.h" +#include <drm/drmP.h>  #include "i915_drv.h"  #include <linux/dma-buf.h> diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index a2d8acde855..776a3225184 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -26,10 +26,9 @@   *   */ -#include "drmP.h" -#include "drm.h" +#include <drm/drmP.h>  #include "i915_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_trace.h"  static bool diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index afbc9240a99..91d43d5c452 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -26,9 +26,8 @@   *   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h"  #include "intel_drv.h" diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 47e427e4bc6..df470b5e8d3 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -22,9 +22,8 @@   *   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h"  #include "intel_drv.h" diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index ada2e90a2a6..8e91083b126 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c @@ -26,9 +26,8 @@   *   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  /* diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 8093ecd2ea3..cedbfd7b3df 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c @@ -25,11 +25,10 @@   *   */ -#include "linux/string.h" -#include "linux/bitops.h" -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <linux/string.h> +#include <linux/bitops.h> +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  /** @file i915_gem_tiling.c @@ -92,7 +91,10 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)  	uint32_t swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;  	uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; -	if (INTEL_INFO(dev)->gen >= 6) { +	if (IS_VALLEYVIEW(dev)) { +		swizzle_x = I915_BIT_6_SWIZZLE_NONE; +		swizzle_y = I915_BIT_6_SWIZZLE_NONE; +	} else if (INTEL_INFO(dev)->gen >= 6) {  		uint32_t dimm_c0, dimm_c1;  		dimm_c0 = I915_READ(MAD_DIMM_C0);  		dimm_c1 = I915_READ(MAD_DIMM_C1); diff --git a/drivers/gpu/drm/i915/i915_ioc32.c b/drivers/gpu/drm/i915/i915_ioc32.c index 0e72abb9f70..3c59584161c 100644 --- a/drivers/gpu/drm/i915/i915_ioc32.c +++ b/drivers/gpu/drm/i915/i915_ioc32.c @@ -31,9 +31,8 @@   */  #include <linux/compat.h> -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  typedef struct _drm_i915_batchbuffer32 { diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index d07c7878e2b..9628508a68a 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -30,9 +30,8 @@  #include <linux/sysrq.h>  #include <linux/slab.h> -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h"  #include "intel_drv.h" @@ -703,12 +702,12 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg)  			intel_opregion_gse_intr(dev);  		for (i = 0; i < 3; i++) { +			if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i))) +				drm_handle_vblank(dev, i);  			if (de_iir & (DE_PLANEA_FLIP_DONE_IVB << (5 * i))) {  				intel_prepare_page_flip(dev, i);  				intel_finish_page_flip_plane(dev, i);  			} -			if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i))) -				drm_handle_vblank(dev, i);  		}  		/* check event from PCH */ @@ -782,6 +781,12 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)  	if (de_iir & DE_GSE)  		intel_opregion_gse_intr(dev); +	if (de_iir & DE_PIPEA_VBLANK) +		drm_handle_vblank(dev, 0); + +	if (de_iir & DE_PIPEB_VBLANK) +		drm_handle_vblank(dev, 1); +  	if (de_iir & DE_PLANEA_FLIP_DONE) {  		intel_prepare_page_flip(dev, 0);  		intel_finish_page_flip_plane(dev, 0); @@ -792,12 +797,6 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)  		intel_finish_page_flip_plane(dev, 1);  	} -	if (de_iir & DE_PIPEA_VBLANK) -		drm_handle_vblank(dev, 0); - -	if (de_iir & DE_PIPEB_VBLANK) -		drm_handle_vblank(dev, 1); -  	/* check event from PCH */  	if (de_iir & DE_PCH_EVENT) {  		if (HAS_PCH_CPT(dev)) diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 08c51ab43c5..2a48e47f289 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -529,12 +529,15 @@  # define _3D_CHICKEN2_WM_READ_PIPELINED			(1 << 14)  #define _3D_CHICKEN3	0x02090  #define  _3D_CHICKEN_SF_DISABLE_OBJEND_CULL		(1 << 10) -#define  _3D_CHICKEN_SF_DISABLE_FASTCLIP_CULL		(1 << 5) +#define  _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL		(1 << 5)  #define MI_MODE		0x0209c  # define VS_TIMER_DISPATCH				(1 << 6)  # define MI_FLUSH_ENABLE				(1 << 12) +#define GEN6_GT_MODE	0x20d0 +#define   GEN6_GT_MODE_HI	(1 << 9) +  #define GFX_MODE	0x02520  #define GFX_MODE_GEN7	0x0229c  #define RING_MODE_GEN7(ring)	((ring)->mmio_base+0x29c) @@ -1802,6 +1805,10 @@  /* Video Data Island Packet control */  #define VIDEO_DIP_DATA		0x61178 +/* Read the description of VIDEO_DIP_DATA (before Haswel) or VIDEO_DIP_ECC + * (Haswell and newer) to see which VIDEO_DIP_DATA byte corresponds to each byte + * of the infoframe structure specified by CEA-861. */ +#define   VIDEO_DIP_DATA_SIZE	32  #define VIDEO_DIP_CTL		0x61170  /* Pre HSW: */  #define   VIDEO_DIP_ENABLE		(1 << 31) diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 7ebd8d6df87..fd82415d2cf 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c @@ -24,9 +24,8 @@   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "intel_drv.h"  #include "i915_reg.h" diff --git a/drivers/gpu/drm/i915/intel_acpi.c b/drivers/gpu/drm/i915/intel_acpi.c index f413899475e..bcbbaea2a78 100644 --- a/drivers/gpu/drm/i915/intel_acpi.c +++ b/drivers/gpu/drm/i915/intel_acpi.c @@ -8,7 +8,7 @@  #include <linux/vga_switcheroo.h>  #include <acpi/acpi_drivers.h> -#include "drmP.h" +#include <drm/drmP.h>  #include "i915_drv.h"  #define INTEL_DSM_REVISION_ID 1 /* For Calpella anyway... */ diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 8c6074154bf..0ed6baff4b0 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c @@ -26,9 +26,8 @@   */  #include <linux/dmi.h>  #include <drm/drm_dp_helper.h> -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "intel_bios.h" diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index 31c2107e782..36e57f93437 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h @@ -28,7 +28,7 @@  #ifndef _I830_BIOS_H_  #define _I830_BIOS_H_ -#include "drmP.h" +#include <drm/drmP.h>  struct vbt_header {  	u8 signature[20];		/**< Always starts with 'VBT$' */ diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 53f3e87509d..a720accff2a 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -27,13 +27,12 @@  #include <linux/dmi.h>  #include <linux/i2c.h>  #include <linux/slab.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_crtc_helper.h" -#include "drm_edid.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_crtc_helper.h> +#include <drm/drm_edid.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  /* Here's the desired hotplug mode */ diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index c2c219bf375..338570c8e0d 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -32,13 +32,13 @@  #include <linux/slab.h>  #include <linux/vgaarb.h>  #include <drm/drm_edid.h> -#include "drmP.h" +#include <drm/drmP.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_trace.h" -#include "drm_dp_helper.h" -#include "drm_crtc_helper.h" +#include <drm/drm_dp_helper.h> +#include <drm/drm_crtc_helper.h>  #include <linux/dma_remapping.h>  #define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) @@ -2806,13 +2806,34 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc)  	udelay(100);  } +static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc) +{ +	struct drm_device *dev = crtc->dev; +	struct drm_i915_private *dev_priv = dev->dev_private; +	unsigned long flags; +	bool pending; + +	if (atomic_read(&dev_priv->mm.wedged)) +		return false; + +	spin_lock_irqsave(&dev->event_lock, flags); +	pending = to_intel_crtc(crtc)->unpin_work != NULL; +	spin_unlock_irqrestore(&dev->event_lock, flags); + +	return pending; +} +  static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)  {  	struct drm_device *dev = crtc->dev; +	struct drm_i915_private *dev_priv = dev->dev_private;  	if (crtc->fb == NULL)  		return; +	wait_event(dev_priv->pending_flip_queue, +		   !intel_crtc_has_pending_flip(crtc)); +  	mutex_lock(&dev->struct_mutex);  	intel_finish_fb(crtc->fb);  	mutex_unlock(&dev->struct_mutex); @@ -3240,6 +3261,16 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)  	if (HAS_PCH_CPT(dev))  		intel_cpt_verify_modeset(dev, intel_crtc->pipe); + +	/* +	 * There seems to be a race in PCH platform hw (at least on some +	 * outputs) where an enabled pipe still completes any pageflip right +	 * away (as if the pipe is off) instead of waiting for vblank. As soon +	 * as the first vblank happend, everything works as expected. Hence just +	 * wait for one vblank before returning to avoid strange things +	 * happening. +	 */ +	intel_wait_for_vblank(dev, intel_crtc->pipe);  }  static void ironlake_crtc_disable(struct drm_crtc *crtc) @@ -4476,7 +4507,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,  	/* default to 8bpc */  	pipeconf &= ~(PIPECONF_BPP_MASK | PIPECONF_DITHER_EN);  	if (is_dp) { -		if (mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) { +		if (adjusted_mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) {  			pipeconf |= PIPECONF_BPP_6 |  				    PIPECONF_DITHER_EN |  				    PIPECONF_DITHER_TYPE_SP; @@ -6485,15 +6516,13 @@ static void do_intel_finish_page_flip(struct drm_device *dev,  	struct intel_unpin_work *work;  	struct drm_i915_gem_object *obj;  	struct drm_pending_vblank_event *e; -	struct timeval tnow, tvbl; +	struct timeval tvbl;  	unsigned long flags;  	/* Ignore early vblank irqs */  	if (intel_crtc == NULL)  		return; -	do_gettimeofday(&tnow); -  	spin_lock_irqsave(&dev->event_lock, flags);  	work = intel_crtc->unpin_work;  	if (work == NULL || !work->pending) { @@ -6507,25 +6536,6 @@ static void do_intel_finish_page_flip(struct drm_device *dev,  		e = work->event;  		e->event.sequence = drm_vblank_count_and_time(dev, intel_crtc->pipe, &tvbl); -		/* Called before vblank count and timestamps have -		 * been updated for the vblank interval of flip -		 * completion? Need to increment vblank count and -		 * add one videorefresh duration to returned timestamp -		 * to account for this. We assume this happened if we -		 * get called over 0.9 frame durations after the last -		 * timestamped vblank. -		 * -		 * This calculation can not be used with vrefresh rates -		 * below 5Hz (10Hz to be on the safe side) without -		 * promoting to 64 integers. -		 */ -		if (10 * (timeval_to_ns(&tnow) - timeval_to_ns(&tvbl)) > -		    9 * crtc->framedur_ns) { -			e->event.sequence++; -			tvbl = ns_to_timeval(timeval_to_ns(&tvbl) + -					     crtc->framedur_ns); -		} -  		e->event.tv_sec = tvbl.tv_sec;  		e->event.tv_usec = tvbl.tv_usec; @@ -6542,9 +6552,8 @@ static void do_intel_finish_page_flip(struct drm_device *dev,  	atomic_clear_mask(1 << intel_crtc->plane,  			  &obj->pending_flip.counter); -	if (atomic_read(&obj->pending_flip) == 0) -		wake_up(&dev_priv->pending_flip_queue); +	wake_up(&dev_priv->pending_flip_queue);  	schedule_work(&work->work);  	trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); @@ -8231,8 +8240,7 @@ static struct intel_quirk intel_quirks[] = {  	/* ThinkPad T60 needs pipe A force quirk (bug #16494) */  	{ 0x2782, 0x17aa, 0x201a, quirk_pipea_force }, -	/* 855 & before need to leave pipe A & dpll A up */ -	{ 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, +	/* 830/845 need to leave pipe A & dpll A up */  	{ 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },  	{ 0x3577, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, @@ -8389,29 +8397,42 @@ static void intel_enable_pipe_a(struct drm_device *dev)  } +static bool +intel_check_plane_mapping(struct intel_crtc *crtc) +{ +	struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; +	u32 reg, val; + +	if (dev_priv->num_pipe == 1) +		return true; + +	reg = DSPCNTR(!crtc->plane); +	val = I915_READ(reg); + +	if ((val & DISPLAY_PLANE_ENABLE) && +	    (!!(val & DISPPLANE_SEL_PIPE_MASK) == crtc->pipe)) +		return false; + +	return true; +} +  static void intel_sanitize_crtc(struct intel_crtc *crtc)  {  	struct drm_device *dev = crtc->base.dev;  	struct drm_i915_private *dev_priv = dev->dev_private; -	u32 reg, val; +	u32 reg;  	/* Clear any frame start delays used for debugging left by the BIOS */  	reg = PIPECONF(crtc->pipe);  	I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);  	/* We need to sanitize the plane -> pipe mapping first because this will -	 * disable the crtc (and hence change the state) if it is wrong. */ -	if (!HAS_PCH_SPLIT(dev)) { +	 * disable the crtc (and hence change the state) if it is wrong. Note +	 * that gen4+ has a fixed plane -> pipe mapping.  */ +	if (INTEL_INFO(dev)->gen < 4 && !intel_check_plane_mapping(crtc)) {  		struct intel_connector *connector;  		bool plane; -		reg = DSPCNTR(crtc->plane); -		val = I915_READ(reg); - -		if ((val & DISPLAY_PLANE_ENABLE) == 0 && -		    (!!(val & DISPPLANE_SEL_PIPE_MASK) == crtc->pipe)) -			goto ok; -  		DRM_DEBUG_KMS("[CRTC:%d] wrong plane connection detected!\n",  			      crtc->base.base.id); @@ -8435,7 +8456,6 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)  		WARN_ON(crtc->active);  		crtc->base.enabled = false;  	} -ok:  	if (dev_priv->quirks & QUIRK_PIPEA_FORCE &&  	    crtc->pipe == PIPE_A && !crtc->active) { diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 697b1768e5c..d868ba7f8ad 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -28,13 +28,12 @@  #include <linux/i2c.h>  #include <linux/slab.h>  #include <linux/export.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_crtc_helper.h" -#include "drm_edid.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_crtc_helper.h> +#include <drm/drm_edid.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #define DP_RECEIVER_CAP_SIZE	0xf @@ -1923,8 +1922,7 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)  			if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)  				break;  		if (i == intel_dp->lane_count && voltage_tries == 5) { -			++loop_tries; -			if (loop_tries == 5) { +			if (++loop_tries == 5) {  				DRM_DEBUG_KMS("too many full retries, give up\n");  				break;  			} @@ -1934,15 +1932,11 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)  		}  		/* Check to see if we've tried the same voltage 5 times */ -		if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { -			++voltage_tries; -			if (voltage_tries == 5) { -				DRM_DEBUG_KMS("too many voltage retries, give up\n"); -				break; -			} -		} else +		if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) != voltage) { +			voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;  			voltage_tries = 0; -		voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; +		} else +			++voltage_tries;  		/* Compute new intel_dp->train_set as requested by target */  		intel_get_adjust_train(intel_dp, link_status); @@ -2524,8 +2518,9 @@ static void  intel_dp_destroy(struct drm_connector *connector)  {  	struct drm_device *dev = connector->dev; +	struct intel_dp *intel_dp = intel_attached_dp(connector); -	if (intel_dpd_is_edp(dev)) +	if (is_edp(intel_dp))  		intel_panel_destroy_backlight(dev);  	drm_sysfs_connector_remove(connector); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 95cbd67ebf9..0c2a20ffa1c 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -26,12 +26,12 @@  #define __INTEL_DRV_H__  #include <linux/i2c.h> -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h" -#include "drm_crtc.h" -#include "drm_crtc_helper.h" -#include "drm_fb_helper.h" -#include "drm_dp_helper.h" +#include <drm/drm_crtc.h> +#include <drm/drm_crtc_helper.h> +#include <drm/drm_fb_helper.h> +#include <drm/drm_dp_helper.h>  #define _wait_for(COND, MS, W) ({ \  	unsigned long timeout__ = jiffies + msecs_to_jiffies(MS);	\ diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 4f1fdcc4400..15da99533e5 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c @@ -26,11 +26,10 @@   */  #include <linux/i2c.h>  #include <linux/slab.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "dvo.h" diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 97f673523b9..7b30b5c2c4e 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c @@ -36,12 +36,11 @@  #include <linux/init.h>  #include <linux/vga_switcheroo.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_fb_helper.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_fb_helper.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  static struct fb_ops intelfb_ops = { diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index a6dd00d99da..ab1e34b0920 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -29,12 +29,11 @@  #include <linux/i2c.h>  #include <linux/slab.h>  #include <linux/delay.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_edid.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_edid.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  static void @@ -151,6 +150,9 @@ static void g4x_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(VIDEO_DIP_DATA, *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(VIDEO_DIP_DATA, 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -186,6 +188,9 @@ static void ibx_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -224,6 +229,9 @@ static void cpt_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -259,6 +267,9 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -292,6 +303,9 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(data_reg + i, *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(data_reg + i, 0);  	mmiowb();  	val |= hsw_infoframe_enable(frame); diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index b9755f6378d..c2c6dbc0971 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c @@ -29,10 +29,9 @@  #include <linux/i2c.h>  #include <linux/i2c-algo-bit.h>  #include <linux/export.h> -#include "drmP.h" -#include "drm.h" +#include <drm/drmP.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  struct gmbus_port { diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 40d72bd64e1..e3166df55da 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -31,12 +31,11 @@  #include <linux/dmi.h>  #include <linux/i2c.h>  #include <linux/slab.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_edid.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_edid.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include <linux/acpi.h> diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c index 1773fb871c2..cabd84bf66e 100644 --- a/drivers/gpu/drm/i915/intel_modes.c +++ b/drivers/gpu/drm/i915/intel_modes.c @@ -27,7 +27,8 @@  #include <linux/i2c.h>  #include <linux/fb.h>  #include <drm/drm_edid.h> -#include "drmP.h" +#include <drm/drmP.h> +#include <drm/drm_edid.h>  #include "intel_drv.h"  #include "i915_drv.h" diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index 0f2db1648f0..7741c22c934 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c @@ -31,8 +31,8 @@  #include <linux/acpi_io.h>  #include <acpi/video.h> -#include "drmP.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "intel_drv.h" diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index afd0f30ab88..495625914e4 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c @@ -25,9 +25,8 @@   *   * Derived from Xorg ddx, xf86-video-intel, src/i830_video.c   */ -#include "drmP.h" -#include "drm.h" -#include "i915_drm.h" +#include <drm/drmP.h> +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "i915_reg.h"  #include "intel_drv.h" @@ -210,7 +209,6 @@ static void intel_overlay_unmap_regs(struct intel_overlay *overlay,  }  static int intel_overlay_do_wait_request(struct intel_overlay *overlay, -					 struct drm_i915_gem_request *request,  					 void (*tail)(struct intel_overlay *))  {  	struct drm_device *dev = overlay->dev; @@ -219,12 +217,10 @@ static int intel_overlay_do_wait_request(struct intel_overlay *overlay,  	int ret;  	BUG_ON(overlay->last_flip_req); -	ret = i915_add_request(ring, NULL, request); -	if (ret) { -	    kfree(request); -	    return ret; -	} -	overlay->last_flip_req = request->seqno; +	ret = i915_add_request(ring, NULL, &overlay->last_flip_req); +	if (ret) +		return ret; +  	overlay->flip_tail = tail;  	ret = i915_wait_seqno(ring, overlay->last_flip_req);  	if (ret) @@ -241,7 +237,6 @@ static int intel_overlay_on(struct intel_overlay *overlay)  	struct drm_device *dev = overlay->dev;  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; -	struct drm_i915_gem_request *request;  	int ret;  	BUG_ON(overlay->active); @@ -249,17 +244,9 @@ static int intel_overlay_on(struct intel_overlay *overlay)  	WARN_ON(IS_I830(dev) && !(dev_priv->quirks & QUIRK_PIPEA_FORCE)); -	request = kzalloc(sizeof(*request), GFP_KERNEL); -	if (request == NULL) { -		ret = -ENOMEM; -		goto out; -	} -  	ret = intel_ring_begin(ring, 4); -	if (ret) { -		kfree(request); -		goto out; -	} +	if (ret) +		return ret;  	intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_ON);  	intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE); @@ -267,9 +254,7 @@ static int intel_overlay_on(struct intel_overlay *overlay)  	intel_ring_emit(ring, MI_NOOP);  	intel_ring_advance(ring); -	ret = intel_overlay_do_wait_request(overlay, request, NULL); -out: -	return ret; +	return intel_overlay_do_wait_request(overlay, NULL);  }  /* overlay needs to be enabled in OCMD reg */ @@ -279,17 +264,12 @@ static int intel_overlay_continue(struct intel_overlay *overlay,  	struct drm_device *dev = overlay->dev;  	drm_i915_private_t *dev_priv = dev->dev_private;  	struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; -	struct drm_i915_gem_request *request;  	u32 flip_addr = overlay->flip_addr;  	u32 tmp;  	int ret;  	BUG_ON(!overlay->active); -	request = kzalloc(sizeof(*request), GFP_KERNEL); -	if (request == NULL) -		return -ENOMEM; -  	if (load_polyphase_filter)  		flip_addr |= OFC_UPDATE; @@ -299,22 +279,14 @@ static int intel_overlay_continue(struct intel_overlay *overlay,  		DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp);  	ret = intel_ring_begin(ring, 2); -	if (ret) { -		kfree(request); +	if (ret)  		return ret; -	} +  	intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);  	intel_ring_emit(ring, flip_addr);  	intel_ring_advance(ring); -	ret = i915_add_request(ring, NULL, request); -	if (ret) { -		kfree(request); -		return ret; -	} - -	overlay->last_flip_req = request->seqno; -	return 0; +	return i915_add_request(ring, NULL, &overlay->last_flip_req);  }  static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) @@ -350,15 +322,10 @@ static int intel_overlay_off(struct intel_overlay *overlay)  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct intel_ring_buffer *ring = &dev_priv->ring[RCS];  	u32 flip_addr = overlay->flip_addr; -	struct drm_i915_gem_request *request;  	int ret;  	BUG_ON(!overlay->active); -	request = kzalloc(sizeof(*request), GFP_KERNEL); -	if (request == NULL) -		return -ENOMEM; -  	/* According to intel docs the overlay hw may hang (when switching  	 * off) without loading the filter coeffs. It is however unclear whether  	 * this applies to the disabling of the overlay or to the switching off @@ -366,10 +333,9 @@ static int intel_overlay_off(struct intel_overlay *overlay)  	flip_addr |= OFC_UPDATE;  	ret = intel_ring_begin(ring, 6); -	if (ret) { -		kfree(request); +	if (ret)  		return ret; -	} +  	/* wait for overlay to go idle */  	intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);  	intel_ring_emit(ring, flip_addr); @@ -380,8 +346,7 @@ static int intel_overlay_off(struct intel_overlay *overlay)  	intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);  	intel_ring_advance(ring); -	return intel_overlay_do_wait_request(overlay, request, -					     intel_overlay_off_tail); +	return intel_overlay_do_wait_request(overlay, intel_overlay_off_tail);  }  /* recover from an interruption due to a signal @@ -426,24 +391,16 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)  		return 0;  	if (I915_READ(ISR) & I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT) { -		struct drm_i915_gem_request *request; -  		/* synchronous slowpath */ -		request = kzalloc(sizeof(*request), GFP_KERNEL); -		if (request == NULL) -			return -ENOMEM; -  		ret = intel_ring_begin(ring, 2); -		if (ret) { -			kfree(request); +		if (ret)  			return ret; -		}  		intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);  		intel_ring_emit(ring, MI_NOOP);  		intel_ring_advance(ring); -		ret = intel_overlay_do_wait_request(overlay, request, +		ret = intel_overlay_do_wait_request(overlay,  						    intel_overlay_release_old_vid_tail);  		if (ret)  			return ret; diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 30ae8f55a45..59068beac3f 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -2728,7 +2728,7 @@ static const struct cparams {  	{ 0, 800, 231, 23784 },  }; -unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) +static unsigned long __i915_chipset_val(struct drm_i915_private *dev_priv)  {  	u64 total_count, diff, ret;  	u32 count1, count2, count3, m = 0, c = 0; @@ -2782,6 +2782,22 @@ unsigned long i915_chipset_val(struct drm_i915_private *dev_priv)  	return ret;  } +unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) +{ +	unsigned long val; + +	if (dev_priv->info->gen != 5) +		return 0; + +	spin_lock_irq(&mchdev_lock); + +	val = __i915_chipset_val(dev_priv); + +	spin_unlock_irq(&mchdev_lock); + +	return val; +} +  unsigned long i915_mch_val(struct drm_i915_private *dev_priv)  {  	unsigned long m, x, b; @@ -2985,7 +3001,7 @@ void i915_update_gfx_val(struct drm_i915_private *dev_priv)  	spin_unlock_irq(&mchdev_lock);  } -unsigned long i915_gfx_val(struct drm_i915_private *dev_priv) +static unsigned long __i915_gfx_val(struct drm_i915_private *dev_priv)  {  	unsigned long t, corr, state1, corr2, state2;  	u32 pxvid, ext_v; @@ -3022,6 +3038,22 @@ unsigned long i915_gfx_val(struct drm_i915_private *dev_priv)  	return dev_priv->ips.gfx_power + state2;  } +unsigned long i915_gfx_val(struct drm_i915_private *dev_priv) +{ +	unsigned long val; + +	if (dev_priv->info->gen != 5) +		return 0; + +	spin_lock_irq(&mchdev_lock); + +	val = __i915_gfx_val(dev_priv); + +	spin_unlock_irq(&mchdev_lock); + +	return val; +} +  /**   * i915_read_mch_val - return value for IPS use   * @@ -3038,8 +3070,8 @@ unsigned long i915_read_mch_val(void)  		goto out_unlock;  	dev_priv = i915_mch_dev; -	chipset_val = i915_chipset_val(dev_priv); -	graphics_val = i915_gfx_val(dev_priv); +	chipset_val = __i915_chipset_val(dev_priv); +	graphics_val = __i915_gfx_val(dev_priv);  	ret = chipset_val + graphics_val; @@ -3395,8 +3427,8 @@ static void gen6_init_clock_gating(struct drm_device *dev)  		   GEN6_RCCUNIT_CLOCK_GATE_DISABLE);  	/* Bspec says we need to always set all mask bits. */ -	I915_WRITE(_3D_CHICKEN, (0xFFFF << 16) | -		   _3D_CHICKEN_SF_DISABLE_FASTCLIP_CULL); +	I915_WRITE(_3D_CHICKEN3, (0xFFFF << 16) | +		   _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL);  	/*  	 * According to the spec the following bits should be @@ -3427,6 +3459,11 @@ static void gen6_init_clock_gating(struct drm_device *dev)  			   DISPPLANE_TRICKLE_FEED_DISABLE);  		intel_flush_display_plane(dev_priv, pipe);  	} + +	/* The default value should be 0x200 according to docs, but the two +	 * platforms I checked have a 0 for this. (Maybe BIOS overrides?) */ +	I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_DISABLE(0xffff)); +	I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_ENABLE(GEN6_GT_MODE_HI));  }  static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv) diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 6c6f95a534b..785df4fbff2 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -27,10 +27,9 @@   *   */ -#include "drmP.h" -#include "drm.h" +#include <drm/drmP.h>  #include "i915_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_trace.h"  #include "intel_drv.h" diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 39c319827f9..0007a4d9bf6 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -29,12 +29,11 @@  #include <linux/slab.h>  #include <linux/delay.h>  #include <linux/export.h> -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_edid.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_edid.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  #include "intel_sdvo_regs.h" diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 7644f31a377..82f5e5c7009 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c @@ -29,11 +29,11 @@   * registers; newer ones are much simpler and we can use the new DRM plane   * support.   */ -#include "drmP.h" -#include "drm_crtc.h" -#include "drm_fourcc.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_fourcc.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  static void diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index d2c5c8f3baf..62bb048c135 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c @@ -30,12 +30,11 @@   * Integrated TV-out support for the 915GM and 945GM.   */ -#include "drmP.h" -#include "drm.h" -#include "drm_crtc.h" -#include "drm_edid.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h> +#include <drm/drm_edid.h>  #include "intel_drv.h" -#include "i915_drm.h" +#include <drm/i915_drm.h>  #include "i915_drv.h"  enum tv_margin {  |