All of lore.kernel.org
 help / color / mirror / Atom feed
From: ville.syrjala@linux.intel.com
To: dri-devel@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org
Subject: [PATCH 15/81] drm: Add the atomic modeset ioctl
Date: Wed, 12 Dec 2012 18:15:42 +0200	[thread overview]
Message-ID: <1355329008-31459-16-git-send-email-ville.syrjala@linux.intel.com> (raw)
In-Reply-To: <1355329008-31459-1-git-send-email-ville.syrjala@linux.intel.com>

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

This new ioctl can be used to update an arbitrary set of object
properties in one operation.

The ioctl simply takes a list of object IDs and property IDs and their
values. For setting values of blob properties, the property value
indicates the length of the data, and the actual data is passed via
another blob pointer.

Three flags are currently supported to alter the behaviour of the ioctl:
- DRM_MODE_ATOMIC_TEST_ONLY indicates that the new state chould only be
  checked for validity, but not hardware state is to be modified.
- DRM_MODE_ATOMIC_EVENT requests that asynchronous completion events be
  sent back to user space. A new event type is added for this purpose.
- DRM_MODE_ATOMIC_NONBLOCK indicates that the operation must be
  completed asynchronously without blocking the the caller for
  significant amounts of time.

Internally the driver must implement the functions pointers in struct
drm_atomic_funcs to support the new ioctl.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/drm_crtc.c  |  146 +++++++++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_drv.c   |    1 +
 include/drm/drmP.h          |    8 +++
 include/drm/drm_crtc.h      |   13 ++++
 include/uapi/drm/drm.h      |   12 ++++
 include/uapi/drm/drm_mode.h |   17 +++++
 6 files changed, 197 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index aeda9f4..897ff46 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -4245,3 +4245,149 @@ int drm_calc_vscale(struct drm_region *src, struct drm_region *dst,
 	return vscale;
 }
 EXPORT_SYMBOL(drm_calc_vscale);
