From patchwork Fri Oct 5 20:39:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kazlauskas, Nicholas" X-Patchwork-Id: 10628717 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 CA7AB933 for ; Fri, 5 Oct 2018 20:40:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BA31829940 for ; Fri, 5 Oct 2018 20:40:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B6E4B29AA4; Fri, 5 Oct 2018 20:40:46 +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 B1ECF29940 for ; Fri, 5 Oct 2018 20:40:45 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 63E9D6E8D8; Fri, 5 Oct 2018 20:40:44 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM04-CO1-obe.outbound.protection.outlook.com (mail-eopbgr690083.outbound.protection.outlook.com [40.107.69.83]) by gabe.freedesktop.org (Postfix) with ESMTPS id A96CB6E8CD; Fri, 5 Oct 2018 20:40:42 +0000 (UTC) Received: from MWHPR1201CA0002.namprd12.prod.outlook.com (2603:10b6:301:4a::12) by SN1PR12MB0430.namprd12.prod.outlook.com (2a01:111:e400:5865::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1207.21; Fri, 5 Oct 2018 20:40:40 +0000 Received: from DM3NAM03FT028.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e49::200) by MWHPR1201CA0002.outlook.office365.com (2603:10b6:301:4a::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1207.18 via Frontend Transport; Fri, 5 Oct 2018 20:40:39 +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 DM3NAM03FT028.mail.protection.outlook.com (10.152.82.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.1207.19 via Frontend Transport; Fri, 5 Oct 2018 20:40:39 +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; Fri, 5 Oct 2018 15:40:38 -0500 From: Nicholas Kazlauskas To: , Subject: [PATCH v3 4/4] drm/amd/display: Set FreeSync state using drm VRR properties Date: Fri, 5 Oct 2018 16:39:49 -0400 Message-ID: <20181005203949.6289-5-nicholas.kazlauskas@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181005203949.6289-1-nicholas.kazlauskas@amd.com> References: <20181005203949.6289-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)(39860400002)(376002)(346002)(2980300002)(428003)(189003)(199004)(53936002)(77096007)(26005)(4326008)(186003)(1076002)(5660300001)(86362001)(47776003)(68736007)(6666003)(4744004)(356003)(316002)(76176011)(2906002)(486006)(478600001)(51416003)(48376002)(11346002)(305945005)(126002)(476003)(2616005)(446003)(105586002)(53416004)(72206003)(106466001)(426003)(50466002)(336012)(81166006)(81156014)(50226002)(104016004)(36756003)(97736004)(110136005)(14444005)(5024004)(8936002)(54906003)(8676002)(44832011)(7696005)(16586007); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0430; H:SATLEXCHOV01.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; DM3NAM03FT028; 1:qENg/C2rfsls+BKxPR4AjNGwVf00U+cA0tknyPDO+sh9A5qsJCeQnnIAsbBtUax9NVUU+0MrbYQy4c0NwKhDlckWVfiJFRWYa85KMI91GJmeDzmC8HcToUu88X4DHv2R X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 17e3ab8c-d104-4975-8a24-08d62b02cfce X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060); SRVR:SN1PR12MB0430; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0430; 3:2bYPNu9a4f30zEj26kH6/fuRvS339Yiaot5eic6JPqoZq3/j6OoUqOuFQuo2pVTbUB6DsB/9AkPxK9ofMuFLi/pIf4mxTR0OM7Fa+RjwWlWuAoOmN+z7XwuzscPfJtnr6yEfCuu79WvCdQaaeG7M4MN7mrwgyuHEmYohi3Oaxbg1ubKfYN1ier0O6e4OmdSMuQzRUfGbWsn1p0z962k717N1HxCfTIxUjC8OjQmJ+/AJG5OALodfjj01c+Yi5P5hFTESFzLoK9S7FVAismP7L3MeHezdr9r0yGAdPATygtIq81Wnl6+Nhmzd2fG3TcNLGetZfgYfzO3QphvXOxXNYTevMFcFwaQ5c+v9Ki4Om+c=; 25:n2CJ2LJKTTsFygXo8/Px20rlFWvUnFIZG80boEWwNDV+b+ptL0RKJY1oGsdjMav1iWguIfp7KDd+Aon34rnlcYvRy9C9GRfo1wCwzdXXrL9dci6CoXhU0P0ztY1+znfiNElP9bA0Akuy/Tw71ay/PLCKKXRpmhUb0Wt2i0buVutI8+Vh5ph/dXq9M2r0V1TIbeZNxiU+N8O7EIEUaqP2XYCLWE7ExqywfEGPiknOhwpnQXTy7YtREZQsEVtO/dFHuXcH7sz6/l1jhJl8MJ9EXv9cDi+VcT58XhLFOeDYM39Ey8hEp2KVK+gD056Kd84R9aORdgUJ9aQvcorUi0VYyw== X-MS-TrafficTypeDiagnostic: SN1PR12MB0430: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0430; 31:tpHQ0DSvs0b/vjnP5TE1FEwur321d1H31D8FjE3ZJrx2dLkDlErUraCOHnpEeFRaMuB409XjeRSIdUfW0Uayt+hULawi5015zZB59cksSCQXF4NlTuneVZkF+DZYC8h8af1lmH4QqUnZKYz5jGjzksRCWOuNHJ3PtSllTqau47Qq0PnaguMSRy5arfe60cj58KTmV/dXjW3x8YSTnYNIZM8C7hH/SQP3AYyra79jRAI=; 20:enK1KjP37fErV63aVS9ZY8SRKWRAbhCkfJ/eLxKg7hLvihbXLlwEBP/0CnkZmkDyfE4zMVK8eX44+PXPmt1C1EPQA8XAXIOOXLRycRc5oNlj6PKL0XCbMtpqmWsU1p3ll/WePBnXKFrEqLhE8ShB2FXdeVlPvDEEPgRhRR+mDPdG0+fpYmAhxeYpBCTxOXO44pUvd928txqQv5PQjlZOsU+Ymu9XYkR9X4dK7h+JXgUbEMUcQsWPAJhTNcfCm+7TeAi2JKZyQWkzmeJKcDfCIz7QadG73XLvxWIuqUgnIm0pqQOfnxbzaqZpbALWGgrHLVFoWHH7PV9aqmWTumN41KnluX/zbvdKkRJcxVtVsPIB76Hb7KnfCyqdt3GFtgekkKSM7V3ENRHGHb63TSj3khaEl/z+2nP/TZel1+uEUXk1yCUnoatEPN5dwIEOtN4GoBEVgNPEkZFh3k4FvOp80uXAkIIebzK5ssdiMRcj+f4f+4QwLAI1TDkj+pJfb36X 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)(3002001)(10201501046)(3231355)(944501410)(52105095)(93006095)(93003095)(6055026)(149066)(150057)(6041310)(20161123560045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123562045)(201708071742011)(7699051); SRVR:SN1PR12MB0430; BCL:0; PCL:0; RULEID:; SRVR:SN1PR12MB0430; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0430; 4:gBRQI18h5iKpwm0S+FOF4jxbYGCllIwTdiMcOCJ5YACsPR3Cdx5WNpdw2tao4wMOVj0z+ZfBrVvp8es4yNB+/bUSwKuFlgyY3qQQ9ERDmOO+UF7GKoNdPDKRd8YvrVoCOcCYD2IrSbaZeKnANXVC4hy3cSzlYif2/bYs26xTN5Or9fS56dks9yk59Ia6FPEgK2XuE/M1WnzGUbJEnbnqpcaP3oUoVUUc4j1QSFiNGfDGn2pv/hr842g6zRLsDR+rKnGcRBwRi1zPtxXhp/a5rABqmqdB4z9xhTn2YYhdVOlocdL2rcT4kFWddq9ZMNSF X-Forefront-PRVS: 0816F1D86E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR12MB0430; 23:sYSsUUPKH8uMzrvIBP3hroA59nNUbaXs6MRtx9Ar0?= uMkU/mXOrwyQVxXAqsvWLObCqXwneFP8UtSJKAPzJwUCIrF8nkzGWPtnnTEy+IGSKA2Z0AgQrT1JbghGU+CCGf9ykNfNg1GPOu8HYdtaZn108Te8164sHjoj1Bih01E56K2QPlGrOrkKGOubZtNeZWnmA5GBNTTtYKeeEgF4eEcHpH8r/KUrt+Lk+tYJsffrKqV0VwJU0ki8RK64t6jr9sPbjY4nDH9O15fjxRcerP2Pz3ZGwETpvCR/dLa2l4xz0CJi+ITe/8D0yzLBlUaT49PNA6SCi22urtbAekshMZDoaQZwyp/m4DAQA6pMpBAiYRFPiDi2+6AZN5o3aX1CoQ3vZLNpFV9q5q/Q92dKcel7Idme+VpyjiqujfjsYEbFFHmut8idJw8iVhUnJnF+KT8KNR27dmOgFz+9AEnazTbAw78ATuEG/OySP3qQl6+m4SYbI7N42FkwLCVkQgxUVwVBpuQ09ZCXScLrwIJSQRm9TiToLWRdChB5+8vcLlvqC9LhxYIn8E9Mq0SRJE62LddFkJDYZ+S1uw6ndfTScUj1P9JmUa+MKsoY6a0mA+mwQ4UIIBlv6Tw5Pquicp07GDxgo7Yorzw4vPAFWXz5qoxPB0JLTk3GunD7vmG9orO1dfjSQZxWFKgMt21ssFHk9HLfca8+3OR55BTjAvFllnlGx+j+NQbrur0/ruv/FtbLXGREKFlHt1M89+E8MouhKxJgKqzeK0XW7hWJGgCuR0fwk1bK30esvkCWbfc9+HV++MkIfcw045jUKrPU1qo7BGSPcMqykS+nbDqF+0V5PN9n4JMURUhHeGBXQNva313dphNd6VQAm/rRcnU9Z2VfjW+jAu6ZXgj4micdq0qvZOq5wpHHS3Aifb2v3fOd5uyTSKmEBKnnDe0EDgGwAHcR0vRR0xaIIOSnktg9fxZ8d7rCmlSyS6Dp3NLvu1ONnhmugWjuQlJ8u7/7MEhhlgEb4c8cKfPzehd+608zjYzXzU8m7pGYJtokgx8Q0PpF1rE5JvHtvgLj9piIG0YQNgwEebOceAIE3+QgYwporfWvpOfyo+LtzUfBZQf3Mp9cubrhH9pB8mEiAFCjuHtak+hXyioq0AF28w9LwyxT9fhclO9otunfqsGDDWkbcvSCQMws6tQXVr0y2PwAxFv6mgQkwRctwXP4jr6sd2hPCUqiUj16uM/V1PBkMUApRI8C0EDRNQ= X-Microsoft-Antispam-Message-Info: v+WzS7EmlgcoOPNkBFOalbCBXB+OTxLqquRhUsK8r+/iIIH65oM0A6uK8yA83kb+Uu4p0h8nPAuDb44YoMbMoj3JTdGr4oOxrpm9SzpwVezKth9PQFivsD9QC3hvVMAtVamvPkEbFaaQ7zG9HQ2T9zXjC7LzQ9mkKJZsF2Jb8cmes2NnX0IeGEJ6ImE1k74DAP3bY+cH7mkO1pSdjXymQ0SwPvcfSepWvjMN8W3Hp4Yd9JTBR77oaFsuIih4JJtWeLeTF96b/dkmlhpusfX5GfTAYEGeFpkwfylzmmyftF4Wy79b/98KntDfyaGD3Vyja0BFp/Ntt881HbukPja82I5whXWoTOmrKWzCO3pUDiE= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0430; 6:RcPclHBkv/gPwZ54DClri6KUxrRG9TkI9PYyc8bkvlqc8bB9BacDmgi2AK8IDAv6TSNJeTehsg/iD9Ivq/3e8RdKJPF1Z7Bmh9uslJFS7CYkJ457vLHij18Lgb9qucZddjgJdBZFQcXqF8nLgObu6sI0y7acFYDa9MufJMjHZLJWjKkh6DyMzDUCBedag+ny3qsBeWVeU5oAmXrROnCfqdMCrAvyyWZd4tLu9AjjRsBBNCQVhbEZKwokUeS6qvh6+Wr64Lx6A1BhlfIW7Re7JbqLTrB6oSp0+tjIAjYMgOkZdqa4wMZ4sY19mhrOEn85l6DXEl5PBdKXr/OQWe0fgEKfOsHQzqciC5EoL5pJOb9iRIrHjQBIFMl0ZCMGvpSG41CpcahHpTD2jsVwrbPIXuVCg043K2ZIkikvqk8NgeX8Ndm1ktrxpWYIbyavT6TT5FCeXp9hY9rYqCcypwa6SA==; 5:QmEnmqEMh0UMk27rx098G0bRDUokh9SLVfYV2vvflp9Ui1GGm/mwq4R5eSG8C45LpJnmNGaZFqZsgVQcpHTOyjIJkO+OvitofMVgltGOvjtoMHwDSzR1v05hyZ6CxznXIlGEBNrLeiNQoJ2OB6s4hWdvNOTnO/xWrJ4SH5/60Cc=; 7:nSJM6m5r1azthMuBeaI+J8LnF1WsBNlx8mGPDMfIspak7Vn1UAhQTvgDf7iUGFziDv4/9x4TfXAGZEIm7aEOeRNTwD0/D2IGGJKSxaCMVm4Bym2BrPOUXoR3a1mE7NZ6FZo+7YqTXsDMNn27o57KTlbPm1IrlBTlVuIKJVEE6CYAlLTFgvx9n49U3shr9/F7J6jL8Z3MGlr4SMUxcVvtaXn/N74j45MABXOWDzqUpq+nAiUG67aAG1NeCAd5PVG5 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0430; 20:S8foSEuKfrB1Z//LPnjf5giBQDrLUwImtoKjU2wYYxPZ4wlRGwD0kkBIVjJ/30Lie5EFp7beqZx2jB4F5aWKwZ6+Kgc+TX5WJp1Hff1+xvfdwn1B/zPjwJICOdODKf03xS//knVXg9hqKM6fVePMuUVz+MRuBsYje+eGtCyFEahtqRU71hXNQy/SBvjDqCF1kJCdEcQQtM+FlhwespYVdpL/MynWLTs4d2o1zbh7ZuUQxzDtB5XSaAJuUuSFjl8I X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Oct 2018 20:40:39.1945 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 17e3ab8c-d104-4975-8a24-08d62b02cfce 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: SN1PR12MB0430 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 Support for AMDGPU specific FreeSync properties and ioctls are dropped from amdgpu_dm in favor of supporting drm variable refresh rate properties. The drm vrr_capable property is now attached to any DP/HDMI connector. Its value is updated accordingly to the connector's FreeSync capabiltiy. The freesync_enable logic and ioctl control has has been dropped in favor of utilizing the vrr_enabled on the drm CRTC. This allows for more fine grained atomic control over which CRTCs should support variable refresh rate. To handle state changes for vrr_enabled it was easiest to drop the forced modeset on freesync_enabled change. This patch now performs the required strema updates when planes are 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. VRR packets and timing adjustments are now tracked and compared to previous values sent to the hardware. Signed-off-by: Nicholas Kazlauskas --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 255 +++++++++--------- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 7 +- 2 files changed, 138 insertions(+), 124 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 6a2342d72742..0a608e31ad95 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -1802,72 +1802,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 */ @@ -1881,7 +1815,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, }; @@ -2834,7 +2767,8 @@ dm_crtc_duplicate_state(struct drm_crtc *crtc) state->adjust = cur->adjust; state->vrr_infopacket = cur->vrr_infopacket; - state->freesync_enabled = cur->freesync_enabled; + state->vrr_supported = cur->vrr_supported; + state->freesync_config = cur->freesync_config; /* TODO Duplicate dc_stream after objects are stream object is flattened */ @@ -3053,8 +2987,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; } @@ -3800,6 +3732,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_vrr_capable_property( + &aconnector->base); + } } static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap, @@ -4176,6 +4113,77 @@ 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; + + /* + * TODO: Determine why min/max totals and vrefresh can be 0 here. + * For now it's sufficient to just guard against these conditions. + */ + + if (!new_stream->timing.h_total || !new_stream->timing.v_total) + return; + + if (new_crtc_state->vrr_supported && + config.min_refresh_in_uhz && + config.max_refresh_in_uhz) { + config.state = new_crtc_state->base.vrr_enabled ? + VRR_STATE_ACTIVE_VARIABLE : + VRR_STATE_INACTIVE; + } else { + config.state = VRR_STATE_UNSUPPORTED; + } + + mod_freesync_build_vrr_params(dm->freesync_module, + new_stream, + &config, &vrr); + + mod_freesync_build_vrr_infopacket( + dm->freesync_module, + new_stream, + &vrr, + packet_type_vrr, + transfer_func_unknown, + &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.vrr_enabled, + (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 * @@ -4197,6 +4205,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); struct dc_stream_status *stream_status; @@ -4269,11 +4278,26 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc, } surface_updates->flip_addr = &addr; + if (acrtc_state->stream) { + update_freesync_state_on_stream( + &adev->dm, + acrtc_state, + 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); @@ -4333,11 +4357,6 @@ 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) { - stream_update->vrr_infopacket = &dc_stream->vrr_infopacket; - stream_update->adjust = &dc_stream->adjust; - } - for (i = 0; i < new_plane_count; i++) { updates[i].surface = plane_states[i]; updates[i].gamma = @@ -4473,9 +4492,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, @@ -4679,9 +4695,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, @@ -4899,20 +4912,18 @@ 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->vrr_supported = new_con_state->freesync_capable; + + if (new_con_state->freesync_capable) { + config.state = new_crtc_state->base.vrr_enabled ? VRR_STATE_ACTIVE_VARIABLE : VRR_STATE_INACTIVE; config.min_refresh_in_uhz = @@ -4922,19 +4933,18 @@ void set_freesync_on_stream(struct amdgpu_display_manager *dm, config.vsif_supported = true; } - mod_freesync_build_vrr_params(dm->freesync_module, - new_stream, - &config, &vrr); + new_crtc_state->freesync_config = config; +} - mod_freesync_build_vrr_infopacket(dm->freesync_module, - new_stream, - &vrr, - packet_type_fs1, - NULL, - &vrr_infopacket); +static void reset_freesync_config_for_crtc( + struct dm_crtc_state *new_crtc_state) +{ + new_crtc_state->vrr_supported = false; - new_crtc_state->adjust = vrr.adjust; - new_crtc_state->vrr_infopacket = vrr_infopacket; + 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, @@ -5009,9 +5019,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; @@ -5020,9 +5027,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; @@ -5059,6 +5063,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 */ @@ -5136,7 +5142,9 @@ 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; @@ -5401,12 +5409,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->vrr_enabled) continue; if (!new_crtc_state->enable) @@ -5558,14 +5563,15 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, struct detailed_data_monitor_range *range; struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector); - struct dm_connector_state *dm_con_state; + struct dm_connector_state *dm_con_state = NULL; struct drm_device *dev = connector->dev; struct amdgpu_device *adev = dev->dev_private; + bool freesync_capable = false; if (!connector->state) { DRM_ERROR("%s - Connector has no state", __func__); - return; + goto update; } if (!edid) { @@ -5575,9 +5581,7 @@ 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; + goto update; } dm_con_state = to_dm_connector_state(connector->state); @@ -5585,10 +5589,10 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, edid_check_required = false; if (!amdgpu_dm_connector->dc_sink) { DRM_ERROR("dc_sink NULL, could not add free_sync module.\n"); - return; + goto update; } if (!adev->dm.freesync_module) - return; + goto update; /* * if edid non zero restrict freesync only for dp and edp */ @@ -5600,7 +5604,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++) { @@ -5632,8 +5635,16 @@ 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; + freesync_capable = true; } } + +update: + if (dm_con_state) + dm_con_state->freesync_capable = freesync_capable; + + if (connector->vrr_capable_property) + drm_connector_set_vrr_capable_property(connector, + freesync_capable); } 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 978b34a5011c..a5aaf8b08968 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -185,7 +185,11 @@ struct dm_crtc_state { int crc_skip_count; bool crc_enabled; - bool freesync_enabled; + bool freesync_timing_changed; + bool freesync_vrr_info_changed; + + bool vrr_supported; + struct mod_freesync_config freesync_config; struct dc_crtc_timing_adjust adjust; struct dc_info_packet vrr_infopacket; }; @@ -207,7 +211,6 @@ struct dm_connector_state { uint8_t underscan_vborder; uint8_t underscan_hborder; bool underscan_enable; - bool freesync_enable; bool freesync_capable; };