diff options
| -rw-r--r-- | shared-core/i915_dma.c | 46 | ||||
| -rw-r--r-- | shared-core/i915_drm.h | 21 | ||||
| -rw-r--r-- | shared-core/i915_drv.h | 5 | ||||
| -rw-r--r-- | shared-core/i915_irq.c | 66 | 
4 files changed, 73 insertions, 65 deletions
| diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 9f18feee..daa03df8 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -572,11 +572,11 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,  	return 0;  } -static void i915_do_dispatch_flip(struct drm_device * dev, int pipe, int sync) +static void i915_do_dispatch_flip(struct drm_device * dev, int plane, int sync)  {  	drm_i915_private_t *dev_priv = dev->dev_private;  	u32 num_pages, current_page, next_page, dspbase; -	int shift = 2 * pipe, x, y; +	int shift = 2 * plane, x, y;  	RING_LOCALS;  	/* Calculate display base offset */ @@ -597,25 +597,25 @@ static void i915_do_dispatch_flip(struct drm_device * dev, int pipe, int sync)  		break;  	} -	if (pipe == 0) { -		x = dev_priv->sarea_priv->pipeA_x; -		y = dev_priv->sarea_priv->pipeA_y; +	if (plane == 0) { +		x = dev_priv->sarea_priv->planeA_x; +		y = dev_priv->sarea_priv->planeA_y;  	} else { -		x = dev_priv->sarea_priv->pipeB_x; -		y = dev_priv->sarea_priv->pipeB_y; +		x = dev_priv->sarea_priv->planeB_x; +		y = dev_priv->sarea_priv->planeB_y;  	}  	dspbase += (y * dev_priv->sarea_priv->pitch + x) * dev_priv->cpp; -	DRM_DEBUG("pipe=%d current_page=%d dspbase=0x%x\n", pipe, current_page, +	DRM_DEBUG("plane=%d current_page=%d dspbase=0x%x\n", plane, current_page,  		  dspbase);  	BEGIN_LP_RING(4);  	OUT_RING(sync ? 0 : -		 (MI_WAIT_FOR_EVENT | (pipe ? MI_WAIT_FOR_PLANE_B_FLIP : +		 (MI_WAIT_FOR_EVENT | (plane ? MI_WAIT_FOR_PLANE_B_FLIP :  				       MI_WAIT_FOR_PLANE_A_FLIP)));  	OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | (sync ? 0 : ASYNC_FLIP) | -		 (pipe ? DISPLAY_PLANE_B : DISPLAY_PLANE_A)); +		 (plane ? DISPLAY_PLANE_B : DISPLAY_PLANE_A));  	OUT_RING(dev_priv->sarea_priv->pitch * dev_priv->cpp);  	OUT_RING(dspbase);  	ADVANCE_LP_RING(); @@ -624,19 +624,19 @@ static void i915_do_dispatch_flip(struct drm_device * dev, int pipe, int sync)  	dev_priv->sarea_priv->pf_current_page |= next_page << shift;  } -void i915_dispatch_flip(struct drm_device * dev, int pipes, int sync) +void i915_dispatch_flip(struct drm_device * dev, int planes, int sync)  {  	drm_i915_private_t *dev_priv = dev->dev_private;  	int i; -	DRM_DEBUG("%s: pipes=0x%x pfCurrentPage=%d\n", +	DRM_DEBUG("%s: planes=0x%x pfCurrentPage=%d\n",  		  __FUNCTION__, -		  pipes, dev_priv->sarea_priv->pf_current_page); +		  planes, dev_priv->sarea_priv->pf_current_page);  	i915_emit_mi_flush(dev, MI_READ_FLUSH | MI_EXE_FLUSH);  	for (i = 0; i < 2; i++) -		if (pipes & (1 << i)) +		if (planes & (1 << i))  			i915_do_dispatch_flip(dev, i, sync);  	i915_emit_breadcrumb(dev); @@ -728,21 +728,21 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,  static int i915_do_cleanup_pageflip(struct drm_device * dev)  {  	drm_i915_private_t *dev_priv = dev->dev_private; -	int i, pipes, num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2; +	int i, planes, num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;  	DRM_DEBUG("%s\n", __FUNCTION__); -	for (i = 0, pipes = 0; i < 2; i++) +	for (i = 0, planes = 0; i < 2; i++)  		if (dev_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) {  			dev_priv->sarea_priv->pf_current_page =  				(dev_priv->sarea_priv->pf_current_page &  				 ~(0x3 << (2 * i))) | (num_pages - 1) << (2 * i); -			pipes |= 1 << i; +			planes |= 1 << i;  		} -	if (pipes) -		i915_dispatch_flip(dev, pipes, 0); +	if (planes) +		i915_dispatch_flip(dev, planes, 0);  	return 0;  } @@ -755,13 +755,13 @@ static int i915_flip_bufs(struct drm_device *dev, void *data, struct drm_file *f  	LOCK_TEST_WITH_RETURN(dev, file_priv); -	if (param->pipes & ~0x3) { -		DRM_ERROR("Invalid pipes 0x%x, only <= 0x3 is valid\n", -			  param->pipes); +	if (param->planes & ~0x3) { +		DRM_ERROR("Invalid planes 0x%x, only <= 0x3 is valid\n", +			  param->planes);  		return -EINVAL;  	} -	i915_dispatch_flip(dev, param->pipes, 0); +	i915_dispatch_flip(dev, param->planes, 0);  	return 0;  } diff --git a/shared-core/i915_drm.h b/shared-core/i915_drm.h index 3a90df6e..575b182a 100644 --- a/shared-core/i915_drm.h +++ b/shared-core/i915_drm.h @@ -105,14 +105,17 @@ typedef struct _drm_i915_sarea {  	unsigned int rotated_tiled;  	unsigned int rotated2_tiled; -	int pipeA_x; -	int pipeA_y; -	int pipeA_w; -	int pipeA_h; -	int pipeB_x; -	int pipeB_y; -	int pipeB_w; -	int pipeB_h; +	int planeA_x; +	int planeA_y; +	int planeA_w; +	int planeA_h; +	int planeB_x; +	int planeB_y; +	int planeB_w; +	int planeB_h; + +	int planeA_pipe; +	int planeB_pipe;  	/* Triple buffering */  	drm_handle_t third_handle; @@ -182,7 +185,7 @@ typedef struct _drm_i915_sarea {  /* Asynchronous page flipping:   */  typedef struct drm_i915_flip { -	int pipes; +	int planes;  } drm_i915_flip_t;  /* Allow drivers to submit batchbuffers directly to hardware, relying diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index aff03bee..c5f51897 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -55,10 +55,11 @@   *      - Support vertical blank on secondary display pipe   * 1.8: New ioctl for ARB_Occlusion_Query   * 1.9: Usable page flipping and triple buffering + * 1.10: Plane/pipe disentangling   */  #define DRIVER_MAJOR		1  #if defined(I915_HAVE_FENCE) && defined(I915_HAVE_BUFFER) -#define DRIVER_MINOR		9 +#define DRIVER_MINOR		10  #else  #define DRIVER_MINOR		6  #endif @@ -87,7 +88,7 @@ struct mem_block {  typedef struct _drm_i915_vbl_swap {  	struct list_head head;  	drm_drawable_t drw_id; -	unsigned int pipe; +	unsigned int plane;  	unsigned int sequence;  	int flip;  } drm_i915_vbl_swap_t; diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index 1056b3e6..72c61876 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -44,28 +44,28 @@   */  static void  i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw, -			 int pipe) +			 int plane)  {  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;  	drm_i915_sarea_t *sarea_priv = dev_priv->sarea_priv;  	u16 x1, y1, x2, y2; -	int pf_pipes = 1 << pipe; +	int pf_planes = 1 << plane;  	DRM_SPINLOCK_ASSERT(&dev->drw_lock); -	/* If the window is visible on the other pipe, we have to flip on that -	 * pipe as well. +	/* If the window is visible on the other plane, we have to flip on that +	 * plane as well.  	 */ -	if (pipe == 1) { -		x1 = sarea_priv->pipeA_x; -		y1 = sarea_priv->pipeA_y; -		x2 = x1 + sarea_priv->pipeA_w; -		y2 = y1 + sarea_priv->pipeA_h; +	if (plane == 1) { +		x1 = sarea_priv->planeA_x; +		y1 = sarea_priv->planeA_y; +		x2 = x1 + sarea_priv->planeA_w; +		y2 = y1 + sarea_priv->planeA_h;  	} else { -		x1 = sarea_priv->pipeB_x; -		y1 = sarea_priv->pipeB_y; -		x2 = x1 + sarea_priv->pipeB_w; -		y2 = y1 + sarea_priv->pipeB_h; +		x1 = sarea_priv->planeB_x; +		y1 = sarea_priv->planeB_y; +		x2 = x1 + sarea_priv->planeB_w; +		y2 = y1 + sarea_priv->planeB_h;  	}  	if (x2 > 0 && y2 > 0) { @@ -75,13 +75,13 @@ i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,  		for (i = 0; i < num_rects; i++)  			if (!(rect[i].x1 >= x2 || rect[i].y1 >= y2 ||  			      rect[i].x2 <= x1 || rect[i].y2 <= y1)) { -				pf_pipes = 0x3; +				pf_planes = 0x3;  				break;  			}  	} -	i915_dispatch_flip(dev, pf_pipes, 1); +	i915_dispatch_flip(dev, pf_planes, 1);  }  /** @@ -124,8 +124,10 @@ static void i915_vblank_tasklet(struct drm_device *dev)  	list_for_each_safe(list, tmp, &dev_priv->vbl_swaps.head) {  		drm_i915_vbl_swap_t *vbl_swap =  			list_entry(list, drm_i915_vbl_swap_t, head); +		int pipe = vbl_swap->plane ? sarea_priv->planeB_pipe : +			sarea_priv->planeA_pipe; -		if ((counter[vbl_swap->pipe] - vbl_swap->sequence) > (1<<23)) +		if ((counter[pipe] - vbl_swap->sequence) > (1<<23))  			continue;  		list_del(list); @@ -176,10 +178,10 @@ static void i915_vblank_tasklet(struct drm_device *dev)  	i915_kernel_lost_context(dev);  	upper[0] = upper[1] = 0; -	slice[0] = max(sarea_priv->pipeA_h / nhits, 1); -	slice[1] = max(sarea_priv->pipeB_h / nhits, 1); -	lower[0] = sarea_priv->pipeA_y + slice[0]; -	lower[1] = sarea_priv->pipeB_y + slice[0]; +	slice[0] = max(sarea_priv->planeA_h / nhits, 1); +	slice[1] = max(sarea_priv->planeB_h / nhits, 1); +	lower[0] = sarea_priv->planeA_y + slice[0]; +	lower[1] = sarea_priv->planeB_y + slice[0];  	offsets[0] = sarea_priv->front_offset;  	offsets[1] = sarea_priv->back_offset; @@ -205,7 +207,7 @@ static void i915_vblank_tasklet(struct drm_device *dev)  			drm_i915_vbl_swap_t *swap_hit =  				list_entry(hit, drm_i915_vbl_swap_t, head);  			struct drm_clip_rect *rect; -			int num_rects, pipe, front, back; +			int num_rects, plane, front, back;  			unsigned short top, bottom;  			drw = drm_get_drawable_info(dev, swap_hit->drw_id); @@ -213,10 +215,10 @@ static void i915_vblank_tasklet(struct drm_device *dev)  			if (!drw)  				continue; -			pipe = swap_hit->pipe; +			plane = swap_hit->plane;  			if (swap_hit->flip) { -				i915_dispatch_vsync_flip(dev, drw, pipe); +				i915_dispatch_vsync_flip(dev, drw, plane);  				continue;  			} @@ -238,11 +240,11 @@ static void i915_vblank_tasklet(struct drm_device *dev)  			}  			rect = drw->rects; -			top = upper[pipe]; -			bottom = lower[pipe]; +			top = upper[plane]; +			bottom = lower[plane];  			front = (dev_priv->sarea_priv->pf_current_page >> -				 (2 * pipe)) & 0x3; +				 (2 * plane)) & 0x3;  			back = (front + 1) % num_pages;  			for (num_rects = drw->num_rects; num_rects--; rect++) { @@ -560,9 +562,10 @@ int i915_vblank_swap(struct drm_device *dev, void *data,  	drm_i915_private_t *dev_priv = dev->dev_private;  	drm_i915_vblank_swap_t *swap = data;  	drm_i915_vbl_swap_t *vbl_swap; -	unsigned int pipe, seqtype, curseq; +	unsigned int pipe, seqtype, curseq, plane;  	unsigned long irqflags;  	struct list_head *list; +	drm_i915_sarea_t *sarea_priv = dev_priv->sarea_priv;  	if (!dev_priv) {  		DRM_ERROR("%s called with no initialization\n", __func__); @@ -581,7 +584,8 @@ int i915_vblank_swap(struct drm_device *dev, void *data,  		return -EINVAL;  	} -	pipe = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0; +	plane = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0; +	pipe = plane ? sarea_priv->planeB_pipe : sarea_priv->planeA_pipe;  	seqtype = swap->seqtype & (_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE); @@ -624,7 +628,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,  				return -EINVAL;  			} -			i915_dispatch_vsync_flip(dev, drw, pipe); +			i915_dispatch_vsync_flip(dev, drw, plane);  			DRM_SPINUNLOCK_IRQRESTORE(&dev->drw_lock, irqflags); @@ -638,7 +642,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,  		vbl_swap = list_entry(list, drm_i915_vbl_swap_t, head);  		if (vbl_swap->drw_id == swap->drawable && -		    vbl_swap->pipe == pipe && +		    vbl_swap->plane == plane &&  		    vbl_swap->sequence == swap->sequence) {  			vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);  			DRM_SPINUNLOCK_IRQRESTORE(&dev_priv->swaps_lock, irqflags); @@ -664,7 +668,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,  	DRM_DEBUG("\n");  	vbl_swap->drw_id = swap->drawable; -	vbl_swap->pipe = pipe; +	vbl_swap->plane = plane;  	vbl_swap->sequence = swap->sequence;  	vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP); | 
