Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3505073pxk; Mon, 5 Oct 2020 11:21:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzl6mTM3k7KZl3thecmpBNEaCY/AMuWidVkZYFymMEzdUCFwzmt9oGD+kCktfIEkDk04Ptb X-Received: by 2002:a17:906:4754:: with SMTP id j20mr1043419ejs.293.1601922101838; Mon, 05 Oct 2020 11:21:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601922101; cv=none; d=google.com; s=arc-20160816; b=hSdUamSitPra5+oHQpW2KPA8JDCinHoehrLnv1dZ3Epb61fIwBlxicbTQwG29J1Oin Aic5wsW0/Hd0UGE1vKV7mBiVJrzLZB0aGys2EDR2Z36GsLoabuSw7FC2B6xdfKZkof+p 1/3VMMZsWOP1BZlQ0o4VlVdHtXFreZjf8/9nWYuGxljAKiEQ8MdbOpnNOtHX0zLCSvht aQsLjxkt6lcGEYeir/BWnYLMgfDuJjkbXvZcPXnsG4rhva0v8o+1Lc6N+xiAENYJqPs/ Qbn6+id0j0Xlh5cB1EexnlyH2RmjT0YNusinV3WEKJb37Qcmyilv+qFh0ZPekmZiTHYB AiFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:message-id:references:in-reply-to :subject:cc:to:from:date:content-transfer-encoding:mime-version :sender:dkim-signature; bh=ld9Fueldp78QECrk1tT6tf3UhOcfsqkKomFN6EN3Tjg=; b=UvoFVkmmpo2/jJkpIpjsYVtcXdp2AGltbqZkRmmTe7fHBgeX5tOdG7vOSrQsbqLJ/Z 9uB3ahhWsVz0F0ACuMQ8FQZx39PFngPCkcYjmy0+rswzzawxtAdbYxir1a3Rp1f7+hWj WHTqg4rm94orgEUnab1REuMs7Q/wxskk4qDnNBNreeDs1lgtzFEVjBLAmPDE6jzGbp+u vk9NnMFiUwg92flj89fHmCOhq8Sxfgmy43jMy+ZynQu90T1DZNpnZ38bjQ4lV7hkVUJe MqfqkllS345V2ejeTVNxMkD8p6Kq8+SWKBnJ4Rq9bfrCfpLLzDqjPrdK/YirhweGGaFK Cicg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=qJ5wlcqg; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 12si252640ejy.241.2020.10.05.11.21.18; Mon, 05 Oct 2020 11:21:41 -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=@mg.codeaurora.org header.s=smtp header.b=qJ5wlcqg; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727206AbgJESCv (ORCPT + 99 others); Mon, 5 Oct 2020 14:02:51 -0400 Received: from z5.mailgun.us ([104.130.96.5]:54408 "EHLO z5.mailgun.us" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726894AbgJESCv (ORCPT ); Mon, 5 Oct 2020 14:02:51 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1601920969; h=Message-ID: References: In-Reply-To: Subject: Cc: To: From: Date: Content-Transfer-Encoding: Content-Type: MIME-Version: Sender; bh=ld9Fueldp78QECrk1tT6tf3UhOcfsqkKomFN6EN3Tjg=; b=qJ5wlcqgdhDmK7lDj4tPE4/AsCH5TXcsog0NGljvRz6G/EF69cQvKWgmigmjNz7h5WaF/Cut +AnJx57DGEut0nyXXOyN9JXzrN+TlQObzfpOh8lBg+LqIGgrpi4FvB/MWuV6bIWIQC4qHj4a Kd5hOC8IN2I7gqSHfDUzan0zgUE= X-Mailgun-Sending-Ip: 104.130.96.5 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n07.prod.us-east-1.postgun.com with SMTP id 5f7b5fa3aad2c3cd1c8412ac (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Mon, 05 Oct 2020 18:02:11 GMT Sender: khsieh=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 28E93C433F1; Mon, 5 Oct 2020 18:02:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: khsieh) by smtp.codeaurora.org (Postfix) with ESMTPSA id 47ACAC433C8; Mon, 5 Oct 2020 18:02:10 +0000 (UTC) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Mon, 05 Oct 2020 11:02:10 -0700 From: khsieh@codeaurora.org To: Stephen Boyd Cc: robdclark@gmail.com, sean@poorly.run, tanmay@codeaurora.org, abhinavk@codeaurora.org, aravindh@codeaurora.org, airlied@linux.ie, daniel@ffwll.ch, linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] drm/msm/dp: fixes wrong connection state caused by failure of link train In-Reply-To: <160169114309.310579.5033839844955785761@swboyd.mtv.corp.google.com> References: <20201002220919.17245-1-khsieh@codeaurora.org> <160169114309.310579.5033839844955785761@swboyd.mtv.corp.google.com> Message-ID: <0de13a805820e4d73b8f906682386845@codeaurora.org> X-Sender: khsieh@codeaurora.org User-Agent: Roundcube Webmail/1.3.9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2020-10-02 19:12, Stephen Boyd wrote: > Quoting Kuogee Hsieh (2020-10-02 15:09:19) >> Connection state is set incorrectly happen at either failure of link >> train >> or cable plugged in while suspended. This patch fixes these problems. >> This patch also replace ST_SUSPEND_PENDING with ST_DISPLAY_OFF. >> >> Signed-off-by: Kuogee Hsieh > > Any Fixes: tag? > >> --- >> drivers/gpu/drm/msm/dp/dp_display.c | 52 >> ++++++++++++++--------------- >> drivers/gpu/drm/msm/dp/dp_panel.c | 5 +++ >> 2 files changed, 31 insertions(+), 26 deletions(-) >> >> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c >> b/drivers/gpu/drm/msm/dp/dp_display.c >> index 431dff9de797..898c6cc1643a 100644 >> --- a/drivers/gpu/drm/msm/dp/dp_display.c >> +++ b/drivers/gpu/drm/msm/dp/dp_display.c >> @@ -340,8 +340,6 @@ static int dp_display_process_hpd_high(struct >> dp_display_private *dp) >> } >> >> dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); >> - >> - >> end: >> return rc; >> } > > Not sure we need this hunk > >> @@ -1186,19 +1180,19 @@ static int dp_pm_resume(struct device *dev) >> >> dp = container_of(dp_display, struct dp_display_private, >> dp_display); >> >> + /* start from dis connection state */ > > disconnection? Or disconnected state? > >> + atomic_set(&dp->hpd_state, ST_DISCONNECTED); >> + >> dp_display_host_init(dp); >> >> dp_catalog_ctrl_hpd_config(dp->catalog); >> >> status = dp_catalog_hpd_get_state_status(dp->catalog); >> >> - if (status) { >> + if (status) >> dp->dp_display.is_connected = true; >> - } else { >> + else >> dp->dp_display.is_connected = false; >> - /* make sure next resume host_init be called */ >> - dp->core_initialized = false; >> - } >> >> return 0; >> } >> @@ -1214,6 +1208,9 @@ static int dp_pm_suspend(struct device *dev) >> if (dp_display->power_on == true) >> dp_display_disable(dp, 0); >> >> + /* host_init will be called at pm_resume */ >> + dp->core_initialized = false; >> + >> atomic_set(&dp->hpd_state, ST_SUSPENDED); >> >> return 0; >> @@ -1343,6 +1340,9 @@ int msm_dp_display_enable(struct msm_dp *dp, >> struct drm_encoder *encoder) >> >> mutex_lock(&dp_display->event_mutex); >> >> + /* delete sentinel checking */ > > Stop sentinel checking? > >> + dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT); >> + >> rc = dp_display_set_mode(dp, &dp_display->dp_mode); >> if (rc) { >> DRM_ERROR("Failed to perform a mode set, rc=%d\n", >> rc); >> @@ -1368,9 +1368,8 @@ int msm_dp_display_enable(struct msm_dp *dp, >> struct drm_encoder *encoder) >> dp_display_unprepare(dp); >> } >> >> - dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT); >> - >> - if (state == ST_SUSPEND_PENDING) >> + /* manual kick off plug event to train link */ >> + if (state == ST_DISPLAY_OFF) >> dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0); >> >> /* completed connection */ >> @@ -1402,20 +1401,21 @@ int msm_dp_display_disable(struct msm_dp *dp, >> struct drm_encoder *encoder) >> >> mutex_lock(&dp_display->event_mutex); >> >> + /* delete sentinel checking */ > > Stop sentinel checking? > >> + dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT); >> + >> dp_display_disable(dp_display, 0); >> >> rc = dp_display_unprepare(dp); >> if (rc) >> DRM_ERROR("DP display unprepare failed, rc=%d\n", rc); >> >> - dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT); >> - >> state = atomic_read(&dp_display->hpd_state); >> if (state == ST_DISCONNECT_PENDING) { > > I don't understand the atomic nature of this hpd_state variable. Why is > it an atomic variable? Is taking a spinlock bad? What is to prevent the > atomic read here to not be interrupted and then this if condition check > be invalid because the variable has been updated somewhere else? hpd_state variable updated by multiple threads. however it was protected by mutex. in theory, it should also work as u32. since it was declared as atomic from beginning and it does not cause any negative effects, can we keep it as it is? >> /* completed disconnection */ >> atomic_set(&dp_display->hpd_state, ST_DISCONNECTED); >> } else { >> - atomic_set(&dp_display->hpd_state, >> ST_SUSPEND_PENDING); >> + atomic_set(&dp_display->hpd_state, ST_DISPLAY_OFF);