From patchwork Wed Sep 12 09:48:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chunming Zhou X-Patchwork-Id: 10597235 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 142C0920 for ; Wed, 12 Sep 2018 09:49:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 02F8F296EE for ; Wed, 12 Sep 2018 09:49:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EBA01296F4; Wed, 12 Sep 2018 09:49:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5A2AD296EE for ; Wed, 12 Sep 2018 09:49:43 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5EB536E4F4; Wed, 12 Sep 2018 09:49:40 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0085.outbound.protection.outlook.com [104.47.33.85]) by gabe.freedesktop.org (Postfix) with ESMTPS id 492096E4F4; Wed, 12 Sep 2018 09:49:39 +0000 (UTC) Received: from DM3PR12CA0109.namprd12.prod.outlook.com (2603:10b6:0:55::29) by BY1PR12MB0424.namprd12.prod.outlook.com (2a01:111:e400:51b2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1122.17; Wed, 12 Sep 2018 09:49:36 +0000 Received: from DM3NAM03FT009.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e49::202) by DM3PR12CA0109.outlook.office365.com (2603:10b6:0:55::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1122.16 via Frontend Transport; Wed, 12 Sep 2018 09:49:36 +0000 Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV01.amd.com (165.204.84.17) by DM3NAM03FT009.mail.protection.outlook.com (10.152.82.114) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.1143.11 via Frontend Transport; Wed, 12 Sep 2018 09:49:36 +0000 Received: from zhoucm1.amd.com (10.34.1.3) by SATLEXCHOV01.amd.com (10.181.40.71) with Microsoft SMTP Server id 14.3.389.1; Wed, 12 Sep 2018 04:49:33 -0500 From: Chunming Zhou To: Subject: [PATCH 6/9] drm: add support of syncobj timeline point wait v2 Date: Wed, 12 Sep 2018 17:48:48 +0800 Message-ID: <20180912094851.824-6-david1.zhou@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180912094851.824-1-david1.zhou@amd.com> References: <20180912094851.824-1-david1.zhou@amd.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:165.204.84.17; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39860400002)(396003)(136003)(346002)(376002)(2980300002)(428003)(189003)(199004)(97736004)(356003)(486006)(8676002)(16586007)(6666003)(6916009)(5660300001)(476003)(54906003)(81166006)(81156014)(126002)(86362001)(186003)(316002)(77096007)(26005)(36756003)(4326008)(450100002)(14444005)(336012)(50466002)(105586002)(48376002)(478600001)(47776003)(8936002)(104016004)(76176011)(53416004)(446003)(7696005)(2351001)(51416003)(2616005)(11346002)(106466001)(50226002)(1076002)(68736007)(426003)(72206003)(305945005)(2906002)(53936002); DIR:OUT; SFP:1101; SCL:1; SRVR:BY1PR12MB0424; H:SATLEXCHOV01.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; DM3NAM03FT009; 1:qULJttMpMYHA57vfrSlghvVuzqavFL0kTMYY6KrWH06jdnq70/tE7xwH9pFiOtEC/s5axpsgQJ/MAwY3+HkxybJ3ect8lp23NJ7uriHFHZ4Fb9xwl+5GwIJ3FwEFs60N X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 166d05a1-a85e-4582-c7f7-08d618950cdc X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(2017052603328)(7153060); SRVR:BY1PR12MB0424; X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0424; 3:WLSM9k6SGCu3vuq3rY2VMBWKJGNbCd7hbeaDH3WFeiE0PXwuqRUSMK0RhbYLwrwAHdQjK0Qdq5qJt/mqdCSmF78/ufyKvJ1HrapQBFb/rY3iGMbBfDzUC2MM+0DT18V02hy973Tyw3vVzFwOWOGfywRvzZ2GGz/HyadqVVcEGjhCthe2Va3zJTasaoJDr7dTTG4P+zFw0VSoR+JlEQ1pPLbuufAcWY5O+a7H8hLdGQX/DMuAsn4wkTuecitHur2kw/gdyEhenPQfeSiWHvYVaoffjuw831G+WnyQzJ62I/5MdK/Su6ohfdmUlY5Tkgk/VhyLoeK4cZSgzXGeziIffiCjF+KVgW4zz0VH79AeIQA=; 25:IbvFWZsiVPNb98RE1JIJtEy9+3yOknyzgM/BEusv7mV5wJloZl5WQCwZkoDfVf+eW222ydhDOogIAXTQZjMFBoQAbLDWtrlxapMwD43XQNLo3OmMpu7kcvOVzjRTWgSQvcXiCqBxOsa54R+01Xf3AUyuKJtPv0zeEF1m2ixpnwnJgCM0S6HX0jpTH/KiiRDv4TQ67jbDOygQqOFB4miVT+ouC/+j1xYqcX3zR16lPKQ6nCN/uVwCny82851XbNk1Bps9S2+WUZAGJ8t3sHfW0CqWNRpB7/vZ5vbQ+k72Pr2/7B0/BhEc1iCYwRR+G6ecR1AnL5rQeDESmzlolSz+2w== X-MS-TrafficTypeDiagnostic: BY1PR12MB0424: X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0424; 31:sQDYkKILox68VbdaPnlNhMwEWc/+R5i1xCYQ3oT9eC88EenWtbjUOHioVFhZzijxVFN8L7Mc0hAOJjBrevf8/9dIcsuvSnSycTsZ8jG2ufphULel58Ud+D7W9mriV8Du61shFWrst0q7TMZWROF4kzZ4ZI7RZIbObG3ED/gcYS12+j4XxtBBjNQV1/q+VXIogakebaqNoncVvZRFwUQEHKEVQED1J3gQAlkIehYhyaI=; 20:SBXaS2dnAumRYKfVsDncOFv0rkOeZ+aFIWXfFidfSeW6O4b8GPgNFXZk9MRlrGItUtuu2R/qXXyGX7DMsmDHr9zDwp+lWMv//RX3HYkh0yjfvG8DGg3kxm2f0uBtsW9Ij8sIHMaYNfTB9TZlNF5Y1YE7vdtICVj2s12CMNSetHuaRp68GbXvWzV+uk6qZ60lgORxBrAcRho8Ih1pB2ePF9sFViI5NUAhUHUVIrRCebu7sU/cU3mitumuZjmqEHUZy56zz2cwyBIoeZOwPD79+6/TWWuaiPyqtYecOlUMU3RJjSvTFnbL3NXfRnuf6kdoBkrZ/j+Cr+JiENjIhAyJ1XIdMujktHSJqVVVD1cJ+Li9TiquS4NI7A9Ud6fc71nj8XgvD7NIRKtI12qtz720aw6BaR1lxOVTQAp+mtEMfcMTUbleBwf9gWVC26TrIYyfqu7clL8pIgKVdIjbUcvW+q5C71gDe9Jc6ShKlyrkCaPAza1V+WTfnTpaVDGzrIGk X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(3231311)(944501410)(52105095)(93006095)(93003095)(6055026)(149027)(150027)(6041310)(20161123562045)(20161123564045)(20161123560045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699050); SRVR:BY1PR12MB0424; BCL:0; PCL:0; RULEID:; SRVR:BY1PR12MB0424; X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0424; 4:jZAeAY5Fj4RnOarfPJewaAzhBX48UWOWFSzNDJmwGmfahmwuHZ0eG1csm6iJ5OyLVBRgN3h/9hX8DRuQSn1EmbHkJa7yhEoIneqvylwsW0utvIVO/VEQaLme4k/f164zLRWoaxTQcUveWFsLAfxf1MTSMGyYgtJj07c/zk4Qe3yw+dzeALAzAZCMO0x8IjHiZ6btrmRSibKzRttgQRppWqnkdH7eVOpeKarhHrYGgDanx4Mf4vd37ouSGSReNuytWI1JMhuv2d1/4YpjIs9v50YfM1AzRFjFu7t0DS/8e+yehmVMDbAZeZIpOKYvzyOH X-Forefront-PRVS: 07935ACF08 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR12MB0424; 23:gOuLOA5YqKHfFevDfrypDbKlfvGn1ragr9/NZD8Yc?= U51PBaP8RqV7PLjL0UWnf5uAlClEmjzaO1hYpEicUk8WHjEktCfadQGQI1pamkNp8tQk9Bq8wEs2wssL4AsiuqUCvXFK/HI11QOHdlAuw03uIu/IIJ5QvfVl+t/PhoomTtp0G6T+UxXTwlmeQaUA3GmbpstHoYscfVUdoc3kgze40ywVrl0CMVrSEwmSiz5ji5TnoBKGeKVKe3nAt6e6DCtqgXCa1wNxrk8v8daXwfCVBMLV7orx4dcmwVQ4X5lh+W3YGllduKwc6p2mJZAQcIR7TDkP94GWkAuKMYm2kyazd+1z1GoiRYwWb8yzywZPJZRVId7ZDDGwSeAzDTq0f3/3WRy+L3S/p4HxSSCgBmHh3359tfIEj6NP7KB4+WCtczhD+3WX7R6/pZsj858Ys4xAY/Nu7FAoBB3pET85iF9qginswUgsUbtwvJWdMudtDRBU8H27iNwRm+yLuWYwItBCBjaG6r1bz0uDK9hkJykN/ehJqwUnsNjz3i+HwajkSt4INqU7tca/Qm24SRIBmmUFsBIn7mHXqpquRT9RSdI1Fh9bsdg5i23qSPK4p9r6UImE186kUrxuhK+bHXjapgvErWAaQMLCMCnLMrSjIXIXyfSuST1/fn21ITexvMR0WUfX7xDbAaNNOVzg9G21U/3CaK7au0bZJAou/5MMCKf05eySUkVq6hr4ZtLvkyEc0v+TMa9bndLwKjEe2/DyLKVr0Jdh1HAz2UqSHTd7X1szg/18hwL9JKCKiEUVipeaa+O+wKj38MQOfSs9rvsdBmJbN091Qx/ohBW9tAjt68OuH+tXTuDwt6fy06Te+z7I1MZo1DDivVz3Xw0wsT0gV4evEZd80uKGIyZXYpWS9124QvrYaX1eUPD7tjzSo0sTwPRcoAqqR6u/cSyosqWwrzL6EEMgXammyBkIVgqtqIhbrYszq9yZkVzV/dcKzyfVDQUS4awEZXO+xbgg16apt+z+h5HYXOhMD2vsO4OdBH31eHNIQC/TVNpoLi7rpx2F7ZlxfjUkJgkZIds6YT8YnNeL28WMYmDS2x29OCWpwh4RAGYA8dKd40fNaFGbpWO/5s/cJfX+QpwB0PfszfHMcbc1QqvlUQHCCJLhHFa5yYEFHr6fXmYb0fgoXMug4DhFXCxp92rdcgg/88O1of3b2Moddcv8C4CewXdim13JUqfxw== X-Microsoft-Antispam-Message-Info: 2GVChDmv+8mO/5qbv7HkFKfQO5PIZsNg1rrdG+y6ZaahBz2FGOr+Lt4FVNBXiEtN8LXU9s5mHZjseZ4Q8AqMdKW0qQTEDN0FrWzKIPsMcFOI6V1qiaZJhPpvDxCQm9Wvn+u3V4N5gjkN+MqohRHGu0IbFsR0b4utUuZ/97dvtm2WutXtvV2Plf5g7IaQqiz1lWthF56fdKFgI1MFqMWjmmR2KOeN6NBZJUaDdKm+QHkZG3IAMpK18RLmK+UJmkwGuskSEtVoM8cR1+GNU3QiXYhC1fVaciQouqJIjwhMbIDeT55hA+D3B9THlL3jdgUWVPGwkLDF60/nth31+Cb4Jh1nTHXkmYrhxaBx4OXfsuQ= X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0424; 6:KFeuvpvxNSTrZQT0A+tZXz70cDaurcRnY34COgY7V+/O4LJQSmBMwePs0f7574WW8I2uJioYqtr3cBLk6Vi+gcCH+RS8ooZlL76mkXd5sFFJ2aJEQqlZ5IAHxuDMIepZ4yhYpjO3L2orUtE/rfNdWnToBq0rEVPcttl6vvZdM1G3oW+OuEQrxUUB2up+1RJaRHtncUuR7fd64Yqe6m5u9Y3B5NCM2bKvtiZaqQsgVvrckVuaimOjLVXTCQOaue9rW4dI6Iiefx8UoHFbB8l0sgVmBhuc2g7BjIsKkqlzcEgWC7zO0ln0+d7tLVh7qKqnb1HVFmgmVd5Y+NdI2Z80Tt76AGjXbed+i8T65NrnHUK6sp7ECecF602WGXUDksPmis8M6xP0FQ8UZS/6qbdOpGB5x1TI+SSpcKskI4eu/TiGt+cZWwJdfds4mQNcCHZy/Q4xKPkjlkHdawRlOfCsHA==; 5:te6LQUIWNHLncJk8HoVAISnsqb2u9SQdnYaCS7ncsva7TNPhpffsgPDySuwuKtotBTyzqj/vIxS2GlufXzyrTHAy6YAmbo3pwJLr8JaKu7nglEoLyLbNEhJdKMYKsaFTDZtsNU9JES8QWbr6WYGWZd5GFDcuEv5K6WKFFxZXkMg=; 7:eCw4dEiG0E1wbFacQsHtVQZ6lYOKLuMnjgbotkKmMyQj8CyeZu+DaePGeCO49YYKKoU3S4Li/paiC7a3ztfFjPG6wZrh5wN1tX/OZ5K4nSignWynSX1gV6aKQKBmRPynBYz3FQx56jfHpmul+XIfgbqM/WIB1BDEquRJj8UU4vSFl3zO4y5aFMgWK9ycFWipJDk8XRYTb8J9sjxG5KZxFe8iom28xpy4VAk1gAg/oFnsXynBtwVqt/2I+vQzDEsh SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0424; 20:HPv1XtEQ1uhTlBDC3AM9kG+60qbTPYiYSKkkjepSihR5NBhv68PKJSxVLTWFTzh3qCODhDqNEwuOx+/SVIwVoVZ/L44TZxkO9x4tlqF2+3Iz6j0bqBW5EI1BB/R5fqTLLoIYcQNSIWP+lmiKk/WT1v37fbw+VhIc8HpECMhK9hXRre0tL1RlzpC1R9HGcN+j5hLGyXpdmjRHADrnuMF4JdvXCTDZt4CkTaOV3B6D0QfCIVpUPRJIyNzVBD12QS2Z X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Sep 2018 09:49:36.2618 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 166d05a1-a85e-4582-c7f7-08d618950cdc X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXCHOV01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR12MB0424 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: amd-gfx@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP points array is one-to-one match with syncobjs array. v2: add seperate ioctl for timeline point wait, otherwise break uapi. Signed-off-by: Chunming Zhou --- drivers/gpu/drm/drm_internal.h | 2 + drivers/gpu/drm/drm_ioctl.c | 2 + drivers/gpu/drm/drm_syncobj.c | 87 +++++++++++++++++++++++++++++----- include/uapi/drm/drm.h | 14 ++++++ 4 files changed, 94 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h index 40179c5fc6b8..1bdbf2273b49 100644 --- a/drivers/gpu/drm/drm_internal.h +++ b/drivers/gpu/drm/drm_internal.h @@ -178,6 +178,8 @@ int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, struct drm_file *file_private); int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file_private); +int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_private); int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data, struct drm_file *file_private); int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data, diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index ea10e9a26aad..92d94867746b 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -669,6 +669,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = { DRM_UNLOCKED|DRM_RENDER_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl, + DRM_UNLOCKED|DRM_RENDER_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl, diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 502cdf313aea..bcb3ba002985 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -976,6 +976,7 @@ static void syncobj_wait_fence_func(struct dma_fence *fence, } static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, + void __user *user_points, uint32_t count, uint32_t flags, signed long timeout, @@ -983,13 +984,27 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, { struct syncobj_wait_entry *entries; struct dma_fence *fence; + uint64_t *points; signed long ret; uint32_t signaled_count, i; - entries = kcalloc(count, sizeof(*entries), GFP_KERNEL); - if (!entries) + points = kmalloc_array(count, sizeof(*points), GFP_KERNEL); + if (points == NULL) return -ENOMEM; + if (!user_points) { + memset(points, 0, count * sizeof(uint64_t)); + } else if (copy_from_user(points, user_points, sizeof(uint64_t) * count)) { + ret = -EFAULT; + goto err_free_points; + } + + + entries = kcalloc(count, sizeof(*entries), GFP_KERNEL); + if (!entries) { + ret = -ENOMEM; + goto err_free_points; + } /* Walk the list of sync objects and initialize entries. We do * this up-front so that we can properly return -EINVAL if there is * a syncobj with a missing fence and then never have the chance of @@ -998,7 +1013,7 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, signaled_count = 0; for (i = 0; i < count; ++i) { entries[i].task = current; - ret = drm_syncobj_search_fence(syncobjs[i], 0, 0, + ret = drm_syncobj_search_fence(syncobjs[i], points[i], 0, &entries[i].fence); if (!entries[i].fence) { ret = -EINVAL; @@ -1084,6 +1099,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, } kfree(entries); +err_free_points: + kfree(points); + return ret; } @@ -1122,20 +1140,33 @@ static signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec) static int drm_syncobj_array_wait(struct drm_device *dev, struct drm_file *file_private, struct drm_syncobj_wait *wait, - struct drm_syncobj **syncobjs) + struct drm_syncobj_timeline_wait *timeline_wait, + struct drm_syncobj **syncobjs, bool timeline) { - signed long timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec); + signed long timeout = 0; signed long ret = 0; uint32_t first = ~0; - ret = drm_syncobj_array_wait_timeout(syncobjs, - wait->count_handles, - wait->flags, - timeout, &first); + if (!timeline) { + timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec); + ret = drm_syncobj_array_wait_timeout(syncobjs, + NULL, + wait->count_handles, + wait->flags, + timeout, &first); + wait->first_signaled = first; + } else { + timeout = drm_timeout_abs_to_jiffies(timeline_wait->timeout_nsec); + ret = drm_syncobj_array_wait_timeout(syncobjs, + u64_to_user_ptr(timeline_wait->points), + timeline_wait->count_handles, + timeline_wait->flags, + timeout, &first); + timeline_wait->first_signaled = first; + } if (ret < 0) return ret; - wait->first_signaled = first; if (ret == 0) return -ETIME; return 0; @@ -1223,13 +1254,47 @@ drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, return ret; ret = drm_syncobj_array_wait(dev, file_private, - args, syncobjs); + args, NULL, syncobjs, false); drm_syncobj_array_free(syncobjs, args->count_handles); return ret; } +int +drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_private) +{ + struct drm_syncobj_timeline_wait *args = data; + struct drm_syncobj **syncobjs; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) + return -ENODEV; + + if (args->flags & ~(DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL | + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)) + return -EINVAL; + + if (args->count_handles == 0) + return -EINVAL; + + ret = drm_syncobj_array_find(file_private, + u64_to_user_ptr(args->handles), + args->count_handles, + &syncobjs); + if (ret < 0) + return ret; + + ret = drm_syncobj_array_wait(dev, file_private, + NULL, args, syncobjs, true); + + drm_syncobj_array_free(syncobjs, args->count_handles); + + return ret; +} + + int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data, struct drm_file *file_private) diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index cebdb2541eb7..501e86d81f47 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -748,6 +748,19 @@ struct drm_syncobj_wait { __u32 pad; }; +struct drm_syncobj_timeline_wait { + __u64 handles; + /* wait on specific timeline point for every handles*/ + __u64 points; + /* absolute timeout */ + __s64 timeout_nsec; + __u32 count_handles; + __u32 flags; + __u32 first_signaled; /* only valid when not waiting all */ + __u32 pad; +}; + + struct drm_syncobj_array { __u64 handles; __u32 count_handles; @@ -910,6 +923,7 @@ extern "C" { #define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease) #define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease) +#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait) /** * Device specific ioctls should only be in their respective headers * The device specific ioctl range is from 0x40 to 0x9f.