+
+int drm_mode_atomic_ioctl(struct drm_device *dev,
+			  void *data, struct drm_file *file_priv)
+{
+	struct drm_mode_atomic *arg = data;
+	uint32_t __user *objs_ptr = (uint32_t __user *)(unsigned long)(arg->objs_ptr);
+	uint32_t __user *count_props_ptr = (uint32_t __user *)(unsigned long)(arg->count_props_ptr);
+	uint32_t __user *props_ptr = (uint32_t __user *)(unsigned long)(arg->props_ptr);
+	uint64_t __user *prop_values_ptr = (uint64_t __user *)(unsigned long)(arg->prop_values_ptr);
+	uint64_t __user *blob_values_ptr = (uint64_t __user *)(unsigned long)(arg->blob_values_ptr);
+	unsigned int copied_objs = 0;
+	unsigned int copied_props = 0;
+	unsigned int copied_blobs = 0;
+	void *state;
+	int ret = 0;
+	unsigned int i, j;
+
+	if (!dev->driver->atomic_funcs ||
+	    !dev->driver->atomic_funcs->begin ||
+	    !dev->driver->atomic_funcs->set ||
+	    !dev->driver->atomic_funcs->check ||
+	    !dev->driver->atomic_funcs->commit ||
+	    !dev->driver->atomic_funcs->end)
+		return -ENOSYS;
+
+	if (arg->flags & ~(DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_EVENT | DRM_MODE_ATOMIC_NONBLOCK))
+		return -EINVAL;
+
+	/* can't test and expect an event at the same time. */
+	if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY && arg->flags & DRM_MODE_ATOMIC_EVENT)
+		return -EINVAL;
+
+	mutex_lock(&dev->mode_config.mutex);
+
+	state = dev->driver->atomic_funcs->begin(dev, file_priv, arg->flags, arg->user_data);
+	if (IS_ERR(state)) {
+		ret = PTR_ERR(state);
+		goto unlock;
+	}
+
+	for (i = 0; i < arg->count_objs; i++) {
+		uint32_t obj_id, count_props;
+		struct drm_mode_object *obj;
+
+		if (get_user(obj_id, objs_ptr + copied_objs)) {
+			ret = -EFAULT;
+			goto out;
+		}
+
+		obj = drm_mode_object_find(dev, obj_id, DRM_MODE_OBJECT_ANY);
+		if (!obj || !obj->properties) {
+			ret = -ENOENT;
+			goto out;
+		}
+
+		if (get_user(count_props, count_props_ptr + copied_objs)) {
+			ret = -EFAULT;
+			goto out;
+		}
+
+		copied_objs++;
+
+		for (j = 0; j < count_props; j++) {
+			uint32_t prop_id;
+			uint64_t prop_value;
+			struct drm_mode_object *prop_obj;
+			struct drm_property *prop;
+			void *blob_data = NULL;
+
+			if (get_user(prop_id, props_ptr + copied_props)) {
+				ret = -EFAULT;
+				goto out;
+			}
+
+			if (!object_has_prop(obj, prop_id)) {
+				ret = -EINVAL;
+				goto out;
+			}
+
+			prop_obj = drm_mode_object_find(dev, prop_id, DRM_MODE_OBJECT_PROPERTY);
+			if (!prop_obj) {
+				ret = -ENOENT;
+				goto out;
+			}
+			prop = obj_to_property(prop_obj);
+
+			if (get_user(prop_value, prop_values_ptr + copied_props)) {
+				ret = -EFAULT;
+				goto out;
+			}
+
+			if (!drm_property_change_is_valid(prop, prop_value)) {
+				ret = -EINVAL;
+				goto out;
+			}
+
+			if (prop->flags & DRM_MODE_PROP_BLOB && prop_value) {
+				uint64_t blob_ptr;
+
+				if (get_user(blob_ptr, blob_values_ptr + copied_blobs)) {
+					ret = -EFAULT;
+					goto out;
+				}
+
+				blob_data = kmalloc(prop_value, GFP_KERNEL);
+				if (!blob_data) {
+					ret = -ENOMEM;
+					goto out;
+				}
+
+				if (copy_from_user(blob_data, (void __user *)(unsigned long)blob_ptr, prop_value)) {
+					kfree(blob_data);
+					ret = -EFAULT;
+					goto out;
+				}
+			}
+
+			/* User space sends the blob pointer even if we don't use it (length==0). */
+			if (prop->flags & DRM_MODE_PROP_BLOB)
+				copied_blobs++;
+
+			/* The driver will be in charge of blob_data from now on. */
+			ret = dev->driver->atomic_funcs->set(dev, state, obj, prop, prop_value, blob_data);
+			if (ret)
+				goto out;
+
+			copied_props++;
+		}
+	}
+
+	ret = dev->driver->atomic_funcs->check(dev, state);
+	if (ret)
+		goto out;
+
+	if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY)
+		goto out;
+
+	ret = dev->driver->atomic_funcs->commit(dev, state);
+
+ out:
+	dev->driver->atomic_funcs->end(dev, state);
+ unlock:
+	mutex_unlock(&dev->mode_config.mutex);
+
+	return ret;
+}
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index be174ca..dbef305 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -166,6 +166,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+	DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 };
 
 #define DRM_CORE_IOCTL_COUNT	ARRAY_SIZE( drm_ioctls )
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index fad21c9..1773812 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -958,6 +958,8 @@ struct drm_driver {
 
 	/* List of devices hanging off this driver */
 	struct list_head device_list;
+
+	const struct drm_atomic_funcs *atomic_funcs;
 };
 
 #define DRM_MINOR_UNASSIGNED 0
@@ -1051,6 +1053,12 @@ struct drm_pending_vblank_event {
 	struct drm_event_vblank event;
 };
 
