From patchwork Fri Apr 11 20:08:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048696 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 880FCC369B1 for ; Fri, 11 Apr 2025 20:14:03 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E410C10E059; Fri, 11 Apr 2025 20:14:01 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="Pb7yVjot"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2DCD710E112; Fri, 11 Apr 2025 20:13:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=TK2JLSVBieZV8SUvE1j3+I9gMWXg581Hnx4nqke2OVI=; b=Pb7yVjotylowzCpeasSWYHCkC0 TlxsTWF6655ef5mA55nA6bNqA7IxtNXkk8+AHB4b0wjhsf2eHf8BFRPicj1xOOW9mj6XcUiAtVHhy QImlebohlj/yNsDKghuB6lKJCmh0pygYqkbc0bXFa3+zDhXKUgYbmdUoyUJK+gDhZwpwQmjr9oIwW jy6LfHVlkDvSCe2qVY0867FMhMSm3/hi1UWuuKru4tmJ1RwwrueXlcP0LXG6w71I70asoi8G5ktir Urnw84rd+jH3oMhb3RW/g+bncIoG8gvaKdNIW+P9dljSQoNAlmtHETNEpE9Pj/R47IZPVGOISlj4B Ga/v1ZCQ==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Kl1-00FIP5-8r; Fri, 11 Apr 2025 22:13:47 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch, mwen@igalia.com Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 01/13] drm/amd/display: make sure drm_edid stored in aconnector doesn't leak Date: Fri, 11 Apr 2025 17:08:31 -0300 Message-ID: <20250411201333.151335-2-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Make sure the drm_edid container stored in aconnector is freed when detroying the aconnector. Fixes: 48edb2a4 ("drm/amd/display: switch amdgpu_dm_connector to use struct drm_edid") Signed-off-by: Melissa Wen Reviewed-by: Mario Limonciello --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 ++ 1 file changed, 2 insertions(+) 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 8665bd3cb75a..960bb8c62ffe 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -7397,6 +7397,8 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector) dc_sink_release(aconnector->dc_sink); aconnector->dc_sink = NULL; + drm_edid_free(aconnector->drm_edid); + drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux); drm_connector_unregister(connector); drm_connector_cleanup(connector); From patchwork Fri Apr 11 20:08:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048698 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A56C1C369B2 for ; Fri, 11 Apr 2025 20:14:08 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7785410EC85; Fri, 11 Apr 2025 20:14:04 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="qA8TaeB2"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 29DE010E059; Fri, 11 Apr 2025 20:13:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=FvdMdmlGt5NIzYeDPVUJapuflhc5GuaJtNNUub5tKEU=; b=qA8TaeB2ZUWHhUL7vuF8uQ+mdX fr6LWUduAnZnNFH676xchKTHXG+KNz7pe/0LVkcdb3jSfrS0rWP+XLhpUdD3KjtOeVaa1/JweXpTk D0cE7OQ/ANs3pYG1riFIWEN6PWeIVsS6YNdmO4zbAd4lFQnPIlJY8eRYqCBRac2J41jlg1uP/dtOQ zPXzjxyXiRU/PesdqIDFepsikWofmet6w8p1SrL7Ei8e3iNFbe7iFg425u7d88nzWEqVWZvi6XVgH JQqt1y/dVGWTgzJmJGozMruO8rFYVK4n6RjxKOaaQeEBTD1iJhCydwsSt7wzOsB6AuJuao3QF1HAu cWgHqNtg==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Kl6-00FIP5-8A; Fri, 11 Apr 2025 22:13:52 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 02/13] drm/amd/display: use drm_edid_product_id for parsing EDID product info Date: Fri, 11 Apr 2025 17:08:32 -0300 Message-ID: <20250411201333.151335-3-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Since [1], we can use drm_edid_product_id to get debug info from drm_edid instead of directly parsing EDID. Link: https://lore.kernel.org/dri-devel/cover.1712655867.git.jani.nikula@intel.com/ [1] Signed-off-by: Melissa Wen --- .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index 62954b351ebd..e93adb7e48a5 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -108,6 +108,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps( struct drm_connector *connector = &aconnector->base; struct drm_device *dev = connector->dev; struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL; + struct drm_edid *drm_edid; + struct drm_edid_product_id product_id; struct cea_sad *sads; int sad_count = -1; int sadb_count = -1; @@ -122,13 +124,13 @@ enum dc_edid_status dm_helpers_parse_edid_caps( if (!drm_edid_is_valid(edid_buf)) result = EDID_BAD_CHECKSUM; - edid_caps->manufacturer_id = (uint16_t) edid_buf->mfg_id[0] | - ((uint16_t) edid_buf->mfg_id[1])<<8; - edid_caps->product_id = (uint16_t) edid_buf->prod_code[0] | - ((uint16_t) edid_buf->prod_code[1])<<8; - edid_caps->serial_number = edid_buf->serial; - edid_caps->manufacture_week = edid_buf->mfg_week; - edid_caps->manufacture_year = edid_buf->mfg_year; + drm_edid_get_product_id(drm_edid, &product_id); + + edid_caps->manufacturer_id = le16_to_cpu(product_id.manufacturer_name); + edid_caps->product_id = le16_to_cpu(product_id.product_code); + edid_caps->serial_number = le32_to_cpu(product_id.serial_number); + edid_caps->manufacture_week = product_id.week_of_manufacture; + edid_caps->manufacture_year = product_id.year_of_manufacture; drm_edid_get_monitor_name(edid_buf, edid_caps->display_name, From patchwork Fri Apr 11 20:08:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048699 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5D4ADC369A2 for ; Fri, 11 Apr 2025 20:14:10 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B409810EC89; Fri, 11 Apr 2025 20:14:04 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="chyrdqp5"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2481B10EC84; Fri, 11 Apr 2025 20:14:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=wfXX9S7PCt7NAkisaLJntvVwSvLhMyLTN4HYJqNRzoE=; b=chyrdqp5nKfJ9Gwk8P7aFR3pIE I6EPHBebhJ9taL0ysuZmIilXqu8gRLn5cbHOvwqpPPX9/krIJuFtwiSLRxX3xHy29EmqNbSWPd3BP maT+G8AZZPHzZ4cQeLmsvyMCTvyqTYZ4j6NuVfSOiehdltT+K5jwSS9iBfQbz8phuR44Iw9wMd/KZ 0Ew20gsWKTVoFJaqZj/XaaYUYt5zgcK7TP/NKgtGBsTFg4kq81xfAXXANUupY6OlXDsy2zPBs1kmr 5OesSlgsdBlAF2ph7ni6WGhGZhNiUAPFguonBqCRbZeOJHGKi+1aXiMSF5Piv5OIrJjOovpg9q4dK 8yf9gJ2A==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3KlB-00FIP5-3M; Fri, 11 Apr 2025 22:13:57 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 03/13] drm/amd/display: parse display name from drm_eld Date: Fri, 11 Apr 2025 17:08:33 -0300 Message-ID: <20250411201333.151335-4-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" We don't need to parse dc_edid to get the display name since it's already set in drm_eld which in turn had it values updated when updating connector with the opaque drm_edid. Signed-off-by: Melissa Wen --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index e93adb7e48a5..faea6b7fb3f3 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -34,7 +34,7 @@ #include #include #include - +#include #include "dm_services.h" #include "amdgpu.h" #include "dc.h" @@ -90,6 +90,7 @@ static void apply_edid_quirks(struct drm_device *dev, struct edid *edid, struct } } +#define AMDGPU_ELD_DISPLAY_NAME_SIZE_IN_CHARS 13 /** * dm_helpers_parse_edid_caps() - Parse edid caps * @@ -132,9 +133,10 @@ enum dc_edid_status dm_helpers_parse_edid_caps( edid_caps->manufacture_week = product_id.week_of_manufacture; edid_caps->manufacture_year = product_id.year_of_manufacture; - drm_edid_get_monitor_name(edid_buf, - edid_caps->display_name, - AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS); + memset(edid_caps->display_name, 0, AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS); + memcpy(edid_caps->display_name, + &connector->eld[DRM_ELD_MONITOR_NAME_STRING], + AMDGPU_ELD_DISPLAY_NAME_SIZE_IN_CHARS); edid_caps->edid_hdmi = connector->display_info.is_hdmi; From patchwork Fri Apr 11 20:08:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048700 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2AE69C369B4 for ; Fri, 11 Apr 2025 20:14:12 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E742510EC8D; Fri, 11 Apr 2025 20:14:10 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="S5JVSQn3"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id B3ABB10EC8B; Fri, 11 Apr 2025 20:14:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=ah1mVPqBaf9p3HruRY1ZJsWHsyhb5wlc5vWrJ5ghBFU=; b=S5JVSQn3Konf9mQ/vp1s/44y4F ID3hV2XZJfr7aVJsUDv3DLlpEHcExhPittz3QU5xqpDbsHtEu2YNXguE6A/yBqo7X/cPDBjgupUIC mS7Ftu67EI96kHX8JuRFXG0gtclAbB6Z9zA6f8QyWV7oDegzv05QBL6Q+fhUnjtZEaEmEe6+HWAQt /myYJXoDnAD5DTLw5Y0IlY2FFMSj/QuBeEEPk/vElLa73vIkTRIkWRd+L6XApvI2ixu5rhs78j6vB eScYmZUK7LQ3iPwy/Q8qmG8WTNLdp08EZLHax03Lm4EyUKeeWQF6U/+4hmoxfpvSi1rUR6jwUGSIU SVTDjkqQ==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3KlF-00FIP5-VG; Fri, 11 Apr 2025 22:14:02 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 04/13] drm/amd/display: get panel id with drm_edid helper Date: Fri, 11 Apr 2025 17:08:34 -0300 Message-ID: <20250411201333.151335-5-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Instead of using driver-specific code, use DRM helpers. Signed-off-by: Melissa Wen --- .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index faea6b7fb3f3..620be159b8ef 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -48,16 +48,11 @@ #include "ddc_service_types.h" #include "clk_mgr.h" -static u32 edid_extract_panel_id(struct edid *edid) +static void apply_edid_quirks(struct drm_device *dev, + const struct drm_edid *drm_edid, + struct dc_edid_caps *edid_caps) { - return (u32)edid->mfg_id[0] << 24 | - (u32)edid->mfg_id[1] << 16 | - (u32)EDID_PRODUCT_ID(edid); -} - -static void apply_edid_quirks(struct drm_device *dev, struct edid *edid, struct dc_edid_caps *edid_caps) -{ - uint32_t panel_id = edid_extract_panel_id(edid); + uint32_t panel_id = drm_edid_get_panel_id(drm_edid); switch (panel_id) { /* Workaround for monitors that need a delay after detecting the link */ @@ -140,7 +135,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps( edid_caps->edid_hdmi = connector->display_info.is_hdmi; - apply_edid_quirks(dev, edid_buf, edid_caps); + apply_edid_quirks(dev, drm_edid, edid_caps); sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads); if (sad_count <= 0) From patchwork Fri Apr 11 20:08:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048701 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9EB40C369A2 for ; Fri, 11 Apr 2025 20:14:14 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id F123B10EC92; Fri, 11 Apr 2025 20:14:13 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="HhUMGw5W"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 95C6110EC8F; Fri, 11 Apr 2025 20:14:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=HuNWxemYPTO41JTJ7/7SU6ZPp+FusokzWkMDvDWW9qA=; b=HhUMGw5WqKwyT7C8CeCGar3vZV lBfdoLdICEL9TrJr18hVYCGjqYFPV5q1fRv7xZ5VX61PEB+ANJwiEgTFusJFFOAEnBlg5HPiikhOM k190U0eT6vZwO+NVND3iPOtor4dmsn52c0LBe9AMTzVO0OJZKCYfwSA5wr7v9agvpauVER+2r21aM gbCepGcjQWl3+XpBDeXRvXqf73k/JfTkhdUQA2uOy9lx2AkJtPCS9AFZiMeS+gjyp4RigZtRDYfF7 JmkCCgCvXPZem7eSqMaV8pdrdWMJSIdE96t5EyS1A4ebJiNnrS1/ZCmxw64cWBdiE2nfaRoLeuxsT DBeZrTLQ==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3KlK-00FIP5-Rb; Fri, 11 Apr 2025 22:14:07 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 05/13] drm/amd/display: get SAD from drm_eld when parsing EDID caps Date: Fri, 11 Apr 2025 17:08:35 -0300 Message-ID: <20250411201333.151335-6-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" drm_edid_connector_update() updates display info, filling ELD with audio info from Short-Audio Descriptors in the last step of update_dislay_info(). Our goal is stopping using raw edid, so we can extract SAD from drm_eld instead of access raw edid to get audio caps. Signed-off-by: Melissa Wen --- .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index 620be159b8ef..ca9fe423e18e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -104,11 +104,9 @@ enum dc_edid_status dm_helpers_parse_edid_caps( struct drm_connector *connector = &aconnector->base; struct drm_device *dev = connector->dev; struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL; - struct drm_edid *drm_edid; + const struct drm_edid *drm_edid; struct drm_edid_product_id product_id; - struct cea_sad *sads; - int sad_count = -1; - int sadb_count = -1; + int sad_count, sadb_count; int i = 0; uint8_t *sadb = NULL; @@ -117,9 +115,12 @@ enum dc_edid_status dm_helpers_parse_edid_caps( if (!edid_caps || !edid) return EDID_BAD_INPUT; - if (!drm_edid_is_valid(edid_buf)) + drm_edid = drm_edid_alloc(edid_buf, EDID_LENGTH * (edid_buf->extensions + 1)); + + if (!drm_edid_valid(drm_edid)) result = EDID_BAD_CHECKSUM; + drm_edid_connector_update(connector, drm_edid); drm_edid_get_product_id(drm_edid, &product_id); edid_caps->manufacturer_id = le16_to_cpu(product_id.manufacturer_name); @@ -137,18 +138,23 @@ enum dc_edid_status dm_helpers_parse_edid_caps( apply_edid_quirks(dev, drm_edid, edid_caps); - sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads); - if (sad_count <= 0) + sad_count = drm_eld_sad_count(connector->eld); + if (sad_count <= 0) { + drm_edid_free(drm_edid); return result; + } edid_caps->audio_mode_count = min(sad_count, DC_MAX_AUDIO_DESC_COUNT); for (i = 0; i < edid_caps->audio_mode_count; ++i) { - struct cea_sad *sad = &sads[i]; + struct cea_sad sad; - edid_caps->audio_modes[i].format_code = sad->format; - edid_caps->audio_modes[i].channel_count = sad->channels + 1; - edid_caps->audio_modes[i].sample_rate = sad->freq; - edid_caps->audio_modes[i].sample_size = sad->byte2; + if (drm_eld_sad_get(connector->eld, i, &sad) < 0) + continue; + + edid_caps->audio_modes[i].format_code = sad.format; + edid_caps->audio_modes[i].channel_count = sad.channels + 1; + edid_caps->audio_modes[i].sample_rate = sad.freq; + edid_caps->audio_modes[i].sample_size = sad.byte2; } sadb_count = drm_edid_to_speaker_allocation((struct edid *) edid->raw_edid, &sadb); @@ -163,8 +169,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps( else edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION; - kfree(sads); kfree(sadb); + drm_edid_free(drm_edid); return result; } From patchwork Fri Apr 11 20:08:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048702 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2DCD5C369B1 for ; Fri, 11 Apr 2025 20:14:19 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8348F10EC97; Fri, 11 Apr 2025 20:14:18 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="TBSSzx6F"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6E5DF10EC94; Fri, 11 Apr 2025 20:14:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=kNH4EoiW+25DXwI9IK1z0N9UI+fH7xxFQRZdVpHfKSc=; b=TBSSzx6F9hzC+VZvAX3AqBEAW6 DZqAh3yrzBbHUMmlbnm7yF1PYYIu86W1nVvISIRMAJpJaafoaqEGTnR2xabhNYdwqJz3W0biS99a2 XbMgsCDcOZ+cLPu6Keu/rOxl7y9iETXFcImAcT5816m2aoHl0EcVHBEsb1acYGQm+J9sfiqvzbKlK OBJGmiCxT31PoDlmwMReZDOpWCm/eUyIkVw9aRc9Aco11IOSsyUvXr9oU84y0kFXPx9Kp4E8iWkUK HaGf651TVFUH2szqBbYm7Taxw44r+AdEpyqKSHWVw1n6xtTkcSWFcEmK/Tm5yoODmj5FUA+cV8JHu QlFmcmuA==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3KlP-00FIP5-OD; Fri, 11 Apr 2025 22:14:12 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 06/13] drm/amd/display: get SADB from drm_eld when parsing EDID caps Date: Fri, 11 Apr 2025 17:08:36 -0300 Message-ID: <20250411201333.151335-7-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" drm_edid_connector_update() updates display info, filling ELD with speaker allocation data in the last step of update_dislay_info(). Our goal is stopping using raw edid, so we can extract SADB from drm_eld instead of access raw edid to get audio caps. Signed-off-by: Melissa Wen --- .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index ca9fe423e18e..a96f527a59df 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -106,10 +106,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps( struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL; const struct drm_edid *drm_edid; struct drm_edid_product_id product_id; - int sad_count, sadb_count; + int sad_count; int i = 0; - uint8_t *sadb = NULL; - enum dc_edid_status result = EDID_OK; if (!edid_caps || !edid) @@ -157,19 +155,11 @@ enum dc_edid_status dm_helpers_parse_edid_caps( edid_caps->audio_modes[i].sample_size = sad.byte2; } - sadb_count = drm_edid_to_speaker_allocation((struct edid *) edid->raw_edid, &sadb); - - if (sadb_count < 0) { - DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sadb_count); - sadb_count = 0; - } - - if (sadb_count) - edid_caps->speaker_flags = sadb[0]; + if (connector->eld[DRM_ELD_SPEAKER]) + edid_caps->speaker_flags = connector->eld[DRM_ELD_SPEAKER]; else edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION; - kfree(sadb); drm_edid_free(drm_edid); return result; From patchwork Fri Apr 11 20:08:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048703 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 03D94C369B1 for ; Fri, 11 Apr 2025 20:14:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5FD6910EC8F; Fri, 11 Apr 2025 20:14:23 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="PHhe7eEW"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2A61D10EC8F; Fri, 11 Apr 2025 20:14:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=3i5MrLa8+wtoOzjOoZ6gt4WTRyqc5q+rZf82aUTLAaY=; b=PHhe7eEWOWaPKvzK+YjuvyJ2U1 uCb6KS0VZXA4Gs0UvoXKqtFhUO0glDqFyAKfP7f8Up6z24tEfY+IsrAZ1lowUsC6VgZzGRhzrDYNd 7LZ3Qhwq/l9MHwH1TYrBXd0UUmHg6JfArjrs4qv9EP2FCYAzARSh/ecCftQ/uU627lq1r2p7JNZUW g5hqxs8o+u991c8B0FURXXDq1kkHj8hdrzBeGxDYfuYpkrU0SLHaRrR6PD+EWTCgs3DyJRfaHXnzp P3qnJRgGng0k/fQpTiOO2UXlL3Zfd8LxpJgC56skfLFSRBIqU3TlnRwypke7EPYkeAMaEeS9jdohM 3D7uH1JA==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3KlU-00FIP5-NW; Fri, 11 Apr 2025 22:14:17 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 07/13] drm/amd/display: simplify dm_helpers_parse_edid_caps signature Date: Fri, 11 Apr 2025 17:08:37 -0300 Message-ID: <20250411201333.151335-8-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Pass dc_sink to dm_helpers_parse_edid_caps(), since it already contains edid info. It's a groundwork to get rid of raw edid stored as dc_edid. Signed-off-by: Melissa Wen --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 +---- .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 17 +++++++---------- drivers/gpu/drm/amd/display/dc/dm_helpers.h | 7 ++----- .../drm/amd/display/dc/link/link_detection.c | 5 +---- 4 files changed, 11 insertions(+), 23 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 960bb8c62ffe..3cad6d9153f7 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -7529,10 +7529,7 @@ static void amdgpu_dm_connector_funcs_force(struct drm_connector *connector) memset(&dc_em_sink->edid_caps, 0, sizeof(struct dc_edid_caps)); memmove(dc_em_sink->dc_edid.raw_edid, edid, (edid->extensions + 1) * EDID_LENGTH); - dm_helpers_parse_edid_caps( - dc_link, - &dc_em_sink->dc_edid, - &dc_em_sink->edid_caps); + dm_helpers_parse_edid_caps(dc_link, dc_em_sink); } } diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index a96f527a59df..3082582c1579 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -95,22 +95,22 @@ static void apply_edid_quirks(struct drm_device *dev, * * Return: void */ -enum dc_edid_status dm_helpers_parse_edid_caps( - struct dc_link *link, - const struct dc_edid *edid, - struct dc_edid_caps *edid_caps) +enum dc_edid_status dm_helpers_parse_edid_caps(struct dc_link *link, + struct dc_sink *sink) { struct amdgpu_dm_connector *aconnector = link->priv; struct drm_connector *connector = &aconnector->base; struct drm_device *dev = connector->dev; - struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL; + struct edid *edid_buf; const struct drm_edid *drm_edid; struct drm_edid_product_id product_id; + struct dc_edid_caps *edid_caps = &sink->edid_caps; int sad_count; int i = 0; enum dc_edid_status result = EDID_OK; - if (!edid_caps || !edid) + edid_buf = (struct edid *) &sink->dc_edid.raw_edid; + if (!edid_caps || !edid_buf) return EDID_BAD_INPUT; drm_edid = drm_edid_alloc(edid_buf, EDID_LENGTH * (edid_buf->extensions + 1)); @@ -1030,10 +1030,7 @@ enum dc_edid_status dm_helpers_read_local_edid( /* We don't need the original edid anymore */ drm_edid_free(drm_edid); - edid_status = dm_helpers_parse_edid_caps( - link, - &sink->dc_edid, - &sink->edid_caps); + edid_status = dm_helpers_parse_edid_caps(link, sink); } while (edid_status == EDID_BAD_CHECKSUM && --retry > 0); diff --git a/drivers/gpu/drm/amd/display/dc/dm_helpers.h b/drivers/gpu/drm/amd/display/dc/dm_helpers.h index 9d160b39e8c5..ce6a70368bd0 100644 --- a/drivers/gpu/drm/amd/display/dc/dm_helpers.h +++ b/drivers/gpu/drm/amd/display/dc/dm_helpers.h @@ -59,11 +59,8 @@ void dm_helpers_free_gpu_mem( enum dc_gpu_mem_alloc_type type, void *pvMem); -enum dc_edid_status dm_helpers_parse_edid_caps( - struct dc_link *link, - const struct dc_edid *edid, - struct dc_edid_caps *edid_caps); - +enum dc_edid_status dm_helpers_parse_edid_caps(struct dc_link *link, + struct dc_sink *sink); /* * Update DP branch info diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index cc9191a5c9e6..8c7a00c1ad2b 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -1429,10 +1429,7 @@ struct dc_sink *link_add_remote_sink( dc_sink)) goto fail_add_sink; - edid_status = dm_helpers_parse_edid_caps( - link, - &dc_sink->dc_edid, - &dc_sink->edid_caps); + edid_status = dm_helpers_parse_edid_caps(link, dc_sink); /* * Treat device as no EDID device if EDID From patchwork Fri Apr 11 20:08:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048704 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9CBA0C369A2 for ; Fri, 11 Apr 2025 20:14:28 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1515F10EC8C; Fri, 11 Apr 2025 20:14:28 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="UOsIyPpB"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id D900610EC8C; Fri, 11 Apr 2025 20:14:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=VXwPrifWrMDNIsaf2huRNEfSEWG28Ts2hn2JjkTH0Lk=; b=UOsIyPpBfhePWMuizMZLEC72ab fnbnPwDaLjmtDGuVfpahzG6WJFrTjRgk4QeuV2cKkcGi6hcK8qWx26AoT+OtFHVa/VZyzvzlTYPr5 ufERXiDHzWJJwosGp9dIv9++FzJYD2UxPrQe3WNbEJ9oyFIcwTaou+MYTgWULTyztBKiMpXHgIjB9 +JDBqOMz3R5GkJ3RBk2s0mCXcav44dv7fJyfjWBkqpmul0R+GhBV7xfuwxkcBv5Exr65Vpx8Ml6OF TkefudGg4oOebCmS/uJIhD5nYJoUzTx8qDXNRmBBTI6hUStquuSVFXqWiSRbNfkE5WUTLbrSpYBDc XQnjc+Aw==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3KlZ-00FIP5-HN; Fri, 11 Apr 2025 22:14:22 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 08/13] drm/amd/display: change DC functions to accept private types for edid Date: Fri, 11 Apr 2025 17:08:38 -0300 Message-ID: <20250411201333.151335-9-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" There is an opaque obj in Linux/DRM to encapsulate edid data as `drm_edid`. This obj isn't present in other platforms but we need to pass it through DC when adding sink. To pass this data without compromise the independence of DC code, make some DC functions accept edid data as private options. Signed-off-by: Melissa Wen --- drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c | 9 ++++----- drivers/gpu/drm/amd/display/dc/dc.h | 9 ++++----- drivers/gpu/drm/amd/display/dc/inc/link.h | 9 ++++----- drivers/gpu/drm/amd/display/dc/link/link_detection.c | 4 ++-- drivers/gpu/drm/amd/display/dc/link/link_detection.h | 9 ++++----- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c index 71e15da4bb69..b6f03ac16cad 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c @@ -278,11 +278,10 @@ unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link) return link->dc->link_srv->dp_trace_get_link_loss_count(link); } -struct dc_sink *dc_link_add_remote_sink( - struct dc_link *link, - const uint8_t *edid, - int len, - struct dc_sink_init_data *init_data) +struct dc_sink *dc_link_add_remote_sink(struct dc_link *link, + const void *edid, + int len, + struct dc_sink_init_data *init_data) { return link->dc->link_srv->add_remote_sink(link, edid, len, init_data); } diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index 7624b909497e..d60cd9d23848 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -1875,11 +1875,10 @@ struct dc_sink_init_data; * @len - size of the edid in byte * @init_data - */ -struct dc_sink *dc_link_add_remote_sink( - struct dc_link *dc_link, - const uint8_t *edid, - int len, - struct dc_sink_init_data *init_data); +struct dc_sink *dc_link_add_remote_sink(struct dc_link *dc_link, + const void *edid, + int len, + struct dc_sink_init_data *init_data); /* Remove remote sink from a link with dc_connection_mst_branch connection type. * @link - link the sink should be removed from diff --git a/drivers/gpu/drm/amd/display/dc/inc/link.h b/drivers/gpu/drm/amd/display/dc/inc/link.h index 2948a696ee12..ab69af34ec82 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/link.h +++ b/drivers/gpu/drm/amd/display/dc/inc/link.h @@ -107,11 +107,10 @@ struct link_service { bool (*detect_link)(struct dc_link *link, enum dc_detect_reason reason); bool (*detect_connection_type)(struct dc_link *link, enum dc_connection_type *type); - struct dc_sink *(*add_remote_sink)( - struct dc_link *link, - const uint8_t *edid, - int len, - struct dc_sink_init_data *init_data); + struct dc_sink *(*add_remote_sink)(struct dc_link *link, + const void *edid, + int len, + struct dc_sink_init_data *init_data); void (*remove_remote_sink)(struct dc_link *link, struct dc_sink *sink); bool (*get_hpd_state)(struct dc_link *link); struct gpio *(*get_hpd_gpio)(struct dc_bios *dcb, diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index 8c7a00c1ad2b..6d05ddb194c9 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -1394,7 +1394,7 @@ static bool link_add_remote_sink_helper(struct dc_link *dc_link, struct dc_sink struct dc_sink *link_add_remote_sink( struct dc_link *link, - const uint8_t *edid, + const void *edid, int len, struct dc_sink_init_data *init_data) { @@ -1421,7 +1421,7 @@ struct dc_sink *link_add_remote_sink( if (!dc_sink) return NULL; - memmove(dc_sink->dc_edid.raw_edid, edid, len); + memmove(dc_sink->dc_edid.raw_edid, (const uint8_t *) edid, len); dc_sink->dc_edid.length = len; if (!link_add_remote_sink_helper( diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.h b/drivers/gpu/drm/amd/display/dc/link/link_detection.h index 7da05078721e..9cd3aa36c7d8 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.h +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.h @@ -29,11 +29,10 @@ bool link_detect(struct dc_link *link, enum dc_detect_reason reason); bool link_detect_connection_type(struct dc_link *link, enum dc_connection_type *type); -struct dc_sink *link_add_remote_sink( - struct dc_link *link, - const uint8_t *edid, - int len, - struct dc_sink_init_data *init_data); +struct dc_sink *link_add_remote_sink(struct dc_link *link, + const void *edid, + int len, + struct dc_sink_init_data *init_data); void link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink); bool link_reset_cur_dp_mst_topology(struct dc_link *link); const struct dc_link_status *link_get_status(const struct dc_link *link); From patchwork Fri Apr 11 20:08:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048706 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D8571C369A2 for ; Fri, 11 Apr 2025 20:14:33 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3BE2610EC99; Fri, 11 Apr 2025 20:14:33 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="Pm8ZlAjH"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 441BD10EC98; Fri, 11 Apr 2025 20:14:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=YiD+UP2BPtijPqBZcpQvdyudwxTdoPcV2tG5RTmnLVQ=; b=Pm8ZlAjHF1EqRuXwxYsOCiwVZF 0rXRqRt7g07BxSdASN2hr7Ai2p8sWNefpsSU1l/yWdHN+AI8QfK3vUWlZ81NBarqhtgh1wiifImWa Lgn0ALsRiTLQk9BW8vYh1CcEyPk0ijkoSUevbedmSBPOIPIBzJFx3U8VwA+LbBazt+02yA3jQPy+f D1cjpJMFdRsxS3qTt6W6vhoj5US4GbuJPQGuPwEhHQvO3BhMzRUNaitcIVXKovjKOd2rx+t43YRI7 lhbFj20aRVZkBdEslLPLXLROlHTIQbc6axpfdTD+Boc31erQa+ctROgX+AIUg15xeSC/aGQ/Ef0/t nl2TLDcw==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Kle-00FIP5-Ak; Fri, 11 Apr 2025 22:14:26 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 09/13] drm/amd/display: add a mid-layer file to handle EDID in DC Date: Fri, 11 Apr 2025 17:08:39 -0300 Message-ID: <20250411201333.151335-10-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Rodrigo Siqueira Since DC is a shared code, this commit introduces a new file to work as a mid-layer in DC for the edid manipulation. Signed-off-by: Rodrigo Siqueira Co-developed-by: Melissa Wen Signed-off-by: Melissa Wen --- .../gpu/drm/amd/display/amdgpu_dm/Makefile | 1 + .../gpu/drm/amd/display/amdgpu_dm/dc_edid.c | 19 +++++++++++++++++++ .../gpu/drm/amd/display/amdgpu_dm/dc_edid.h | 11 +++++++++++ .../drm/amd/display/dc/link/link_detection.c | 17 +++-------------- 4 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c create mode 100644 drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/Makefile b/drivers/gpu/drm/amd/display/amdgpu_dm/Makefile index ab2a97e354da..30188bf75724 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/Makefile +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/Makefile @@ -38,6 +38,7 @@ AMDGPUDM = \ amdgpu_dm_pp_smu.o \ amdgpu_dm_psr.o \ amdgpu_dm_replay.o \ + dc_edid.o \ amdgpu_dm_wb.o ifdef CONFIG_DRM_AMD_DC_FP diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c new file mode 100644 index 000000000000..fab873b091f5 --- /dev/null +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +#include "amdgpu_dm/dc_edid.h" +#include "dc.h" + +bool dc_edid_is_same_edid(struct dc_sink *prev_sink, + struct dc_sink *current_sink) +{ + struct dc_edid *old_edid = &prev_sink->dc_edid; + struct dc_edid *new_edid = ¤t_sink->dc_edid; + + if (old_edid->length != new_edid->length) + return false; + + if (new_edid->length == 0) + return false; + + return (memcmp(old_edid->raw_edid, + new_edid->raw_edid, new_edid->length) == 0); +} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h new file mode 100644 index 000000000000..7e3b1177bc8a --- /dev/null +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: MIT */ + +#ifndef __DC_EDID_H__ +#define __DC_EDID_H__ + +#include "dc.h" + +bool dc_edid_is_same_edid(struct dc_sink *prev_sink, + struct dc_sink *current_sink); + +#endif /* __DC_EDID_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index 6d05ddb194c9..e748721f31e4 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -48,6 +48,8 @@ #include "dm_helpers.h" #include "clk_mgr.h" +#include "dc_edid.h" + // Offset DPCD 050Eh == 0x5A #define MST_HUB_ID_0x5A 0x5A @@ -616,18 +618,6 @@ static bool detect_dp(struct dc_link *link, return true; } -static bool is_same_edid(struct dc_edid *old_edid, struct dc_edid *new_edid) -{ - if (old_edid->length != new_edid->length) - return false; - - if (new_edid->length == 0) - return false; - - return (memcmp(old_edid->raw_edid, - new_edid->raw_edid, new_edid->length) == 0); -} - static bool wait_for_entering_dp_alt_mode(struct dc_link *link) { @@ -1114,8 +1104,7 @@ static bool detect_link_and_local_sink(struct dc_link *link, // Check if edid is the same if ((prev_sink) && (edid_status == EDID_THE_SAME || edid_status == EDID_OK)) - same_edid = is_same_edid(&prev_sink->dc_edid, - &sink->dc_edid); + same_edid = dc_edid_is_same_edid(prev_sink, sink); if (sink->edid_caps.panel_patch.skip_scdc_overwrite) link->ctx->dc->debug.hdmi20_disable = true; From patchwork Fri Apr 11 20:08:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048707 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 44D27C369B1 for ; Fri, 11 Apr 2025 20:14:39 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A069510EC9B; Fri, 11 Apr 2025 20:14:38 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="KaP2OuLH"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id D2A3510EC9B; Fri, 11 Apr 2025 20:14:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=af0YOPhxxT7oseIiamLQLUGtR5wWdlc5QpGqJ79jKxk=; b=KaP2OuLH+isAY2+k4ENpARO5U8 CZveCeOmksB31u/j087zdS8oiZv/3bI9mphL3v+xvnbPD7bOJvD2QhUd6bYeZkf7aWiwq8i5lo6/g C3MAytQm2vkZPX7WJ8ril8iOdz20vhRG6mdSQaOOt0ThRcxS/JVD/50dZykGi4fjZme8HSwPTAHPe IUAnmaL1wcNzwuSUNuXSxlVjD3MLMlUJ221+yPGr6dv4VH1F/g0hQhR5rr5B1b43DmgxQBJdXwoUJ 0QcqPZbb6Y6cZfy8+mdFENFmFHld2tplG0nGxXoh9RbWUpdfHPlwCiJz322tpZtA7nrepsulfkqNl HkLmknsA==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Klj-00FIP5-3M; Fri, 11 Apr 2025 22:14:31 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 10/13] drm/amd/display: create a function to fill dc_sink with edid data Date: Fri, 11 Apr 2025 17:08:40 -0300 Message-ID: <20250411201333.151335-11-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Rodrigo Siqueira As part of the effort of stopping using raw edid, this commit move the copy of the edid in DC to a dedicated function that will allow the usage of drm_edid in the next steps. Signed-off-by: Rodrigo Siqueira Co-developer--by: Melissa Wen Signed-off-by: Melissa Wen --- drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c | 8 ++++++++ drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h | 2 ++ drivers/gpu/drm/amd/display/dc/link/link_detection.c | 3 +-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c index fab873b091f5..39fcaa16a14a 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c @@ -17,3 +17,11 @@ bool dc_edid_is_same_edid(struct dc_sink *prev_sink, return (memcmp(old_edid->raw_edid, new_edid->raw_edid, new_edid->length) == 0); } + +void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, + const void *edid, + int len) +{ + memmove(dc_sink->dc_edid.raw_edid, (const uint8_t *) edid, len); + dc_sink->dc_edid.length = len; +} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h index 7e3b1177bc8a..f42cd5bbc730 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h @@ -7,5 +7,7 @@ bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink); +void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, + const void *edid, int len); #endif /* __DC_EDID_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index e748721f31e4..978d2b4a4d29 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -1410,8 +1410,7 @@ struct dc_sink *link_add_remote_sink( if (!dc_sink) return NULL; - memmove(dc_sink->dc_edid.raw_edid, (const uint8_t *) edid, len); - dc_sink->dc_edid.length = len; + dc_edid_copy_edid_to_dc(dc_sink, edid, len); if (!link_add_remote_sink_helper( link, From patchwork Fri Apr 11 20:08:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048708 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 08C93C369AB for ; Fri, 11 Apr 2025 20:14:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4C03710EC9A; Fri, 11 Apr 2025 20:14:46 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="miLXtdIY"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id B43B210EC9D for ; Fri, 11 Apr 2025 20:14:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=NcnBYS+IJuXdkD3TBjtgHB1cOkaBNKkPSrRkXjMW/As=; b=miLXtdIYfe5jR0Bt7Hp1Dg7J8k VSd69YSe6rGd1PjHqRgJ7P3aL1vdwIjfhp9WZi7fvlP3EaG+dVE43jYrJGjLTzY8HtRN+qiqddHZM 1eKY/SkJTQnqOsQA0llh5gdnqOqgzKyrZTYPSlNffk0BrB7fAdKexxRyj7UlMx3mh8ROtrq42SIVj Y6xDTcYCu83LvCTcsRcFdh3QDljrbRc/EyucbP5euvxmIqv0mHtlGNL7+/TAkUWr3p//NYZxejA0x 7q9oBhfneVKSAC4DQHDLtYni9z6YwXXrABpd1zWMkQUVpekSuIeWRORaoTguHl+vrjuOroM06n4n8 tM3yeDHg==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Kln-00FIP5-Cl; Fri, 11 Apr 2025 22:14:35 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 11/13] drm/edid: introduce a helper that compares edid data from two drm_edid Date: Fri, 11 Apr 2025 17:08:41 -0300 Message-ID: <20250411201333.151335-12-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" AMD driver has a function used to compare if two edid are the same; this is useful to some of the link detection algorithms implemented by amdgpu. Since the amdgpu function can be helpful for other drivers, this commit abstracts the AMD function to make it available at the DRM level by wrapping existent drm_edid_eq(). Co-developed-by: Rodrigo Siqueira Signed-off-by: Rodrigo Siqueira Signed-off-by: Melissa Wen --- drivers/gpu/drm/drm_edid.c | 18 ++++++++++++++++++ include/drm/drm_edid.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 855beafb76ff..328a25d198e5 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -7502,3 +7502,21 @@ bool drm_edid_is_digital(const struct drm_edid *drm_edid) drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL; } EXPORT_SYMBOL(drm_edid_is_digital); + +/** + * drm_edid_is_edid_eq - Check if it the EDID is equal + * + * @drm_edid_old: old drm_edid to compare edid + * @drm_edid_new: new drm_edid to compare edid + * + * Return true if the EDID is equal + */ +bool drm_edid_is_edid_eq(const struct drm_edid *drm_edid_old, + const struct drm_edid *drm_edid_new) +{ + const void *old_edid = drm_edid_old->edid; + size_t old_edid_size = drm_edid_old->size; + + return drm_edid_eq(drm_edid_new, old_edid, old_edid_size); +} +EXPORT_SYMBOL(drm_edid_is_edid_eq); diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index eaac5e665892..0e062761296c 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -469,6 +469,8 @@ int drm_edid_connector_update(struct drm_connector *connector, const struct drm_edid *edid); int drm_edid_connector_add_modes(struct drm_connector *connector); bool drm_edid_is_digital(const struct drm_edid *drm_edid); +bool drm_edid_is_edid_eq(const struct drm_edid *drm_edid_first, + const struct drm_edid *drm_edid_second); void drm_edid_get_product_id(const struct drm_edid *drm_edid, struct drm_edid_product_id *id); void drm_edid_print_product_id(struct drm_printer *p, From patchwork Fri Apr 11 20:08:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048709 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DF573C369B1 for ; Fri, 11 Apr 2025 20:14:48 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4A23910EC9E; Fri, 11 Apr 2025 20:14:48 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="qyLedVMx"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id B9CD710EC9A; Fri, 11 Apr 2025 20:14:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=yyhXtMF9oUIWnT6Vs+9eGMKsH6B2P/2tukc5ckGCwdo=; b=qyLedVMxkJqsPjTqPqZ1dTy6A3 hZ8JiruXHPxBS4M9KHqjK3MuJOZ59obSgytEb/1xBORwNPONks35Uw6G74f2+UToUdMesk7CJQUWD JCHypvr9I5fbEuOUSquGMIpR3T27agtBSJzsU6Cva3r6a76Hg97RTC6DbK+q6qVRZZOyrPfocjR0S 6PHfIKg0jUCBzqD2j7zmOwgIoTAedmwBa3EygD99ukXRcA7VVSbDMTMSOSPr5BtFA2QERmDUD6kxp SXVky/MlWObaktf1qPPF/JDW1qSuDbyABTgvqbt76v3AxoKHowUVbwmzUdtROz8/XYsRAODoDZ9VV 9p7P9sWA==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Kls-00FIP5-De; Fri, 11 Apr 2025 22:14:41 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 12/13] drm/amd/display: add drm_edid to dc_sink Date: Fri, 11 Apr 2025 17:08:42 -0300 Message-ID: <20250411201333.151335-13-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Add Linux opaque object to dc_sink for storing edid data cross driver, drm_edid. Also include the Linux call to free this object, the drm_edid_free() Signed-off-by: Melissa Wen --- drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c | 7 +++++++ drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h | 1 + drivers/gpu/drm/amd/display/dc/core/dc_sink.c | 3 +++ drivers/gpu/drm/amd/display/dc/dc.h | 3 +++ 4 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c index 39fcaa16a14a..fa0f0e61f05d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT #include "amdgpu_dm/dc_edid.h" #include "dc.h" +#include bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink) @@ -25,3 +26,9 @@ void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, memmove(dc_sink->dc_edid.raw_edid, (const uint8_t *) edid, len); dc_sink->dc_edid.length = len; } + + +void dc_edid_sink_edid_free(struct dc_sink *sink) +{ + drm_edid_free(sink->drm_edid); +} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h index f42cd5bbc730..2c76768be459 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h @@ -9,5 +9,6 @@ bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink); void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, const void *edid, int len); +void dc_edid_sink_edid_free(struct dc_sink *sink); #endif /* __DC_EDID_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c index 455fa5dd1420..3774a3245506 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c @@ -26,6 +26,7 @@ #include "dm_services.h" #include "dm_helpers.h" #include "core_types.h" +#include "dc_edid.h" /******************************************************************************* * Private functions @@ -65,6 +66,8 @@ void dc_sink_retain(struct dc_sink *sink) static void dc_sink_free(struct kref *kref) { struct dc_sink *sink = container_of(kref, struct dc_sink, refcount); + + dc_edid_sink_edid_free(sink); kfree(sink->dc_container_id); kfree(sink); } diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index d60cd9d23848..0d4e6ea1821b 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -46,6 +46,8 @@ #include "dmub/inc/dmub_cmd.h" +#include + struct abm_save_restore; /* forward declaration */ @@ -2430,6 +2432,7 @@ struct scdc_caps { struct dc_sink { enum signal_type sink_signal; struct dc_edid dc_edid; /* raw edid */ + const struct drm_edid *drm_edid; /* Linux DRM edid*/ struct dc_edid_caps edid_caps; /* parse display caps */ struct dc_container_id *dc_container_id; uint32_t dongle_max_pix_clk; From patchwork Fri Apr 11 20:08:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Melissa Wen X-Patchwork-Id: 14048710 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E38DEC369AB for ; Fri, 11 Apr 2025 20:14:53 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3EBBC10ECA1; Fri, 11 Apr 2025 20:14:53 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="jbJ3GdEB"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id BD02410EC9F; Fri, 11 Apr 2025 20:14:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=m8gbsGs53QKdVE+LfHoqxDJxPZHx8u+jvP1YMHlVLQ0=; b=jbJ3GdEBhfFNMP70XnbA0ndrAM riGCuyzrSc/7J7pWMypt9bAqRljRobgYU/cXmx0lp5x09T1VXIapVe636/OF1pUZjF62C14qj6/bh pvRlisS7AMqeyKim/n4Be03FyM6wxBOfcY1cyjW0sikfsqzCctaAwplU1a3Qq7qn89jrKny7FIRbc O69wEI8suohPmhKYQi0FeN8GJ7aWFYgDJUIZgrOMCuB15/1AKFfXk7/e3dzCkdzY9EQz+k85lj7Un WvO6K9ZK8fqU2Wr2dg3W3emm5GPJ04XhLcGr03RXs+WCDvRm6eTeQAa5O8ZyKWnSC9WyxyumBV4ZT KmqOd8Cg==; Received: from [189.6.35.67] (helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1u3Klx-00FIP5-6N; Fri, 11 Apr 2025 22:14:46 +0200 From: Melissa Wen To: Alex Hung , Mario Limonciello , Rodrigo Siqueira , harry.wentland@amd.com, sunpeng.li@amd.com, alexander.deucher@amd.com, christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch Cc: Jani Nikula , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, kernel-dev@igalia.com Subject: [PATCH 13/13] drm/amd/display: move dc_sink from dc_edid to drm_edid Date: Fri, 11 Apr 2025 17:08:43 -0300 Message-ID: <20250411201333.151335-14-mwen@igalia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250411201333.151335-1-mwen@igalia.com> References: <20250411201333.151335-1-mwen@igalia.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Reduce direct handling of edid data by resorting to drm helpers that deal with this info inside drm_edid infrastructure. Signed-off-by: Melissa Wen --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 26 +++++++------------ .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 24 +++++------------ .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 21 +++++---------- .../gpu/drm/amd/display/amdgpu_dm/dc_edid.c | 26 +++++++++---------- .../gpu/drm/amd/display/amdgpu_dm/dc_edid.h | 1 + .../drm/amd/display/dc/link/link_detection.c | 3 ++- 6 files changed, 40 insertions(+), 61 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 3cad6d9153f7..3598f0091551 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -68,6 +68,7 @@ #endif #include "amdgpu_dm_psr.h" #include "amdgpu_dm_replay.h" +#include "dc_edid.h" #include "ivsrcid/ivsrcid_vislands30.h" @@ -3862,6 +3863,8 @@ void amdgpu_dm_update_connector_after_detect( * 2. Send an event and let userspace tell us what to do */ if (sink) { + const struct drm_edid *drm_edid = sink->drm_edid; + /* * TODO: check if we still need the S3 mode update workaround. * If yes, put it here. @@ -3873,16 +3876,15 @@ void amdgpu_dm_update_connector_after_detect( aconnector->dc_sink = sink; dc_sink_retain(aconnector->dc_sink); - if (sink->dc_edid.length == 0) { + + if (!drm_edid_valid(drm_edid)) { aconnector->drm_edid = NULL; hdmi_cec_unset_edid(aconnector); if (aconnector->dc_link->aux_mode) { drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux); } } else { - const struct edid *edid = (const struct edid *)sink->dc_edid.raw_edid; - - aconnector->drm_edid = drm_edid_alloc(edid, sink->dc_edid.length); + aconnector->drm_edid = drm_edid_dup(sink->drm_edid); drm_edid_connector_update(connector, aconnector->drm_edid); hdmi_cec_set_edid(aconnector); @@ -7523,12 +7525,8 @@ static void amdgpu_dm_connector_funcs_force(struct drm_connector *connector) aconnector->drm_edid = drm_edid; /* Update emulated (virtual) sink's EDID */ if (dc_em_sink && dc_link) { - // FIXME: Get rid of drm_edid_raw() - const struct edid *edid = drm_edid_raw(drm_edid); - memset(&dc_em_sink->edid_caps, 0, sizeof(struct dc_edid_caps)); - memmove(dc_em_sink->dc_edid.raw_edid, edid, - (edid->extensions + 1) * EDID_LENGTH); + dc_edid_copy_edid_to_dc(dc_em_sink, drm_edid, 0); dm_helpers_parse_edid_caps(dc_link, dc_em_sink); } } @@ -7561,7 +7559,6 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector) .sink_signal = SIGNAL_TYPE_VIRTUAL }; const struct drm_edid *drm_edid; - const struct edid *edid; struct i2c_adapter *ddc; if (dc_link && dc_link->aux_mode) @@ -7581,12 +7578,9 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector) aconnector->drm_edid = drm_edid; - edid = drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw() - aconnector->dc_em_sink = dc_link_add_remote_sink( - aconnector->dc_link, - (uint8_t *)edid, - (edid->extensions + 1) * EDID_LENGTH, - &init_params); + aconnector->dc_em_sink = dc_link_add_remote_sink(aconnector->dc_link, + drm_edid, 0, + &init_params); if (aconnector->base.force == DRM_FORCE_ON) { aconnector->dc_sink = aconnector->dc_link->local_sink ? diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index 3082582c1579..c56c1e36f539 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -47,6 +47,7 @@ #include "dm_helpers.h" #include "ddc_service_types.h" #include "clk_mgr.h" +#include "dc_edid.h" static void apply_edid_quirks(struct drm_device *dev, const struct drm_edid *drm_edid, @@ -101,20 +102,16 @@ enum dc_edid_status dm_helpers_parse_edid_caps(struct dc_link *link, struct amdgpu_dm_connector *aconnector = link->priv; struct drm_connector *connector = &aconnector->base; struct drm_device *dev = connector->dev; - struct edid *edid_buf; - const struct drm_edid *drm_edid; + const struct drm_edid *drm_edid = sink->drm_edid; struct drm_edid_product_id product_id; struct dc_edid_caps *edid_caps = &sink->edid_caps; int sad_count; int i = 0; enum dc_edid_status result = EDID_OK; - edid_buf = (struct edid *) &sink->dc_edid.raw_edid; - if (!edid_caps || !edid_buf) + if (!edid_caps || !drm_edid) return EDID_BAD_INPUT; - drm_edid = drm_edid_alloc(edid_buf, EDID_LENGTH * (edid_buf->extensions + 1)); - if (!drm_edid_valid(drm_edid)) result = EDID_BAD_CHECKSUM; @@ -137,10 +134,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps(struct dc_link *link, apply_edid_quirks(dev, drm_edid, edid_caps); sad_count = drm_eld_sad_count(connector->eld); - if (sad_count <= 0) { - drm_edid_free(drm_edid); + if (sad_count <= 0) return result; - } edid_caps->audio_mode_count = min(sad_count, DC_MAX_AUDIO_DESC_COUNT); for (i = 0; i < edid_caps->audio_mode_count; ++i) { @@ -160,8 +155,6 @@ enum dc_edid_status dm_helpers_parse_edid_caps(struct dc_link *link, else edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION; - drm_edid_free(drm_edid); - return result; } @@ -993,7 +986,6 @@ enum dc_edid_status dm_helpers_read_local_edid( int retry = 3; enum dc_edid_status edid_status; const struct drm_edid *drm_edid; - const struct edid *edid; if (link->aux_mode) ddc = &aconnector->dm_dp_aux.aux.ddc; @@ -1023,11 +1015,7 @@ enum dc_edid_status dm_helpers_read_local_edid( if (!drm_edid) return EDID_NO_RESPONSE; - edid = drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw() - sink->dc_edid.length = EDID_LENGTH * (edid->extensions + 1); - memmove(sink->dc_edid.raw_edid, (uint8_t *)edid, sink->dc_edid.length); - - /* We don't need the original edid anymore */ + sink->drm_edid = drm_edid_dup(drm_edid); drm_edid_free(drm_edid); edid_status = dm_helpers_parse_edid_caps(link, sink); @@ -1053,6 +1041,8 @@ enum dc_edid_status dm_helpers_read_local_edid( test_response.bits.EDID_CHECKSUM_WRITE = 1; + // TODO: drm_edid doesn't have a helper for dp_write_dpcd yet + dc_edid_copy_edid_to_sink(sink); dm_helpers_dp_write_dpcd(ctx, link, DP_TEST_EDID_CHECKSUM, diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 075e8a5be47c..e3de1526397d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -333,12 +333,10 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector) .link = aconnector->dc_link, .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; - dc_sink = dc_link_add_remote_sink( - aconnector->dc_link, - NULL, - 0, - &init_params); - + dc_sink = dc_link_add_remote_sink(aconnector->dc_link, + NULL, + 0, + &init_params); if (!dc_sink) { DRM_ERROR("Unable to add a remote sink\n"); return 0; @@ -371,15 +369,10 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector) struct dc_sink_init_data init_params = { .link = aconnector->dc_link, .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; - const struct edid *edid; - - edid = drm_edid_raw(aconnector->drm_edid); // FIXME: Get rid of drm_edid_raw() - dc_sink = dc_link_add_remote_sink( - aconnector->dc_link, - (uint8_t *)edid, - (edid->extensions + 1) * EDID_LENGTH, - &init_params); + dc_sink = dc_link_add_remote_sink(aconnector->dc_link, + aconnector->drm_edid, 0, + &init_params); if (!dc_sink) { DRM_ERROR("Unable to add a remote sink\n"); return 0; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c index fa0f0e61f05d..b398c9c5e04f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c @@ -6,25 +6,25 @@ bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink) { - struct dc_edid *old_edid = &prev_sink->dc_edid; - struct dc_edid *new_edid = ¤t_sink->dc_edid; - - if (old_edid->length != new_edid->length) - return false; - - if (new_edid->length == 0) - return false; - - return (memcmp(old_edid->raw_edid, - new_edid->raw_edid, new_edid->length) == 0); + return drm_edid_is_edid_eq(prev_sink->drm_edid, current_sink->drm_edid); } void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, const void *edid, int len) { - memmove(dc_sink->dc_edid.raw_edid, (const uint8_t *) edid, len); - dc_sink->dc_edid.length = len; + dc_sink->drm_edid = drm_edid_dup((const struct drm_edid *) edid); +} + +void dc_edid_copy_edid_to_sink(struct dc_sink *sink) +{ + const struct edid *edid; + uint32_t edid_length; + + edid = drm_edid_raw(sink->drm_edid); // FIXME: Get rid of drm_edid_raw() + edid_length = EDID_LENGTH * (edid->extensions + 1); + memcpy(sink->dc_edid.raw_edid, (uint8_t *) edid, edid_length); + sink->dc_edid.length = edid_length; } diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h index 2c76768be459..a95cc6ccc743 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h @@ -9,6 +9,7 @@ bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink); void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, const void *edid, int len); +void dc_edid_copy_edid_to_sink(struct dc_sink *sink); void dc_edid_sink_edid_free(struct dc_sink *sink); #endif /* __DC_EDID_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index 978d2b4a4d29..40cf1f0aa7cf 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -1142,6 +1142,7 @@ static bool detect_link_and_local_sink(struct dc_link *link, dp_trace_init(link); /* Connectivity log: detection */ + dc_edid_copy_edid_to_sink(sink); for (i = 0; i < sink->dc_edid.length / DC_EDID_BLOCK_SIZE; i++) { CONN_DATA_DETECT(link, &sink->dc_edid.raw_edid[i * DC_EDID_BLOCK_SIZE], @@ -1424,7 +1425,7 @@ struct dc_sink *link_add_remote_sink( * parsing fails */ if (edid_status != EDID_OK && edid_status != EDID_PARTIAL_VALID) { - dc_sink->dc_edid.length = 0; + drm_edid_free(dc_sink->drm_edid); dm_error("Bad EDID, status%d!\n", edid_status); }