On Fri, Nov 22, 2013 at 3:35 AM, Inki Dae inki.dae@samsung.com wrote:
Hi Rob and Ville,
2013/11/21 Rob Clark robdclark@gmail.com:
From: Ville Syrjälä ville.syrjala@linux.intel.com
The atomic modeset ioctl cna be used to push any number of new values for object properties. The driver can then check the full device configuration as single unit, and try to apply the changes atomically.
The ioctl simply takes a list of object IDs and property IDs and their values. For setting values to blob properties, the property value indicates the length of the data, and the actual data is passed via another blob pointer.
The caller can demand non-blocking operation from the ioctl, and if the driver can't satisfy that requirement an error will be returned.
The caller can also request to receive asynchronous completion events after the operation has reached the hardware. An event is sent for each object specified by the caller, whether or not the actual state of that object changed. Each event also carries a framebuffer ID, which indicates to user space that the specified object is no longer accessing that framebuffer.
TODO: detailed error reporting?
v1: original v2: rebase on uapi changes, and drm state structs.. -- Rob Clark v3: rebase, missing padding in drm_event_atomic.. -- Rob Clark v4: drop atomic event, align flags w/ pageflip (atomic flags should be a strick superset of pageflip flags to keep things easier for the drivers)
Signed-off-by: Ville Syrjälä ville.syrjala@linux.intel.com
drivers/gpu/drm/drm_crtc.c | 157 +++++++++++++++++++++++++++++++++++++++++++- drivers/gpu/drm/drm_drv.c | 1 + include/drm/drmP.h | 6 ++ include/drm/drm_crtc.h | 2 + include/uapi/drm/drm.h | 12 ++++ include/uapi/drm/drm_mode.h | 21 ++++++ 6 files changed, 198 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 4b40a39..8368ef5 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -4037,7 +4037,8 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, return -ENOENT; crtc = obj_to_crtc(obj);
state = dev->driver->atomic_begin(dev, page_flip->flags);
state = dev->driver->atomic_begin(dev,
page_flip->flags | DRM_MODE_ATOMIC_NONBLOCK); if (IS_ERR(state)) return PTR_ERR(state);
@@ -4451,3 +4452,157 @@ void drm_mode_config_cleanup(struct drm_device *dev) idr_destroy(&dev->mode_config.crtc_idr); } EXPORT_SYMBOL(drm_mode_config_cleanup);
+int drm_mode_atomic_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv)
+{
Build error at this function like below,
drivers/built-in.o: In function `drm_mode_atomic_ioctl': of_iommu.c:(.text+0x6d854): undefined reference to `__get_user_bad' of_iommu.c:(.text+0x6d940): undefined reference to `__get_user_bad'
And built correctly with the below change,
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index 9b06bb4..0f4f469 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S @@ -66,7 +66,7 @@ ENTRY(__get_user_4) mov pc, lr ENDPROC(__get_user_4) -__get_user_bad: +ENTRY(__get_user_bad) mov r2, #0 mov r0, #-EFAULT mov pc, lr
I guess __get_user_bad is not global but drm_mode_atomic_ioctl function tries to refer this function as extern.
no, actually __get_user_bad is (I think) supposed to be a build error.
You need this patch:
http://cgit.freedesktop.org/~robclark/linux/commit/?h=global-thermonuclear-w...
(Or I think Russell King had a slightly updated version of that.. I need to work out with him about getting some version of that patch merged.)
BR, -R
Is it build error only I can see?
Thanks, Inki Dae