From nobody Wed Oct 8 22:14:50 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 CE6BA28313D for ; Mon, 23 Jun 2025 16:43:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750697039; cv=none; b=iusTuHip/SB+VOKgS9cj6vOSc/P2QT2ZLvOETjUbsKdfR5kHqoXMNYKOVIFZM3T5rsyJXDPn9FRc6OVZUFXy615c4IKZCwh9X8myLOtVt1EVyFb7ANGxjQ31VJrwJPIjnNLy2dDBEZ/PQcQXqRWeNLBkClT4lAR3+3q70XCQcEQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750697039; c=relaxed/simple; bh=YZUBtdMrOu9oRJYltUtsuCHLn65wM+oMi2tnyHqk1ck=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HFdZAVyv4YO49xNn6/acshuHr4C71XYlbe3EFTcJSL00z+OCz8kkUDRIdHvYT/3Suah1a/IrelXuLij4+1Lg4oRsrMCYILKQMFge8ystKbb0X7pZRGwtkNaZKbgSnnoj0paebQ40Gul7AFvQwx7gk6j51RJUog6PssMdWGF1+fU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=gpmoWZTr; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="gpmoWZTr" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55NGKuo0002966 for ; Mon, 23 Jun 2025 16:43:56 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 6Gp4KTM2ss1gIVnakPLCD9UpvQd1HhAAfpFPPwxXMtE=; b=gpmoWZTrzmcKuE+y Mv57i6/4TSXgcB2+QO8AuIsOHKAvVeMh4F7ZYmyEToJJxXvi7UOXFuQBOfgfmJhz JTb2jEULvdu5tZrCkyiY9tBf0yCi55wKb4lATKYsz3qYQM0EZ1HEb6EsvZpUy9n6 KTwXImi5jZKSoOzax76TtSX13iyYb6Pkc2h6sORwtOe/dCNfpu4/dpMtuf+La4I6 BneQFkYtrQ7QrXf/gYP4zUIUFICQ1N/t8VFBBl2k2hBn1RadyYUulwLsZs2BWgAd 8+jlAcKSiZgFKU5CL2c4ocva9oOMKfdiT3qtYETy+DNlZ1b/vJQ1FnqGdhswz7xB gdnMaw== Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 47fabd821h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 23 Jun 2025 16:43:56 +0000 (GMT) Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-b2fcbd76b61so5481241a12.3 for ; Mon, 23 Jun 2025 09:43:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750697035; x=1751301835; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6Gp4KTM2ss1gIVnakPLCD9UpvQd1HhAAfpFPPwxXMtE=; b=w73phtLTUxOygS0+hcVJlw3nKzdlY2jRzTqRxjQ6SMWOeavp0F1XYGc6aBunsePdJT K6Mc9VJ8HTFh7FRjcqiLQronSzbt9AjutMGm1+q1JfNB8qtlCYRsPXWzHnBictwWJ3ys GrEZBSrLqesXOXdYLEEQZdCF920W0tPESjAp1x5oFH67Y98wmeWk709P5N8Jr8TcvO4F ojXunjauQnKsKsRz31Krx6vDCaTA+afSeykSoLaNvB6S1paGkS6oWZvDegyn46Pcloou Gix688I8rSD9JOn/MaNvE4ILxXjYnJ2TKsOKqoQsvNElLlzzXNv0rktxnbkW6CWkZGE9 M4ow== X-Forwarded-Encrypted: i=1; AJvYcCXZJEynxRpA65heGkpAwyqObRXoe+eb+VIoI+t5rXioaDQwF43MAKqkRASkzTbD8/vSwFX9894lwBwipqU=@vger.kernel.org X-Gm-Message-State: AOJu0YybD8N6/qQ6V9S6vn0Z745vwioY5KcA1SI7uAsRxbN/b/fxPhlH Fcuw8kTB8xAQTSqY8xxzXUEJMuH5k1wWz+jrxOPMDBBJvKdMVHxgUTynOEtSoqC4fhO8G/drtet gtcpSvfVg/hvFC5NhP4cxIzBCdDkRtzPVc19dFxh19b3eIf/m33vsmzTDh4gZV1S34DE= X-Gm-Gg: ASbGncs4RNhkgMVYtuJ4desSzgWxQTonPBKC0qKFAYOEifvfAg7ON2CQqAjFMbfoZC6 UbO39djvxPuC7fWj6jRxZDLZDmXOpPrf4C8XxsvBwUpEdXSGmS9UvCBYBzD6YzSBqMYyxQwQqZN crTiG3ZKggHhGQgSarR54bOH1Nk9xR9Az3XKuxGU4s/Qr21xiq8+0w/PpCpi42Agmyp5PidvAxp mDcsIlJuJqIvYPRhKBl9Kn512T2hAoXFNe8LE95di3h6JuANIgwGK3n7jNwrIE4LhD5YJOmYyuH 0PR7dmlZTDMBxFkKv9yomHxGYNUlxvV/u9sXYzGTcThteOZf/31J X-Received: by 2002:a17:90b:2889:b0:311:e8cc:4248 with SMTP id 98e67ed59e1d1-3159d8f7f8emr25727507a91.33.1750697035149; Mon, 23 Jun 2025 09:43:55 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE7X9jf+cu1c0sm4aA1WuSCQvY3/vycTn+T2aPmrvRj0ZYX3vnW7zvYC9mDTYusdSfBoC548w== X-Received: by 2002:a17:90b:2889:b0:311:e8cc:4248 with SMTP id 98e67ed59e1d1-3159d8f7f8emr25727484a91.33.1750697034750; Mon, 23 Jun 2025 09:43:54 -0700 (PDT) Received: from hu-kamalw-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3159e048346sm9271254a91.26.2025.06.23.09.43.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 09:43:54 -0700 (PDT) From: Kamal Wadhwa Date: Mon, 23 Jun 2025 22:13:40 +0530 Subject: [PATCH 1/2] soc: qcom: rpmh: Add support to read back resource settings Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250623-add-rpmh-read-support-v1-1-ae583d260195@oss.qualcomm.com> References: <20250623-add-rpmh-read-support-v1-0-ae583d260195@oss.qualcomm.com> In-Reply-To: <20250623-add-rpmh-read-support-v1-0-ae583d260195@oss.qualcomm.com> To: Bjorn Andersson , Konrad Dybcio , Liam Girdwood , Mark Brown Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Kamal Wadhwa , Maulik Shah X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750697028; l=7829; i=kamal.wadhwa@oss.qualcomm.com; s=20241018; h=from:subject:message-id; bh=Deo7CKV42V7f0kQwaNWmGiavoI3ZoT4v46mr2+YU2yo=; b=a4sojfD84Lo46zdhKgpPLd3fwsOR3V/ye/0R4FY+vXkRE2NnV9waoeetz6o5Teakcc95Seq+I YAWHwR+8BQdB7WSzG5eHXVdbehEjDeZDR1V0jEPalAX6YHPBvflsf0k X-Developer-Key: i=kamal.wadhwa@oss.qualcomm.com; a=ed25519; pk=XbPE6DM5/mJi2tsiYwMCJCZ4O5XPMqColJRlGVcM7Hs= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIzMDEwMSBTYWx0ZWRfX+zuIun/FHb4v 0KW/X8mFA9NfoyGD960kfAobsP99wSrvLkSrSzC8uPNAix8vYqU9LeVPNOXe1s7YSUibdihLdcq CBDLxU4OJGgQe8h3dPBcZXvfayWUvXh+aIER2hodrNj7oqXAFFbxF8Dogl5hKQFYuXQvXbgWnls XSKK/5/PxbisFTseQe2mQVxJImLdGxBgQzgCLzeNADCpClC7zghQlaZEAQ/aa1Gt/TsY8WzF0kt vT6lxM2AlMhkPp/4s/HbwXdS9YYXg2b2P5YCVAnpyQE34SWuNSiEAu4Y9K/WmzuBzWk19N2exoe GwbM2Y9Nqn1nWOv9a6F3A249cyiwnzLBzHv7rh5d7NM1DILNSRd+L3ee0YT1Q+wdCOl/vJR2D0c gIytiEgUUWFY4hKvQSfZ/6t33GHNwSD/MBG/j2npS2nmz8raBVYK6xkiG+IrfRemqtwOgx6y X-Authority-Analysis: v=2.4 cv=FK8bx/os c=1 sm=1 tr=0 ts=6859844c cx=c_pps a=Oh5Dbbf/trHjhBongsHeRQ==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=6IFa9wvqVegA:10 a=EUspDBNiAAAA:8 a=J08J-H9Ko50usCvt6EIA:9 a=QEXdDO2ut3YA:10 a=_Vgx9l1VpLgwpw_dHYaR:22 X-Proofpoint-ORIG-GUID: h-PI8GSLWJQ7GE2-txeOtf06EgVgd9GN X-Proofpoint-GUID: h-PI8GSLWJQ7GE2-txeOtf06EgVgd9GN X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.7,FMLib:17.12.80.40 definitions=2025-06-23_04,2025-06-23_07,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 mlxlogscore=999 mlxscore=0 malwarescore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 phishscore=0 adultscore=0 priorityscore=1501 spamscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505280000 definitions=main-2506230101 From: Maulik Shah All rpmh_*() APIs so far have supported placing votes for various resource settings but the H/W also have option to read resource settings. This change adds a new rpmh_read() API to allow clients to read back resource setting from H/W. This will be useful for clients like regulators, which currently don't have a way to know the settings applied during bootloader stage. Signed-off-by: Maulik Shah --- drivers/soc/qcom/rpmh-rsc.c | 12 ++++++++-- drivers/soc/qcom/rpmh.c | 54 +++++++++++++++++++++++++++++++++++++++++= ---- include/soc/qcom/rpmh.h | 7 ++++++ include/soc/qcom/tcs.h | 2 ++ 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c index cb82e887b51d4401edba713348eed9621622b73b..18eed2cb8d300e862991efc20be= 58ff7ead378ce 100644 --- a/drivers/soc/qcom/rpmh-rsc.c +++ b/drivers/soc/qcom/rpmh-rsc.c @@ -443,6 +443,7 @@ static irqreturn_t tcs_tx_done(int irq, void *p) int i; unsigned long irq_status; const struct tcs_request *req; + u32 reg; =20 irq_status =3D readl_relaxed(drv->tcs_base + drv->regs[RSC_DRV_IRQ_STATUS= ]); =20 @@ -453,6 +454,11 @@ static irqreturn_t tcs_tx_done(int irq, void *p) =20 trace_rpmh_tx_done(drv, i, req); =20 + if (req->is_read) { + reg =3D drv->regs[RSC_DRV_CMD_RESP_DATA]; + req->cmds[0].data =3D read_tcs_reg(drv, reg, i); + } + /* * If wake tcs was re-purposed for sending active * votes, clear AMC trigger & enable modes and @@ -496,13 +502,14 @@ static void __tcs_buffer_write(struct rsc_drv *drv, i= nt tcs_id, int cmd_id, const struct tcs_request *msg) { u32 msgid; - u32 cmd_msgid =3D CMD_MSGID_LEN | CMD_MSGID_WRITE; + u32 cmd_msgid =3D CMD_MSGID_LEN; u32 cmd_enable =3D 0; struct tcs_cmd *cmd; int i, j; =20 /* Convert all commands to RR when the request has wait_for_compl set */ cmd_msgid |=3D msg->wait_for_compl ? CMD_MSGID_RESP_REQ : 0; + cmd_msgid |=3D (!msg->is_read) ? CMD_MSGID_WRITE : 0; =20 for (i =3D 0, j =3D cmd_id; i < msg->num_cmds; i++, j++) { cmd =3D &msg->cmds[i]; @@ -516,7 +523,8 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int= tcs_id, int cmd_id, =20 write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_MSGID], tcs_id, j, msgid); write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_ADDR], tcs_id, j, cmd->addr); - write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_DATA], tcs_id, j, cmd->data); + if (!msg->is_read) + write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_DATA], tcs_id, j, cmd->data); trace_rpmh_send_msg(drv, tcs_id, msg->state, j, msgid, cmd); } =20 diff --git a/drivers/soc/qcom/rpmh.c b/drivers/soc/qcom/rpmh.c index 8903ed956312d0a2ac7f673d86ef504947e9b119..c69f08fc76eea724f2c9933c7e2= 5fbf671820764 100644 --- a/drivers/soc/qcom/rpmh.c +++ b/drivers/soc/qcom/rpmh.c @@ -175,6 +175,9 @@ static int __rpmh_write(const struct device *dev, enum = rpmh_state state, struct cache_req *req; int i; =20 + if (rpm_msg->msg.is_read) + goto send_data; + /* Cache the request in our store and link the payload */ for (i =3D 0; i < rpm_msg->msg.num_cmds; i++) { req =3D cache_rpm_request(ctrlr, state, &rpm_msg->msg.cmds[i]); @@ -182,6 +185,7 @@ static int __rpmh_write(const struct device *dev, enum = rpmh_state state, return PTR_ERR(req); } =20 +send_data: if (state =3D=3D RPMH_ACTIVE_ONLY_STATE) { ret =3D rpmh_rsc_send_data(ctrlr_to_drv(ctrlr), &rpm_msg->msg); } else { @@ -194,7 +198,7 @@ static int __rpmh_write(const struct device *dev, enum = rpmh_state state, } =20 static int __fill_rpmh_msg(struct rpmh_request *req, enum rpmh_state state, - const struct tcs_cmd *cmd, u32 n) + const struct tcs_cmd *cmd, u32 n, bool is_read) { if (!cmd || !n || n > MAX_RPMH_PAYLOAD) return -EINVAL; @@ -204,10 +208,52 @@ static int __fill_rpmh_msg(struct rpmh_request *req, = enum rpmh_state state, req->msg.state =3D state; req->msg.cmds =3D req->cmd; req->msg.num_cmds =3D n; + req->msg.is_read =3D is_read; =20 return 0; } =20 +/** + * rpmh_read: Read a resource value + * + * @dev: The device making the request + * @state: Must be Active state + * @cmd: The payload having address of resource to read + * @n: The number of elements in @cmd, must be single command + * + * Reads the value for the resource address given in tcs_cmd->addr + * and returns the tcs_cmd->data filled with same. + * + * May sleep. Do not call from atomic contexts. + * + * Return: + * * 0 - Success + * * -Error - Error code + */ +int rpmh_read(const struct device *dev, enum rpmh_state state, struct tcs_= cmd *cmd, u32 n) +{ + int ret; + DECLARE_COMPLETION_ONSTACK(compl); + DEFINE_RPMH_MSG_ONSTACK(dev, state, &compl, rpm_msg); + + if (n !=3D 1 || state !=3D RPMH_ACTIVE_ONLY_STATE) + return -EINVAL; + + ret =3D __fill_rpmh_msg(&rpm_msg, state, cmd, n, true); + if (ret) + return ret; + + ret =3D __rpmh_write(dev, state, &rpm_msg); + if (ret) + return ret; + + ret =3D wait_for_completion_timeout(&compl, RPMH_TIMEOUT_MS); + cmd[0].data =3D rpm_msg.cmd[0].data; + + return (ret > 0) ? 0 : -ETIMEDOUT; +} +EXPORT_SYMBOL_GPL(rpmh_read); + /** * rpmh_write_async: Write a set of RPMH commands * @@ -230,7 +276,7 @@ int rpmh_write_async(const struct device *dev, enum rpm= h_state state, return -ENOMEM; rpm_msg->needs_free =3D true; =20 - ret =3D __fill_rpmh_msg(rpm_msg, state, cmd, n); + ret =3D __fill_rpmh_msg(rpm_msg, state, cmd, n, false); if (ret) { kfree(rpm_msg); return ret; @@ -257,7 +303,7 @@ int rpmh_write(const struct device *dev, enum rpmh_stat= e state, DEFINE_RPMH_MSG_ONSTACK(dev, state, &compl, rpm_msg); int ret; =20 - ret =3D __fill_rpmh_msg(&rpm_msg, state, cmd, n); + ret =3D __fill_rpmh_msg(&rpm_msg, state, cmd, n, false); if (ret) return ret; =20 @@ -352,7 +398,7 @@ int rpmh_write_batch(const struct device *dev, enum rpm= h_state state, rpm_msgs =3D req->rpm_msgs; =20 for (i =3D 0; i < count; i++) { - __fill_rpmh_msg(rpm_msgs + i, state, cmd, n[i]); + __fill_rpmh_msg(rpm_msgs + i, state, cmd, n[i], false); cmd +=3D n[i]; } =20 diff --git a/include/soc/qcom/rpmh.h b/include/soc/qcom/rpmh.h index bdbee1a97d3685d8a6153d586ddf650bd3bd3dde..03eea0bc798e6b66a4d47e9ae1b= c408de696c059 100644 --- a/include/soc/qcom/rpmh.h +++ b/include/soc/qcom/rpmh.h @@ -11,6 +11,9 @@ =20 =20 #if IS_ENABLED(CONFIG_QCOM_RPMH) +int rpmh_read(const struct device *dev, enum rpmh_state state, + struct tcs_cmd *cmd, u32 n); + int rpmh_write(const struct device *dev, enum rpmh_state state, const struct tcs_cmd *cmd, u32 n); =20 @@ -24,6 +27,10 @@ void rpmh_invalidate(const struct device *dev); =20 #else =20 +static inline int rpmh_read(const struct device *dev, enum rpmh_state stat= e, + struct tcs_cmd *cmd, u32 n) +{ return -ENODEV; } + static inline int rpmh_write(const struct device *dev, enum rpmh_state sta= te, const struct tcs_cmd *cmd, u32 n) { return -ENODEV; } diff --git a/include/soc/qcom/tcs.h b/include/soc/qcom/tcs.h index cff67ce25488e2d3603a7707af2ca77f8266a713..45b8513be2f9bb0957796476f60= 31146ee34e931 100644 --- a/include/soc/qcom/tcs.h +++ b/include/soc/qcom/tcs.h @@ -51,6 +51,7 @@ struct tcs_cmd { * struct tcs_request: A set of tcs_cmds sent together in a TCS * * @state: state for the request. + * @is_read: set for read only requests * @wait_for_compl: wait until we get a response from the h/w accelerator * (same as setting cmd->wait for all commands in the req= uest) * @num_cmds: the number of @cmds in this request @@ -58,6 +59,7 @@ struct tcs_cmd { */ struct tcs_request { enum rpmh_state state; + bool is_read; u32 wait_for_compl; u32 num_cmds; struct tcs_cmd *cmds; --=20 2.25.1 From nobody Wed Oct 8 22:14:50 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 A6A2329DB73 for ; Mon, 23 Jun 2025 16:44:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750697042; cv=none; b=lI6C9HBNKjgALsQIHu4cEQGIgaycQ4gOWCU2ud3IMehWHoMVY3Iur/rOspzAzakdIQlS/K4qQy784BqecH0tCjFWCBf3p08PqUfY6PEnHggiwiG2UNWQDfSQiAZxcc2czCS7L3priVFb3GFDl8/OxycoEByjQ9QDejWq18jA2es= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750697042; c=relaxed/simple; bh=sn1KF/6Ht8dkS8+c6d0VPrkLlRi1uh3h1hk4Rb9e8aw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TbeTYYfYeNOPweFR3EXoEYJEwU0uv52i0MiVWsWBjvjOOa60Bm59++GX7zCaioIgNCgvdK8mCsGKdXCe3hb04fgmfwnA9QZWMdl1bKVuV2sR858GVYR0l8u8nv93Xfw/bmOSVjIeXFRuGvVRt5rJWBRjUaeL6uxvoMJz/ADtZlk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Y0b8AB0Q; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Y0b8AB0Q" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55NGZP7a005909 for ; Mon, 23 Jun 2025 16:43:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= qWNqZMKTL0RTyb8f45ntbHnU/u8jjeMVsb9+e79xe8I=; b=Y0b8AB0Qs2iqnAPB daDNou9tezI1vzPFipSgtNpZdc6XN5f7wogT+SgGE7hcsK+beaGhlYL77Q8pwcha A6ffV+82Qtwq+VGlify2nA3e+kUuNfFt84ygY3UE34c1frSMffqbAIO6SWn2KUMv IK8KQQIPMb6Uo5yx1Mhbxwsx5Z6Ty9GTm+0RcH64N0VjusMn8d2/ifEbk4AjvqMf K6QcsLNQm/+/QXtBbQ5+/w67cx8VbZsUEbimxQ/b6f54VgC3YIXMwwW5lJtWpxnR CJ/T+VIjeSEmDVmoGlX/voKBbtO4sMBsU959x7M9DXdu4g88NVDiJfKm0gh6AT+A 4LgqOw== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 47f3bg9e65-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 23 Jun 2025 16:43:59 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-313d6d671ffso4123133a91.2 for ; Mon, 23 Jun 2025 09:43:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750697038; x=1751301838; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qWNqZMKTL0RTyb8f45ntbHnU/u8jjeMVsb9+e79xe8I=; b=RsIgQKR05iqlW2puTmGRd7cc8nuyH4t9AweaOMAsLF+v5hdQmCowbnHKYtFlRXmS27 CbwLRgFNbrH7xjr3ZK0NEib+u9zc4QQt+1dN0jNoxTCXKRVaStli0BmrXfVVvspfGN7A 8mRKim4p27BWGvVYWmS+kLbWPqxoenN8wU0sIDbJcmWTE9eHSDsGqoO/l1029uDWvu0x tSPLpLMCMfWIPwD7TUaPRMtiepOQzXwsgxYeNGr0fZLf5zFrJGC1Va4tKdP7us5Y1qNA RBsWywz0+fCQ3prcBHzPi80Ntw5yV4s/e0/wDP0ZqlZ5aEzTpZqt7DwJQ29imzXDDAmH VVSA== X-Forwarded-Encrypted: i=1; AJvYcCWBDYpzPiZvaAZsObzy/PFDODJKL9GizLw4fOKUKSYPwubGNFdb6V76YyjBxSzbhILEgv+8NEDRlBFeSzk=@vger.kernel.org X-Gm-Message-State: AOJu0YxSqNYPZ7WImC8xY+mJ4aXaptekkChGnBNRNK4RTWICpMvK4t3h pZvkSrSIGd+ez0Ej6UJuuFZC+BaD1LXXlgaKlgSiSMa4WbjZ6NMYhFpyubH0lCgqYi1b6N3Xq/6 yho+v1yOrjZwo3J635xCAGQV+sMuwVCPdyumRdW7Em5M2kGy+auyIMjNvIXwdMVojWkc= X-Gm-Gg: ASbGnct5rfiFYzb5S4UjFfpdAy/cAd0j+xSUu7OG2qt3pW+vpNBhrHu3a+fZI04zuKC jNYnLNaONGsfMutxxZSdXGJ5YXyYwYWJbOETUDGZlA1GNdXFC/WYNthhLv3Zf/Hc/nZc9JHyH8Y hA+WexUlFptT0ZK44lyoi+N8eysg72346I8e6TTSVJvx6m+u2KGVHf0r0s8DIWyvUevJquPIs6a fe1SVXaGAe22rRmmzuJQs4XILm+2HIfog9vM37GV9A3y+xsP9DYkVosNlkjBNb7XzM7XEIcWe5m bg2RCKqmcmWk590wy5hztnjlfyioSTX886dqD/2/KSpStVsdyGs3 X-Received: by 2002:a17:90b:5826:b0:2fe:e9c6:689e with SMTP id 98e67ed59e1d1-3159d64432cmr20159125a91.8.1750697038076; Mon, 23 Jun 2025 09:43:58 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEc6+DPGexoqt9iFZAUHgGKTSWRV9mQ6Fl4MWUU0bfxuffMek6pig/mwkiOYyr/RXSKgvyvnA== X-Received: by 2002:a17:90b:5826:b0:2fe:e9c6:689e with SMTP id 98e67ed59e1d1-3159d64432cmr20159094a91.8.1750697037645; Mon, 23 Jun 2025 09:43:57 -0700 (PDT) Received: from hu-kamalw-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3159e048346sm9271254a91.26.2025.06.23.09.43.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 09:43:57 -0700 (PDT) From: Kamal Wadhwa Date: Mon, 23 Jun 2025 22:13:41 +0530 Subject: [PATCH 2/2] regulator: qcom-rpmh: Add support to read regulator settings Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250623-add-rpmh-read-support-v1-2-ae583d260195@oss.qualcomm.com> References: <20250623-add-rpmh-read-support-v1-0-ae583d260195@oss.qualcomm.com> In-Reply-To: <20250623-add-rpmh-read-support-v1-0-ae583d260195@oss.qualcomm.com> To: Bjorn Andersson , Konrad Dybcio , Liam Girdwood , Mark Brown Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Kamal Wadhwa , David Collins X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1750697028; l=5166; i=kamal.wadhwa@oss.qualcomm.com; s=20241018; h=from:subject:message-id; bh=sn1KF/6Ht8dkS8+c6d0VPrkLlRi1uh3h1hk4Rb9e8aw=; b=EOeQmrffC193kGihEndFlAgPdXhvvTnjn+yaE0LDszh2PJZd0RPEd6NXWQbpmtm38atm5WTCg gSkNudxW7jFB3NNqaMBhBuYhALq/nNtQEkfbSZPm9k4fUxq5oqYG9Jo X-Developer-Key: i=kamal.wadhwa@oss.qualcomm.com; a=ed25519; pk=XbPE6DM5/mJi2tsiYwMCJCZ4O5XPMqColJRlGVcM7Hs= X-Proofpoint-ORIG-GUID: MFIsfhBu1qHMpqqBP-AoJxR_0KvsYYEQ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIzMDEwMSBTYWx0ZWRfX3CaMtQy3SbpT TQLyCunH1x03a93RCaq/QmXGJG9BFDNxxwxsJD207kfZRvUfIC9uK77aVsBrR5bBtRDwstzny/0 fc/8M9BtrOKli9mOaqWyxKcSzFFra87MsoGQ4DMEgbiFN16sX4xy6lPu1LVYLQjdA3RQkweVYOV r1xtOqWd+mlNT4EsEHn6s6c90/N8odwcMblVCfEoW1huwclfa2LynqPdqTo6ZbgtD/8LQ9CYgwF Ht8LsVtgIrZkzzpm8pogpLI/a6BTyxvhPT8gKt59ebi0+dxMx/t1PGKQk10om9Ukv8b7g/MlITx vCdUok/DjD70Z4nxfs51RsgC3MjE8wOuswNq2p+siIHNATQcjrnYZ8UKgZWmV/Fgp8b5l+c/4Pc CPa4hj4MGWg469I5jrw8s6lxhUBkCZGEw7j6yNwdjuSCtBGFKzk+Py4NnGJ91H14oJIjSlAj X-Authority-Analysis: v=2.4 cv=L4kdQ/T8 c=1 sm=1 tr=0 ts=6859844f cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=6IFa9wvqVegA:10 a=EUspDBNiAAAA:8 a=oayDomAjHHfHustaWQ8A:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: MFIsfhBu1qHMpqqBP-AoJxR_0KvsYYEQ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.7,FMLib:17.12.80.40 definitions=2025-06-23_04,2025-06-23_07,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 malwarescore=0 bulkscore=0 clxscore=1015 suspectscore=0 adultscore=0 priorityscore=1501 impostorscore=0 lowpriorityscore=0 spamscore=0 phishscore=0 mlxlogscore=999 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505280000 definitions=main-2506230101 Currently, the RPMH regulator's `get_voltage_sel()` function only returns cached values from the last `set_voltage_sel()` operation. This limitation prevents the regulator framework from accurately reflecting the regulator configurations set during the bootloader stage. As a result, the regulator framework may trigger an unnecessary `set_voltage_sel()` call with the `min_uV` value specified in the regulator's device tree settings, which can cause issues for consumers like the display and UFS that require a consistent voltage setting from the bootloader state until their drivers are probed. To address this issue, enhance the `get_voltage_sel()`, `get_mode()`, and `is_enabled()` callbacks to read the regulator settings directly from the RPMH hardware using the `rpmh_read()` function. This change ensures that the regulator framework accurately reflects the actual state of the regulators, avoiding unnecessary voltage adjustments and maintaining consistent power settings across the transition from bootloader to kernel. Signed-off-by: David Collins Signed-off-by: Kamal Wadhwa --- drivers/regulator/qcom-rpmh-regulator.c | 71 +++++++++++++++++++++++++++++= ++++ 1 file changed, 71 insertions(+) diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qc= om-rpmh-regulator.c index 7870722b6ee21ce487c2cf911760fb4a385fc44b..ba5bd4ecec7429a1ada008c237c= f7444a37a9cc6 100644 --- a/drivers/regulator/qcom-rpmh-regulator.c +++ b/drivers/regulator/qcom-rpmh-regulator.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. // Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. +// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. =20 #define pr_fmt(fmt) "%s: " fmt, __func__ =20 @@ -33,8 +34,13 @@ enum rpmh_regulator_type { }; =20 #define RPMH_REGULATOR_REG_VRM_VOLTAGE 0x0 +#define RPMH_REGULATOR_VOLTAGE_MASK 0x1FFF + #define RPMH_REGULATOR_REG_ENABLE 0x4 +#define RPMH_REGULATOR_ENABLE_MASK 0x1 + #define RPMH_REGULATOR_REG_VRM_MODE 0x8 +#define RPMH_REGULATOR_MODE_MASK 0x7 =20 #define PMIC4_LDO_MODE_RETENTION 4 #define PMIC4_LDO_MODE_LPM 5 @@ -174,6 +180,28 @@ static int rpmh_regulator_send_request(struct rpmh_vre= g *vreg, return ret; } =20 +static int rpmh_regulator_read_data(struct rpmh_vreg *vreg, struct tcs_cmd= *cmd) +{ + return rpmh_read(vreg->dev, RPMH_ACTIVE_ONLY_STATE, cmd, 1); +} + +static int _rpmh_regulator_vrm_get_voltage(struct regulator_dev *rdev, int= *uV) +{ + struct rpmh_vreg *vreg =3D rdev_get_drvdata(rdev); + struct tcs_cmd cmd =3D { + .addr =3D vreg->addr + RPMH_REGULATOR_REG_VRM_VOLTAGE, + }; + int ret; + + ret =3D rpmh_regulator_read_data(vreg, &cmd); + if (!ret) + *uV =3D (cmd.data & RPMH_REGULATOR_VOLTAGE_MASK) * 1000; + else + dev_err(vreg->dev, "failed to read VOLTAGE ret =3D %d\n", ret); + + return ret; +} + static int _rpmh_regulator_vrm_set_voltage_sel(struct regulator_dev *rdev, unsigned int selector, bool wait_for_ack) { @@ -215,6 +243,14 @@ static int rpmh_regulator_vrm_set_voltage_sel(struct r= egulator_dev *rdev, static int rpmh_regulator_vrm_get_voltage_sel(struct regulator_dev *rdev) { struct rpmh_vreg *vreg =3D rdev_get_drvdata(rdev); + int ret, uV =3D 0; + + if (vreg->voltage_selector < 0) { + ret =3D _rpmh_regulator_vrm_get_voltage(rdev, &uV); + if (!ret && uV !=3D 0) + vreg->voltage_selector =3D regulator_map_voltage_linear_range(rdev, + uV, INT_MAX); + } =20 return vreg->voltage_selector; } @@ -222,6 +258,18 @@ static int rpmh_regulator_vrm_get_voltage_sel(struct r= egulator_dev *rdev) static int rpmh_regulator_is_enabled(struct regulator_dev *rdev) { struct rpmh_vreg *vreg =3D rdev_get_drvdata(rdev); + struct tcs_cmd cmd =3D { + .addr =3D vreg->addr + RPMH_REGULATOR_REG_ENABLE, + }; + int ret; + + if (vreg->enabled < 0) { + ret =3D rpmh_regulator_read_data(vreg, &cmd); + if (!ret) + vreg->enabled =3D cmd.data & RPMH_REGULATOR_ENABLE_MASK; + else + dev_err(vreg->dev, "failed to read ENABLE status ret =3D %d\n", ret); + } =20 return vreg->enabled; } @@ -303,6 +351,29 @@ static int rpmh_regulator_vrm_set_mode(struct regulato= r_dev *rdev, static unsigned int rpmh_regulator_vrm_get_mode(struct regulator_dev *rdev) { struct rpmh_vreg *vreg =3D rdev_get_drvdata(rdev); + struct tcs_cmd cmd =3D { + .addr =3D vreg->addr + RPMH_REGULATOR_REG_VRM_MODE, + }; + int ret, pmic_mode, mode; + + if (vreg->mode > REGULATOR_MODE_INVALID && vreg->mode <=3D REGULATOR_MODE= _STANDBY) + return vreg->mode; + + ret =3D rpmh_regulator_read_data(vreg, &cmd); + if (!ret) { + pmic_mode =3D cmd.data & RPMH_REGULATOR_MODE_MASK; + if (pmic_mode =3D=3D 0) + return vreg->mode; + + for (mode =3D 0; mode <=3D REGULATOR_MODE_STANDBY; mode++) { + if (pmic_mode =3D=3D vreg->hw_data->pmic_mode_map[mode]) { + vreg->mode =3D mode; + break; + } + } + } else { + dev_err(vreg->dev, "failed to read MODE ret =3D %d\n", ret); + } =20 return vreg->mode; } --=20 2.25.1