From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751927AbdBOQTZ (ORCPT ); Wed, 15 Feb 2017 11:19:25 -0500 Received: from mail.free-electrons.com ([62.4.15.54]:46353 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751525AbdBOQTP (ORCPT ); Wed, 15 Feb 2017 11:19:15 -0500 From: Maxime Ripard To: Daniel Vetter , David Airlie , Sean Paul , Jani Nikula Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Stefan Christ , Boris Brezillon , Maxime Ripard Subject: [PATCH v3 2/2] drm/fb-helper: implement ioctl FBIO_WAITFORVSYNC Date: Wed, 15 Feb 2017 17:19:09 +0100 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Stefan Christ Implement legacy framebuffer ioctl FBIO_WAITFORVSYNC in the generic framebuffer emulation driver. Legacy framebuffer users like non kms/drm based OpenGL(ES)/EGL implementations may require the ioctl to synchronize drawing or buffer flip for double buffering. It is tested on the i.MX6. Code is based on https://github.com/Xilinx/linux-xlnx/blob/master/drivers/gpu/drm/xilinx/xilinx_drm_fb.c#L196 Signed-off-by: Stefan Christ Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_fb_helper.c | 63 ++++++++++++++++++++++++++++++++++- include/drm/drm_fb_helper.h | 12 +++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index c6de87abaca8..15ee9641c725 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1240,6 +1240,69 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) EXPORT_SYMBOL(drm_fb_helper_setcmap); /** + * drm_fb_helper_ioctl - legacy ioctl implementation + * @info: fbdev registered by the helper + * @cmd: ioctl command + * @arg: ioctl argument + * + * A helper to implement the standard fbdev ioctl. Only + * FBIO_WAITFORVSYNC is implemented for now. + */ +int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd, + unsigned long arg) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_device *dev = fb_helper->dev; + struct drm_mode_set *mode_set; + struct drm_crtc *crtc; + u32 karg; + int ret = 0; + + mutex_lock(&dev->mode_config.mutex); + if (!drm_fb_helper_is_bound(fb_helper)) { + ret = -EBUSY; + goto unlock; + } + + switch (cmd) { + case FBIO_WAITFORVSYNC: + if (get_user(karg, (__u32 __user *)arg)) { + ret = -EFAULT; + goto unlock; + } + + if (karg >= fb_helper->crtc_count) { + ret = -EINVAL; + goto unlock; + } + + mode_set = &fb_helper->crtc_info[karg].mode_set; + crtc = mode_set->crtc; + + /* + * Only wait for a vblank event if the CRTC is + * enabled, otherwise just don't do anythintg, + * not even report an error. + */ + ret = drm_crtc_vblank_get(crtc); + if (!ret) { + drm_crtc_wait_one_vblank(crtc); + drm_crtc_vblank_put(crtc); + } + + ret = 0; + goto unlock; + default: + ret = -ENOTTY; + } + +unlock: + mutex_unlock(&dev->mode_config.mutex); + return ret; +} +EXPORT_SYMBOL(drm_fb_helper_ioctl); + +/** * drm_fb_helper_check_var - implementation for ->fb_check_var * @var: screeninfo to check * @info: fbdev registered by the helper diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index 975deedd593e..2891888c6e41 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -230,7 +230,8 @@ struct drm_fb_helper { .fb_blank = drm_fb_helper_blank, \ .fb_pan_display = drm_fb_helper_pan_display, \ .fb_debug_enter = drm_fb_helper_debug_enter, \ - .fb_debug_leave = drm_fb_helper_debug_leave + .fb_debug_leave = drm_fb_helper_debug_leave, \ + .fb_ioctl = drm_fb_helper_ioctl #ifdef CONFIG_DRM_FBDEV_EMULATION void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, @@ -286,6 +287,9 @@ void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper, int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); +int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd, + unsigned long arg); + int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); @@ -377,6 +381,12 @@ static inline int drm_fb_helper_setcmap(struct fb_cmap *cmap, return 0; } +static inline int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd, + unsigned long arg) +{ + return 0; +} + static inline void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper) { } -- git-series 0.8.11 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxime Ripard Subject: [PATCH v3 2/2] drm/fb-helper: implement ioctl FBIO_WAITFORVSYNC Date: Wed, 15 Feb 2017 17:19:09 +0100 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail.free-electrons.com (mail.free-electrons.com [62.4.15.54]) by gabe.freedesktop.org (Postfix) with ESMTP id B8D196E97B for ; Wed, 15 Feb 2017 16:19:14 +0000 (UTC) In-Reply-To: In-Reply-To: References: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter , David Airlie , Sean Paul , Jani Nikula Cc: Maxime Ripard , Stefan Christ , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org RnJvbTogU3RlZmFuIENocmlzdCA8cy5jaHJpc3RAcGh5dGVjLmRlPgoKSW1wbGVtZW50IGxlZ2Fj eSBmcmFtZWJ1ZmZlciBpb2N0bCBGQklPX1dBSVRGT1JWU1lOQyBpbiB0aGUgZ2VuZXJpYwpmcmFt ZWJ1ZmZlciBlbXVsYXRpb24gZHJpdmVyLiBMZWdhY3kgZnJhbWVidWZmZXIgdXNlcnMgbGlrZSBu b24ga21zL2RybQpiYXNlZCBPcGVuR0woRVMpL0VHTCBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlcXVp cmUgdGhlIGlvY3RsIHRvCnN5bmNocm9uaXplIGRyYXdpbmcgb3IgYnVmZmVyIGZsaXAgZm9yIGRv dWJsZSBidWZmZXJpbmcuIEl0IGlzIHRlc3RlZCBvbgp0aGUgaS5NWDYuCgpDb2RlIGlzIGJhc2Vk IG9uCiAgICBodHRwczovL2dpdGh1Yi5jb20vWGlsaW54L2xpbnV4LXhsbngvYmxvYi9tYXN0ZXIv ZHJpdmVycy9ncHUvZHJtL3hpbGlueC94aWxpbnhfZHJtX2ZiLmMjTDE5NgoKU2lnbmVkLW9mZi1i eTogU3RlZmFuIENocmlzdCA8cy5jaHJpc3RAcGh5dGVjLmRlPgpTaWduZWQtb2ZmLWJ5OiBNYXhp bWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KLS0tCiBkcml2ZXJz L2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jIHwgNjMgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKy0KIGluY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaCAgICAgfCAxMiArKysrKy0KIDIg ZmlsZXMgY2hhbmdlZCwgNzQgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJt X2ZiX2hlbHBlci5jCmluZGV4IGM2ZGU4N2FiYWNhOC4uMTVlZTk2NDFjNzI1IDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9k cm1fZmJfaGVscGVyLmMKQEAgLTEyNDAsNiArMTI0MCw2OSBAQCBpbnQgZHJtX2ZiX2hlbHBlcl9z ZXRjbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIEVYUE9S VF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9zZXRjbWFwKTsKIAogLyoqCisgKiBkcm1fZmJfaGVscGVy X2lvY3RsIC0gbGVnYWN5IGlvY3RsIGltcGxlbWVudGF0aW9uCisgKiBAaW5mbzogZmJkZXYgcmVn aXN0ZXJlZCBieSB0aGUgaGVscGVyCisgKiBAY21kOiBpb2N0bCBjb21tYW5kCisgKiBAYXJnOiBp b2N0bCBhcmd1bWVudAorICoKKyAqIEEgaGVscGVyIHRvIGltcGxlbWVudCB0aGUgc3RhbmRhcmQg ZmJkZXYgaW9jdGwuIE9ubHkKKyAqIEZCSU9fV0FJVEZPUlZTWU5DIGlzIGltcGxlbWVudGVkIGZv ciBub3cuCisgKi8KK2ludCBkcm1fZmJfaGVscGVyX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZv LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRy bV9mYl9oZWxwZXIgKmZiX2hlbHBlciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2ID0gZmJfaGVscGVyLT5kZXY7CisJc3RydWN0IGRybV9tb2RlX3NldCAqbW9kZV9zZXQ7CisJ c3RydWN0IGRybV9jcnRjICpjcnRjOworCXUzMiBrYXJnOworCWludCByZXQgPSAwOworCisJbXV0 ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJaWYgKCFkcm1fZmJfaGVscGVyX2lz X2JvdW5kKGZiX2hlbHBlcikpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHVubG9jazsKKwl9 CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRkJJT19XQUlURk9SVlNZTkM6CisJCWlmIChnZXRf dXNlcihrYXJnLCAoX191MzIgX191c2VyICopYXJnKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJ CWdvdG8gdW5sb2NrOworCQl9CisKKwkJaWYgKGthcmcgPj0gZmJfaGVscGVyLT5jcnRjX2NvdW50 KSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQltb2RlX3Nl dCA9ICZmYl9oZWxwZXItPmNydGNfaW5mb1trYXJnXS5tb2RlX3NldDsKKwkJY3J0YyA9IG1vZGVf c2V0LT5jcnRjOworCisJCS8qCisJCSAqIE9ubHkgd2FpdCBmb3IgYSB2YmxhbmsgZXZlbnQgaWYg dGhlIENSVEMgaXMKKwkJICogZW5hYmxlZCwgb3RoZXJ3aXNlIGp1c3QgZG9uJ3QgZG8gYW55dGhp bnRnLAorCQkgKiBub3QgZXZlbiByZXBvcnQgYW4gZXJyb3IuCisJCSAqLworCQlyZXQgPSBkcm1f Y3J0Y192YmxhbmtfZ2V0KGNydGMpOworCQlpZiAoIXJldCkgeworCQkJZHJtX2NydGNfd2FpdF9v bmVfdmJsYW5rKGNydGMpOworCQkJZHJtX2NydGNfdmJsYW5rX3B1dChjcnRjKTsKKwkJfQorCisJ CXJldCA9IDA7CisJCWdvdG8gdW5sb2NrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJ fQorCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwly ZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX2lvY3RsKTsKKworLyoq CiAgKiBkcm1fZmJfaGVscGVyX2NoZWNrX3ZhciAtIGltcGxlbWVudGF0aW9uIGZvciAtPmZiX2No ZWNrX3ZhcgogICogQHZhcjogc2NyZWVuaW5mbyB0byBjaGVjawogICogQGluZm86IGZiZGV2IHJl Z2lzdGVyZWQgYnkgdGhlIGhlbHBlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZiX2hl bHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCmluZGV4IDk3NWRlZWRkNTkzZS4u Mjg5MTg4OGM2ZTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKKysr IGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCkBAIC0yMzAsNyArMjMwLDggQEAgc3RydWN0 IGRybV9mYl9oZWxwZXIgewogCS5mYl9ibGFuawk9IGRybV9mYl9oZWxwZXJfYmxhbmssIFwKIAku ZmJfcGFuX2Rpc3BsYXkJPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LCBcCiAJLmZiX2RlYnVn X2VudGVyID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19lbnRlciwgXAotCS5mYl9kZWJ1Z19sZWF2ZSA9 IGRybV9mYl9oZWxwZXJfZGVidWdfbGVhdmUKKwkuZmJfZGVidWdfbGVhdmUgPSBkcm1fZmJfaGVs cGVyX2RlYnVnX2xlYXZlLCBcCisJLmZiX2lvY3RsCT0gZHJtX2ZiX2hlbHBlcl9pb2N0bAogCiAj aWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIHZvaWQgZHJtX2ZiX2hlbHBlcl9wcmVw YXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIs CkBAIC0yODYsNiArMjg3LDkgQEAgdm9pZCBkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kX3VubG9j a2VkKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAKIGludCBkcm1fZmJfaGVscGVy X3NldGNtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAor aW50IGRybV9mYl9oZWxwZXJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGlu dCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZyk7CisKIGludCBkcm1fZmJfaGVscGVyX2hvdHBs dWdfZXZlbnQoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcik7CiBpbnQgZHJtX2ZiX2hl bHBlcl9pbml0aWFsX2NvbmZpZyhzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyLCBpbnQg YnBwX3NlbCk7CiBpbnQgZHJtX2ZiX2hlbHBlcl9zaW5nbGVfYWRkX2FsbF9jb25uZWN0b3JzKHN0 cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpOwpAQCAtMzc3LDYgKzM4MSwxMiBAQCBzdGF0 aWMgaW5saW5lIGludCBkcm1fZmJfaGVscGVyX3NldGNtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAs CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGRybV9mYl9oZWxwZXJfaW9jdGwo c3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICAgdW5zaWdu ZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBkcm1f ZmJfaGVscGVyX3VubGlua19mYmkoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcikKIHsK IH0KLS0gCmdpdC1zZXJpZXMgMC44LjExCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=