From patchwork Mon Sep 24 18:15:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kazlauskas, Nicholas" X-Patchwork-Id: 10612775 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 385B7112B for ; Mon, 24 Sep 2018 18:16:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 28C7D296A8 for ; Mon, 24 Sep 2018 18:16:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A4022A2C7; Mon, 24 Sep 2018 18:16:14 +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 84F47296A8 for ; Mon, 24 Sep 2018 18:16:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C2A376E2D8; Mon, 24 Sep 2018 18:16:11 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM05-CO1-obe.outbound.protection.outlook.com (mail-eopbgr720057.outbound.protection.outlook.com [40.107.72.57]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0597E6E145; Mon, 24 Sep 2018 18:16:10 +0000 (UTC) Received: from BN6PR1201CA0007.namprd12.prod.outlook.com (2603:10b6:405:4c::17) by BN4PR12MB0740.namprd12.prod.outlook.com (2a01:111:e400:59bc::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1143.18; Mon, 24 Sep 2018 18:16:07 +0000 Received: from CO1NAM03FT046.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e48::202) by BN6PR1201CA0007.outlook.office365.com (2603:10b6:405:4c::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1164.22 via Frontend Transport; Mon, 24 Sep 2018 18:16:07 +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 CO1NAM03FT046.mail.protection.outlook.com (10.152.81.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.1185.13 via Frontend Transport; Mon, 24 Sep 2018 18:16:06 +0000 Received: from kazbox.amd.com (10.180.168.240) by SATLEXCHOV01.amd.com (10.181.40.71) with Microsoft SMTP Server id 14.3.389.1; Mon, 24 Sep 2018 13:16:03 -0500 From: Nicholas Kazlauskas To: , Subject: [PATCH v2 1/3] drm: Add variable refresh rate properties to connector Date: Mon, 24 Sep 2018 14:15:35 -0400 Message-ID: <20180924181537.12092-2-nicholas.kazlauskas@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180924181537.12092-1-nicholas.kazlauskas@amd.com> References: <20180924181537.12092-1-nicholas.kazlauskas@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)(376002)(346002)(136003)(396003)(39860400002)(2980300002)(428003)(189003)(199004)(72206003)(486006)(478600001)(446003)(2616005)(426003)(4326008)(11346002)(16586007)(44832011)(476003)(126002)(26005)(81156014)(5660300001)(8936002)(81166006)(53416004)(305945005)(186003)(356003)(2906002)(1076002)(48376002)(47776003)(97736004)(53936002)(316002)(77096007)(68736007)(86362001)(50226002)(336012)(54906003)(104016004)(76176011)(36756003)(6666003)(110136005)(8676002)(106466001)(51416003)(5024004)(7696005)(50466002)(105586002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN4PR12MB0740; H:SATLEXCHOV01.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; CO1NAM03FT046; 1:Zpl2OEdm5IBwzLe9aQtSqoN6bIM6p039Qf8a3HpdtdsfhvpJatBC+TDfSX1pNIi483E1WkZcXEkXuoFH1Zlas9ue9dlAMFdLwiifPrxNr+I+Ua1R4XZn9QRjaRXvfz9b X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6db3cf3f-c5f6-4219-fe1c-08d62249cc26 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060); SRVR:BN4PR12MB0740; X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0740; 3:31MN/PoVPl4ohx/tscMkjxRAIki05c3kv8G4IopzTsR1jVDBNIeZhieAqmrFo3H4Ibke+WYmik3j2pLOuJeZhCfSGQRWZ10vxNiGx87+PNYedpR7u5hADFUpQT6wglitelEP9JjTk5QJ+Ulnof96J2B1RuYNxcm8/QJ3BMRvkW9+S58RI6t/mog4jRvTc/mpxZH2V/kPycH6laP8pokVDuEKt0Xjy2Ms07iuxiQPkdowRtiiP+HYeHL8CVZGdjZgyagCeUOte81qBf4dbJhxDoZgXKfkZujRQ6mQejhyLIwaYFz7vuPhMo9Uz0BjaP5BvWNbCNURYZT/CdN6lWaKDEySUYBDxGxwGZSt/xmnkr8=; 25:GdsXxZtf0GpRhJf5uIqsFJww2mCnfcJl+Rkbq0ZGQZYLaLxsfES5z81VvH4YPrDZyDm1UukQXyZTWiJ3yqQZ4JhRGbiBMcbkF8wK4MttDoplvbYhocHkTpOJsOXOTNMqCv6cqK2M9WickgZ77G+AsBhw8M/dYEYZpYJ8kyx88c7EZcZsyy0k3KT+413j+NSA0ebeLMMZoeoJyeLciCj7TX8mtbuHcWHfqUDRmzDPGp/mZzpjgftQUHGbGAdbqG5h/MtOmTYEb45SAXa+2yBjIjDoDTU320cZJFyh/YwQTTLN0wHSRM1+InPJ9Al5+2Yfq6n1nK+X69JtC0yD7LnusA== X-MS-TrafficTypeDiagnostic: BN4PR12MB0740: X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0740; 31:1BliqTXTU1rCNksmWKCrnMw3doyrOqN/uRr16oX1kB/sx9AXX9lx1QJmImGojM4xZchkVUUtxpvCB3ydMMNbQEPvwsn1/VNh0ScHNlShrGEVj8HNnRg4jdLTNEBq0EkGjErhERwd5zzWd2e7RRJK4KVSM0QPoQN+yhxwncoXpe+Tv3y1OaqwpTFFhzdV4uCC6d8GkojUtgFhXmxjRNDbikwxJWc2ZVfZFo5u75EKdPc=; 20:bO+HQtQfJwG34i6rSbGQRQ+lf3CjGs5OVzcK3dWPZ3TMFCLXj0XFNB9WIuZJssxi1g8uwejjHr85KrjPXcQM2eak+bkkFxVYzBkpsCETn5i9Wf4D+eS0XFoMbcWy83yQkv1nYQek3lVmjAuMOMpCFjd63wZUVbyXKJDgZtTmSwZyFGbFydiZ9LgZ5uRxYAjqlhnoJ5obhJysxUk86ECpHF7v4RcEKRCavpdkW9AlMsD5d14znakixEic10u33IMA/J1ZWRZy3hleA1RYPFVyTEhNNuZ5aoqZlTQ5X2+3wsbpzUCBrOdqB2QSgCXGzWw5i4bbypAKRsVxnGzvJkvcLDDsjV9rgy0U1lTfZHw61pAUmcfTr6wt++wD98ymNezLfRSSwJeuH5rVAuJJ9ANRHiGZdz6gg6QRWzkhR/8CWt7ln1Rr9x4dndw0eXOev7XDdFVvrUnQFgsznSl6iGk9FREEogu+/fRdRIPiRCfbOPC/VUDBR8AIvDzh1ko5wmiX 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)(93006095)(93003095)(3002001)(3231355)(944501410)(52105095)(10201501046)(6055026)(149066)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201708071742011)(7699051); SRVR:BN4PR12MB0740; BCL:0; PCL:0; RULEID:; SRVR:BN4PR12MB0740; X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0740; 4:nb39cwFcCC9yQwxufU3qDuQHBMTt97VegHuhx7xQawu+b92Qr29+LQU0T82yGh5qpbs3N9n64NhRscukYJLQ695t84v0Z/zRMfVj6FyUqmSVVvThckZUh18z+nzcPdBaKX/BanzH49nii2SQCQ6VgaFzWe8lmUmLiKKM8wjSnIujsnGRwjmJJmmKY/V4P8DxBQRfjNLpplaKmUN6iYnC7AOuQpYOVA423gsO56kL2S0C1VpYkCMigJN1OpSbLSJblyQ1vME+XIJil2O/XbAeTmVQo3h3i6xuSdtiumrTbbFf3sEhDBF8luD33HRV0xEv X-Forefront-PRVS: 0805EC9467 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN4PR12MB0740; 23:Qsyo5zHH2SbeDkNzLbTi20nTJN4C8JIIdvby3m1KY?= mqMOy4tLw2DBZsbf+h3u3b7AaddvRL9BF6CnGlthYm3zNQ5fAp5zkZoxJGwRkJ/YUtwdmnTvGi4J9+xFUT7vq2cLpQIeZEWD9tFjmdyNQR1eE3VYaABUdBFvcIsgBAzt0dCDD9h3gwQGj5CjjIMc6H2d/xIxjURPJUZAjNaVtQZo3f4nJL01Q/ZmCFcQceP/oDakK4UzWcXBstrvY2sObNYlsNfuFkWk7s2xXCdy4Enov+409d42dcpj+xTBOtSiV9Tczo8oudp/9gJrGqJAtygV5YpayUZjI7r3Zqgv2JGSv7mPLNYizHsRmol/yvArHeQ3XO0fuH2q+9aHZL8ECj+70d3rPLuLhuwmTy5gmM4y1iC1z6Z38gEZKhESdyZyK96YPNxdkq8oqZ2iFkOxw0AtGsZFGKNwmDoJKgoTGc0il+D67qf/zAP2fGjEjMJpx+wHPmvIPk7/rQdNt5AIVzGlK5/XayORjXPr8XzVThn3Lw/h8JZAPjMfdOBD4n6BzYiKeXRVnl4N14TS+tscOU6wWG+b0iy7+gHcm80Y5oPrdYCihNfaJfjSDSLCwcONimnouJTfh5cN5xdArD9bPNOwEHIpHEHc1o7k6iFGOFnC/2np6B3InQkDUwFEJDBESVA+vYu5AG9GBFqoqCFIcywc819yvgnKqqi6MRZ9+mzcPxggN5+UB43SNDaggVrdLZmqA6p/gpJ0FYFFctxX4jV7f7TY5zYjWU0lMyHtfrTz+ZuZBpcJk/x/agK2A1Fmq7LKQFZzKrl6S/lwMNQARNG4OTizr56ui7YxCCzYIVHND9hfaYx//TNk+k8cVam1HCI7Oc+wOzhixQtHoSDiguuhv4QUvaQ2CaLU4chCxWYBoJoL6Ag9Qj/o3ZZm5q13N4CJFo8b8+YQZwFAFRIClhmeDHQEqwHmvv0fmccRoYwkhCnFzFSr3BuKudK6gabW6pSuvyYtdD/1WHIF50Cl4Eao1OthALr+IQWSujRDjwp2P/RNiBBFesWBF5Mqm9IzpoGYqdUslsbaiYMVsnWQnMQoX6d+XGKsXBGtjReQMgvQyT1uUNqv1R61oI9DzdWQUk3BgQhPJTDSNfYXDcKtBhZlMpXmsGwhZnNspLxXMpcML7Y7oMGlgfzK3e2BJTCO9Y6kLVTUinnbvOzrpyykHV6 X-Microsoft-Antispam-Message-Info: 2FMrfmyOsbBnFIIs5GIDxJ4tcmkWgCkGCJFWbrJhS9L1gyiIdBcogcyJ4z/3FgQdl2KITTPbWSPCoWPaNXFxHZq/cLYtSJSDDHF25E0kHeAj7sKfsSINQATU3jj+jgel8xTQkYPxGBPwQpHWstR7rAlHz+tHADxwwi2TcNj0zQjwFgr1oNS54FC4TcoCqHbPC9gLu3B5OG54pFJApYr76F9czo4gk5FOSZlKBZ/njgTSg4Rc5r8LEGZp7ETaJv5M8azR8ofFaIrlhIXpGXGZ0wnIVviEHckqU+uemSZ+i1Lo3poeIFrjGbBZ8w2KDw0sMzjvBl7F7B3LJAcXXhvzmEjXBNQDlU3HvRgfRxdfqyk= X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0740; 6:YyOkXxS/6eYyq6eFQufStiHYsMSSjjtYL31xP7arfNEMQ7SZo0KfdUNoKD2fFtxj2vMCsObxGZhUnhC+A/lkbzIjWTfxKdH2hPriXZjwDH3CtcvkF7h9hRxbX53hHocTgbbRDUP0IMjSIQ+D4+2Qo8+kZhuz/ykewyjXPw7W3PdjFFYW1lf4yBEmfekrrsD8QSS1rFSEcsRxEE7r6dDWhG9PaV/Z06jl1/63AnwDNJJhI/J1UycZ9s2On0Fylc5IpUkQRIBMcODkkGo1DBgXw/HP4546dYqD/39LIGOFS1Y7wdNOih0Ek1RkG+MyKrodPRDT6yW+ACk1oTRBwCgjZladRTVgVttMs1YSrqdL6op1AkJJkI2iWZEciSVX1wweReZHywWXIa8G5JACWuNaqd7ylbSbDhW6/lc8tVtCABdtn7GwwR+YIMFSGGP2kyLfqfmaigHjF6pzcltcQDOtZA==; 5:Sx/QEuUR0BpcLgg/YhqpHrPIoDLUuhVds5Oxo/ruNqnb/6yP8jSC4u3ve7PgSDd8dTYhAfpvszvgU5a9u1wk+7FyLeqgZCBL8zO8ZA5szwgmjIelVKBNYiNvu5HMUtgy+8cQfz9BVltlELUGf8YT6rkVYWuCZ3qgQKfedbiZQq8=; 7:CeNZFfIZHQbKQsJZiV9HDW074XBFlsLi8lscr1iXdntNwUBs0MZHf6SZbof2fWXuptE9YMssOMJfAIY+NXDQXWY+JFl2tORrRfn1m0NSJj/TRitHnzLjSt/tTqH4SMQf+qsD6Mza/sdlhhr8fUqUQwgbaQClL05bgXrCFgPfVykHPL1VxHJvm6lnL1Liy1AitdcWPu4XBbKIlH0vsD959gXCp5UxJLNqyfsDifRsA9tkbM64gFqIOS9JeNkX+XP0 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0740; 20:/L09mXmM8nH7A4oaQ6g2IzGKyVmIH/XBYPRnsW3pyEMYBuzRaWjpfuBHi9pRcld+OtueTjUVcdvi78wuH/Uzz5kWd2tSafKzquhmW7t/VencEy06sRxn7FaIg6sISFYCXYJe33P/X1REwMBKZ1Q5Ig85K0sPebR5IxjT8aAvhXj6LwfomCXdFSbrwnyAHtTULm4uXsnPMpyE5CZS/r0yPkL9ANT2es65rqDUAn8z1cpfhi/0QmYcRQzrTNT4CgAq X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2018 18:16:06.9130 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6db3cf3f-c5f6-4219-fe1c-08d62249cc26 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: BN4PR12MB0740 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: nicolai.haehnle@amd.com, michel@daenzer.net, Christian.Koenig@amd.com, manasi.d.navare@intel.com, Alexander.Deucher@amd.com, Nicholas Kazlauskas , Marek.Olsak@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Modern display hardware is capable of supporting variable refresh rates and adaptive sync technologies. The properties for querying and controlling these features should be exposed on the DRM connector. This patch introduces two new properties for variable refresh rate support: - variable_refresh_capable - variable_refresh_enabled These are optional properties that can be added to a DRM connector dynamically by using drm_connector_attach_variable_refresh_properties. DRM drivers should set variable_refresh_capable as applicable for their hardware. The property variable_refresh_enabled is a userspace controlled option. Signed-off-by: Nicholas Kazlauskas --- drivers/gpu/drm/drm_atomic_uapi.c | 6 ++++++ drivers/gpu/drm/drm_connector.c | 35 +++++++++++++++++++++++++++++++ include/drm/drm_connector.h | 27 ++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index d5b7f315098c..0bb27a24a55c 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -723,6 +723,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, state->content_type = val; } else if (property == connector->scaling_mode_property) { state->scaling_mode = val; + } else if (property == connector->variable_refresh_enabled_property) { + state->variable_refresh_enabled = val; } else if (property == connector->content_protection_property) { if (val == DRM_MODE_CONTENT_PROTECTION_ENABLED) { DRM_DEBUG_KMS("only drivers can set CP Enabled\n"); @@ -797,6 +799,10 @@ drm_atomic_connector_get_property(struct drm_connector *connector, *val = state->content_type; } else if (property == connector->scaling_mode_property) { *val = state->scaling_mode; + } else if (property == connector->variable_refresh_capable_property) { + *val = state->variable_refresh_capable; + } else if (property == connector->variable_refresh_enabled_property) { + *val = state->variable_refresh_enabled; } else if (property == connector->content_protection_property) { *val = state->content_protection; } else if (property == config->writeback_fb_id_property) { diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 1e40e5decbe9..fc1732639bd3 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1254,6 +1254,41 @@ int drm_mode_create_scaling_mode_property(struct drm_device *dev) } EXPORT_SYMBOL(drm_mode_create_scaling_mode_property); +/** + * drm_connector_attach_variable_refresh_properties - creates and attaches + * properties for connectors that support adaptive refresh + * @connector: connector to create adaptive refresh properties on + */ +int drm_connector_attach_variable_refresh_properties( + struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_property *prop; + + if (!connector->variable_refresh_capable_property) { + prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, + "variable_refresh_capable"); + if (!prop) + return -ENOMEM; + + connector->variable_refresh_capable_property = prop; + drm_object_attach_property(&connector->base, prop, 0); + } + + if (!connector->variable_refresh_enabled_property) { + prop = drm_property_create_bool(dev, 0, + "variable_refresh_enabled"); + if (!prop) + return -ENOMEM; + + connector->variable_refresh_enabled_property = prop; + drm_object_attach_property(&connector->base, prop, 0); + } + + return 0; +} +EXPORT_SYMBOL(drm_connector_attach_variable_refresh_properties); + /** * drm_connector_attach_scaling_mode_property - attach atomic scaling mode property * @connector: connector to attach scaling mode property on. diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 91a877fa00cb..e2c26842bd50 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -449,6 +449,18 @@ struct drm_connector_state { */ unsigned int content_protection; + /** + * @variable_refresh_enabled: Connector property used to check + * if variable refresh is supported on the device. + */ + bool variable_refresh_capable; + + /** + * @variable_refresh_enabled: Connector property used to check + * if variable refresh is enabled. + */ + bool variable_refresh_enabled; + /** * @writeback_job: Writeback job for writeback connectors * @@ -910,6 +922,19 @@ struct drm_connector { */ struct drm_property *scaling_mode_property; + /** + * @variable_refresh_capable_property: Optional property for + * querying hardware support for variable refresh. + */ + struct drm_property *variable_refresh_capable_property; + + /** + * @variable_refresh_enabled_property: Optional property for + * enabling or disabling support for variable refresh + * on the connector. + */ + struct drm_property *variable_refresh_enabled_property; + /** * @content_protection_property: DRM ENUM property for content * protection. See drm_connector_attach_content_protection_property(). @@ -1183,6 +1208,8 @@ int drm_mode_create_scaling_mode_property(struct drm_device *dev); int drm_connector_attach_content_type_property(struct drm_connector *dev); int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, u32 scaling_mode_mask); +int drm_connector_attach_variable_refresh_properties( + struct drm_connector *connector); int drm_connector_attach_content_protection_property( struct drm_connector *connector); int drm_mode_create_aspect_ratio_property(struct drm_device *dev); From patchwork Mon Sep 24 18:15:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kazlauskas, Nicholas" X-Patchwork-Id: 10612777 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 05151112B for ; Mon, 24 Sep 2018 18:16:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EA22F296A8 for ; Mon, 24 Sep 2018 18:16:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DDC112A2C7; Mon, 24 Sep 2018 18:16:30 +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 5CC3E296A8 for ; Mon, 24 Sep 2018 18:16:30 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 46FB76E31B; Mon, 24 Sep 2018 18:16:29 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0043.outbound.protection.outlook.com [104.47.40.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 39A786E31B; Mon, 24 Sep 2018 18:16:28 +0000 (UTC) Received: from DM3PR12CA0065.namprd12.prod.outlook.com (2603:10b6:0:56::33) by BLUPR12MB0609.namprd12.prod.outlook.com (2a01:111:e400:594f::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1143.18; Mon, 24 Sep 2018 18:16:25 +0000 Received: from CO1NAM03FT034.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e48::204) by DM3PR12CA0065.outlook.office365.com (2603:10b6:0:56::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1164.20 via Frontend Transport; Mon, 24 Sep 2018 18:16:25 +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 CO1NAM03FT034.mail.protection.outlook.com (10.152.80.177) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.1185.13 via Frontend Transport; Mon, 24 Sep 2018 18:16:24 +0000 Received: from kazbox.amd.com (10.180.168.240) by SATLEXCHOV01.amd.com (10.181.40.71) with Microsoft SMTP Server id 14.3.389.1; Mon, 24 Sep 2018 13:16:23 -0500 From: Nicholas Kazlauskas To: , Subject: [PATCH v2 2/3] drm: Add variable refresh property to DRM CRTC Date: Mon, 24 Sep 2018 14:15:36 -0400 Message-ID: <20180924181537.12092-3-nicholas.kazlauskas@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180924181537.12092-1-nicholas.kazlauskas@amd.com> References: <20180924181537.12092-1-nicholas.kazlauskas@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)(396003)(136003)(376002)(39860400002)(346002)(2980300002)(428003)(199004)(189003)(4326008)(575784001)(8676002)(86362001)(14444005)(5024004)(5660300001)(106466001)(68736007)(305945005)(16586007)(316002)(110136005)(54906003)(53936002)(11346002)(44832011)(486006)(47776003)(48376002)(50466002)(478600001)(2616005)(476003)(53416004)(104016004)(126002)(72206003)(446003)(1076002)(2906002)(6666003)(76176011)(36756003)(356003)(336012)(50226002)(8936002)(105586002)(77096007)(81156014)(97736004)(426003)(51416003)(7696005)(81166006)(186003)(26005); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR12MB0609; H:SATLEXCHOV01.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; CO1NAM03FT034; 1:PRMI0lNRcS5O36VuZ0DbVFOuRvv8oo0YCjWb5YL1HwHdeThl9drhFRCufZjySC1ajwscTCVeb18qp9CvdH0XFa6IGtdpmDYMbYiKS38uvmBRmK2T8xxXxvvvYfN+WZdq X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bd72a22e-8267-4d7d-43d8-08d62249d6cd X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060); SRVR:BLUPR12MB0609; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0609; 3:LrSPC2j7M3Yob4y6KESzvPr9kExhVQcXbr9CxXrQdmVxNlCyw48oUzjCzjjjrusMISyiCMrmE9HGWIivi+7tFc80kDfOJhHHa754fRfgT4Ew1EAv1wDVhiPDY/VJU8pN39awDwmGYjYifEAF5x5ibIfWIMs7IVHrmMA7/aAsq506z47PFTBJ7K0DeTFqiKalCMtARZh3cCtmeptjVr6gWysNa364ZKytlX0gv64D4t3KP+nLShT3a9+CPr3uIiequNk+BuQde2VNv+tl+FzQZv06kf0XbueLUa0oVzUy/SpDoc3SICH5FODlY1e4Ue0DZHUIKRXN/bg4qux1Wz1GsEo9bFZ3AXY5aZ8Aslx5L5k=; 25:JNdGIysRTVWPOJJxitpYMehNkR2iiYKKwVqJUu+hURWrbmAJZ/SsXWEYLD76nOq98piQt5fNOOxCKBshE7n6nwF5SVsXhky5/B4jHYlak8ea+0vYoiWUVdcaosT9AXQI9oXziycLqKk/uQkXHfmdX02wpJ/0RbpzRhRnUYZnW5YDzgpussaBv+iIcDVmGpRuEoDat70sUhHJd5V9yXetyZCd1I3+BOFSku1LUnZCUTCQYAYF4Y47RFU3RKSos2IEKdfjvhzfhPwBIuhw9Ms9e/rNKjRWWkFMv1WyKe2zQfD648cHd4v+JUX3DbQvfHDGSYE/koA2QRHaMUwk8frz9Q== X-MS-TrafficTypeDiagnostic: BLUPR12MB0609: X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0609; 31:Z3fzk1n92cT8+tVo9tN7eGtmdLf+wzTg77syjEWn9Hq8h9IemLrTuH7/DYlLLG/SnHOuV9lkhckyRxlXs1ecBFWNGN2tkCDgVIb8xk4WqB0NtPTw8BRG9LP/4hW5jCz2doxvoIK61geB61wEb6Az3iyFeLoZ8uJc/DEoDDwAcbcNHeZEifCSVpxSwICIRn6tJzPRlYswUhUe3ow7OvkReSALBKxzHRYehVU6mPYkXWE=; 20:1TxqlKpaeFlmxCkZFHhIEhAk26DDm+DMkupEa0F8d1w5Jw+ULvmn2Dth4mur/ELWUmHBfYQj5aYkuugcO5iBCF4Ap+1yEJsUWlaSSvEvlFvoHUs4TdYJXukt0Ujoj6y34oVs8+i6vX+8Sbge9g1IsysIGo9wVM2XPryO26HC5wB52U6rQYZ0e+rauk6Fs4PduMu2S/4I18P8Lve/qnG8kcnAHU30ukOrlltublDhm64GAFxZQAxiB9Bme37vEKi/pzk25sBYGpIVrLihM/cJZEZyu/Sd0akAAPYrPi2ee9dwFsauvH4qmiBoU1f/fIo+4a+1ZGexhMOBN6FNdhOriNIOA8jXBr+BOOsG8IPT2Adqo6sEKpWKzkhuQcNkXIZY3t5yNVxfKcJlg9s9whVDTf6eb/yu2OpBXQKWtpEiF2HTlpTFzujhDEgxePE7T/eDxawv1Ee0CKToxay11ULSnvHW4qPlZHMYeOmLhHdm6C5xR/tW6Qqz5FPijbIlfsLT 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)(93006095)(93003095)(3231355)(944501410)(52105095)(3002001)(6055026)(149066)(150027)(6041310)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123558120)(201708071742011)(7699051); SRVR:BLUPR12MB0609; BCL:0; PCL:0; RULEID:; SRVR:BLUPR12MB0609; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0609; 4:9te2aM3WrJY9wK9TDr620Ffk9enxnesAAVtRnv1eSehQRgrp/TpcbeEYVqoxdOHDkznr5YV3PKuqetIyEQo/82K6VUlgEpOZgUR6fuMp0seN59moBUzxcX6wFlQ22ZS52kFuOznW798URX2QeEfTXY1Ex4S8TVQYqKshWSxplYPOiZQgPvovwQc3qdKxkJuC6UXDgFcf4FJxXrWDCdl5/w9LV/PuntbWluyaZ8MPIslxndDMDkczXS/Ak9ISycuG9HTby7+YjYGDuAO06PuInbXPqrn8DjPEUGz6ZfARXFN4ki/HR2Z5BdXe43FS+iZY X-Forefront-PRVS: 0805EC9467 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR12MB0609; 23:0V3Tn4Ox248aQPGFIfzHrY5q8EDz3qtOFg4pcCf3Q?= rqIOzl1G4CqSkpJHD5bi4WITkVFwoBWhVlQtglFVJ1SSskVa4ATw8wZKFEY/WDysyrXMDyi8RY47pVfyez4bjstwo0zCxADNQ1kphoxVrmlMHhdU7hRCrbwKOjNWXsaDfoa/FhwLoNGJFAP+qugr+OE7utQDjz3rJkQR57TyFRa+oDvvYjE9dVUhnwRseaJko24wk9Ewbd5R3ie+3HwVmuEEPTDtSuWQdo9WU1l1qPlce8AujD1v5nhFseu3MO1odPC9gQ/UxywKOONtaPRMogIhe2i6QokLzMWIRleRSCxs6av1KizPLC+2r5BD7oGal8E+Cw0YgKgRE18WU4aQv1n1is8qZGRqpiSYz5Mk/Ka/R501xdsPgTbl7Garqj+p0w+F8OjgMC4UBMo75KO/phlmTezCie8BMAn3UQNzEsVI3W1viREW9rHstj5cXd40Pu4vtX4jYeMk2wEJo19h4k9DeM4+kTZEarKI/V0BCmCooczbMn4ZCyJBI4ab5bgNMZJ8Kg9ArjoBXzOiQ4oGEq7T6+2XV+R9yu1+cdsEqwluYrtaiWp2Aoq8saX1GHxAyU8w2sHmBxcirePIncvB5/A+Ew5wp52orEnqd8pOD5BgG5xQNH+TGxjIoBaiaA4V1xEpF4uRTCgta8XPF3Q6vXP/IeLGgIcVCKJd8fR+n6E/Bu9sec5+k3gQJjdY7RN5E9/Vep9ZUhM1xbCIh+IfIQ8ORkIAIo6Qelmh5UEpW0UOx9NzdG7fLshuGnnDXr9Q87NZEVzQdyQgU9edBMfZrDEAD35v9ygdAnLf5WrqaKgXix8OsFSVpkJM2Cf3jiX0lddJvM/aC3dFCgb1L54o9vRrhvcY9dfUbfMahA+Mx7Ar6gB+Ev2aCU44srmvrbtPW6zBcgqyOgRoGf/L3x8pX1P9jQeUsO8CIoEPGfruclY1Oz6+BktsglVzhNPmD+gMtiW7F9yfxSes5yBSvaYuxbW9SgaIgxLaw04CDrh/dctrg+3DbsmaUzAASEpcray5GwQEQmGKV6vpxmzplN/SiNcSk1yjtp+XRJk+olRAGuhvEtQiJA3XHKJ3BO6xNOuTtsloGpb7qWthgnPDf1yPNK6tk7VvASoxNszIPuAjGHmwuL4LTgQbBMkQOfwzHVWvj3e7gEpJ0Wi8EWbUsRk3gpVo+Q979VE4xlS2JnhdphwX8Rl7dBTTydAeOKmrUTVhpg= X-Microsoft-Antispam-Message-Info: zEVjALfBFmluTGWVGTtm0j/a1H37Xq9tOfwONrop49LGHE6poaKq8+y59JC8oNgFZ/fDOHqAEsDYhlFZeyIBY11jZnJH/onkf5UmyFpd7L4KXHOdBhNrvfrcTU7NqzX4X1kW3pgfTQ+LxlShHF9siCcAAqAYHLqTajV3PZbqN4vVcjNG/LknqSRFcOK9qrJFlIY7hI1a3/fuhKAALY2NUM0fSp2+0q8rz8ItJQ08/gat99RzIuEbazDEYUdCnmgHg1DP3WdXr/qymERcdq6yQsbr27c1+4R7ZnaMrIs22q49ApN4jUKTz+R/7yNR3Zxk6JPaIel7e9qVMB8mnArfj8c10weBstCpxIn4i7h2Y+A= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0609; 6:fu+Rd4yOisQiwxzD11rTwMJASeac6waBe84qtH5sDYQKURMig7APSNt1a2ssC20QcKcP73HI1xWaY1k6ru6YFfRPbIl3q9WqwD3PJDY/BgwTnTTZQAzTD5fi6+xqVagVviZQqVB2nXnBfVODZBkdHKeMLoVJvIWQ6r6xvi40eX3dZn9xXcgheo/s6UgVhbQy7Ng40Zy6D0vzvGSg90sVbWKJkYDG10AaYTDivbBUORCX+EgWhQKTU/+C1db9UhUWs0FbQzQ3yzdzXZ76H3mzNpAGVPDjiP2iImc2hcc1lOVZOv8j1JbsmNRV/OxQDvQ/edKIHI2f8GgdvRfpwTlxWdOdH0ZsRPq8AvUBIkVnVJDPyfPpk/JaRFbHSPNLOkCrqo3ixEThoD5/uuRbm83zeOkSzRpy/wkBcgb5W3OWZD3DRHW+yeQLaYxMe9D6gTdXC6F/mN0XQ3ETKu+NjJeI5A==; 5:vhpueFX5ar9pnAxw2BjHw+Hz2Nls7qO+Mu7QBUWdiaL9sZ3hvTDECHnUrJHseKthUTDDpGCNj7ltqxGlv88sP05+vDLHsax/AU0NzgDts/pyLwGjswA81/bo261Cy0vZ1b6FBGQlNjEj+elUl63H/jvgK1BvlDmldeKEzTDejeU=; 7:p5mB++V52Ps/ZAR5qNDIZgQeTqZztYBPmqugLALFqlmnIY0bv4p/GsiVKLsv5XeZVtABoAgHz5R6JRdIvPow/ctvAAp2DR2zV0FTbGqJ9hJSHur3JFT95278E9Bvm9NsnS5hHuLZ6FukDAE0vJi3/ItyGGsJ50Vyagtx3sAeqR2cvpmJx4yuOHojj9c6uVkVoquvFTObb+2IIokASs27r+3QcIJIReZHTOhcKYGD3GsKQmkB8Wp3FTx0V7rzgIU4 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0609; 20:E70ECuXaYnvr5eLQvlJc94un81oU55YtzsU+Eg9CN9VrF4hjkhMKYJxs88zMFWsR3w5Q1hJdbKeUa5ryDHinRS0oMSjWZpIy6K6s3oNVsZRTpKeecbbRB5KJGk509IeyIJojdcbIj3zpBfRn3SYXlPLbTm/xkapexvWfTU9ybdupLWsILBkJdUVxtpITzw+v/WHMaj80Z9hOGbljPdySEhZMkGY/ahGLngZQQPbaylqXmqlMjYD3P9qcHh2LiuWr X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2018 18:16:24.7799 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bd72a22e-8267-4d7d-43d8-08d62249d6cd 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: BLUPR12MB0609 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: nicolai.haehnle@amd.com, michel@daenzer.net, Christian.Koenig@amd.com, manasi.d.navare@intel.com, Alexander.Deucher@amd.com, Nicholas Kazlauskas , Marek.Olsak@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Variable refresh rate algorithms have typically been enabled only when the display is covered by a single source of content. This patch introduces a new default CRTC property that helps hint to the driver when the CRTC composition is suitable for variable refresh rate algorithms. Userspace can set this property dynamically as the composition changes. Whether the variable refresh rate algorithms are active will still depend on the CRTC being suitable and the connector being capable and enabled by the user for variable refresh rate support. It is worth noting that while the property is atomic it isn't filtered from legacy userspace queries. This allows for Xorg userspace drivers to implement support in non-atomic setups. Signed-off-by: Nicholas Kazlauskas --- drivers/gpu/drm/drm_atomic_helper.c | 1 + drivers/gpu/drm/drm_atomic_uapi.c | 6 ++++++ drivers/gpu/drm/drm_crtc.c | 2 ++ drivers/gpu/drm/drm_mode_config.c | 6 ++++++ include/drm/drm_crtc.h | 13 +++++++++++++ include/drm/drm_mode_config.h | 8 ++++++++ 6 files changed, 36 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 3cf1aa132778..b768d397a811 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -3473,6 +3473,7 @@ void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc, state->planes_changed = false; state->connectors_changed = false; state->color_mgmt_changed = false; + state->variable_refresh_changed = false; state->zpos_changed = false; state->commit = NULL; state->event = NULL; diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 0bb27a24a55c..32a4cf8a01c3 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -433,6 +433,10 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc, ret = drm_atomic_set_mode_prop_for_crtc(state, mode); drm_property_blob_put(mode); return ret; + } else if (property == config->prop_variable_refresh) { + if (state->variable_refresh != val) + state->variable_refresh_changed = true; + state->variable_refresh = val; } else if (property == config->degamma_lut_property) { ret = drm_atomic_replace_property_blob_from_id(dev, &state->degamma_lut, @@ -491,6 +495,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc, *val = state->active; else if (property == config->prop_mode_id) *val = (state->mode_blob) ? state->mode_blob->base.id : 0; + else if (property == config->prop_variable_refresh) + *val = state->variable_refresh; else if (property == config->degamma_lut_property) *val = (state->degamma_lut) ? state->degamma_lut->base.id : 0; else if (property == config->ctm_property) diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 5f488aa80bcd..ca33d6fb90ac 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -340,6 +340,8 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, drm_object_attach_property(&crtc->base, config->prop_mode_id, 0); drm_object_attach_property(&crtc->base, config->prop_out_fence_ptr, 0); + drm_object_attach_property(&crtc->base, + config->prop_variable_refresh, 0); } return 0; diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c index ee80788f2c40..1287c161d65d 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -310,6 +310,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev) return -ENOMEM; dev->mode_config.prop_mode_id = prop; + prop = drm_property_create_bool(dev, 0, + "VARIABLE_REFRESH"); + if (!prop) + return -ENOMEM; + dev->mode_config.prop_variable_refresh = prop; + prop = drm_property_create(dev, DRM_MODE_PROP_BLOB, "DEGAMMA_LUT", 0); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index b21437bc95bf..32b77f18ce6d 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -168,6 +168,12 @@ struct drm_crtc_state { * drivers to steer the atomic commit control flow. */ bool color_mgmt_changed : 1; + /** + * @variable_refresh_changed: Variable refresh support has changed + * on the CRTC. Used by the atomic helpers and drivers to steer the + * atomic commit control flow. + */ + bool variable_refresh_changed : 1; /** * @no_vblank: @@ -290,6 +296,13 @@ struct drm_crtc_state { */ u32 pageflip_flags; + /** + * @variable_refresh: + * + * Indicates whether the CRTC is suitable for variable refresh rate. + */ + bool variable_refresh; + /** * @event: * diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index 928e4172a0bb..1290191cd96e 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -639,6 +639,14 @@ struct drm_mode_config { * connectors must be of and active must be set to disabled, too. */ struct drm_property *prop_mode_id; + /** + * @prop_variable_refresh: Default atomic CRTC property to indicate + * whether the CRTC is suitable for variable refresh rate support. + * + * This is only an indication of support, not whether variable + * refresh is active on the CRTC. + */ + struct drm_property *prop_variable_refresh; /** * @dvi_i_subconnector_property: Optional DVI-I property to From patchwork Mon Sep 24 18:15:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kazlauskas, Nicholas" X-Patchwork-Id: 10612781 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 0C9C2157B for ; Mon, 24 Sep 2018 18:17:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE8F0296A8 for ; Mon, 24 Sep 2018 18:17:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E1CC62A2C7; Mon, 24 Sep 2018 18:17:02 +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 08DF0296A8 for ; Mon, 24 Sep 2018 18:17:01 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A27866E31A; Mon, 24 Sep 2018 18:17:00 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0065.outbound.protection.outlook.com [104.47.32.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id CE7A46E29B; Mon, 24 Sep 2018 18:16:58 +0000 (UTC) Received: from DM5PR12CA0056.namprd12.prod.outlook.com (2603:10b6:3:103::18) by BLUPR12MB0419.namprd12.prod.outlook.com (2a01:111:e400:516c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1143.17; Mon, 24 Sep 2018 18:16:55 +0000 Received: from CO1NAM03FT042.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e48::206) by DM5PR12CA0056.outlook.office365.com (2603:10b6:3:103::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1164.20 via Frontend Transport; Mon, 24 Sep 2018 18:16:55 +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 CO1NAM03FT042.mail.protection.outlook.com (10.152.81.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.1185.13 via Frontend Transport; Mon, 24 Sep 2018 18:16:54 +0000 Received: from kazbox.amd.com (10.180.168.240) by SATLEXCHOV01.amd.com (10.181.40.71) with Microsoft SMTP Server id 14.3.389.1; Mon, 24 Sep 2018 13:16:45 -0500 From: Nicholas Kazlauskas To: , Subject: [PATCH v2 3/3] drm/amd/display: Set FreeSync state using DRM VRR properties Date: Mon, 24 Sep 2018 14:15:37 -0400 Message-ID: <20180924181537.12092-4-nicholas.kazlauskas@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180924181537.12092-1-nicholas.kazlauskas@amd.com> References: <20180924181537.12092-1-nicholas.kazlauskas@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)(346002)(396003)(136003)(376002)(2980300002)(428003)(199004)(189003)(26005)(72206003)(77096007)(486006)(8936002)(110136005)(54906003)(104016004)(47776003)(53936002)(478600001)(44832011)(305945005)(50226002)(36756003)(7696005)(426003)(356003)(4326008)(51416003)(11346002)(2906002)(446003)(126002)(76176011)(48376002)(97736004)(186003)(476003)(336012)(8676002)(81156014)(50466002)(81166006)(2616005)(5024004)(14444005)(53416004)(5660300001)(6666003)(217873002)(68736007)(105586002)(106466001)(86362001)(16586007)(1076002)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR12MB0419; H:SATLEXCHOV01.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; CO1NAM03FT042; 1:pU8x3dNz3f9JF3ma/VGIrew+xYo+6p4o8llsEi/8GJHcJg2J/2niOrYCFkSqVHt2nkM5hEAWhdZxgAjt+R00jDnWCSIN/lXxlBw57Lo8AFwXJIkvhQAw0SjHpkXlATHG X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 67f7bbf0-e554-4064-c253-08d62249e895 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060); SRVR:BLUPR12MB0419; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0419; 3:B3/iCSeS6y10tK6v7mIGWziOK2+77790prEOc5mp+uj45F9xQOselmMJMLO0bF97iyyo5RjiJ/TnA8wbi/7s22UwWZL4v93Ql1IGRADM7IIs21JhAnn8eH7KNYr6XaUkX2p+0XHNJKgSUbvtrFho0lp72F+SRqJxvaMaig32kT4/0J+fd6r7hanMJuCOJZ90gkb24AE5LQnDXanepWgBY3/yD2YuXentql6zn5qJq9TsnR1ddIv5uuB6XT8hq7m8P9w21/qw5GRxXoqfpkFBkLdPpfP3dQwkdIyFGpaA9VgLgJe3DIifBdYVwGthaqloNrvOuwQPvuxvKvXz37OPRu1s6pmQdPWyBFNN+uyznig=; 25:Rko3MvjYXS45SgLc/9VAnf8/oHcYVDerAmcnxm8qUp1WrYwHw0goqlf9fAp2e6NWeQepO7m0cH4xCr880P5xff6yjM2/GMA3GYVV5TKcQMxiK9WMIDNSYmpxj/648WkgBN6420jo0i8pTTwgct+TEhnoJfQLDwocvZ+TJkN0sImmcj4u5ooJW7zHJRq16vR9ny0BKzJGotI/PFkahbc8Mw+1m1ptbxsz2Kad7tFj+jaA3Ox5iYzne77mjsjISmjJcByJ0ykzg0tN/tsWavg4YMxuKRo/Iz2Oi09wRDn39hk9/pCF252ucWXpCZNf4cqzY3o2jnsZXHwMkNZaREbojg== X-MS-TrafficTypeDiagnostic: BLUPR12MB0419: X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0419; 31:UER1U+VzTD4I8Mhxt21qhgP8vgmz8RSq6icllxCXuoHDq1FykcgbHdapyo2UsojRblxdtb5LLTIwf1LDHgc5T6y2d2kz7kLiNwdM3vAAMVOEOmAdKjCt6lvHpP0lk89cIsL0KF4Xx+Me2EthSC9DJwXdpW/qwbKv44mBS5yW2Jp6wOGzeutdz1cFW6zbylclYTs7mDrxXaYazjfqr/r1a7P/WbAe63Wfx8I87T09alU=; 20:0fdQCh2MI7vSbca4gmecUc68bQ7PjB9Gd+MM+3kO30U/9+Q+R/fs+uFYUAebdzl/J1bomAya19NXxd6YtrQeBtC8M6gEfZpvo6ITNnftSdAw2KUEjKyqnMoIpht3ow18PF2LzMAYRmGz874xT8/BdyzTDN9KlonY1c6i/NKkzzYV/Cq3S1QMO85pczHX+5ATtMpibgCStHypReJ+kpNNvdlPpV36TwQiWNf6J8xlZPU8ltgtayUvd4B368P+SufX3XzgTQm4cl6a+6pZ75R1cyu8tlWUcMXL2NU8AMstdWdWxNV4boXlDjIEJOC5zfDXrgclJ42RKgH9R2vXsphZ+NsXCi6uuKtsn7LryO2z3mdKHQn0Tg0rDFkOD56yf+b2ZapdjbGf97ZEIfM5wlX643HEIURN1TLYAuMQprPQKdxO3P8wY6mmCJXFPuXq2K1Es6kOIwC7pHGUbcMHSXsIvRg8tTDTc8lOofv7q+Tdo+5DpxZWk6mK3jspZQ7HRzN8 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)(5005006)(8121501046)(10201501046)(93006095)(93003095)(3231355)(944501410)(52105095)(3002001)(6055026)(149066)(150027)(6041310)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051); SRVR:BLUPR12MB0419; BCL:0; PCL:0; RULEID:; SRVR:BLUPR12MB0419; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0419; 4:jmtcY9hCzi9Ew6nKNSriI08ASedOAlVBh3oJ4yjKrg9u0M4ta3/oo8FzVcVNcEKn74ASkJYWv1YL2DKwn6R/djtUpsmCTsX9sOWST4es11jfyRwO7WfDs962XZwjNwIeCrMr8HekywWc9vHoQXSF6e78MLIjAZGs8Kp5HDGEOcaOFe7cCD/+QFwLA1n17o7DdcI5+e33C4WLEFOc81szsPZpTdiwvk+0H/iLqZqf09TOI8fvYYbMxY4RAeJ+5Si5CPKRThfgyanpDICWCH+ieK47dxp0oGF39YsY3KPCpHmEoFZLq8ZczuLSCzLpDqvV X-Forefront-PRVS: 0805EC9467 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR12MB0419; 23:aHb+eo2Tnx9hSgh5Y8xUr9voN4zPbIeOEL9QNIYo5?= 0xP+E1Cu1WRkL9Y8nBFQPa3B7+2WG3Ods8VKqQ8uPeUOandTs8px87XILrye1AwaGj294A4T3cUAzxMsbDwesyY6JRsbv1AGOU5K0+OUXEvLPwxZ2pxw9b9ybM2DuOmUlFg8/YP8ALiyS1HfBOAFLmejqB8ZSDuHY2EEXZCuVHpQarS9TYa1OugXD7eDGNxWeEmegF3Ogk/PefmFqs43fnxp48hT5+j1pjnbeHzdzkBNxhG0IkEW0b5cAMrzPacZa2oEixV6oC/pXAO+6UZ5F4TtUddn0SuUkNTIZ1y6oAUUVsNf0bcwaWHrioBi9xyJ9X2s/bSVgRUXX3XtCUn8LC2pRUj18uTHH4BWVlRxpBrB7ASo6C3IHXt2sfoj+TPkxGcEWWGskaTVFto4jHNfcmcH18icLkOUa9jYK7aVHNeFV1HbOHTmrNYMZZiwO9DtNHPNnor3ks7htbU7YJFAlPaCnIrxkX/oKhsZ5LnB0DoS1GYvZxYRAQzwOwn4PS2AewKw+cJLh5R6byekzVv/0ZoCgaoaZbipn/dZdCUWRNd2ibH5rd4+A1Y34s4VP5pPqbnhJXRuS8VHGQJg0CG3pOAYXc474sQE/l4V28vOqbXYZ4+x6FvPVusz2AwoUNqzV6+XH6wWFsgTdP2/8+k3kViJYb3zKgN3C90e2r/PTeBkfhr4QL887JFluc8jOsu6MS5v6smreAmiBJBJ7YYuwXwdUf5nBki0T8WDJ885x7A+ij6dOMRwYUhwS+8mDkpWPC8DYUdkYceOvIa6LHilqOjd+gwOPrysyBmiSeBHhY48x/RfKJ67LJ1nG6t7fZr3BpkLnhzJm9Xmi9FWeerf0l2zSxK8OehINwSwDwo9vKZI6HEvFNzH8Knm58cZZvdAD2MYd31UfowqKPjLUwRqavTwXGLebtyZIo5I0p0EFTQm1twovBY2v+8HXMNDifTt78A0fiWfviybJ8L1/+r254ZPiobpaCPaoerBsWMnXMejri2QlMFlSyoYNIlkHmlrrJhrvmMjL9Zkbqb278ef0etNs+CbGxa8dN0ReG6NjYDfTgBDdBXgXGnxcPM5F0YS8RitivGBX02mw/usu9FJ1wIgy2ZKnHKXla7pG6vHNb4R3cDYTKOR0ddcCp+VITDs2IEwR6NSJIJ/NbFA2STW6fJHgUg+SLeeGDxQ/KTkFbGZKCdz8+mszX1Pcab0LNCt6I= X-Microsoft-Antispam-Message-Info: pMhckOJU4zldXQbIhndj1Ez7aLFsGAjT8oGzvAdK4RKfIEFNxIm0UhpMSDGzdLXo7r+9SGgY4Fy2U6RWGcCV5daiwPV6FoDTQ256wDIfT7L3LTkm27t592qMiCcjNxwdWHHbn0rbC9vDk1uy2y8w/P+DbEvZejXR2mD1ZCl5IZLKvShmJ8yxv8BrmscipO9EOpbpeCQVIBb7OUS8T5qoHzuMB2AdG6pMdb89bb2Q10uc2mRgrWaWcnMHLx3yahBvsXDG/EoeeuvwfxRnnksDLEXTxwddw7coF5k6jek0aniqeED2DjH3XDayIqbbm+puhpo6Xkfacdtf48AkneEqUB63SOMi9phc/5E6qyrgEZM= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0419; 6:fAaxxzgfs3Wq1eCkY9T0gHHQb3XK0uj/kZt9Ee9+S0ZhoNVdvs7pSCdXCOryhQF1hY0K8ovBB1B5o8VB/UXJl52Iz12ZcN6620UC9adUqipUS3N4oZOQFxmP4HiIli/O6rfzTrZa5yoN0dXpqh567n0mjCqWcnyatVhxfs7WmuA3re0lxUJ4/ALABNZGKM+TidLxcG+CX24VE2gZsVBYhn3v1nRIjm+htaGxSLFdzrLAukQg2ea/jyHQXU8kYAFJHDsCy2cTd84URbzwgMoYz47P5ipsMtxFpm7yF2ogNEozg8ilu15NLkApAtrur4WvJERKdq0RulafepXEfCVLbmpShmU1R4pDczyYIW5QeA4oed5/i/DaMbZIh5XnEUzsTzikF1X4FXea/G/6E5iCOUwE4C3OTVeLlEJULjqJSIUxS5Ty/TMHokLuKLP2AoxCEYA42LNmI3iX3iUCSbLayw==; 5:62m+V3uifZfFuH6Kv97xJ37wp7qs4GcZMgx0Ch3IKF/etUjHLp9D0k6yoWr3Ry3hwSg1rF/4gNZ76t//Z6P0zVHCxy9691FG/cESp5TNvz5fwnjfH0swZ8oyrDN7MVrYxtrTFO/J2tjM6ysVOb30zdhEmLMz9nkERGI25BNmAb8=; 7:AV2KQKRST+HKVUjJaI/3UHVtsHDRxl2+wZ7PXPk/vpBUshitNIjSkw6Q0aHY65ujIC1Lq7kzDHSm12iep93NZOXtywNcj0r1wYl0fq/vOMCwyHKTc+gr7yXoHn/rNd0w8AjP5ja3pqYX6ZwOcG+3ZeTcbPF0oP/z/8cpIpOgNWZcbycwTjkJcvALENLVr7um/Esdlg/boe3lsh1d04/jL1dvabOpv4/+h0b1FS/J18EOTyYFk352tod6vfhp7uVi SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0419; 20:rIQmirvPzOmuH57e8UfRVKGktkTne8Z48Olm4ddTFClDu8Eh6gagpTm+hDijzcQ44eOLlidyZNuAPELMhYZtK1RCcvye6Kd9OjXBvRhN8Gmjil91Z2Q5IknZlVwmjRG6rJazaCYQ7+ZXO178rPEuRcsQNFiljkz/rfMv3FuLTgcH2W8NpRWaC6kgq1bhJQU5OjUGB1UnJ4xXtEQhkJSZz/Rwc0BMQklWgdunc/I+qQGIeGIocimVJIc5qkyBhGo4 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2018 18:16:54.6152 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 67f7bbf0-e554-4064-c253-08d62249e895 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: BLUPR12MB0419 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: nicolai.haehnle@amd.com, michel@daenzer.net, Christian.Koenig@amd.com, manasi.d.navare@intel.com, Alexander.Deucher@amd.com, Nicholas Kazlauskas , Marek.Olsak@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP The AMDGPU specific FreeSync properties and IOCTLs are dropped from amdgpu_dm in favor of the DRM variable refresh properties. The AMDGPU connector properties freesync_capable and freesync_enabled are mostly direct mappings to the DRM variable_refresh_capable and variable_refresh_enabled. The AMDGPU CRTC freesync_enabled property requires special care to handle correctly. The DRM variable_refresh property is a content hint to the driver which is independent from actual hardware variable refresh capability and user configuration. To handle changes with this property it was easier to drop the forced modeset on variable refresh change. This patch now performs the required stream updates when planes are attached *or* flipped. This is done for a few reasons: (1) VRR stream updates can be done in the fast update path (2) amdgpu_dm_atomic_check would have had to been hacked apart to check desired variable refresh state and capability before the CRTC disable pass. (3) Performing VRR stream updates on-flip is needed for enabling BTR support. FreeSync state on the stream is now tracked and compared to the previous packet sent to the hardware. It's worth noting that the current implementation treats variable_refresh_enabled as a strict requirement for sending the VRR enable *or* disable packet. Signed-off-by: Nicholas Kazlauskas --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 232 +++++++++--------- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 6 +- 2 files changed, 121 insertions(+), 117 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 6c849e055038..0fddc2e66f49 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -1683,72 +1683,6 @@ static void dm_bandwidth_update(struct amdgpu_device *adev) /* TODO: implement later */ } -static int amdgpu_notify_freesync(struct drm_device *dev, void *data, - struct drm_file *filp) -{ - struct drm_atomic_state *state; - struct drm_modeset_acquire_ctx ctx; - struct drm_crtc *crtc; - struct drm_connector *connector; - struct drm_connector_state *old_con_state, *new_con_state; - int ret = 0; - uint8_t i; - bool enable = false; - - drm_modeset_acquire_init(&ctx, 0); - - state = drm_atomic_state_alloc(dev); - if (!state) { - ret = -ENOMEM; - goto out; - } - state->acquire_ctx = &ctx; - -retry: - drm_for_each_crtc(crtc, dev) { - ret = drm_atomic_add_affected_connectors(state, crtc); - if (ret) - goto fail; - - /* TODO rework amdgpu_dm_commit_planes so we don't need this */ - ret = drm_atomic_add_affected_planes(state, crtc); - if (ret) - goto fail; - } - - for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) { - struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state); - struct drm_crtc_state *new_crtc_state; - struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc); - struct dm_crtc_state *dm_new_crtc_state; - - if (!acrtc) { - ASSERT(0); - continue; - } - - new_crtc_state = drm_atomic_get_new_crtc_state(state, &acrtc->base); - dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); - - dm_new_crtc_state->freesync_enabled = enable; - } - - ret = drm_atomic_commit(state); - -fail: - if (ret == -EDEADLK) { - drm_atomic_state_clear(state); - drm_modeset_backoff(&ctx); - goto retry; - } - - drm_atomic_state_put(state); - -out: - drm_modeset_drop_locks(&ctx); - drm_modeset_acquire_fini(&ctx); - return ret; -} static const struct amdgpu_display_funcs dm_display_funcs = { .bandwidth_update = dm_bandwidth_update, /* called unconditionally */ @@ -1762,7 +1696,6 @@ static const struct amdgpu_display_funcs dm_display_funcs = { dm_crtc_get_scanoutpos,/* called unconditionally */ .add_encoder = NULL, /* VBIOS parsing. DAL does it. */ .add_connector = NULL, /* VBIOS parsing. DAL does it. */ - .notify_freesync = amdgpu_notify_freesync, }; @@ -2645,7 +2578,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, update_stream_signal(stream); - if (dm_state && dm_state->freesync_capable) + if (dm_state && dm_state->base.variable_refresh_capable) stream->ignore_msa_timing_param = true; finish: if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL) @@ -2713,9 +2646,10 @@ dm_crtc_duplicate_state(struct drm_crtc *crtc) dc_stream_retain(state->stream); } + state->freesync_enabled = cur->freesync_enabled; + state->freesync_config = cur->freesync_config; state->adjust = cur->adjust; state->vrr_infopacket = cur->vrr_infopacket; - state->freesync_enabled = cur->freesync_enabled; /* TODO Duplicate dc_stream after objects are stream object is flattened */ @@ -2933,9 +2867,6 @@ amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector) __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base); - new_state->freesync_capable = state->freesync_capable; - new_state->freesync_enable = state->freesync_enable; - return &new_state->base; } @@ -3681,6 +3612,11 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, adev->mode_info.underscan_vborder_property, 0); + if (connector_type == DRM_MODE_CONNECTOR_HDMIA || + connector_type == DRM_MODE_CONNECTOR_DisplayPort) { + drm_connector_attach_variable_refresh_properties( + &aconnector->base); + } } static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap, @@ -4057,6 +3993,63 @@ static void prepare_flip_isr(struct amdgpu_crtc *acrtc) acrtc->crtc_id); } +static void update_freesync_state_on_stream( + struct amdgpu_display_manager *dm, + struct dm_crtc_state *new_crtc_state, + struct dc_stream_state *new_stream) +{ + struct mod_vrr_params vrr = {0}; + struct dc_info_packet vrr_infopacket = {0}; + struct mod_freesync_config config = new_crtc_state->freesync_config; + + if (!new_stream) + return; + + if (new_crtc_state->freesync_enabled) { + config.state = new_crtc_state->base.variable_refresh ? + VRR_STATE_ACTIVE_VARIABLE : + VRR_STATE_INACTIVE; + } + + mod_freesync_build_vrr_params(dm->freesync_module, + new_stream, + &config, &vrr); + + mod_freesync_build_vrr_infopacket( + dm->freesync_module, + new_stream, + &vrr, + &vrr_infopacket); + + new_crtc_state->freesync_timing_changed = + (memcmp(&new_crtc_state->adjust, + &vrr.adjust, + sizeof(vrr.adjust)) != 0); + + new_crtc_state->freesync_vrr_info_changed = + (memcmp(&new_crtc_state->vrr_infopacket, + &vrr_infopacket, + sizeof(vrr_infopacket)) != 0); + + new_crtc_state->adjust = vrr.adjust; + new_crtc_state->vrr_infopacket = vrr_infopacket; + + new_stream->adjust = new_crtc_state->adjust; + new_stream->vrr_infopacket = vrr_infopacket; + + if (new_crtc_state->freesync_vrr_info_changed) + DRM_DEBUG_KMS("Freesync VRR info changed: crtc_id=%d wanted=%d actual=%d", + (int)new_crtc_state->base.crtc->base.id, + (int)new_crtc_state->base.variable_refresh, + (int)vrr.state); + + if (new_crtc_state->freesync_timing_changed) + DRM_DEBUG_KMS("Freesync timing changed: crtc_id=%d min=%d max=%d\n", + (int)new_crtc_state->base.crtc->base.id, + (int)vrr.adjust.v_total_min, + (int)vrr.adjust.v_total_max); +} + /* * Executes flip * @@ -4078,6 +4071,7 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc, struct dc_flip_addrs addr = { {0} }; /* TODO eliminate or rename surface_update */ struct dc_surface_update surface_updates[1] = { {0} }; + struct dc_stream_update stream_update = {0}; struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state); @@ -4137,11 +4131,21 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc, surface_updates->surface = dc_stream_get_status(acrtc_state->stream)->plane_states[0]; surface_updates->flip_addr = &addr; + if (acrtc_state->stream) { + if (acrtc_state->freesync_timing_changed) + stream_update.adjust = + &acrtc_state->stream->adjust; + + if (acrtc_state->freesync_vrr_info_changed) + stream_update.vrr_infopacket = + &acrtc_state->stream->vrr_infopacket; + } + dc_commit_updates_for_stream(adev->dm.dc, surface_updates, 1, acrtc_state->stream, - NULL, + &stream_update, &surface_updates->surface, state); @@ -4201,10 +4205,10 @@ static bool commit_planes_to_stream( stream_update->dst = dc_stream->dst; stream_update->out_transfer_func = dc_stream->out_transfer_func; - if (dm_new_crtc_state->freesync_enabled != dm_old_crtc_state->freesync_enabled) { + if (dm_new_crtc_state->freesync_vrr_info_changed) stream_update->vrr_infopacket = &dc_stream->vrr_infopacket; + if (dm_new_crtc_state->freesync_timing_changed) stream_update->adjust = &dc_stream->adjust; - } for (i = 0; i < new_plane_count; i++) { updates[i].surface = plane_states[i]; @@ -4341,9 +4345,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags); } - dc_stream_attach->adjust = acrtc_state->adjust; - dc_stream_attach->vrr_infopacket = acrtc_state->vrr_infopacket; - if (false == commit_planes_to_stream(dm->dc, plane_states_constructed, planes_count, @@ -4515,6 +4516,17 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) } } + /* Handle freesync changes. */ + for_each_new_crtc_in_state(state, crtc, new_crtc_state, j) { + if (!new_crtc_state->active) + continue; + + dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); + + update_freesync_state_on_stream(dm, + dm_new_crtc_state, dm_new_crtc_state->stream); + } + /* Handle scaling and underscan changes*/ for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) { struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state); @@ -4547,9 +4559,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) WARN_ON(!status); WARN_ON(!status->plane_count); - dm_new_crtc_state->stream->adjust = dm_new_crtc_state->adjust; - dm_new_crtc_state->stream->vrr_infopacket = dm_new_crtc_state->vrr_infopacket; - /*TODO How it works with MPO ?*/ if (!commit_planes_to_stream( dm->dc, @@ -4767,20 +4776,19 @@ static int do_aquire_global_lock(struct drm_device *dev, return ret < 0 ? ret : 0; } -void set_freesync_on_stream(struct amdgpu_display_manager *dm, - struct dm_crtc_state *new_crtc_state, - struct dm_connector_state *new_con_state, - struct dc_stream_state *new_stream) +static void get_freesync_config_for_crtc( + struct dm_crtc_state *new_crtc_state, + struct dm_connector_state *new_con_state) { struct mod_freesync_config config = {0}; - struct mod_vrr_params vrr = {0}; - struct dc_info_packet vrr_infopacket = {0}; struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(new_con_state->base.connector); - if (new_con_state->freesync_capable && - new_con_state->freesync_enable) { - config.state = new_crtc_state->freesync_enabled ? + new_crtc_state->freesync_enabled = false; + + if (new_con_state->base.variable_refresh_capable && + new_con_state->base.variable_refresh_enabled) { + config.state = new_crtc_state->base.variable_refresh ? VRR_STATE_ACTIVE_VARIABLE : VRR_STATE_INACTIVE; config.min_refresh_in_uhz = @@ -4788,19 +4796,20 @@ void set_freesync_on_stream(struct amdgpu_display_manager *dm, config.max_refresh_in_uhz = aconnector->max_vfreq * 1000000; config.vsif_supported = true; - } - mod_freesync_build_vrr_params(dm->freesync_module, - new_stream, - &config, &vrr); + new_crtc_state->freesync_enabled = true; + } - mod_freesync_build_vrr_infopacket(dm->freesync_module, - new_stream, - &vrr, - &vrr_infopacket); + new_crtc_state->freesync_config = config; +} - new_crtc_state->adjust = vrr.adjust; - new_crtc_state->vrr_infopacket = vrr_infopacket; +static void reset_freesync_config_for_crtc( + struct dm_crtc_state *new_crtc_state) +{ + memset(&new_crtc_state->adjust, 0, + sizeof(new_crtc_state->adjust)); + memset(&new_crtc_state->vrr_infopacket, 0, + sizeof(new_crtc_state->vrr_infopacket)); } static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, @@ -4875,9 +4884,6 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, break; } - set_freesync_on_stream(dm, dm_new_crtc_state, - dm_new_conn_state, new_stream); - if (dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) && dc_is_stream_scaling_unchanged(new_stream, dm_old_crtc_state->stream)) { new_crtc_state->mode_changed = false; @@ -4886,9 +4892,6 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, } } - if (dm_old_crtc_state->freesync_enabled != dm_new_crtc_state->freesync_enabled) - new_crtc_state->mode_changed = true; - if (!drm_atomic_crtc_needs_modeset(new_crtc_state)) goto next_crtc; @@ -4925,6 +4928,8 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, dc_stream_release(dm_old_crtc_state->stream); dm_new_crtc_state->stream = NULL; + reset_freesync_config_for_crtc(dm_new_crtc_state); + *lock_and_validation_needed = true; } else {/* Add stream for any updated/enabled CRTC */ @@ -5002,7 +5007,8 @@ static int dm_update_crtcs_state(struct amdgpu_display_manager *dm, amdgpu_dm_set_ctm(dm_new_crtc_state); } - + /* Update Freesync settings. */ + get_freesync_config_for_crtc(dm_new_crtc_state, dm_new_conn_state); } return ret; @@ -5267,12 +5273,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, goto fail; for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { - struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); - struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); - if (!drm_atomic_crtc_needs_modeset(new_crtc_state) && !new_crtc_state->color_mgmt_changed && - (dm_old_crtc_state->freesync_enabled == dm_new_crtc_state->freesync_enabled)) + !new_crtc_state->variable_refresh_changed) continue; if (!new_crtc_state->enable) @@ -5434,6 +5437,8 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, return; } + connector->state->variable_refresh_capable = false; + if (!edid) { dm_con_state = to_dm_connector_state(connector->state); @@ -5441,8 +5446,6 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, amdgpu_dm_connector->max_vfreq = 0; amdgpu_dm_connector->pixel_clock_mhz = 0; - dm_con_state->freesync_capable = false; - dm_con_state->freesync_enable = false; return; } @@ -5466,7 +5469,6 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, amdgpu_dm_connector); } } - dm_con_state->freesync_capable = false; if (edid_check_required == true && (edid->version > 1 || (edid->version == 1 && edid->revision > 1))) { for (i = 0; i < 4; i++) { @@ -5498,7 +5500,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10) { - dm_con_state->freesync_capable = true; + connector->state->variable_refresh_capable = true; } } } diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index d4f1bdf93207..debde9899ba7 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -187,7 +187,11 @@ struct dm_crtc_state { int crc_skip_count; bool crc_enabled; + bool freesync_timing_changed; + bool freesync_vrr_info_changed; + bool freesync_enabled; + struct mod_freesync_config freesync_config; struct dc_crtc_timing_adjust adjust; struct dc_info_packet vrr_infopacket; }; @@ -209,8 +213,6 @@ struct dm_connector_state { uint8_t underscan_vborder; uint8_t underscan_hborder; bool underscan_enable; - bool freesync_enable; - bool freesync_capable; }; #define to_dm_connector_state(x)\