+struct drm_pending_atomic_event {
+	struct drm_pending_event base;
+	int pipe;
+	struct drm_event_atomic event;
+};
+
 /**
  * DRM device structure. This structure represent a complete card that
  * may contain multiple heads.
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index d05d302..77f08a3 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1092,6 +1092,8 @@ extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
 					     struct drm_file *file_priv);
 extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
 					   struct drm_file *file_priv);
+extern int drm_mode_atomic_ioctl(struct drm_device *dev,
+				 void *data, struct drm_file *file_priv);
 
 extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
 				 int *bpp);
@@ -1132,4 +1134,15 @@ extern int drm_calc_hscale(struct drm_region *src, struct drm_region *dst,
 extern int drm_calc_vscale(struct drm_region *src, struct drm_region *dst,
 			   int min_vscale, int max_vscale);
 
+struct drm_atomic_funcs {
+	void *(*begin)(struct drm_device *dev, struct drm_file *file,
+		       uint32_t flags, uint64_t user_data);
+	int (*set)(struct drm_device *dev, void *state,
+		   struct drm_mode_object *obj, struct drm_property *prop,
+		   uint64_t value, void *blob_data);
+	int (*check)(struct drm_device *dev, void *state);
+	int (*commit)(struct drm_device *dev, void *state);
+	void (*end)(struct drm_device *dev, void *state);
+};
+
 #endif /* __DRM_CRTC_H__ */
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 8d1e2bb..7b057ca 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -732,6 +732,7 @@ struct drm_prime_handle {
 #define DRM_IOCTL_MODE_ADDFB2		DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
 #define DRM_IOCTL_MODE_OBJ_GETPROPERTIES	DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
 #define DRM_IOCTL_MODE_OBJ_SETPROPERTY	DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
+#define DRM_IOCTL_MODE_ATOMIC	DRM_IOWR(0xBB, struct drm_mode_atomic)
 
 /**
  * Device specific ioctls should only be in their respective headers
@@ -763,6 +764,7 @@ struct drm_event {
 
 #define DRM_EVENT_VBLANK 0x01
 #define DRM_EVENT_FLIP_COMPLETE 0x02
+#define DRM_EVENT_ATOMIC_COMPLETE 0x03
 
 struct drm_event_vblank {
 	struct drm_event base;
@@ -773,6 +775,16 @@ struct drm_event_vblank {
 	__u32 reserved;
 };
 
+struct drm_event_atomic {
+	struct drm_event base;
+	__u64 user_data;
+	__u32 tv_sec;
+	__u32 tv_usec;
+	__u32 sequence;
+	__u32 obj_id;
+	__u32 old_fb_id;
+};
+
 #define DRM_CAP_DUMB_BUFFER 0x1
 #define DRM_CAP_VBLANK_HIGH_CRTC 0x2
 #define DRM_CAP_DUMB_PREFERRED_DEPTH 0x3
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 3d6301b..71f5e0d 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -460,4 +460,21 @@ struct drm_mode_destroy_dumb {
 	uint32_t handle;
 };
 
+
+#define DRM_MODE_ATOMIC_TEST_ONLY (1<<0)
+#define DRM_MODE_ATOMIC_EVENT (1<<1)
+#define DRM_MODE_ATOMIC_NONBLOCK (1<<2)
+
+/* FIXME come up with some sane error reporting mechanism? */
+struct drm_mode_atomic {
+	__u32 flags;
+	__u32 count_objs;
+	__u64 objs_ptr;
+	__u64 count_props_ptr;
+	__u64 props_ptr;
+	__u64 prop_values_ptr;
+	__u64 blob_values_ptr;
+	__u64 user_data;
+};
+
 #endif
-- 
1.7.8.6

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2012-12-12 16:15 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-12 16:15 [PATCH 00/81] drm/i915: Atomic mode setting / page flip, yet again ville.syrjala
2012-12-12 16:15 ` [PATCH 01/81] drm: Add struct drm_region and assorted utility functions ville.syrjala
2012-12-12 16:15 ` [PATCH 02/81] drm: Add drm_calc_{hscale, vscale}() " ville.syrjala
2012-12-12 16:15 ` [PATCH 03/81] drm: Keep a copy of last plane coordinates ville.syrjala
2012-12-12 16:15 ` [PATCH 04/81] drm: Add restore_fbdev_mode() hook to drm_fb_helper ville.syrjala
2012-12-12 16:15 ` [PATCH 05/81] drm: Export drm_property_create_blob() and drm_property_destroy_blob() ville.syrjala
2012-12-12 16:15 ` [PATCH 06/81] drm: Allow signed values for range properties ville.syrjala
2012-12-12 16:15 ` [PATCH 07/81] drm: Allow drm_mode_object_find() to look up an object of any type ville.syrjala
2012-12-12 16:15 ` [PATCH 08/81] drm: Export drm_encoder_crtc_ok ville.syrjala
2012-12-12 16:15 ` [PATCH 09/81] drm: Export drm_crtc_prepare_encoders() ville.syrjala
2012-12-12 16:15 ` [PATCH 10/81] drm: Refactor object property check code ville.syrjala
2012-12-12 16:15 ` [PATCH 11/81] drm: Export mode<->umode conversion functions ville.syrjala
2012-12-12 16:15 ` [PATCH 12/81] drm: Make blobs resizeable ville.syrjala
2012-12-12 16:15 ` [PATCH 13/81] drm: Add drm_flip helper ville.syrjala
2012-12-12 16:15 ` [PATCH 14/81] drm: Add mode_blob and connector_ids_blob to drm_crtc ville.syrjala
2012-12-12 16:15 ` ville.syrjala [this message]
2012-12-12 16:15 ` [PATCH 16/81] drm/i915: Use drm_format_plane_cpp() rather than bits_per_pixel/8 ville.syrjala
2012-12-12 16:15 ` [PATCH 17/81] drm/i915: Implement proper clipping for video sprites ville.syrjala
2012-12-12 16:15 ` [PATCH 18/81] drm/i915: Implement restore_fbdev_mode hook ville.syrjala
2012-12-12 16:15 ` [PATCH 19/81] drm/i915: Split clipping and checking from update_plane hook ville.syrjala
2012-12-12 16:15 ` [PATCH 20/81] drm/i915: Factor out i9xx_compute_clocks() like ironlake_compute_clocks() ville.syrjala
2012-12-12 16:15 ` [PATCH 21/81] drm/i915: Consitify adjusted_mode parameter ville.syrjala
2012-12-12 16:15 ` [PATCH 22/81] drm/i915: Add intel_check_clock() ville.syrjala
2012-12-12 16:15 ` [PATCH 23/81] drm/i915: store cursor_handle in struct intel_crtc ville.syrjala
2012-12-12 16:15 ` [PATCH 24/81] drm/i915: split cursor setting code into prepare/commit/unref parts ville.syrjala
2012-12-12 16:15 ` [PATCH 25/81] drm/i915: unstatic cursor functions for use with atomic modesetting ville.syrjala
2012-12-12 16:15 ` [PATCH 26/81] drm/i915: Unstatic intel_finish_fb() ville.syrjala
2012-12-12 16:15 ` [PATCH 27/81] drm/i915: Pull intel_pipe_set_base() out of the crtc_mode_set() functions ville.syrjala
2012-12-12 16:15 ` [PATCH 28/81] drm/i915: Unstatic intel_crtc_update_sarea() ville.syrjala
2012-12-12 16:15 ` [PATCH 29/81] drm/i915: Unstatic intel_crtc_update_sarea_pos() ville.syrjala
2012-12-12 16:15 ` [PATCH 30/81] drm/i915: Constify mode argument to intel_modeset_adjusted_mode() ville.syrjala
2012-12-12 16:15 ` [PATCH 31/81] drm/i915: Unstatic intel_crtc_mode_fixup() ville.syrjala
2012-12-12 16:15 ` [PATCH 32/81] drm/i915: Introduce intel_plane_regs ville.syrjala
2012-12-12 16:16 ` [PATCH 33/81] drm/i915: Split primary plane update_plane() into calc+commit phases ville.syrjala
2012-12-12 16:16 ` [PATCH 34/81] drm/i915: Split sprite " ville.syrjala
2012-12-12 16:16 ` [PATCH 35/81] drm/i915: Implement atomic modesetting ville.syrjala
2012-12-12 16:16 ` [PATCH 36/81] drm/i915: Add support for atomic modesetting completion events ville.syrjala
2012-12-12 16:16 ` [PATCH 37/81] drm/i915: Add atomic page flip support ville.syrjala
2012-12-12 16:16 ` [PATCH 38/81] drm/i915: Unstatic intel_enable_primary() and intel_disable_primary() ville.syrjala
2012-12-12 16:16 ` [PATCH 39/81] drm/i915: Respect primary_disabled in crtc_enable() ville.syrjala
2012-12-12 16:16 ` [PATCH 40/81] drm/i915: Enable/disable primary plane in calc_plane() ville.syrjala
2012-12-12 16:16 ` [PATCH 41/81] drm/i915: Add primary plane disable logic to atomic mode setting code ville.syrjala
2012-12-12 16:16 ` [PATCH 42/81] drm: Add missing EXPORT_SYMBOL()s for drm_flip ville.syrjala
2012-12-12 16:16 ` [PATCH 43/81] drm/i915: Clear flip helpers for sprites too ville.syrjala
2012-12-12 16:16 ` [PATCH 44/81] drm/i915: Refactor property handling in atomic code ville.syrjala
2012-12-12 16:16 ` [PATCH 45/81] drm/i915: Move standard properties under mode_config ville.syrjala
2012-12-12 16:16 ` [PATCH 46/81] drm_crtc_helper: Update standard crtc properties after modeset ville.syrjala
2012-12-12 16:16 ` [PATCH 47/81] drm: Update standard plane properties after update_plane/disable_plane ville.syrjala
2012-12-12 16:16 ` [PATCH 48/81] drm/i915: Update CRTC properties after modeset ville.syrjala
2012-12-12 16:16 ` [PATCH 49/81] drm: Move standard crtc/plane prop handling to drm_crtc.c ville.syrjala
2012-12-12 16:16 ` [PATCH 50/81] drm/i915: Use intel_best_encoder() directly ville.syrjala
2012-12-12 16:16 ` [PATCH 51/81] drm/i915: Unstatic intel_modeset_update_staged_output_state() ville.syrjala
2012-12-12 16:16 ` [PATCH 52/81] drm/i915: Update new_crtc and new_encoder fields after atomic modeset ville.syrjala
2012-12-12 16:16 ` [PATCH 53/81] drm/i915: Update connector DPMS state after an " ville.syrjala
2012-12-12 16:16 ` [PATCH 54/81] drm/i915: Kill the pending_flip counter manipulations ville.syrjala
2012-12-12 16:16 ` [PATCH 55/81] drm/i915: Don't mark cursor as pinned, when we don't have a cursor bo ville.syrjala
2012-12-12 16:16 ` [PATCH 56/81] drm/i915: Fix sprite_scaling_enabled for multiple sprites ville.syrjala
2012-12-12 16:16 ` [PATCH 57/81] drm/i915: Fix hiding the cursor with atomic ioctl ville.syrjala
2012-12-12 16:16 ` [PATCH 58/81] drm/i915: Fix plane src rectangle dirty check ville.syrjala
2012-12-12 16:16 ` [PATCH 59/81] drm/i915: Send atomic completion events even if nothing changed ville.syrjala
2012-12-12 16:16 ` [PATCH 60/81] drm/i915: Unpin old fbs only when appropriate ville.syrjala
2012-12-12 16:16 ` [PATCH 61/81] drm/i915: Remove stale prototypes form atomic code ville.syrjala
2012-12-12 16:16 ` [PATCH 62/81] drm/i915: Unstatic i915_gem_check_olr() ville.syrjala
2012-12-12 16:16 ` [PATCH 63/81] drm/i915: Refactor atomic flip code ville.syrjala
2012-12-12 16:16 ` [PATCH 64/81] drm/i915: Implement a non-blocking GPU synchronization mechanism for atomic page flips ville.syrjala
2012-12-12 16:16 ` [PATCH 65/81] drm/i915: Release all atomic flips when GPU hangs ville.syrjala
2012-12-12 16:16 ` [PATCH 66/81] drm/i915: Make a copy of the calculated plane regs ville.syrjala
2012-12-12 16:16 ` [PATCH 67/81] drm/i915: Clear pending flips in haswell_crtc_disable() ville.syrjala
2012-12-12 16:16 ` [PATCH 68/81] drm/i915: Drop all flips waiting for the GPU when the CRTC is about to be disabled ville.syrjala
2012-12-12 16:16 ` [PATCH 69/81] drm/i915: Refactor flip preaparation ville.syrjala
2012-12-12 16:16 ` [PATCH 70/81] drm/i915: Unstatic intel_modeset_commit_output_state() ville.syrjala
2012-12-12 16:16 ` [PATCH 71/81] drm/i915: Eliminate swap_old_new() hack in the atomic code ville.syrjala
2012-12-12 16:16 ` [PATCH 72/81] drm: Drop old_crtc and old_encoder pointers ville.syrjala
2012-12-12 16:16 ` [PATCH 73/81] drm/i915: Use new_crtc when checking if CRTC is in use ville.syrjala
2012-12-12 16:16 ` [PATCH 74/81] drm/i915: Add some TODO items to the atomic code ville.syrjala
2012-12-12 16:16 ` [PATCH 75/81] drm/i915: Drop some stale FIXMEs from " ville.syrjala
2012-12-12 16:16 ` [PATCH 76/81] drm/i915: Add pin count trace point ville.syrjala
2012-12-12 16:16 ` [PATCH 77/81] drm/i915: Add trace points for flip queue length ville.syrjala
2012-12-12 16:16 ` [PATCH 78/81] HACK: drm/i915: Make non-blocking GPU synchronization optional ville.syrjala
2012-12-12 16:16 ` [PATCH 79/81] drm/i915: Add some timing debugs to atomic flips ville.syrjala
2012-12-12 16:16 ` [PATCH 80/81] drm/i915: Add post flush DSL readout for surflive debug ville.syrjala
2012-12-12 16:16 ` [PATCH 81/81] drm/i915: Add trace point for atomic flip vblank evade ville.syrjala
2012-12-13 14:17 ` [PATCH 00/81] drm/i915: Atomic mode setting / page flip, yet again Daniel Vetter
2012-12-13 14:33   ` Ville Syrjälä
2012-12-14 16:28 ` Ville Syrjälä

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1355329008-31459-16-git-send-email-ville.syrjala@linux.intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.