From patchwork Thu Nov 8 14:43:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kazlauskas, Nicholas" X-Patchwork-Id: 10674421 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 CBF3513BF for ; Thu, 8 Nov 2018 14:44:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BB5432DC90 for ; Thu, 8 Nov 2018 14:44:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AF53D2DD37; Thu, 8 Nov 2018 14:44:23 +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 65B032DC90 for ; Thu, 8 Nov 2018 14:44:22 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 436066E661; Thu, 8 Nov 2018 14:44:20 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0048.outbound.protection.outlook.com [104.47.37.48]) by gabe.freedesktop.org (Postfix) with ESMTPS id EB0756E661; Thu, 8 Nov 2018 14:44:17 +0000 (UTC) Received: from CY4PR12CA0032.namprd12.prod.outlook.com (2603:10b6:903:129::18) by CY1PR12MB0743.namprd12.prod.outlook.com (2a01:111:e400:59d1::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.33; Thu, 8 Nov 2018 14:44:14 +0000 Received: from BY2NAM03FT058.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e4a::209) by CY4PR12CA0032.outlook.office365.com (2603:10b6:903:129::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1294.20 via Frontend Transport; Thu, 8 Nov 2018 14:44:14 +0000 Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV02.amd.com (165.204.84.17) by BY2NAM03FT058.mail.protection.outlook.com (10.152.85.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1339.10 via Frontend Transport; Thu, 8 Nov 2018 14:44:14 +0000 Received: from kazbox.amd.com (10.180.168.240) by SATLEXCHOV02.amd.com (10.181.40.72) with Microsoft SMTP Server id 14.3.389.1; Thu, 8 Nov 2018 08:44:12 -0600 From: Nicholas Kazlauskas To: , Subject: [PATCH v7 5/5] drm/amdgpu: Set FreeSync state using drm VRR properties Date: Thu, 8 Nov 2018 09:43:53 -0500 Message-ID: <20181108144353.31363-6-nicholas.kazlauskas@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181108144353.31363-1-nicholas.kazlauskas@amd.com> References: <20181108144353.31363-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)(39860400002)(346002)(136003)(396003)(2980300002)(428003)(189003)(199004)(110136005)(54906003)(1076002)(8936002)(16586007)(26005)(48376002)(47776003)(2906002)(4744004)(105586002)(356004)(316002)(426003)(6666004)(50466002)(486006)(68736007)(50226002)(36756003)(97736004)(478600001)(14444005)(186003)(72206003)(77096007)(81156014)(106466001)(5024004)(2616005)(4326008)(305945005)(336012)(86362001)(53936002)(104016004)(44832011)(76176011)(81166006)(8676002)(126002)(7696005)(575784001)(53416004)(5660300001)(51416003)(11346002)(446003)(476003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0743; H:SATLEXCHOV02.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; BY2NAM03FT058; 1:WNt5bfYjjLXv6isPz8voyqwtVumL9y9pYI1M7KP2jGpOe8C/1xzpUUGSMquu/rQBQ5i7Pzow9OPZvHxOrfcRomTcCistGHb0KFFjYieq64HlIU1bxeqGC5xovpU++H+G X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0a767cca-5e86-4507-7039-08d64588a754 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(5600074)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060); SRVR:CY1PR12MB0743; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0743; 3:hFBZNue1u8hWFfbmg10T7HJw+vYFeVwYrL+oGRtOHFpK4PxK7HKUj88RIYeYnUUajXsD1AeXtRUW6tGuldS6LrBQGOk+LGg/RFv9/wInbBtjJbUBtm94F8PJLHhe68bu9tfvy5/+ZSHii49qEvdYwUdGvkq2G3IFeVDKKytW5EvVKl0VyhWtPEve14zD1pR1otgzK7OIN1jF73a0xmNr6yyO5JySMe04qbC1YE7dBMM2ssjmGvHTuYsFcdaL8XddJBFOldDFXO+xJrViyLwccMOz77mrz7sNnKIxDNLf6aq3vtN8ZPCXmGJ2T1FSZFgJqpqXEBxGFGrmlj39kB9Nt22gQkiNukL7Hn9bpuhVqz8=; 25:+G4XvAKlEj1YCkFmGHxQDkc8mVEYWzEeMz07UlpOOk7JF1Mh6lDKTwYm5G8gPeyu3cj9sxTgyHg2cN3mwFfVNxeItEG4ZtORaJqrAG5Ni0pOr8Lc+AKpf7MKDX/g8uxs85b799U7Sy18I9UWewAunDzVohdRnf/BU/K89ApNmMJtp4nhmfVJoEMmFBynv7YKIOmEu8K131QG8F+XczkoDiAb4n/ZVO9hilBUFW+MYsbgwtIllSNy63TU5moIP4YygkSFu3o/5lHXrMBs4/2uJA+3Pm/IZ9+NeuVxnOuu4buA1AvS84UuHS2TvcsV/WPnAE49mWRu/n8/Fh+BxquGyA== X-MS-TrafficTypeDiagnostic: CY1PR12MB0743: X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0743; 31:sf/S83Xdhix44oegykwxfed3glhrOrknhndd0rfUj4omXFwBU5ydBJ0oBdWrb03WBt1/id7glFE3zuf1d4VyGexmq9XcYt+hZou2ctXyBXsAaQD4zvqCrhhb1XI97stGLdcOF79SQvcwQ7nC+doF1sJNMAyLtEPp8VBQM7Fn3sglkPEGNLu89OkKdM1A24W739vSmJcIbXSlVEOeOYKYB2MGEfgAJJf4vNhKmUVZHNA=; 20:PFNdMQL2GorXJQa6w0YQH4+HTb6+89m6SKNxvUykTcyS57D3QtNULli4ciqLT5DGgqL8g22Qz36i1GZTujYM269IgpPgOe4hqBB6nasi0DCFEsYRBP5TaXnr7YpkIQGBkop3wVpX7ialPTuy1w9Ey9+7CJpuokHw7RFg8QraByF7nXXn3Mr8TTW8uSK7DPbZk9QDO+0fsJr3EX4v9MdaY4KHMy5p4/A4yFljefAEXsV07pg+NQ0DJHGlGevUhHywZs+GkNx0EjSwfVAg8GXnwTMUKRxkF238P2j2tGgTTZGfDh9bttgaKunGpcFVKppx+QFOEfx/5hNUbxCZX6f/n//PZmpDiskmR3Ruavu60lN5JOSg8tzOGGChaQ/5sBCvREGMGgchko0FQKWXSbEk+MChjx1U/KW/domp3lXCU53ltn3DxwNUqgrFt+oLLG0ZaPrlb+us08z869si32wkJkzEzzlFKozTcFtoL02tILyv+f6QkMwveGbScmRaRErZ 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)(10201501046)(3002001)(3231382)(944501410)(52105095)(6055026)(148016)(149066)(150057)(6041310)(20161123562045)(20161123558120)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:CY1PR12MB0743; BCL:0; PCL:0; RULEID:; SRVR:CY1PR12MB0743; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0743; 4:BiMBLR/TGEWhoVk1V+lgLonvYpqgYgtyrpONXWDwU/phcHbtGtgmy6maBQK1lXMQXQj8CgLEWB+BUv31Y/Io5Noudvn4iXgb4lrAfwbZqXr+uT0PkjaH0Et5a4O7Suu8EpdxHHWCR5tNZCBtbIKXn37GgmUFB3fwSsDLgH93AvFCZExMxfHY8vcrjniHWiz+Ik+yBHgMoXHdPYBooD5Liy34kwBAIlI7U9KMHzlNqOCL2q5JvKV/JD9sOxfDBkhDJh8sehyUEl9nkSmMFCgCALkC2ehP0KBtkal8OuNAqJcPVLYxYJ29JsDoePo7i20C X-Forefront-PRVS: 0850800A29 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR12MB0743; 23:c0wia1f4SKWMcPzOFf9jFcbcchyUI9yVpAEZEjvmt?= OOr+BLFKPM53/D3ska1yqYuJ5BqRj60KPpMt0hHLLDN9P3Du1VBL17kuQGRZ2RsxUrSl48C5Gui/fKAK+7+1FNV1B6cs7hf6Mq6nw1SYWdGAS/tHYKuqkyxNQFU3f+TcZvfVjJVyKgkTT5Ee6GscyBVSdRsuj1OnlMFu/WTCsciRf1U7KAWs/0bKSXslWDAh4PRgJ/FoTxipDzKGAuMh50dqZkXkXRK4SUPP4neA+BJKVajPjZYSqMwhue47WNmy+KIctot0eBQQy1Vi1MUK7n2Rb+xIaxLXnAodJgFTqqhXtE//VPdaX9IPYew4060KtTVksGZdENZ3QG8oPbMeSPmJwSUsWQPQZezuLWKH76XtRTZ5yK3/8ItuwXnVcRKs+lywd8rz/TzAta64+q61zs4wvFxFSGBuTtx3ckxsW6Rp5HFdCVUOc/+dk+t7Lxxy6vctI5cmQXY20DfdJSlpOy7MakXmsl0URpflaLCOWcZR2U4+A2WhyNnyWoVh20/ZGWFHwK3cqo3XVWhktMwetihisINRBhvYBmcOs5kYPsEQw9dz7ThcvLVAILCOESfio3YEMcY46Tbxy1V8BAQGNrEtOMCKSv9BjjPWGQjoMfgwMBX6j52ehFcvzpIlZ+1VRsAsyctPvJUUgLkKMR6OiMHQUjgeVoCBXSHtryER04la5IhO2MU732lOUP3iDMZH3dkhoWIbbworIrGC/cJJJlubaF7PEECnjZ6THve0k7Qaavc1bsD/iNfLx9eIQAxIcBdq2SXvpcQhdriQ1630WtLgCMkoO03c09yY5B2mipii+rqJ6uAqUuNCWnFi6KI3xGjkfdG0PcXZ2aGp+7vY/PadJIF37T/nVAsPOhIlzG5WmDn/PJhWAkjvt8tqbA8zR6mpTtJDl5iCUWGESfvJmG0Rsd7gQhIWvl/+PZuDJprngYtCP1ISurQQfUX61xH267hq5K/2KFq59KY36/Cc0qlflqdpFOc0zYy9iR6+iqape11qnW31777Eu9WKDMEH0JQH8CuQlgVh3uAIruKJWVzttt8CmxGwF0XKdQF1OztnLVax2E6djbAA3fs/1JrlsNS/6jEtNAjlkzzbvGbU49jEuRyp8NDIQ2DJ4KXW4OuN1WekyZnUmRJ+GkKiO+cyc6pD6HsuHCAP57ElIkGoT9V3kN0+n6VPR6RbgEo/zx9YbHFzK5FSMxVuQrLVFepRLuDhgQKl19kJ6YWSj4/BeCr X-Microsoft-Antispam-Message-Info: /TdrMgWyXoTNWG730uGNNQ8PcvlLlnSaOrhc1pJOSHg4kFZhzxcQaOtrY8AaI0AXYo1fZqUktqFyy3HyKPTfGsGcbFr97A5r06JonLvU1KwbHeg8IHJr4u/p8TgBTmfie7YZFNHmhR9kP3nNef9vJY1wAkmzeK6CX5i6LiM1PjFd5pp6SRxg8Uzue9D7/1i+rqo1vX53tvITsGS9J4Q/sQaDEq5G3AWno62c+/q27khwaG6Yw+JD6FSgBUp9ryxe1IcfPhG/qgbSfWBgb/zDLsX4hvyIQJMQhgWZYKARE4KeZwT9sIGkcAQeah6cm+rXc0Hbd9lk5vTvAheuNtTitCXvB8A6IaIHamrYtI3EMT8= X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0743; 6:NgnYudQSIGFUHRWw6wzofS1lD+wNukn22YR9rR+xPl6mBwerf1VXxOyNNmmkWOlBEXglfHWMvwNlXMO9B/JA67/p2G+89BH1Px7cyUJ3IfC6Meg7jKmhlnaJny4Z7TMiGcq93pPUYbXAiPjuaQ5ibcrzD2VpPl9T5Yty1LcLPZhBP5zxXKeTmFrPhUBs2IM2YoiZhTh8ZXUaEw4WkXDizOwsLv4OcUjWG1KJnnO5xb2pyz3vYHXh3mEB0qhRA0Hf0j7scZfM2XmaRyouz6NisTbfkQHUoYuqNZAko5ONwb2wh7qnLW3CVnQaZTmLLIChuomY9rHuNbB0ikvkFQ0RKEKgLSieIbiCecngQgUTp90vQWUpBoXgqmvCQyfMmTE4hSNgwXEoCcOpW+sI0eZqHcFdnxT4j/2j85NBUG5R91HoO1AWqevs8ZCME30yxvalhOdOzLESCJIGmlRAHtU/5Q==; 5:/ywuwiMaLWO8jIPjSLLuJf1Lm/BTaX7l7KuJk6N3cHB5HvQkZvVg7xsB8A1pfaY0F1/1YOrtNYE2HKGFMvh6WtOkjfmcLw90gpPf3PIV5oCr29TsA2rg5sfuAeKo1HkOH9aAZdSYn1nhegHwvwWowlZn+1BbRJXodUilgW1NxVQ=; 7:07ZXWolOeDjrlpXQXd169xD6uCUy/rQIgy9hU5EclrUQZVHVhHN7dqj1HmVPzVnRXXjjXUYFXaZKU+TWiFB5KmBEnrj5YAJlO0k59Kk/n6sPH2W2RVEzWxtvrJ3KNY5q0lbT/uR9ovVg3D3ZsJ2zhg== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0743; 20:FmOvVR3KBDXBdIduQVATOQCUGNS91Cj+g/w39qMPy1jXO6O8ZtGrNX1CwNmshveJNg2wc+mSqR4XqVcreRLikqTrdPfZ3SKy7yjKc4fG7YBRtEMxPMZsKFUcIIkMfQTMzVTAnwgaT12AxXtDfVPisccld1tRLYco1gdrSGjQEkxTvy80XLXclqIIlhnPSaOAOJ2X148laLapwJTujlYWLtgw7ucz90S+trl57vUKn0lSvj/aH6fAwseVnLbAF4fB X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Nov 2018 14:44:14.2201 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0a767cca-5e86-4507-7039-08d64588a754 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=[SATLEXCHOV02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0743 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: michel@daenzer.net, Nicholas Kazlauskas 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 notify_freesync and set_freesync_property functions are dropped from amdgpu_display_funcs. 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 stream 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 need to be 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 Reviewed-by: Harry Wentland --- drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 7 - .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 255 +++++++++--------- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 7 +- 3 files changed, 138 insertions(+), 131 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index b9e9e8b02fb7..0cbe867ec375 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -295,13 +295,6 @@ struct amdgpu_display_funcs { uint16_t connector_object_id, struct amdgpu_hpd *hpd, struct amdgpu_router *router); - /* it is used to enter or exit into free sync mode */ - int (*notify_freesync)(struct drm_device *dev, void *data, - struct drm_file *filp); - /* it is used to allow enablement of freesync mode */ - int (*set_freesync_property)(struct drm_connector *connector, - struct drm_property *property, - uint64_t val); }; 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 b0df6dc9a775..53eb3d16f75c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -1809,72 +1809,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 */ @@ -1888,7 +1822,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, }; @@ -2841,7 +2774,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 */ @@ -3060,8 +2994,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; } @@ -3807,6 +3739,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, @@ -4183,6 +4120,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("VRR packet update: crtc=%u enabled=%d state=%d", + 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("VRR timing update: crtc=%u min=%u max=%u\n", + new_crtc_state->base.crtc->base.id, + vrr.adjust.v_total_min, + vrr.adjust.v_total_max); +} + /* * Executes flip * @@ -4204,6 +4212,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; @@ -4276,11 +4285,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); @@ -4340,11 +4364,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 = @@ -4480,9 +4499,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, @@ -4686,9 +4702,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, @@ -4912,20 +4925,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 = @@ -4935,19 +4946,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, @@ -5022,9 +5032,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; @@ -5033,9 +5040,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; @@ -5072,6 +5076,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 */ @@ -5149,7 +5155,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; @@ -5414,12 +5422,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) @@ -5571,14 +5576,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) { @@ -5588,9 +5594,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); @@ -5598,10 +5602,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 */ @@ -5613,7 +5617,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++) { @@ -5645,8 +5648,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; };