Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp2847591pxb; Mon, 19 Apr 2021 15:57:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyl6MJ+vPQwqfBFeSn3UMmRp8F8I1nH74/CuBM+vTVgmklNV/bBE7gyolb2YICztTmrxHmO X-Received: by 2002:aa7:dad1:: with SMTP id x17mr1199179eds.380.1618873024564; Mon, 19 Apr 2021 15:57:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618873024; cv=none; d=google.com; s=arc-20160816; b=aVDRmzz6FI3jRskycCoEo9JE8fieMCNC11TxKkMiEbrOHjgF6eKFRv4T0duFpOFYTd G8P6UNahFUQQTFWxXSHP/HuEqreaO6zF4/y2OUBXpK0kwxh1csU/IkgbqtlagrLfd+A+ afkyOaCY1FPlrSGSnnXcHyXE3n03rnfXKuUyU+JVgH8k2/p4Kg1QXYI15v0V0cBKaboW E8RoFgxlAOk2XMzgJ/w8NAmeaGcmkrvKeof77jqEYxXCzzKgTn6LBMZskHM54akk4Ix/ 62LqwZKCED+OlcttSvZfC/sQzLSrPQIqEMbsZU50DXrN84s3rKEjoo34tZMMJA4dk+gJ Y1tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=g21KQMO+x+0HfA9S5cU+LPpk/DDwp+NmKrjA0l+Lckg=; b=LE0pKRaDL0WWNTpR5ITuqFmrrHTN6Nx5nX17zrPDjeBOuUt6rOzXnnQAcZ+cjt2hjc wbb8ANt4iANe23olWYdl0aQUhFhNv9PIAufjEhaZo1/aAeLmz9dfOEGhJrVRZA9V5sXh TeCw2Ou5EbehRnVOHtsodOwXvDzJY+hi/4+dhYF7VVrcQgThNnYGi6TBOpGWRhPqe1DQ xJRrHzvZy0r8GKU6zFurXU0QXqMdrE6XVnNhR15FVXhd2WxsSXTru7SMnekuPw/5sOif zOxPZiX7CG2LTQFfEhJ1AS7h7FrlDAUPDGLuQLDNYy/3iJAqHgdYfRxbnnZiPQXZO9fu kgIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=BsOCS455; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id co3si9637856edb.456.2021.04.19.15.56.41; Mon, 19 Apr 2021 15:57:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=BsOCS455; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229941AbhDSW4R (ORCPT + 99 others); Mon, 19 Apr 2021 18:56:17 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:40619 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229714AbhDSW4Q (ORCPT ); Mon, 19 Apr 2021 18:56:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1618872946; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=g21KQMO+x+0HfA9S5cU+LPpk/DDwp+NmKrjA0l+Lckg=; b=BsOCS455s/h/jtarwd80r32PmqIPJt8FfHLNZNAmrmmr7MucP/VB20F3X3PbwfsMHDwa23 sIduQH7cHlvWQUuH0RmylZFFLwGcypwufSpv/uYO0Cp9ZP5Cf5fr/8ZElQq8DNBgHLBUVa rCFZoVur64kDfzq43rStE32xHIwNiGM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-489-KZMwLGAWO2uQyxwrI7ZOGw-1; Mon, 19 Apr 2021 18:55:42 -0400 X-MC-Unique: KZMwLGAWO2uQyxwrI7ZOGw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8F11E501F0; Mon, 19 Apr 2021 22:55:38 +0000 (UTC) Received: from Ruby.lyude.net (ovpn-119-153.rdu2.redhat.com [10.10.119.153]) by smtp.corp.redhat.com (Postfix) with ESMTP id 01BD25C1C4; Mon, 19 Apr 2021 22:55:34 +0000 (UTC) From: Lyude Paul To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, nouveau@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Jani Nikula , Rodrigo Vivi , Thomas Zimmermann , Thierry Reding Cc: Harry Wentland , Leo Li , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , David Airlie , Daniel Vetter , Nicholas Kazlauskas , Rodrigo Siqueira , Aurabindo Pillai , Eryk Brol , Stylon Wang , Bhawanpreet Lakha , Bas Nieuwenhuizen , Nikola Cornij , Mikita Lipski , Wayne Lin , Chris Park , Meenakshikumar Somasundaram , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 01/20] drm/amdgpu: Add error handling to amdgpu_dm_initialize_dp_connector() Date: Mon, 19 Apr 2021 18:55:03 -0400 Message-Id: <20210419225523.184856-2-lyude@redhat.com> In-Reply-To: <20210419225523.184856-1-lyude@redhat.com> References: <20210419225523.184856-1-lyude@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org While working on moving i2c device registration into drm_dp_aux_init() - I realized that in order to do so we need to make sure that drivers calling drm_dp_aux_init() handle any errors it could possibly return. In the process of doing that, I noticed that the majority of AMD's code for DP connector creation doesn't attempt to do any real error handling. So, let's fix this and also cleanup amdgpu_dm_initialize_dp_connector() while we're at it. This way we can handle the error codes from drm_dp_aux_init(). Signed-off-by: Lyude Paul --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 29 +++++++----- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 44 +++++++++++-------- .../display/amdgpu_dm/amdgpu_dm_mst_types.h | 6 +-- 3 files changed, 45 insertions(+), 34 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 a0c8c41e4e57..fc5d315bbb05 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -7608,10 +7608,9 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, aconnector->i2c = i2c; res = i2c_add_adapter(&i2c->base); - if (res) { DRM_ERROR("Failed to register hw i2c %d\n", link->link_index); - goto out_free; + goto fail_free; } connector_type = to_drm_connector_type(link->connector_signal); @@ -7625,8 +7624,7 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, if (res) { DRM_ERROR("connector_init failed\n"); - aconnector->connector_id = -1; - goto out_free; + goto fail_id; } drm_connector_helper_add( @@ -7643,15 +7641,22 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, drm_connector_attach_encoder( &aconnector->base, &aencoder->base); - if (connector_type == DRM_MODE_CONNECTOR_DisplayPort - || connector_type == DRM_MODE_CONNECTOR_eDP) - amdgpu_dm_initialize_dp_connector(dm, aconnector, link->link_index); - -out_free: - if (res) { - kfree(i2c); - aconnector->i2c = NULL; + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort || + connector_type == DRM_MODE_CONNECTOR_eDP) { + res = amdgpu_dm_initialize_dp_connector(dm, aconnector, link->link_index); + if (res) + goto fail_cleanup; } + + return 0; +fail_cleanup: + drm_connector_cleanup(&aconnector->base); +fail_id: + aconnector->connector_id = -1; +fail_free: + kfree(i2c); + aconnector->i2c = NULL; + return res; } 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 73cdb9fe981a..3dee9cce9c9e 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 @@ -425,33 +425,39 @@ static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { .add_connector = dm_dp_add_mst_connector, }; -void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, - struct amdgpu_dm_connector *aconnector, - int link_index) +int amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, + struct amdgpu_dm_connector *aconnector, + int link_index) { - aconnector->dm_dp_aux.aux.name = - kasprintf(GFP_KERNEL, "AMDGPU DM aux hw bus %d", - link_index); - aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer; - aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc; + struct amdgpu_dm_dp_aux *dm_aux = &aconnector->dm_dp_aux; + int ret; - drm_dp_aux_init(&aconnector->dm_dp_aux.aux); - drm_dp_cec_register_connector(&aconnector->dm_dp_aux.aux, - &aconnector->base); + dm_aux->aux.name = kasprintf(GFP_KERNEL, "AMDGPU DM aux hw bus %d", link_index); + if (!dm_aux->aux.name) + return -ENOMEM; + + dm_aux->aux.transfer = dm_dp_aux_transfer; + dm_aux->ddc_service = aconnector->dc_link->ddc; + + drm_dp_aux_init(&dm_aux->aux); + drm_dp_cec_register_connector(&dm_aux->aux, &aconnector->base); if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_eDP) - return; + return 0; aconnector->mst_mgr.cbs = &dm_mst_cbs; - drm_dp_mst_topology_mgr_init( - &aconnector->mst_mgr, - adev_to_drm(dm->adev), - &aconnector->dm_dp_aux.aux, - 16, - 4, - aconnector->connector_id); + ret = drm_dp_mst_topology_mgr_init(&aconnector->mst_mgr, adev_to_drm(dm->adev), + &dm_aux->aux, 16, 4, aconnector->connector_id); + if (ret) + goto unreg_cec; drm_connector_attach_dp_subconnector_property(&aconnector->base); + + return 0; +unreg_cec: + drm_dp_cec_unregister_connector(&dm_aux->aux); + kfree(dm_aux->aux.name); + return ret; } int dm_mst_get_pbn_divider(struct dc_link *link) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h index b38bd68121ce..cf771ff58bb3 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h @@ -31,9 +31,9 @@ struct amdgpu_dm_connector; int dm_mst_get_pbn_divider(struct dc_link *link); -void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, - struct amdgpu_dm_connector *aconnector, - int link_index); +int amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, + struct amdgpu_dm_connector *aconnector, + int link_index); void dm_dp_create_fake_mst_encoders(struct amdgpu_device *adev); -- 2.30.2