From patchwork Thu Mar 6 06:12:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rahul Sharma X-Patchwork-Id: 3785381 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 38A93BF549 for ; Thu, 6 Mar 2014 17:03:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2FA732024C for ; Thu, 6 Mar 2014 17:03:14 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 5EDE220160 for ; Thu, 6 Mar 2014 17:03:08 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D3EDA1057D0; Thu, 6 Mar 2014 09:03:02 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by gabe.freedesktop.org (Postfix) with ESMTP id F2A50FAB4E for ; Wed, 5 Mar 2014 22:13:02 -0800 (PST) Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N2000LGS3XP88C0@mailout1.samsung.com> for dri-devel@lists.freedesktop.org; Thu, 06 Mar 2014 15:13:01 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.124]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id B3.18.14803.DE118135; Thu, 06 Mar 2014 15:13:01 +0900 (KST) X-AuditID: cbfee691-b7efc6d0000039d3-f1-531811ed687d Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id BF.3E.28157.DE118135; Thu, 06 Mar 2014 15:13:01 +0900 (KST) Received: from localhost.localdomain ([107.108.83.245]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N2000AL63X9JW40@mmp1.samsung.com>; Thu, 06 Mar 2014 15:13:01 +0900 (KST) From: Rahul Sharma To: dri-devel@lists.freedesktop.org Subject: [RFC 2/4] drm: add ioctl to write into binary blob KMS properties Date: Thu, 06 Mar 2014 11:42:12 +0530 Message-id: <1394086334-20967-3-git-send-email-rahul.sharma@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1394086334-20967-1-git-send-email-rahul.sharma@samsung.com> References: <1394086334-20967-1-git-send-email-rahul.sharma@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupjkeLIzCtJLcpLzFFi42JZI2JSo/tWUCLY4Nc+fYsT1xcxWRx4f5DF 4srX92wWk+5PYLH4vusLu8WM8/uYLOYd+s1oserwBnaLjRO2MlpMWXSY1eLuhrOMDtwesxsu snjsnHWX3WPBplKP+93HmTz6tqxi9Pi8SS6ALYrLJiU1J7MstUjfLoEro/vIffaCyzoVs7cu Y2pgXK/axcjJISFgItG1fRUThC0mceHeerYuRi4OIYGljBJfbq1lhyk6uHcdK0RiEaPEqYv7 mSCcdiaJp/8+glWxCehKzD74jBHEFhFQlvg7cRUjSBGzQBuTxO7eXrAdwgJeEh92bgOzWQRU JZ7uXAy0j4ODV8BDoqvFBMSUEFCQmDPJBqSCU8BTovvPRLBqIaCKuf3rwfZKCBxil5j94RQz xBgBiW+TD7FA9MpKbDrADHG0pMTBFTdYJjAKL2BkWMUomlqQXFCclF5kqlecmFtcmpeul5yf u4kRGBen/z2buIPx/gHrQ4zJQOMmMkuJJucD4yqvJN7Q2MzIwtTE1NjI3NKMNGElcd70R0lB QgLpiSWp2ampBalF8UWlOanFhxiZODilGhhPntoYkCMe63VL1SmdSUP9+s5pylOi5e6wBFnG TplY2uFptfweq8GlM5vSVp6fsLA4voNr+/+9OjcE+H4bhL0Rfrgw/rrUk38vF2grlW++2SZV Ir96BfsKRpf1JfEva7Ql0uJyrW5Ep+teWbRZeXvaP9HHZv96lnyZ+c1y7q+Z1U/mJdx4HGej xFKckWioxVxUnAgAM4ouf6ECAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsVy+t9jAd23ghLBBqva1CxOXF/EZHHg/UEW iytf37NZTLo/gcXi+64v7BYzzu9jsph36DejxarDG9gtNk7YymgxZdFhVou7G84yOnB7zG64 yOKxc9Zddo8Fm0o97ncfZ/Lo27KK0ePzJrkAtqgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4 UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoPuUFMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqG BMH1GBmggYQ1jBndR+6zF1zWqZi9dRlTA+N61S5GTg4JAROJg3vXsULYYhIX7q1n62Lk4hAS WMQocerifiYIp51J4um/j+wgVWwCuhKzDz5jBLFFBJQl/k5cxQhSxCzQxiSxu7eXCSQhLOAl 8WHnNjCbRUBV4unOxUBjOTh4BTwkulpMQEwJAQWJOZNsQCo4BTwluv9MBKsWAqqY27+eaQIj 7wJGhlWMoqkFyQXFSem5RnrFibnFpXnpesn5uZsYwVH3THoH46oGi0OMAhyMSjy8G/zEg4VY E8uKK3MPMUpwMCuJ8D58AhTiTUmsrEotyo8vKs1JLT7EmAx000RmKdHkfGBCyCuJNzQ2MTc1 NrU0sTAxsyRNWEmc92CrdaCQQHpiSWp2ampBahHMFiYOTqkGxmzWaar9EzeHdUvaJ6bbnVP4 G8E6cV3A3Dvp61t2H45j1Hmm2HhAMzWMeW7TJwa99PnHRS58PLQ8YnWohLSx2Ty7UhW9hV53 GWR5u7eYHjuhUVkYvuR25uP/vy34FxgnR7FV/cxlXLN8U0raKX6NH9f7NYK9e2qMe78Zbzj/ jPP4h4+qncVzlViKMxINtZiLihMB+Bpf2/4CAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Mailman-Approved-At: Thu, 06 Mar 2014 09:03:00 -0800 Cc: linux-samsung-soc@vger.kernel.org, joshi@samsung.com, r.sh.open@google.com, marcheu@chromium.org, prashanth.g@samsung.com, ajaykumar.rs@samsung.com, Rahul Sharma X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add a new ioctl to common drm framework which can be used to set variable length binary data from the user space. 'Blob' is the only KMS property which can hold more than 64 bits. So far, it has been implemented as read only property for user application (only used for EDID data). Signed-off-by: Rahul Sharma --- drivers/gpu/drm/drm_crtc.c | 73 ++++++++++++++++++++++++++++++++++++++++++- drivers/gpu/drm/drm_drv.c | 1 + include/drm/drm_crtc.h | 2 ++ include/uapi/drm/drm.h | 1 + include/uapi/drm/drm_mode.h | 8 +++++ 5 files changed, 84 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 9a2215c..a2b87a5 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -3300,7 +3300,6 @@ static bool drm_property_change_is_valid(struct drm_property *property, valid_mask |= (1ULL << property->values[i]); return !(value & ~valid_mask); } else if (property->flags & DRM_MODE_PROP_BLOB) { - /* Only the driver knows */ return true; } else { int i; @@ -3492,6 +3491,78 @@ out: return ret; } +int drm_mode_setblob_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_object *arg_obj; + struct drm_mode_object *blob_obj; + struct drm_mode_object *prop_obj; + struct drm_property *property; + struct drm_mode_set_blob *arg = data; + struct drm_property_blob *blob; + int ret = -EINVAL, i; + void __user *blob_ptr; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + drm_modeset_lock_all(dev); + + blob_obj = drm_mode_object_find(dev, arg->blob_id, DRM_MODE_OBJECT_BLOB); + if (!blob_obj) + goto done; + + blob = obj_to_blob(blob_obj); + + arg_obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type); + if (!arg_obj) + goto done; + + if (!arg_obj->properties) + goto done; + + for (i = 0; i < arg_obj->properties->count; i++) + if (arg_obj->properties->values[i] == arg->blob_id) + break; + + if (i == arg_obj->properties->count) + goto done; + + prop_obj = drm_mode_object_find(dev, arg_obj->properties->ids[i], + DRM_MODE_OBJECT_PROPERTY); + if (!prop_obj) + goto done; + property = obj_to_property(prop_obj); + + if (!drm_property_change_is_valid(property, arg->blob_id)) + goto done; + + if (arg->length == blob->length) { + blob_ptr = (void __user *)(unsigned long)arg->data; + if (copy_from_user(blob->data, blob_ptr, blob->length)) { + ret = -EFAULT; + goto done; + } + } + + switch (arg_obj->type) { + case DRM_MODE_OBJECT_CONNECTOR: + ret = drm_mode_connector_set_obj_prop(arg_obj, property, + arg->blob_id); + break; + case DRM_MODE_OBJECT_CRTC: + ret = drm_mode_crtc_set_obj_prop(arg_obj, property, arg->blob_id); + break; + case DRM_MODE_OBJECT_PLANE: + ret = drm_mode_plane_set_obj_prop(arg_obj, property, arg->blob_id); + break; + } + +done: + drm_modeset_unlock_all(dev); + return ret; +} + int drm_mode_connector_attach_encoder(struct drm_connector *connector, struct drm_encoder *encoder) { diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 345be03..7cdb501 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -167,6 +167,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = { 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_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPBLOB, drm_mode_setblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), }; #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index f764654..82f2016 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1124,6 +1124,8 @@ extern int drm_mode_getproperty_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); extern int drm_mode_getblob_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int drm_mode_setblob_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); extern int drm_mode_getencoder(struct drm_device *dev, diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index b06c8ed..d91139b 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -760,6 +760,7 @@ struct drm_prime_handle { #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_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2) +#define DRM_IOCTL_MODE_SETPROPBLOB DRM_IOWR(0xBC, struct drm_mode_set_blob) /** * Device specific ioctls should only be in their respective headers diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index f104c26..1d8216d 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -295,6 +295,14 @@ struct drm_mode_get_blob { __u64 data; }; +struct drm_mode_set_blob { + __u32 blob_id; + __u32 obj_id; + __u32 obj_type; + __u32 length; + __u64 data; +}; + struct drm_mode_fb_cmd { __u32 fb_id; __u32 width, height;