Received: by 2002:a05:6359:6284:b0:131:369:b2a3 with SMTP id se4csp4675180rwb; Tue, 8 Aug 2023 11:57:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFI9/SBI5Ct4kllPVDkGwR/XG87bSvLquvygrcVkABNJD7KJ6w1NaT372VXzfktrSboN5zL X-Received: by 2002:a17:903:32d2:b0:1b8:2537:541c with SMTP id i18-20020a17090332d200b001b82537541cmr620617plr.32.1691521023695; Tue, 08 Aug 2023 11:57:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691521023; cv=none; d=google.com; s=arc-20160816; b=gm9vbMov4lBlHVXKx8AUpexEHxXb/76z6JsvV9jNH3qfHQ8/d/zvTfWwMsjtHzHhxp rWorlBQz8W+pFHawLrtj+WtaZyEBnB0h0CES0nmw7imDC2jnjBPR2GWpf7wsXGOWnaE3 tqv+aP4qtG2GNAws9HR75A3+qfalF+XiE/Za5xBfzBrH1HXcJ1ZGjLFtiePmtM5TO+PB XlcMbM+6F5jWMUXU7PO+d0Wxka0tuXJYA9ZvxcfTskzRHWnlrCJFf9lA667fYYotG6XE zAb44AS0pBw73btGVNff4OUkcIZN844whoX4KWhl+B5I6svDav94v7nnRC3/xcjdE7iq ZG1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=OMwYtRs4LUqPPcFIZYxm+1oFsKNkdcYpbIPZoUAL5zI=; fh=pLdUY9KyfkzMaW1+pet2Hz3B2J7z43wuczagomEGAO0=; b=hdVu4xGXwYA2+PZZcc0kG3IQPMVxjHcBszOAoRO2L1V295X8NGHW61040EASj8oHWj EeyXqO3nTwo5f3LBnXYv7GlIHcyndito+Qx5Y4d99vGhLdqvmAf6+kByr1ysm0RCdDem 4mj/bWP6KJazfvxLirwp2BFj8eksF3g1HEhVtMmwEEedZajWqKKVRZkVYBjjPEXyqMtp 8DWC3aysg+kZZ9ahUolOPh4dg2nsAAPEJ50MU+Kt2h2F8ZegfDQ7FFyRN7NriTLkCIgb b8jDrgSqM/EC4Wd5H/Bazg0mfqMvIDj/cNFi7FP7mtNFAO1MkVfAGXMbqxGB4qO8rGhU 9vcg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b="C6IWDb8/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id lo12-20020a170903434c00b001b8847d973fsi7545910plb.219.2023.08.08.11.56.51; Tue, 08 Aug 2023 11:57:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b="C6IWDb8/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234630AbjHHR3y (ORCPT + 99 others); Tue, 8 Aug 2023 13:29:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231911AbjHHR3W (ORCPT ); Tue, 8 Aug 2023 13:29:22 -0400 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 720E88C081; Tue, 8 Aug 2023 09:12:39 -0700 (PDT) Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 3787fpLT005135; Tue, 8 Aug 2023 08:53:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=OMwYtRs4LUqPPcFIZYxm+1oFsKNkdcYpbIPZoUAL5zI=; b=C6IWDb8/1tVepnPL8JWQhXexemT3y6x5ALrxv4kGFR1m/ONcu740DYII5LQbKTmPGRJq zWvEXUJ6fPUTHSjbdThFUm0fmeLedKiEKVMHGsju8C/bBqan2VFmMS0D1TshR4prAfEn kWhHPTH/YdjMn6oDgpnS7XHdslweKEYMYzafV5a360xoie/4zmLTVZkLwO4+MFNBGqqW FfxzNuqI9wkkZvgfiW2qWrQ9DiWvv5gUCjvTRmfHp2Vq1KLk3yyXEMDiYhhT+fWY3qys fblVt1LvQzXHscXjrGzln3wkQaku1hiRpzWAOKip8npcsHsUgNJn/tESCK17Vfu2Ocei WA== Received: from nasanppmta05.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3sbb3y8t44-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 08 Aug 2023 08:53:38 +0000 Received: from nasanex01a.na.qualcomm.com (nasanex01a.na.qualcomm.com [10.52.223.231]) by NASANPPMTA05.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 3788rb2G029968 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 8 Aug 2023 08:53:37 GMT Received: from [10.253.74.171] (10.80.80.8) by nasanex01a.na.qualcomm.com (10.52.223.231) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.30; Tue, 8 Aug 2023 01:53:35 -0700 Message-ID: Date: Tue, 8 Aug 2023 16:53:32 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH] bus: mhi: host: pci_generic: Add SDX75 based modem support Content-Language: en-US To: Manivannan Sadhasivam CC: , , , , , References: <1691460215-45383-1-git-send-email-quic_qianyu@quicinc.com> <20230808075103.GD4990@thinkpad> From: Qiang Yu In-Reply-To: <20230808075103.GD4990@thinkpad> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nasanex01a.na.qualcomm.com (10.52.223.231) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: Kig8R0Xi3gs_mxtfSGLhYIz6YstNcAFs X-Proofpoint-GUID: Kig8R0Xi3gs_mxtfSGLhYIz6YstNcAFs X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.957,Hydra:6.0.591,FMLib:17.11.176.26 definitions=2023-08-08_07,2023-08-03_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 adultscore=0 impostorscore=0 mlxlogscore=999 suspectscore=0 spamscore=0 bulkscore=0 lowpriorityscore=0 malwarescore=0 mlxscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2306200000 definitions=main-2308080079 X-Spam-Status: No, score=-3.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 On 8/8/2023 3:51 PM, Manivannan Sadhasivam wrote: > On Tue, Aug 08, 2023 at 10:03:35AM +0800, Qiang Yu wrote: >> Add generic info for SDX75 based modems. SDX75 takes longer than expected >> (default, 8 seconds) to set ready after reboot. Hence add optional ready >> timeout parameter to wait enough for device ready as part of power up >> sequence. >> >> Signed-off-by: Qiang Yu >> --- >> drivers/bus/mhi/host/init.c | 1 + >> drivers/bus/mhi/host/main.c | 7 ++++++- >> drivers/bus/mhi/host/pci_generic.c | 22 ++++++++++++++++++++++ >> drivers/bus/mhi/host/pm.c | 6 +++++- >> include/linux/mhi.h | 4 ++++ >> 5 files changed, 38 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/bus/mhi/host/init.c b/drivers/bus/mhi/host/init.c >> index f78aefd..65ceac1 100644 >> --- a/drivers/bus/mhi/host/init.c >> +++ b/drivers/bus/mhi/host/init.c >> @@ -881,6 +881,7 @@ static int parse_config(struct mhi_controller *mhi_cntrl, >> if (!mhi_cntrl->timeout_ms) >> mhi_cntrl->timeout_ms = MHI_TIMEOUT_MS; >> >> + mhi_cntrl->ready_timeout_ms = config->ready_timeout_ms; >> mhi_cntrl->bounce_buf = config->use_bounce_buf; >> mhi_cntrl->buffer_len = config->buf_len; >> if (!mhi_cntrl->buffer_len) >> diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c >> index 74a7543..8590926 100644 >> --- a/drivers/bus/mhi/host/main.c >> +++ b/drivers/bus/mhi/host/main.c >> @@ -43,8 +43,13 @@ int __must_check mhi_poll_reg_field(struct mhi_controller *mhi_cntrl, >> u32 mask, u32 val, u32 delayus) >> { >> int ret; >> - u32 out, retry = (mhi_cntrl->timeout_ms * 1000) / delayus; >> + u32 out, retry; >> + u32 timeout_ms = mhi_cntrl->timeout_ms; >> >> + if (mhi_cntrl->ready_timeout_ms && mask == MHISTATUS_READY_MASK) >> + timeout_ms = mhi_cntrl->ready_timeout_ms; > Instead of handling the timeout inside mhi_poll_reg_field(), you should pass the > appropriate timeout value to this function. OK, will do. > >> + >> + retry = (timeout_ms * 1000) / delayus; >> while (retry--) { >> ret = mhi_read_reg_field(mhi_cntrl, base, offset, mask, &out); >> if (ret) >> diff --git a/drivers/bus/mhi/host/pci_generic.c b/drivers/bus/mhi/host/pci_generic.c >> index fcd80bc..9c601f0 100644 >> --- a/drivers/bus/mhi/host/pci_generic.c >> +++ b/drivers/bus/mhi/host/pci_generic.c >> @@ -269,6 +269,16 @@ static struct mhi_event_config modem_qcom_v1_mhi_events[] = { >> MHI_EVENT_CONFIG_HW_DATA(5, 2048, 101) >> }; >> >> +static const struct mhi_controller_config modem_qcom_v2_mhiv_config = { >> + .max_channels = 128, >> + .timeout_ms = 8000, >> + .ready_timeout_ms = 50000, >> + .num_channels = ARRAY_SIZE(modem_qcom_v1_mhi_channels), >> + .ch_cfg = modem_qcom_v1_mhi_channels, >> + .num_events = ARRAY_SIZE(modem_qcom_v1_mhi_events), >> + .event_cfg = modem_qcom_v1_mhi_events, >> +}; >> + >> static const struct mhi_controller_config modem_qcom_v1_mhiv_config = { >> .max_channels = 128, >> .timeout_ms = 8000, >> @@ -278,6 +288,16 @@ static const struct mhi_controller_config modem_qcom_v1_mhiv_config = { >> .event_cfg = modem_qcom_v1_mhi_events, >> }; >> >> +static const struct mhi_pci_dev_info mhi_qcom_sdx75_info = { >> + .name = "qcom-sdx75m", >> + .fw = "qcom/sdx75m/xbl.elf", >> + .edl = "qcom/sdx75m/edl.mbn", >> + .config = &modem_qcom_v2_mhiv_config, >> + .bar_num = MHI_PCI_DEFAULT_BAR_NUM, >> + .dma_data_width = 32, >> + .sideband_wake = false, >> +}; >> + >> static const struct mhi_pci_dev_info mhi_qcom_sdx65_info = { >> .name = "qcom-sdx65m", >> .fw = "qcom/sdx65m/xbl.elf", >> @@ -597,6 +617,8 @@ static const struct pci_device_id mhi_pci_id_table[] = { >> .driver_data = (kernel_ulong_t) &mhi_telit_fn990_info }, >> { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0308), >> .driver_data = (kernel_ulong_t) &mhi_qcom_sdx65_info }, >> + { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0309), >> + .driver_data = (kernel_ulong_t) &mhi_qcom_sdx75_info }, >> { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x1001), /* EM120R-GL (sdx24) */ >> .driver_data = (kernel_ulong_t) &mhi_quectel_em1xx_info }, >> { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x1002), /* EM160R-GL (sdx24) */ >> diff --git a/drivers/bus/mhi/host/pm.c b/drivers/bus/mhi/host/pm.c >> index 8a4362d..6f049e0 100644 >> --- a/drivers/bus/mhi/host/pm.c >> +++ b/drivers/bus/mhi/host/pm.c >> @@ -1202,14 +1202,18 @@ EXPORT_SYMBOL_GPL(mhi_power_down); >> int mhi_sync_power_up(struct mhi_controller *mhi_cntrl) >> { >> int ret = mhi_async_power_up(mhi_cntrl); >> + u32 timeout_ms; >> >> if (ret) >> return ret; >> >> + /* Some devices need more time to set ready during power up */ >> + timeout_ms = mhi_cntrl->ready_timeout_ms ? >> + mhi_cntrl->ready_timeout_ms : mhi_cntrl->timeout_ms; > Since you are using this extended timeout value in a couple of places (not just > for checking READY_STATE), it is better to use the existing "timeout_ms" > parameter. > > - Mani We use ready_timeout_ms here is because READY_STATE is polled in a workqueue,  in parallel with waiting valid EE. That means we start to wait valid EE and poll ready like at same time instead of starting to wait EE after ready state. Thus the total time it takes to wait valid EE is about the time for polling ready. >> wait_event_timeout(mhi_cntrl->state_event, >> MHI_IN_MISSION_MODE(mhi_cntrl->ee) || >> MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state), >> - msecs_to_jiffies(mhi_cntrl->timeout_ms)); >> + msecs_to_jiffies(timeout_ms)); >> >> ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -ETIMEDOUT; >> if (ret) >> diff --git a/include/linux/mhi.h b/include/linux/mhi.h >> index f6de4b6..a43e5f8 100644 >> --- a/include/linux/mhi.h >> +++ b/include/linux/mhi.h >> @@ -266,6 +266,7 @@ struct mhi_event_config { >> * struct mhi_controller_config - Root MHI controller configuration >> * @max_channels: Maximum number of channels supported >> * @timeout_ms: Timeout value for operations. 0 means use default >> + * @ready_timeout_ms: Timeout value for waiting device to be ready (optional) >> * @buf_len: Size of automatically allocated buffers. 0 means use default >> * @num_channels: Number of channels defined in @ch_cfg >> * @ch_cfg: Array of defined channels >> @@ -277,6 +278,7 @@ struct mhi_event_config { >> struct mhi_controller_config { >> u32 max_channels; >> u32 timeout_ms; >> + u32 ready_timeout_ms; >> u32 buf_len; >> u32 num_channels; >> const struct mhi_channel_config *ch_cfg; >> @@ -326,6 +328,7 @@ struct mhi_controller_config { >> * @pm_mutex: Mutex for suspend/resume operation >> * @pm_lock: Lock for protecting MHI power management state >> * @timeout_ms: Timeout in ms for state transitions >> + * @ready_timeout_ms: Timeout in ms for waiting device to be ready (optional) >> * @pm_state: MHI power management state >> * @db_access: DB access states >> * @ee: MHI device execution environment >> @@ -413,6 +416,7 @@ struct mhi_controller { >> struct mutex pm_mutex; >> rwlock_t pm_lock; >> u32 timeout_ms; >> + u32 ready_timeout_ms; >> u32 pm_state; >> u32 db_access; >> enum mhi_ee_type ee; >> -- >> 2.7.4 >>