[PATCH xf86-video-intel 1/8] uxa: Switch to using crtc index instead of pipe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>

Start using the kms crtc index rather than the pipe almost
everywhere. The two numbers could in theory be different
if the hardware has some pipes fused off. Though I think
such non-contiguous fusing won't actually happen on the
hardware generations the driver fully supports.

The places where using the kms crtc index is the correct
choice have to do with the vblank ioctl crtc selection.

The only place where we must stick to the hardware pipe
indexing is the MI_SCANLINE_WAIT stuff as there we have to
construct CS packets to be consumed by the hardware itself.

Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
---
 src/uxa/intel.h         |  1 +
 src/uxa/intel_display.c | 20 ++++++++++++++------
 src/uxa/intel_dri.c     | 28 ++++++++++++++--------------
 src/uxa/intel_present.c | 20 ++++++++++----------
 4 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/src/uxa/intel.h b/src/uxa/intel.h
index a5e77af46260..04d17f863e60 100644
--- a/src/uxa/intel.h
+++ b/src/uxa/intel.h
@@ -467,6 +467,7 @@ Bool intel_dri3_screen_init(ScreenPtr screen);
 
 extern Bool intel_crtc_on(xf86CrtcPtr crtc);
 int intel_crtc_to_pipe(xf86CrtcPtr crtc);
+int intel_crtc_to_index(xf86CrtcPtr crtc);
 
 /* intel_memory.c */
 unsigned long intel_get_fence_size(intel_screen_private *intel, unsigned long size);
diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c
index ba4b8d87412c..409cbbcf7901 100644
--- a/src/uxa/intel_display.c
+++ b/src/uxa/intel_display.c
@@ -106,6 +106,7 @@ struct intel_crtc {
 	drmModeModeInfo kmode;
 	drmModeCrtcPtr mode_crtc;
 	int pipe;
+	int index;
 	dri_bo *cursor;
 	dri_bo *rotate_bo;
 	uint32_t rotate_pitch;
@@ -755,6 +756,7 @@ intel_crtc_init(ScrnInfoPtr scrn, struct intel_mode *mode, drmModeResPtr mode_re
 
 	intel_crtc->pipe = drm_intel_get_pipe_from_crtc_id(intel->bufmgr,
 							   crtc_id(intel_crtc));
+	intel_crtc->index = num;
 
 	intel_crtc->cursor = drm_intel_bo_alloc(intel->bufmgr, "ARGB cursor",
 						4*64*64, 4096);
@@ -1768,7 +1770,7 @@ intel_do_pageflip(intel_screen_private *intel,
 		/* Only the reference crtc will finally deliver its page flip
 		 * completion event. All other crtc's events will be discarded.
 		 */
-		flip->dispatch_me = (intel_crtc_to_pipe(crtc->crtc) == ref_crtc_hw_id);
+		flip->dispatch_me = (intel_crtc_to_index(crtc->crtc) == ref_crtc_hw_id);
 		flip->mode = mode;
 
 		seq = intel_drm_queue_alloc(scrn, config->crtc[i], flip, intel_pageflip_handler, intel_pageflip_abort);
@@ -1913,11 +1915,11 @@ intel_drm_abort_scrn(ScrnInfoPtr scrn)
 	}
 }
 
-static uint32_t pipe_select(int pipe)
+static uint32_t crtc_select(int index)
 {
-	if (pipe > 1)
-		return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
-	else if (pipe > 0)
+	if (index > 1)
+		return index << DRM_VBLANK_HIGH_CRTC_SHIFT;
+	else if (index > 0)
 		return DRM_VBLANK_SECONDARY;
 	else
 		return 0;
@@ -1933,7 +1935,7 @@ intel_get_msc_ust(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint32_t *msc, uint64_t *u
 	drmVBlank vbl;
 
 	/* Get current count */
-	vbl.request.type = DRM_VBLANK_RELATIVE | pipe_select(intel_crtc_to_pipe(crtc));
+	vbl.request.type = DRM_VBLANK_RELATIVE | crtc_select(intel_crtc_to_index(crtc));
 	vbl.request.sequence = 0;
 	vbl.request.signal = 0;
 	if (drmWaitVBlank(intel->drmSubFD, &vbl)) {
@@ -2349,6 +2351,12 @@ int intel_crtc_to_pipe(xf86CrtcPtr crtc)
 	return intel_crtc->pipe;
 }
 
+int intel_crtc_to_index(xf86CrtcPtr crtc)
+{
+	struct intel_crtc *intel_crtc = crtc->driver_private;
+	return intel_crtc->index;
+}
+
 Bool intel_crtc_on(xf86CrtcPtr crtc)
 {
 	struct intel_crtc *intel_crtc = crtc->driver_private;
diff --git a/src/uxa/intel_dri.c b/src/uxa/intel_dri.c
index e707b74f091f..d91ed295985d 100644
--- a/src/uxa/intel_dri.c
+++ b/src/uxa/intel_dri.c
@@ -94,11 +94,11 @@ static void I830DRI2FrameEventHandler(unsigned int frame,
 static void
 i830_dri2_del_frame_event(DRI2FrameEventPtr info);
 
-static uint32_t pipe_select(int pipe)
+static uint32_t crtc_select(int index)
 {
-	if (pipe > 1)
-		return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
-	else if (pipe > 0)
+	if (index > 1)
+		return index << DRM_VBLANK_HIGH_CRTC_SHIFT;
+	else if (index > 0)
 		return DRM_VBLANK_SECONDARY;
 	else
 		return 0;
@@ -896,7 +896,7 @@ queue_flip(struct intel_screen_private *intel,
 		return FALSE;
 
 	if (!intel_do_pageflip(intel, old_back,
-			       intel_crtc_to_pipe(crtc),
+			       intel_crtc_to_index(crtc),
 			       FALSE, info,
 			       I830DRI2FlipComplete, I830DRI2FlipAbort))
 		return FALSE;
@@ -940,7 +940,7 @@ queue_swap(struct intel_screen_private *intel,
 	vbl.request.type =
 		DRM_VBLANK_RELATIVE |
 		DRM_VBLANK_EVENT |
-		pipe_select(intel_crtc_to_pipe(crtc));
+		crtc_select(intel_crtc_to_index(crtc));
 	vbl.request.sequence = 1;
 	vbl.request.signal =
 		intel_drm_queue_alloc(intel->scrn, crtc, info,
@@ -1096,7 +1096,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	drmVBlank vbl;
 	int ret;
         xf86CrtcPtr crtc = I830DRI2DrawableCrtc(draw);
-        int pipe = crtc ? intel_crtc_to_pipe(crtc) : -1;
+        int index = crtc ? intel_crtc_to_index(crtc) : -1;
         int flip = 0;
 	DRI2FrameEventPtr swap_info = NULL;
 	uint64_t current_msc, current_ust;
@@ -1104,7 +1104,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
         uint32_t seq;
 
 	/* Drawable not displayed... just complete the swap */
-	if (pipe == -1)
+	if (index == -1)
 	    goto blit_fallback;
 
 	swap_info = calloc(1, sizeof(DRI2FrameEventRec));
@@ -1162,7 +1162,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	 */
 	if (divisor == 0 || current_msc < *target_msc) {
 		vbl.request.type =
-			DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe);
+			DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index);
 
 		/* If non-pageflipping, but blitting/exchanging, we need to use
 		 * DRM_VBLANK_NEXTONMISS to avoid unreliable timestamping later
@@ -1207,7 +1207,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	 * equation.
 	 */
 	vbl.request.type =
-		DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe);
+		DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index);
 	if (flip == 0)
 		vbl.request.type |= DRM_VBLANK_NEXTONMISS;
 
@@ -1322,12 +1322,12 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 	drmVBlank vbl;
 	int ret;
         xf86CrtcPtr crtc = I830DRI2DrawableCrtc(draw);
-        int pipe = crtc ? intel_crtc_to_pipe(crtc) : -1;
+        int index = crtc ? intel_crtc_to_index(crtc) : -1;
 	CARD64 current_msc, current_ust, request_msc;
         uint32_t seq;
 
 	/* Drawable not visible, return immediately */
-	if (pipe == -1)
+	if (index == -1)
 		goto out_complete;
 
 	wait_info = calloc(1, sizeof(DRI2FrameEventRec));
@@ -1368,7 +1368,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 		if (current_msc >= target_msc)
 			target_msc = current_msc;
 		vbl.request.type =
-			DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe);
+			DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index);
 		vbl.request.sequence = intel_crtc_msc_to_sequence(scrn, crtc, target_msc);
 		vbl.request.signal = seq;
 
@@ -1396,7 +1396,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 	 * so we queue an event that will satisfy the divisor/remainder equation.
 	 */
 	vbl.request.type =
-		DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe);
+		DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index);
 
         request_msc = current_msc - (current_msc % divisor) +
                 remainder;
diff --git a/src/uxa/intel_present.c b/src/uxa/intel_present.c
index ac028edd883e..b21e5c41072f 100644
--- a/src/uxa/intel_present.c
+++ b/src/uxa/intel_present.c
@@ -58,11 +58,11 @@ struct intel_present_vblank_event {
 	uint64_t        event_id;
 };
 
-static uint32_t pipe_select(int pipe)
+static uint32_t crtc_select(int index)
 {
-	if (pipe > 1)
-		return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
-	else if (pipe > 0)
+	if (index > 1)
+		return index << DRM_VBLANK_HIGH_CRTC_SHIFT;
+	else if (index > 0)
 		return DRM_VBLANK_SECONDARY;
 	else
 		return 0;
@@ -92,7 +92,7 @@ intel_present_get_crtc(WindowPtr window)
 }
 
 static int
-intel_present_crtc_pipe(ScreenPtr screen, RRCrtcPtr randr_crtc)
+intel_present_crtc_index(ScreenPtr screen, RRCrtcPtr randr_crtc)
 {
 	xf86CrtcPtr crtc;
 
@@ -100,7 +100,7 @@ intel_present_crtc_pipe(ScreenPtr screen, RRCrtcPtr randr_crtc)
 		return 0;
 
 	crtc = randr_crtc->devPrivate;
-	return intel_crtc_to_pipe(crtc);
+	return intel_crtc_to_index(crtc);
 }
 
 static int
@@ -162,7 +162,7 @@ intel_present_queue_vblank(RRCrtcPtr                    crtc,
 	ScreenPtr                               screen = crtc->pScreen;
 	ScrnInfoPtr                             scrn = xf86ScreenToScrn(screen);
 	intel_screen_private                    *intel = intel_get_screen_private(scrn);
-	int                                     pipe = intel_present_crtc_pipe(screen, crtc);
+	int                                     index = intel_present_crtc_index(screen, crtc);
 	struct intel_present_vblank_event       *event;
 	drmVBlank                               vbl;
 	int                                     ret;
@@ -180,7 +180,7 @@ intel_present_queue_vblank(RRCrtcPtr                    crtc,
 		return BadAlloc;
 	}
 
-	vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe);
+	vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index);
 	vbl.request.sequence = intel_crtc_msc_to_sequence(scrn, xf86_crtc, msc);
 	vbl.request.signal = seq;
 	for (;;) {
@@ -315,7 +315,7 @@ intel_present_flip(RRCrtcPtr                    crtc,
 	ScrnInfoPtr                             scrn = xf86ScreenToScrn(screen);
 	intel_screen_private                    *intel = intel_get_screen_private(scrn);
 	struct intel_present_vblank_event       *event;
-	int                                     pipe = intel_present_crtc_pipe(screen, crtc);
+	int                                     index = intel_present_crtc_index(screen, crtc);
 	dri_bo                                  *bo;
 	Bool                                    ret;
 
@@ -332,7 +332,7 @@ intel_present_flip(RRCrtcPtr                    crtc,
 
 	event->event_id = event_id;
 
-	ret = intel_do_pageflip(intel, bo, pipe, !sync_flip,
+	ret = intel_do_pageflip(intel, bo, index, !sync_flip,
 				event,
 				intel_present_flip_event,
 				intel_present_flip_abort);
-- 
2.39.2




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux