From patchwork Tue Oct 10 15:49:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maramaina Naresh X-Patchwork-Id: 13415725 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6058DCD8CA5 for ; Tue, 10 Oct 2023 15:53:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233518AbjJJPxq (ORCPT ); Tue, 10 Oct 2023 11:53:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44910 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233493AbjJJPxo (ORCPT ); Tue, 10 Oct 2023 11:53:44 -0400 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7DD78A7; Tue, 10 Oct 2023 08:53:42 -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 39AEOI1c026900; Tue, 10 Oct 2023 15:50:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=FzLL87SJ190U6pNr9AjGvg/r3hyVqbdFxXodkt/2MWo=; b=efxhgCPek/e791WTJG8tqEkmUcBoatDW7oiiJFYZR3/AfDWBxLjmYvFh/q8ek6a9PNID 9uZmQjXyOsS2q43PFg836eGVCSgjLXx5AfSAe7+bXHcVP8nL11qmAKOg8QdITSu5slEt QQ4UcY1C0GVbWy928N3WTFnxb33hIRUCRxI5tjW/1FRJzCIZsAIG960B743Cuu1qkCjQ OMoeasXeFdJWdXPZUxEEMapvQKLiXqF/Nh5U3KmmAQ8zGFT54R3dyIqAiDEEen+klBCP yfQUIp7iF3TP7OBy02iOYrz+7oG24+WYCVidSDboKRFCIkAIPckjHXWkjhESMTLw8Jqe Og== Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3tmw3j1g8h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:01 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 39AFntkM022702 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:49:55 GMT Received: from hu-mnaresh-hyd.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.36; Tue, 10 Oct 2023 08:49:50 -0700 From: Maramaina Naresh To: Andy Gross , Bjorn Andersson , Konrad Dybcio , Manivannan Sadhasivam , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "James E.J. Bottomley" , "Martin K. Petersen" CC: Alim Akhtar , Avri Altman , Bart Van Assche , , , , , , Subject: [PATCH V1 1/4] dt-bindings: ufs: qcom: Add qos property Date: Tue, 10 Oct 2023 21:19:04 +0530 Message-ID: <1696952947-18062-2-git-send-email-quic_mnaresh@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> References: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: wsINolfMNBSY-OKbdSKEqhkvk7UIVfUb X-Proofpoint-ORIG-GUID: wsINolfMNBSY-OKbdSKEqhkvk7UIVfUb X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-10_10,2023-10-10_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 mlxlogscore=888 malwarescore=0 adultscore=0 mlxscore=0 lowpriorityscore=0 bulkscore=0 suspectscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2309180000 definitions=main-2310100117 Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Add bindings for per-cpu QoS for QCOM UFS. This improves random io performance by 20% for QCOM UFS. Signed-off-by: Maramaina Naresh --- Documentation/devicetree/bindings/ufs/qcom,ufs.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Documentation/devicetree/bindings/ufs/qcom,ufs.yaml b/Documentation/devicetree/bindings/ufs/qcom,ufs.yaml index 462ead5..d8b807e 100644 --- a/Documentation/devicetree/bindings/ufs/qcom,ufs.yaml +++ b/Documentation/devicetree/bindings/ufs/qcom,ufs.yaml @@ -76,6 +76,14 @@ properties: $ref: /schemas/types.yaml#/definitions/phandle description: phandle to the Inline Crypto Engine node + qos: + minItems: 2 + maxItems: 2 + cpumask: + description: list of CPUs under CPU group + vote: + description: vote value for QoS CPU group + reg: minItems: 1 maxItems: 2 @@ -318,5 +326,13 @@ examples: <0 0>, <0 0>; qcom,ice = <&ice>; + qos0 { + cpumask = <0x0f>; + vote = <44>; + }; + qos1 { + cpumask = <0xf0>; + vote = <44>; + }; }; }; From patchwork Tue Oct 10 15:49:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maramaina Naresh X-Patchwork-Id: 13415722 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB073CD8CA2 for ; Tue, 10 Oct 2023 15:50:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233265AbjJJPuU (ORCPT ); Tue, 10 Oct 2023 11:50:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38890 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233020AbjJJPuS (ORCPT ); Tue, 10 Oct 2023 11:50:18 -0400 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE090AF; Tue, 10 Oct 2023 08:50:16 -0700 (PDT) Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39AF86wX001486; Tue, 10 Oct 2023 15:50:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=8uOsaw3IKUcHLttXo2XH4wYYqFxynnEheIIeRAfRGwo=; b=Uw5jzNSrjz3qJLJI3xoBHJxBTKLqB2jfUhwOqZpyfzY45ycPh0toJwYW0ddvsRYpAZXi DjelfVCRRti3SsvcFCQVbka349dSQxBzI3g8OaALANcmkzKVoRBFtn6MAn4CE7UQ3Y5s QC6OnTIjRt5TP+VbAdwJgipxHJx/aztwHPOPoLlSrS6M2pMLr1vVb7XHOD2uMNkLHEQ4 SJ75S3kO8KRLK7HE4sUmLJN0dRP3Mccen/H6P1QjU3wZe7LizqHlZK4ruLxZFdXsCkre P3X1zuk0pFNJExre7+1AHBt7qMKGzCfjhnmEmh9qf6tBwajyCXN4jOl57h4pnaChP5P4 LQ== Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3tmt709qsy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:03 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 39AFo1qj025505 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:01 GMT Received: from hu-mnaresh-hyd.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.36; Tue, 10 Oct 2023 08:49:55 -0700 From: Maramaina Naresh To: Andy Gross , Bjorn Andersson , Konrad Dybcio , Manivannan Sadhasivam , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "James E.J. Bottomley" , "Martin K. Petersen" CC: Alim Akhtar , Avri Altman , Bart Van Assche , , , , , , Subject: [PATCH V1 2/4] ufs: ufs-qcom: Add per-cpu PM QoS support for ufs Date: Tue, 10 Oct 2023 21:19:05 +0530 Message-ID: <1696952947-18062-3-git-send-email-quic_mnaresh@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> References: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: R4-d40Jr-BajqmWieMaeg-zzkSaKTCE3 X-Proofpoint-ORIG-GUID: R4-d40Jr-BajqmWieMaeg-zzkSaKTCE3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-10_10,2023-10-10_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 mlxscore=0 mlxlogscore=999 adultscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 phishscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2309180000 definitions=main-2310100117 Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Qcom SoCs requires registering ufs driver to PM QoS for random io performance improvement. PM QoS initialization will parse all QoS CPU group device tree entries, allocate memory for each individual PM QoS groups and initiates DEV_PM_QOS_RESUME_LATENCY type of PM QoS request for new dev_pm_qos_request handle for each CPU. Voting for maximum latency S32_MAX during driver init. tiotest benchmark tool io performance results on sm8550 platform: 1. Without PM QoS support Type (Speed in) | Average of 6 iterations Random Write(IPOS) | 32201 Random Read(IPOS) | 32201 2. With PM QoS support Type (Speed in) | Average of 6 iterations Random Write(IPOS) | 40833.5 Random Read(IPOS) | 40833.5 (Improvement % with PM QoS = ~20%). Signed-off-by: Asutosh Das Signed-off-by: Nitin Rawat Signed-off-by: Naveen Kumar Goud Arepalli Signed-off-by: Maramaina Naresh --- drivers/ufs/host/ufs-qcom.c | 152 ++++++++++++++++++++++++++++++++++++++++++++ drivers/ufs/host/ufs-qcom.h | 29 +++++++++ 2 files changed, 181 insertions(+) diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c index 2128db0..f3e1e81 100644 --- a/drivers/ufs/host/ufs-qcom.c +++ b/drivers/ufs/host/ufs-qcom.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2013-2016, Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -15,6 +16,7 @@ #include #include #include +#include #include @@ -736,6 +738,53 @@ static void ufs_qcom_device_reset_ctrl(struct ufs_hba *hba, bool asserted) gpiod_set_value_cansleep(host->device_reset, asserted); } +/** + * ufs_qcom_qos_add_cpu_group - inserts QoS CPU group requests into the QoS list + * @qcg: pointer to QoS CPU group + * @type: defines the qos request + * + * Returns 0 for success and non-zero for failure. + */ +static int ufs_qcom_qos_add_cpu_group(struct ufs_qcom_qcg *qcg, + enum constraint type) +{ + struct dev_pm_qos_request *qos_req = qcg->qos_req; + struct device *dev = qcg->host->hba->dev; + int cpu; + int ret; + + for_each_cpu(cpu, &qcg->mask) { + dev_dbg(dev, "cpu: %d | assoc-qos-req: 0x%p\n", + cpu, qos_req); + ret = dev_pm_qos_add_request(get_cpu_device(cpu), + qos_req, + DEV_PM_QOS_RESUME_LATENCY, + type); + if (ret < 0) { + dev_err(dev, "Add qos request has failed %d\n", + ret); + return ret; + } + + qos_req++; + } + + return 0; +} + +/** + * ufs_qcom_qos_remove_cpu_group - removes QoS CPU group requests in QoS list + * @qcg: pointer to QoS CPU group + */ +static void ufs_qcom_qos_remove_cpu_group(struct ufs_qcom_qcg *qcg) +{ + struct dev_pm_qos_request *qos_req = qcg->qos_req; + int cpu; + + for_each_cpu(cpu, &qcg->mask) + dev_pm_qos_remove_request(qos_req++); +} + static int ufs_qcom_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op, enum ufs_notify_change_status status) { @@ -1175,6 +1224,107 @@ static int ufs_qcom_icc_init(struct ufs_qcom_host *host) } /** + * ufs_qcom_qos_exit - de-allocate QoS instances + * @hba: per adapter instance + */ +static void ufs_qcom_qos_exit(struct ufs_hba *hba) +{ + struct ufs_qcom_host *host = ufshcd_get_variant(hba); + struct list_head *head = &host->qos_list_head; + struct ufs_qcom_qcg *qcg; + struct ufs_qcom_qcg *tmp; + + if (list_empty(head)) + return; + + list_for_each_entry_safe(qcg, tmp, head, list) { + if (qcg->qos_req) { + ufs_qcom_qos_remove_cpu_group(qcg); + kfree(qcg->qos_req); + } + + list_del(&qcg->list); + kfree(qcg); + } +} + +/** + * ufs_qcom_qos_init - initialize QoS instances + * @hba: host controller instance + * + * This function parses all QoS CPU group dt entries, allocates memory for + * each individual groups and initiates a qos request for each bit of CPU + * mask. As part of init all qos requests are initialized with the maximum + * delay aggregated constraint value. + */ +static void ufs_qcom_qos_init(struct ufs_hba *hba) +{ + struct ufs_qcom_host *host = ufshcd_get_variant(hba); + struct device *dev = hba->dev; + struct device_node *np = dev->of_node; + struct device_node *group_node; + struct ufs_qcom_qcg *qcg; + cpumask_t mask; + char buf[10]; + u32 cpumask = 0; + u32 vote = 0; + int ret; + + INIT_LIST_HEAD(&host->qos_list_head); + + for_each_available_child_of_node(np, group_node) { + if (!strstr(group_node->name, "qos")) + continue; + + of_property_read_u32(group_node, "cpumask", &cpumask); + sprintf(buf, "%x", cpumask); + cpumask_parse(buf, &mask); + if (!cpumask || !cpumask_subset(&mask, cpu_possible_mask)) { + dev_err(dev, "Invalid group mask\n"); + goto out_err; + } + + of_property_read_u32(group_node, "vote", &vote); + if (!vote) { + dev_err(dev, "1 vote is needed, bailing out: %u\n", + vote); + goto out_err; + } + + qcg = kzalloc(sizeof(*qcg), GFP_KERNEL); + if (!qcg) + goto out_err; + + list_add_tail(&qcg->list, &host->qos_list_head); + cpumask_copy(&qcg->mask, &mask); + qcg->vote = vote; + qcg->host = host; + qcg->qos_req = kcalloc(cpumask_weight(&qcg->mask), + sizeof(struct dev_pm_qos_request), + GFP_KERNEL); + if (!qcg->qos_req) + goto out_err; + + dev_dbg(dev, "qcg: 0x%p | mask-wt: %u | qos_req: 0x%p | vote: %u\n", + qcg, cpumask_weight(&qcg->mask), + qcg->qos_req, qcg->vote); + + ret = ufs_qcom_qos_add_cpu_group(qcg, S32_MAX); + if (ret < 0) + goto out_err; + } + + if (list_empty(&host->qos_list_head)) { + dev_info(dev, "QoS groups undefined\n"); + return; + } + return; + +out_err: + ufs_qcom_qos_exit(hba); +} + +/** * ufs_qcom_init - bind phy with controller * @hba: host controller instance * @@ -1298,6 +1448,7 @@ static int ufs_qcom_init(struct ufs_hba *hba) */ host->phy_gear = UFS_HS_G2; + ufs_qcom_qos_init(hba); return 0; out_variant_clear: @@ -2036,6 +2187,7 @@ static void ufs_qcom_remove(struct platform_device *pdev) struct ufs_hba *hba = platform_get_drvdata(pdev); pm_runtime_get_sync(&(pdev)->dev); + ufs_qcom_qos_exit(hba); ufshcd_remove(hba); platform_msi_domain_free_irqs(hba->dev); } diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h index 9950a00..e975a5e 100644 --- a/drivers/ufs/host/ufs-qcom.h +++ b/drivers/ufs/host/ufs-qcom.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef UFS_QCOM_H_ @@ -7,6 +8,7 @@ #include #include +#include #include #include @@ -135,6 +137,31 @@ enum { #define PA_VS_CORE_CLK_40NS_CYCLES 0x9007 #define PA_VS_CORE_CLK_40NS_CYCLES_MASK GENMASK(6, 0) +/** + * struct ufs_qcom_qcg - context of QoS cpu group + * @qos_req: pointer to per cpu pm qos request + * @host: pointer to QCOM host controller instance + * @list: helper for linked list + * @mask: parsed cpumask value from device tree + * @vote: parsed vote value from device tree + */ +struct ufs_qcom_qcg { + struct dev_pm_qos_request *qos_req; + struct ufs_qcom_host *host; + struct list_head list; + cpumask_t mask; + u32 vote; +}; + +/** + * enum constraint - defines QoS constraint type + * @QOS_PERF: QoS performance mode + * @QOS_POWER: QoS power save mode + */ +enum constraint { + QOS_PERF, + QOS_POWER, +}; /* QCOM UFS host controller core clk frequencies */ #define UNIPRO_CORE_CLK_FREQ_37_5_MHZ 38 @@ -239,6 +266,8 @@ struct ufs_qcom_host { struct reset_controller_dev rcdev; struct gpio_desc *device_reset; + /* QoS list head */ + struct list_head qos_list_head; u32 phy_gear; From patchwork Tue Oct 10 15:49:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maramaina Naresh X-Patchwork-Id: 13415723 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 251E3CD8CA5 for ; Tue, 10 Oct 2023 15:50:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233576AbjJJPue (ORCPT ); Tue, 10 Oct 2023 11:50:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233438AbjJJPuc (ORCPT ); Tue, 10 Oct 2023 11:50:32 -0400 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8B50EC9; Tue, 10 Oct 2023 08:50:25 -0700 (PDT) Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39AEKYiC023864; Tue, 10 Oct 2023 15:50:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=HNT/T5OczMa41UhLCO2rAloksDtU7rqJOiLETgmFOM0=; b=os+F3tv57o6X4MNUTHx0rGOGU6ZQ1hUyLCHjeuPcinqT5g0EeBSaGT8VoCewHcPNG6TR p4PxkTThMnGKVrRUl6TDfq/qL2wVeJ7559wKI/azWNN9QopuGM/Q8+o/PKb+2TxLl1ZP YVl9i+FDcqTSCgOGgjpkhO1ov/JL8MEn6z65xj7aEWZTWm6aqZxCwMQiTZuvYhT3TNIn 03sQ6nAMlyhk1k7hQ203XgRL7crr90hZXlG2RaFhUFstXV3ekBzryaht53KBu2WxMFua r40TBh9i/pqm76d6SXLxpDmYpxt9DSi9lnFWg6DpGv1pUvOQKi+BJoGe5jdGrHnGXHZR Gw== Received: from nalasppmta01.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3tmyma993k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:11 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA01.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 39AFo8Ms031233 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:08 GMT Received: from hu-mnaresh-hyd.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.36; Tue, 10 Oct 2023 08:50:01 -0700 From: Maramaina Naresh To: Andy Gross , Bjorn Andersson , Konrad Dybcio , Manivannan Sadhasivam , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "James E.J. Bottomley" , "Martin K. Petersen" CC: Alim Akhtar , Avri Altman , Bart Van Assche , , , , , , Subject: [PATCH V1 3/4] ufs: ufs-qcom: Add per-cpu PM QoS vote support for ufs Date: Tue, 10 Oct 2023 21:19:06 +0530 Message-ID: <1696952947-18062-4-git-send-email-quic_mnaresh@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> References: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: zoCba7IM8mX8MusTIugiOs7X7R9IR2ri X-Proofpoint-GUID: zoCba7IM8mX8MusTIugiOs7X7R9IR2ri X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-10_11,2023-10-10_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 impostorscore=0 adultscore=0 spamscore=0 clxscore=1015 mlxscore=0 mlxlogscore=999 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2309180000 definitions=main-2310100117 Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org PM QoS per-cpu framework provides performance requirements for each cpu. The per-cpu PM QoS framework will provide the corresponding interface to collect the resume_latency request of the specified device and provide it to the runtime PM. When suspending the device, it will consider this requirement and decide whether to suspend the device. Voting will follow below sequence. 1. Vote for maximum latency S32_MAX in driver init. 2. Schedule a vote of PERF when a transfer request is received. 3. Update the vote to S32_MAX during clock gating. Signed-off-by: Asutosh Das Signed-off-by: Nitin Rawat Signed-off-by: Naveen Kumar Goud Arepalli Signed-off-by: Maramaina Naresh --- drivers/ufs/host/ufs-qcom.c | 188 +++++++++++++++++++++++++++++++++++++++++++- drivers/ufs/host/ufs-qcom.h | 8 ++ 2 files changed, 195 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c index f3e1e81..2123e8e 100644 --- a/drivers/ufs/host/ufs-qcom.c +++ b/drivers/ufs/host/ufs-qcom.c @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -27,6 +28,8 @@ #include #include +#include + #define MCQ_QCFGPTR_MASK GENMASK(7, 0) #define MCQ_QCFGPTR_UNIT 0x200 #define MCQ_SQATTR_OFFSET(c) \ @@ -96,6 +99,9 @@ static struct ufs_qcom_host *ufs_qcom_hosts[MAX_UFS_QCOM_HOSTS]; static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host); static int ufs_qcom_set_core_clk_ctrl(struct ufs_hba *hba, bool is_scale_up); +static int ufs_qcom_update_qos_constraints(struct ufs_qcom_qcg *qcg, + enum constraint type); +static int ufs_qcom_qos_unvote_all(struct ufs_qcom_host *host); static struct ufs_qcom_host *rcdev_to_ufs_host(struct reset_controller_dev *rcd) { @@ -790,6 +796,7 @@ static int ufs_qcom_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op, { struct ufs_qcom_host *host = ufshcd_get_variant(hba); struct phy *phy = host->generic_phy; + int ret; if (status == PRE_CHANGE) return 0; @@ -810,7 +817,11 @@ static int ufs_qcom_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op, ufs_qcom_disable_lane_clks(host); } - return ufs_qcom_ice_suspend(host); + ret = ufs_qcom_ice_suspend(host); + if (ret) + return ret; + + return ufs_qcom_qos_unvote_all(host); } static int ufs_qcom_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) @@ -840,6 +851,33 @@ static int ufs_qcom_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) return ufs_qcom_ice_resume(host); } +/** + * ufs_qcom_qos_unvote_all - unvote QoS for all cpu groups + * @host: qcom host controller instance + */ +static int ufs_qcom_qos_unvote_all(struct ufs_qcom_host *host) +{ + struct list_head *head = &host->qos_list_head; + struct ufs_qcom_qcg *qcg; + int ret = 0; + + if (list_empty(head)) + return ret; + + list_for_each_entry(qcg, head, list) { + flush_work(&qcg->vwork); + if (!qcg->voted) + continue; + + ret = ufs_qcom_update_qos_constraints(qcg, QOS_POWER); + if (ret) + dev_err(host->hba->dev, "Failed to update qos constraints, %d\n", + ret); + } + + return ret; +} + static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_qcom_host *host, bool enable) { if (host->dev_ref_clk_ctrl_mmio && @@ -1157,6 +1195,7 @@ static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on, } else { ufs_qcom_icc_set_bw(host, ufs_qcom_bw_table[MODE_MIN][0][0].mem_bw, ufs_qcom_bw_table[MODE_MIN][0][0].cfg_bw); + ufs_qcom_qos_unvote_all(host); } break; } @@ -1224,6 +1263,144 @@ static int ufs_qcom_icc_init(struct ufs_qcom_host *host) } /** + * ufs_qcom_tag_to_cpu - get CPU number for given request tag + * @hba: host controller instance + * @tag: defines block request id + * + * Returns 0 or posstive value for success and negative value + * for failure. + */ +static int ufs_qcom_tag_to_cpu(struct ufs_hba *hba, unsigned int tag) +{ + struct ufshcd_lrb *lrbp = &hba->lrb[tag]; + + if (lrbp && lrbp->cmd && scsi_cmd_to_rq(lrbp->cmd)) + return blk_mq_rq_cpu(scsi_cmd_to_rq(lrbp->cmd)); + + return -EINVAL; +} + +/** + * ufs_qcom_cpu_to_qos_group - returns QoS group address for given CPU number + * @host: qcom host controller instance + * @cpu: stores CPU number + * + * Returns ufs_qcom_qcg address for success and NULL for failure. + */ +static struct ufs_qcom_qcg *ufs_qcom_cpu_to_qos_group(struct ufs_qcom_host *host, + unsigned int cpu) +{ + struct list_head *head = &host->qos_list_head; + struct ufs_qcom_qcg *qcg; + + if (cpu > num_possible_cpus()) + return NULL; + + list_for_each_entry(qcg, head, list) { + if (cpumask_test_cpu(cpu, &qcg->mask)) + return qcg; + } + + return NULL; +} + +/** + * ufs_qcom_update_qos_constraints - update constraints for QoS group + * @qcg: pointer to QoS CPU group + * @type: defines the qos request + * + * Returns 0 for success and non-zero for failure. + */ +static int ufs_qcom_update_qos_constraints(struct ufs_qcom_qcg *qcg, + enum constraint type) +{ + struct dev_pm_qos_request *qos_req = qcg->qos_req; + struct device *dev = qcg->host->hba->dev; + unsigned int vote; + int cpu; + int ret; + + if (type == QOS_POWER) + vote = S32_MAX; + else + vote = qcg->vote; + + if (qcg->curr_vote == vote) + return 0; + + for_each_cpu(cpu, &qcg->mask) { + dev_dbg(dev, "%s: vote: %d | cpu: %d | qos_req: 0x%p\n", + __func__, vote, cpu, qos_req); + ret = dev_pm_qos_update_request(qos_req, vote); + if (ret < 0) + return ret; + + ++qos_req; + } + + if (type == QOS_POWER) + qcg->voted = false; + else + qcg->voted = true; + qcg->curr_vote = vote; + + return 0; +} + +/** + * ufs_qcom_setup_xfer_req - setup QoS before transfer request is issued + * and initiates QoS vote process for given tag + * @hba: host controller instance + * @tag: defines block request id + * @is_scsi_cmd: tells scsi cmd or not + * + * Returns 0 for success and non-zero for failure. + */ +static void ufs_qcom_setup_xfer_req(struct ufs_hba *hba, int tag, bool is_scsi_cmd) +{ + struct ufs_qcom_host *host = ufshcd_get_variant(hba); + struct list_head *head = &host->qos_list_head; + struct ufs_qcom_qcg *qcg; + int cpu; + + if (list_empty(head)) + return; + + cpu = ufs_qcom_tag_to_cpu(hba, tag); + if (cpu < 0) + return; + + qcg = ufs_qcom_cpu_to_qos_group(host, cpu); + if (!qcg) + return; + + if (qcg->voted) { + dev_dbg(hba->dev, "%s: qcg: 0x%p | cpu: %d\n", + __func__, qcg, cpu); + return; + } + + queue_work(host->qos_workq, &qcg->vwork); + dev_dbg(hba->dev, "Queued QoS work- cpu: %d\n", cpu); +} + +/** + * ufs_qcom_qos_vote_work - starts QoS perf mode vote work + * @work: pointer to QoS work + */ +static void ufs_qcom_qos_vote_work(struct work_struct *work) +{ + struct ufs_qcom_qcg *qcg = container_of(work, struct ufs_qcom_qcg, + vwork); + int ret; + + ret = ufs_qcom_update_qos_constraints(qcg, QOS_PERF); + if (ret) + dev_err(qcg->host->hba->dev, "%s: update qos - failed: %d\n", + __func__, ret); +} + +/** * ufs_qcom_qos_exit - de-allocate QoS instances * @hba: per adapter instance */ @@ -1312,12 +1489,20 @@ static void ufs_qcom_qos_init(struct ufs_hba *hba) ret = ufs_qcom_qos_add_cpu_group(qcg, S32_MAX); if (ret < 0) goto out_err; + + INIT_WORK(&qcg->vwork, ufs_qcom_qos_vote_work); } if (list_empty(&host->qos_list_head)) { dev_info(dev, "QoS groups undefined\n"); return; } + + host->qos_workq = create_singlethread_workqueue("qc_ufs_qos_swq"); + if (!host->qos_workq) { + dev_err(dev, "Failed to create qos workqueue\n"); + goto out_err; + } return; out_err: @@ -2148,6 +2333,7 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = { .dbg_register_dump = ufs_qcom_dump_dbg_regs, .device_reset = ufs_qcom_device_reset, .config_scaling_param = ufs_qcom_config_scaling_param, + .setup_xfer_req = ufs_qcom_setup_xfer_req, .program_key = ufs_qcom_ice_program_key, .reinit_notify = ufs_qcom_reinit_notify, .mcq_config_resource = ufs_qcom_mcq_config_resource, diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h index e975a5e..4ad2b3e 100644 --- a/drivers/ufs/host/ufs-qcom.h +++ b/drivers/ufs/host/ufs-qcom.h @@ -141,16 +141,22 @@ enum { * struct ufs_qcom_qcg - context of QoS cpu group * @qos_req: pointer to per cpu pm qos request * @host: pointer to QCOM host controller instance + * @vwork: qos vote work handle * @list: helper for linked list * @mask: parsed cpumask value from device tree + * @curr_vote: current vote value for group * @vote: parsed vote value from device tree + * @voted: vote status */ struct ufs_qcom_qcg { struct dev_pm_qos_request *qos_req; struct ufs_qcom_host *host; + struct work_struct vwork; struct list_head list; cpumask_t mask; + u32 curr_vote; u32 vote; + bool voted; }; /** @@ -268,6 +274,8 @@ struct ufs_qcom_host { struct gpio_desc *device_reset; /* QoS list head */ struct list_head qos_list_head; + /* QoS workqueue */ + struct workqueue_struct *qos_workq; u32 phy_gear; From patchwork Tue Oct 10 15:49:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maramaina Naresh X-Patchwork-Id: 13415724 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C234DCD8CA6 for ; Tue, 10 Oct 2023 15:50:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233721AbjJJPuw (ORCPT ); Tue, 10 Oct 2023 11:50:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50066 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233606AbjJJPuf (ORCPT ); Tue, 10 Oct 2023 11:50:35 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8B5A410D; Tue, 10 Oct 2023 08:50:31 -0700 (PDT) Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39AFAkgc006885; Tue, 10 Oct 2023 15:50:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=ADrxWFWXFYuV5E4E7D+gCv6o207pa6qVWEgH48QI70o=; b=ivbwuRLiykI1rHl4BiG39fGJlMO0Sl86iD5LcC3OS+Cugg8j9KRq0ANbCGzwSB3VUxW0 OxhxELzoV5CtGkouHZBHRGiFtwVASftE6ufqWdPu95XiE7mR6qzw/JhHwPoU3BUrfwLs mQVTHu803wmgR79Wel3J3bHtjqM1wAOocVz+QSBcetl6pc6jGcEZWlLrZtS5GP9YSWYB c7mHLkM2TJcjN6Xg3SEeHvCzM63WcVK2E50dlyHt1OAl0Y8zFEZdgd/oei6UvE0s0JjS Us/lSqlvnItXbWSgizn5kJy40EKUh2Eio98NYa+5XOv5lup53btubvZAqekNu/MUKcNT 1g== Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3tmxjphe2s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:17 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA04.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 39AFoCju025414 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 10 Oct 2023 15:50:12 GMT Received: from hu-mnaresh-hyd.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.36; Tue, 10 Oct 2023 08:50:06 -0700 From: Maramaina Naresh To: Andy Gross , Bjorn Andersson , Konrad Dybcio , Manivannan Sadhasivam , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "James E.J. Bottomley" , "Martin K. Petersen" CC: Alim Akhtar , Avri Altman , Bart Van Assche , , , , , , Subject: [PATCH V1 4/4] arm64: dts: qcom: sm8550: Add per-cpu PM QoS support for ufs Date: Tue, 10 Oct 2023 21:19:07 +0530 Message-ID: <1696952947-18062-5-git-send-email-quic_mnaresh@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> References: <1696952947-18062-1-git-send-email-quic_mnaresh@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: fZoA8mVt0HN6Db7fUGJANehR_DRdrF3p X-Proofpoint-ORIG-GUID: fZoA8mVt0HN6Db7fUGJANehR_DRdrF3p X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-10_10,2023-10-10_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 adultscore=0 phishscore=0 priorityscore=1501 suspectscore=0 clxscore=1015 impostorscore=0 spamscore=0 lowpriorityscore=0 mlxscore=0 mlxlogscore=911 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2309180000 definitions=main-2310100117 Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Add per-cpu PM QoS support for ufs. Signed-off-by: Maramaina Naresh --- arch/arm64/boot/dts/qcom/sm8550.dtsi | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi index 7b9ddde..84909b0 100644 --- a/arch/arm64/boot/dts/qcom/sm8550.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi @@ -1956,6 +1956,15 @@ qcom,ice = <&ice>; status = "disabled"; + + qos0 { + cpumask = <0x0f>; + vote = <44>; + }; + qos1 { + cpumask = <0xf0>; + vote = <44>; + }; }; ice: crypto@1d88000 {