Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp433037rdf; Tue, 21 Nov 2023 06:44:28 -0800 (PST) X-Google-Smtp-Source: AGHT+IH61suYXXiwoW9R+ifyu2iHd0zVzQ8VzTm0//Plg1QUdCOkinv0cTuo09JttUhJnq5tea7Z X-Received: by 2002:a05:6a21:1207:b0:187:e2ad:9946 with SMTP id oe7-20020a056a21120700b00187e2ad9946mr9455428pzb.54.1700577868368; Tue, 21 Nov 2023 06:44:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700577868; cv=none; d=google.com; s=arc-20160816; b=l+uCO41VVHCz+297JJUznaXuNmwj5O8ECM8Vr/jTivD9TxjiVVcBlQr0UY35mvSMIk rPaBrIOajzvMlwwM00bPKCiBIwO5pPui/nQ2PtqTGnha7EFPzhTML2QreqjNywKd4sz3 M6ONSEZjk6wahV9ldIsTZSH9187ukV6OVmA4V4kgI7ox1omIU0cMpvDK/AKz0+BFhPgq NTzNFP7jpozDeEqChKg+qG5mYOH1WD6WFDzEuB6CT7RQT6wd2EhIOhHo3D02s/cLRlz7 WlgkTeeJUdSEBFiJy1CX1LsX8JPMm/ORHxYFqcbHUUWN38XdNJi9KwpJNoAQ+u2uiOMY Ym3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:message-id:references :in-reply-to:subject:cc:to:from:date:mime-version:dkim-signature; bh=ora9LNQojLFOHpN5TfIswvOn2ErYWx9aqDb30umlaSI=; fh=zKBsU7RjjoTBMYNBsXkXt6uiK+oMI30kutMOl1mi8UA=; b=Sn7xvQv4VxdTVE4enUF3vugWxaTJDEg4WupYarbTPWkPemED7NZ0B5wPzcLe8z457w NBxrtUP2w1hXIIlnjK8DKPcgt99Upc/XSKjC5VAhdk3DyE0U58RYnYSG4x1WFcYpfWJ1 OXbmzM8nInLwwzaHJuylghPwzHQVx1tcNuCQbdOFnRGDqCzSC0EJRRhAqGJiyjI5W4Ki NtmLaPAErISgPSI7ja8hoJrkgycSOBHIJOLPXnmvi15fO1XjmEm/ZT5mNputmjqJ5QHb rbQB5XM1HrEXGErI3CB0eFmWUkNGTmeJ/iCVNA0D1kqbm8Tzsfr01OHO7/bJnQx1+w7j 7hjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tyY22s12; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id n186-20020a6327c3000000b005b8f24e6526si10456988pgn.234.2023.11.21.06.44.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 06:44:28 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tyY22s12; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id B1CF58027F38; Tue, 21 Nov 2023 06:44:26 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234384AbjKUOoY (ORCPT + 99 others); Tue, 21 Nov 2023 09:44:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60006 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234295AbjKUOoX (ORCPT ); Tue, 21 Nov 2023 09:44:23 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 419FF90 for ; Tue, 21 Nov 2023 06:44:19 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C80F3C433C7; Tue, 21 Nov 2023 14:44:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1700577858; bh=i4k9JATCdARgpGIsnHRdPJazvwXg7FUJt9BeVRU1bpE=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=tyY22s12GfB+H/yBT0ENPS7IZmDxag0iY/ghg3pIXF2vP+qWmgTxyhsGfijaaBOkX rHfGRKquiqoPqyT00HZOPy3G6oWeyYJ1qvzoCFycdC2rEaeeU5KEvc7c3qx5IJy9M9 69FWxR1J2b9QFxveDp99y51TPdaztY+VyrEDI6EcnvJkiYTVx7PZBiTgdl2qKvIl7p vctT6tpXYnu22hv4gfl8vJ6Srx/GSVyQ5Wydcvfb40LugS8KnpE0r1hI8xYTteTWhJ rIe3SSN3EEYBoXdRs1JSNfqKGcEQvGNHgP1kTcXTUpPy+4vn8wAtOhC3127DhOT5pv v3xBP99CTS8jw== MIME-Version: 1.0 Date: Tue, 21 Nov 2023 15:44:13 +0100 From: Michael Walle To: =?UTF-8?Q?N=C3=ADcolas_F_=2E_R_=2E_A_=2E_Prado?= , Chun-Kuang Hu , Philipp Zabel , David Airlie , Daniel Vetter , Matthias Brugger , AngeloGioacchino Del Regno Cc: "Nancy . Lin" , Frank Wunderlich , Jitao Shi , Stu Hsieh , dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, "Jason-JH.Lin" Subject: Re: [PATCH v4 2/2] drm/mediatek: dpi/dsi: fix possible_crtcs calculation In-Reply-To: <20230905084922.3908121-2-mwalle@kernel.org> References: <20230905084922.3908121-1-mwalle@kernel.org> <20230905084922.3908121-2-mwalle@kernel.org> Message-ID: <93576c3b04c8378c5c9296ec7a6585d9@kernel.org> X-Sender: mwalle@kernel.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 21 Nov 2023 06:44:26 -0800 (PST) Hi, > mtk_drm_find_possible_crtc_by_comp() assumed that the main path will > always have the CRTC with id 0, the ext id 1 and the third id 2. This > is only true if the paths are all available. But paths are optional > (see > also comment in mtk_drm_kms_init()), e.g. the main path might not be > enabled or available at all. Then the CRTC IDs will shift one up, e.g. > ext will be 0 and the third path will be 1. > > To fix that, dynamically calculate the IDs by the presence of the > paths. > > While at it, make the return code a signed one and return -ENOENT if no > path is found and handle the error in the callers. > > Fixes: 5aa8e7647676 ("drm/mediatek: dpi/dsi: Change the getting > possible_crtc way") > Suggested-by: Nícolas F. R. A. Prado > Signed-off-by: Michael Walle > Reviewed-by: Nícolas F. R. A. Prado > Tested-by: Nícolas F. R. A. Prado Is there anything wrong with these two patches? They are now lingering around for more than two months. Unfortunately, patch 2/2 won't apply anymore because of commit 01389b324c97 ("drm/mediatek: Add connector dynamic selection capability). And I'm a bit puzzled for what the crtc_id is used there because I guess it will have the same problem this patch fixes. -michael > --- > v4: > - return -ENOENT if mtk_drm_find_possible_crtc_by_comp() doesn't find > any path > v3: > - use data instead of priv_n->data > - fixed typos > - collected Rb and Tb tags > v2: > - iterate over all_drm_private[] to get any vdosys > - new check if a path is available > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 5 +- > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 75 ++++++++++++++++----- > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 3 +- > drivers/gpu/drm/mediatek/mtk_dsi.c | 5 +- > 4 files changed, 68 insertions(+), 20 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 2f931e4e2b60..f9250f7ee706 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -796,7 +796,10 @@ static int mtk_dpi_bind(struct device *dev, struct > device *master, void *data) > return ret; > } > > - dpi->encoder.possible_crtcs = > mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->dev); > + ret = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->dev); > + if (ret < 0) > + goto err_cleanup; > + dpi->encoder.possible_crtcs = ret; > > ret = drm_bridge_attach(&dpi->encoder, &dpi->bridge, NULL, > DRM_BRIDGE_ATTACH_NO_CONNECTOR); > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > index 771f4e173353..83ae75ecd858 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > @@ -507,6 +507,27 @@ static bool mtk_drm_find_comp_in_ddp(struct device > *dev, > return false; > } > > +static bool mtk_ddp_path_available(const unsigned int *path, > + unsigned int path_len, > + struct device_node **comp_node) > +{ > + unsigned int i; > + > + if (!path) > + return false; > + > + for (i = 0U; i < path_len; i++) { > + /* OVL_ADAPTOR doesn't have a device node */ > + if (path[i] == DDP_COMPONENT_DRM_OVL_ADAPTOR) > + continue; > + > + if (!comp_node[path[i]]) > + return false; > + } > + > + return true; > +} > + > int mtk_ddp_comp_get_id(struct device_node *node, > enum mtk_ddp_comp_type comp_type) > { > @@ -522,25 +543,47 @@ int mtk_ddp_comp_get_id(struct device_node *node, > return -EINVAL; > } > > -unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device > *drm, > - struct device *dev) > +int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm, struct > device *dev) > { > struct mtk_drm_private *private = drm->dev_private; > - unsigned int ret = 0; > - > - if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path, > private->data->main_len, > - private->ddp_comp)) > - ret = BIT(0); > - else if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path, > - private->data->ext_len, private->ddp_comp)) > - ret = BIT(1); > - else if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path, > - private->data->third_len, private->ddp_comp)) > - ret = BIT(2); > - else > - DRM_INFO("Failed to find comp in ddp table\n"); > + const struct mtk_mmsys_driver_data *data; > + struct mtk_drm_private *priv_n; > + int i = 0, j; > + > + for (j = 0; j < private->data->mmsys_dev_num; j++) { > + priv_n = private->all_drm_private[j]; > + data = priv_n->data; > + > + if (mtk_ddp_path_available(data->main_path, data->main_len, > + priv_n->comp_node)) { > + if (mtk_drm_find_comp_in_ddp(dev, data->main_path, > + data->main_len, > + priv_n->ddp_comp)) > + return BIT(i); > + i++; > + } > + > + if (mtk_ddp_path_available(data->ext_path, data->ext_len, > + priv_n->comp_node)) { > + if (mtk_drm_find_comp_in_ddp(dev, data->ext_path, > + data->ext_len, > + priv_n->ddp_comp)) > + return BIT(i); > + i++; > + } > + > + if (mtk_ddp_path_available(data->third_path, data->third_len, > + priv_n->comp_node)) { > + if (mtk_drm_find_comp_in_ddp(dev, data->third_path, > + data->third_len, > + priv_n->ddp_comp)) > + return BIT(i); > + i++; > + } > + } > > - return ret; > + DRM_INFO("Failed to find comp in ddp table\n"); > + return -ENOENT; > } > > int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp > *comp, > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > index febcaeef16a1..6a95df72de0a 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > @@ -277,8 +277,7 @@ static inline bool mtk_ddp_comp_disconnect(struct > mtk_ddp_comp *comp, struct dev > > int mtk_ddp_comp_get_id(struct device_node *node, > enum mtk_ddp_comp_type comp_type); > -unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device > *drm, > - struct device *dev); > +int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm, struct > device *dev); > int mtk_ddp_comp_init(struct device_node *comp_node, struct > mtk_ddp_comp *comp, > unsigned int comp_id); > enum mtk_ddp_comp_type mtk_ddp_comp_get_type(unsigned int comp_id); > diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c > b/drivers/gpu/drm/mediatek/mtk_dsi.c > index d8bfc2cce54d..d67e5c61a9b9 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dsi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c > @@ -843,7 +843,10 @@ static int mtk_dsi_encoder_init(struct drm_device > *drm, struct mtk_dsi *dsi) > return ret; > } > > - dsi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm, > dsi->host.dev); > + ret = mtk_drm_find_possible_crtc_by_comp(drm, dsi->host.dev); > + if (ret < 0) > + goto err_cleanup_encoder; > + dsi->encoder.possible_crtcs = ret; > > ret = drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL, > DRM_BRIDGE_ATTACH_NO_CONNECTOR);