All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kernel/drm: vblank wait on crtc > 1
@ 2011-03-18 21:58 Ilija Hadzic
  2011-03-18 22:07 ` Jesse Barnes
                   ` (4 more replies)
  0 siblings, 5 replies; 17+ messages in thread
From: Ilija Hadzic @ 2011-03-18 21:58 UTC (permalink / raw)
  To: airlied; +Cc: dri-devel


Hi Dave,

Below is a patch against drm-next branch of 2.6.38-rc8+ kernel that adds 
the capability to wait on vblank events for CRTCs that are greater than 1 
and thus cannot be represented with primary/secondary flags in the legacy 
interface. It was discussed on the dri-devel list in these two threads:

http://lists.freedesktop.org/archives/dri-devel/2011-March/009009.html
http://lists.freedesktop.org/archives/dri-devel/2011-March/009025.html

This patch extends the interface to drm_wait_vblank ioctl so that crtc>1 
can be represented. It also adds a new capability to drm_getcap ioctl so 
that the user space can check whether the new interface to drm_wait_vblank 
is supported (and fall back to the legacy interface if not)

Regards,

Ilija


Reviewed-by: Mario Kleiner <mario.kleiner at tuebingen.mpg.de>
Acked-by: Mario Kleiner <mario.kleiner at tuebingen.mpg.de>

diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 7f6912a..3617b4c 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -280,6 +280,9 @@ int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
  		if (dev->driver->dumb_create)
  			req->value = 1;
  		break;
+	case DRM_CAP_HIGH_CRTC:
+		req->value = 1;
+		break;
  	default:
  		return -EINVAL;
  	}
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index a34ef97..c725088 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -1125,7 +1125,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
  {
  	union drm_wait_vblank *vblwait = data;
  	int ret = 0;
-	unsigned int flags, seq, crtc;
+	unsigned int flags, seq, crtc, high_crtc;

  	if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
  		return -EINVAL;
@@ -1134,16 +1134,21 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
  		return -EINVAL;

  	if (vblwait->request.type &
-	    ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) {
+	    ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | 
+	      _DRM_VBLANK_HIGH_CRTC_MASK)) {
  		DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
  			  vblwait->request.type,
-			  (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK));
+			  (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | 
+			   _DRM_VBLANK_HIGH_CRTC_MASK));
  		return -EINVAL;
  	}

  	flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
-	crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
-
+	high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
+	if (high_crtc)
+		crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
+	else
+		crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
  	if (crtc >= dev->num_crtcs)
  		return -EINVAL;

diff --git a/include/drm/drm.h b/include/drm/drm.h
index 9ac4313..99cd074 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -469,6 +469,8 @@ enum drm_vblank_seq_type {
  	_DRM_VBLANK_SECONDARY = 0x20000000,	/**< Secondary display controller */
  	_DRM_VBLANK_SIGNAL = 0x40000000	/**< Send signal instead of blocking, unsupported */
  };
+#define _DRM_VBLANK_HIGH_CRTC_SHIFT 16
+#define _DRM_VBLANK_HIGH_CRTC_MASK 0x001F0000

  #define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE)
  #define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \
@@ -753,6 +755,7 @@ struct drm_event_vblank {
  };

  #define DRM_CAP_DUMB_BUFFER 0x1
+#define DRM_CAP_HIGH_CRTC 0x2

  /* typedef area */
  #ifndef __KERNEL__

^ permalink raw reply related	[flat|nested] 17+ messages in thread
* Re: [PATCH] kernel/drm: vblank wait on crtc > 1
@ 2011-03-19 17:30 Mario Kleiner
  2011-03-19 18:12 ` Alex Deucher
  0 siblings, 1 reply; 17+ messages in thread
From: Mario Kleiner @ 2011-03-19 17:30 UTC (permalink / raw)
  To: Jesse Barnes, ihadzic; +Cc: dri-devel

>
> On Fri, 18 Mar 2011, Jesse Barnes wrote:
>>
>> I like the new param check, but I'd still prefer a new ioctl to  
>> abusing
>> the old one.
>>
>
> It's not "abusing" it but extending the interface in a
> backwards-compatible manner. Introducing a new one would result in two
> ioctls that essentially do the same thing, which I don't like.

> On Fri, 18 Mar 2011, Jesse Barnes wrote:
>>

 > Yes abusing was a strong word; I just don't like encoding crtc  
numbers
 > in a bitfield, when we just use ints everywhere else.
 >
 > Not a big deal, Dave will make the final call.  Thanks for doing this
 > work.
 > --
 > Jesse Barnes, Intel Open Source Technology Center

Hi

A clean solution with int's in a new ioctl() would be certainly  
nicer. But if we'd define a waitvblank ioctl() v2, we should probably  
fix other limitations of the old one as well.

E.g., the kernel's vblank counter is only 32 bit. The api /  
oml_sync_control extension / mesa/ x etc. expose a 64 bit vblank  
counter. At the moment we work around this by masking out the upper  
32 bit in the ddx, accepting some small skipped frame glitch every  
couple of months of uptime when the "64 bit" counter wraps around  
already at 32 bits. This is something we should probably fix in a  
ioctl() v2 as well.

Take this just as my vote for Ilja's solution as a workable stop-gap  
measure for fixing an existing problem until we implement a more  
permanent solution for a new ioctl().

best,
-mario

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2011-03-22 14:45 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-18 21:58 [PATCH] kernel/drm: vblank wait on crtc > 1 Ilija Hadzic
2011-03-18 22:07 ` Jesse Barnes
2011-03-18 23:13   ` Ilija Hadzic
2011-03-18 23:34     ` Jesse Barnes
2011-03-19 19:35 ` Alex Deucher
2011-03-20 17:32   ` Ilija Hadzic
2011-03-19 20:16 ` Alex Deucher
2011-03-20 23:24 ` Dave Airlie
2011-03-20 23:47   ` Ilija Hadzic
2011-03-21 21:55     ` OT: sending patches to the list (was: [PATCH] kernel/drm: vblank wait on crtc > 1) Paul Menzel
2011-03-22 11:12 ` [PATCH] kernel/drm: vblank wait on crtc > 1 Michel Dänzer
2011-03-22 11:16   ` Ilija Hadzic
2011-03-22 11:27     ` Michel Dänzer
2011-03-22 13:43       ` Ilija Hadzic
2011-03-22 14:45         ` Michel Dänzer
  -- strict thread matches above, loose matches on Subject: below --
2011-03-19 17:30 Mario Kleiner
2011-03-19 18:12 ` Alex Deucher

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.