From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0330F207A32 for ; Thu, 11 Sep 2025 09:32:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.190 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757583174; cv=none; b=SI7zeECyqf5NkMe9zPm5UbbqJXDXS4ltjg5wSzPbKn21TDSYe/43e6WO3mAwsfhDshJfmXQQaD8Yu+pTDzeXH4p9BBa4TFdR/PUcsylhdPU6YucEgD0w8/l2REANh/OFJflOGoOnn79EK3tmNS/8luO5rJGMsUeO4eujihwYFys= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757583174; c=relaxed/simple; bh=+xy9vSCW1vOiGdtWUI+vgUyp2VkBQCyz6hSxHM45Vxk=; h=Message-ID:Date:MIME-Version:Subject:To:CC:References:From: In-Reply-To:Content-Type; b=nvlCWC3fOgaAQruBmVCu+tN4SRlos7+c7vzgVICtEC2aM5czYF7oam3SO9ag07VjugEPA5Mkiuv6AVhoabaV7sPYyphQSX+BjbARF4z+kvsgLx9XfxOsznVakGVRRl86WkaNZygCyuY/hmA8HkonTfeEozpe8UW68hvrBw+O338= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.190 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.162.112]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4cMsfy2fm9z2CgjF; Thu, 11 Sep 2025 17:28:10 +0800 (CST) Received: from dggemv712-chm.china.huawei.com (unknown [10.1.198.32]) by mail.maildlp.com (Postfix) with ESMTPS id 0CA4F1400CB; Thu, 11 Sep 2025 17:32:43 +0800 (CST) Received: from kwepemq100007.china.huawei.com (7.202.195.175) by dggemv712-chm.china.huawei.com (10.1.198.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Thu, 11 Sep 2025 17:32:42 +0800 Received: from [10.159.166.136] (10.159.166.136) by kwepemq100007.china.huawei.com (7.202.195.175) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Thu, 11 Sep 2025 17:32:42 +0800 Message-ID: <8bbfd02f-138d-420c-b456-10d0c913f46e@huawei.com> Date: Thu, 11 Sep 2025 17:32:40 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 drm-dp 02/11] drm/hisilicon/hibmc: fix dp probabilistical detect errors after HPD irq To: Dmitry Baryshkov CC: , , , , , , , , , , , , , , , , References: <20250813094238.3722345-1-shiyongbang@huawei.com> <20250813094238.3722345-3-shiyongbang@huawei.com> <1dd93bb7-4f67-4b9b-8b6a-d7c5c77cf807@huawei.com> From: Yongbang Shi In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: kwepems100001.china.huawei.com (7.221.188.238) To kwepemq100007.china.huawei.com (7.202.195.175) > On Thu, Aug 14, 2025 at 08:19:41PM +0800, Yongbang Shi wrote: >>> On Wed, Aug 13, 2025 at 05:42:29PM +0800, Yongbang Shi wrote: >>>> From: Baihan Li >>>> >>>> The debouncing when HPD pulled out still remains sometimes, 200ms still can >>>> not ensure helper_detect() is correct. So add a flag to hold the sink >>>> status, and changed detect_ctx() functions by using flag to check status. >>> THis doesn't explain what is wrong with >>> drm_connector_helper_detect_from_ddc(). In the end, this function >>> doesn't use the HPD pin. >> I'm sorry about the misunderstanding. >> The issue is that after plugging or unplugging the monitor, the driver takes no action sometimes >> even though an interrupt is triggered. The root cause is that drm_connector_helper_detect_from_ddc() >> still returns connected status when the monitor is unplugged. >> And I will fix the way in the end. > Can you perform a normal DP detection: read DPCD and check that there is > a DPRX attached and that it's either non-branch device or it has one or > more sinks? I'm very sorry that I didn't get the last sentence's asking before. It's a non-branch device. We just connect a DP monitor. Thanks, Baihan Li! >> Thanks, >> Baihan Li! >> >> >>>> Fixes: 3c7623fb5bb6 ("drm/hisilicon/hibmc: Enable this hot plug detect of irq feature") >>>> Signed-off-by: Baihan Li >>>> Signed-off-by: Yongbang Shi >>>> --- >>>> ChangeLog: >>>> v3 -> v4: >>>> - remove link training process in hibmc_dp_detect(), suggested by Dmitry Baryshkov. >>>> - remove if (dev->registered), suggested by Dmitry Baryshkov. >>>> --- >>>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h | 1 + >>>> .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 19 ++++++++++++------- >>>> 2 files changed, 13 insertions(+), 7 deletions(-) >>>> >>>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h >>>> index 665f5b166dfb..68867475508c 100644 >>>> --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h >>>> +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h >>>> @@ -50,6 +50,7 @@ struct hibmc_dp { >>>> struct drm_dp_aux aux; >>>> struct hibmc_dp_cbar_cfg cfg; >>>> u32 irq_status; >>>> + int hpd_status; >>>> }; >>>> int hibmc_dp_hw_init(struct hibmc_dp *dp); >>>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>>> index d06832e62e96..ded38530ecda 100644 >>>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c >>>> @@ -34,9 +34,12 @@ static int hibmc_dp_connector_get_modes(struct drm_connector *connector) >>>> static int hibmc_dp_detect(struct drm_connector *connector, >>>> struct drm_modeset_acquire_ctx *ctx, bool force) >>>> { >>>> - mdelay(200); >>>> + struct hibmc_dp *dp = to_hibmc_dp(connector); >>>> - return drm_connector_helper_detect_from_ddc(connector, ctx, force); >>>> + if (dp->hpd_status) >>>> + return connector_status_connected; >>>> + else >>>> + return connector_status_disconnected; >>>> } >>>> static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { >>>> @@ -115,21 +118,23 @@ irqreturn_t hibmc_dp_hpd_isr(int irq, void *arg) >>>> { >>>> struct drm_device *dev = (struct drm_device *)arg; >>>> struct hibmc_drm_private *priv = to_hibmc_drm_private(dev); >>>> + struct hibmc_dp *dp = &priv->dp; >>>> int idx; >>>> if (!drm_dev_enter(dev, &idx)) >>>> return -ENODEV; >>>> - if (priv->dp.irq_status & DP_MASKED_SINK_HPD_PLUG_INT) { >>>> + if (((dp->irq_status & DP_MASKED_SINK_HPD_PLUG_INT) && !dp->hpd_status)) { >>>> drm_dbg_dp(&priv->dev, "HPD IN isr occur!\n"); >>>> - hibmc_dp_hpd_cfg(&priv->dp); >>>> + hibmc_dp_hpd_cfg(dp); >>>> + dp->hpd_status = 1; >>>> } else { >>>> drm_dbg_dp(&priv->dev, "HPD OUT isr occur!\n"); >>>> - hibmc_dp_reset_link(&priv->dp); >>>> + hibmc_dp_reset_link(dp); >>>> + dp->hpd_status = 0; >>>> } >>>> - if (dev->registered) >>>> - drm_connector_helper_hpd_irq_event(&priv->dp.connector); >>>> + drm_connector_helper_hpd_irq_event(&priv->dp.connector); >>>> drm_dev_exit(idx); >>>> -- >>>> 2.33.0 >>>>