From: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
To: "Bjorn Helgaas" <bhelgaas@google.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Jingoo Han" <jingoohan1@gmail.com>,
"Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Rob Herring" <robh@kernel.org>,
"Johannes Berg" <johannes@sipsolutions.net>,
"Jeff Johnson" <jjohnson@kernel.org>
Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-msm@vger.kernel.org, mhi@lists.linux.dev,
linux-wireless@vger.kernel.org, ath11k@lists.infradead.org,
quic_pyarlaga@quicinc.com, quic_vbadigan@quicinc.com,
quic_vpernami@quicinc.com, quic_mrana@quicinc.com,
Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>,
Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Subject: [PATCH v2 02/10] PCI/bwctrl: Add support to scale bandwidth before & after link re-training
Date: Thu, 13 Mar 2025 17:10:09 +0530 [thread overview]
Message-ID: <20250313-mhi_bw_up-v2-2-869ca32170bf@oss.qualcomm.com> (raw)
In-Reply-To: <20250313-mhi_bw_up-v2-0-869ca32170bf@oss.qualcomm.com>
If the driver wants to move to higher data rate/speed than the current data
rate then the controller driver may need to change certain votes so that
link may come up at requested data rate/speed like QCOM PCIe controllers
need to change their RPMh (Resource Power Manager-hardened) state. Once
link retraining is done controller drivers needs to adjust their votes
based on the final data rate.
Some controllers also may need to update their bandwidth voting like
ICC bw votings etc.
So, add pre_scale_bus_bw() & post_scale_bus_bw() op to call before & after
the link re-train. There is no explicit locking mechanisms as these are
called by a single client endpoint driver.
In case of PCIe switch, if there is a request to change target speed for a
downstream port then no need to call these function ops as these are
outside the scope of the controller drivers.
Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
---
drivers/pci/pcie/bwctrl.c | 15 +++++++++++++++
include/linux/pci.h | 13 +++++++++++++
2 files changed, 28 insertions(+)
diff --git a/drivers/pci/pcie/bwctrl.c b/drivers/pci/pcie/bwctrl.c
index 0a5e7efbce2c..b1d660359553 100644
--- a/drivers/pci/pcie/bwctrl.c
+++ b/drivers/pci/pcie/bwctrl.c
@@ -161,6 +161,8 @@ static int pcie_bwctrl_change_speed(struct pci_dev *port, u16 target_speed, bool
int pcie_set_target_speed(struct pci_dev *port, enum pci_bus_speed speed_req,
bool use_lt)
{
+ struct pci_host_bridge *host = pci_find_host_bridge(port->bus);
+ bool is_rootport = pci_is_root_bus(port->bus);
struct pci_bus *bus = port->subordinate;
u16 target_speed;
int ret;
@@ -173,6 +175,16 @@ int pcie_set_target_speed(struct pci_dev *port, enum pci_bus_speed speed_req,
target_speed = pcie_bwctrl_select_speed(port, speed_req);
+ /*
+ * The controller driver may need to be scaled for targeted speed
+ * otherwise link might not come up at requested speed.
+ */
+ if (is_rootport && host->ops->pre_scale_bus_bw) {
+ ret = host->ops->pre_scale_bus_bw(host->bus, target_speed);
+ if (ret)
+ return ret;
+ }
+
scoped_guard(rwsem_read, &pcie_bwctrl_setspeed_rwsem) {
struct pcie_bwctrl_data *data = port->link_bwctrl;
@@ -197,6 +209,9 @@ int pcie_set_target_speed(struct pci_dev *port, enum pci_bus_speed speed_req,
!list_empty(&bus->devices))
ret = -EAGAIN;
+ if (is_rootport && host->ops->post_scale_bus_bw)
+ host->ops->post_scale_bus_bw(host->bus, pci_bus_speed2lnkctl2(bus->cur_bus_speed));
+
return ret;
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 47b31ad724fa..9ae199c1e698 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -804,6 +804,19 @@ struct pci_ops {
void __iomem *(*map_bus)(struct pci_bus *bus, unsigned int devfn, int where);
int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);
int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
+ /*
+ * Callback to the drivers to update ICC bw votes, clock frequencies etc for
+ * the link re-train to come up in targeted speed. These are called by a single
+ * client endpoint driver, so there is no need for explicit locking mechanisms.
+ */
+ int (*pre_scale_bus_bw)(struct pci_bus *bus, int target_speed);
+ /*
+ * Callback to the drivers to adjust ICC bw votes, clock frequencies etc
+ * to the updated speed after link re-train. These are called by a
+ * single client endpoint driver, so there is no need for explicit
+ * locking mechanisms.
+ */
+ void (*post_scale_bus_bw)(struct pci_bus *bus, int current_speed);
};
/*
--
2.34.1
next prev parent reply other threads:[~2025-03-13 11:40 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-13 11:40 [PATCH v2 00/10] bus: mhi: host: Add support for mhi bus bw Krishna Chaitanya Chundru
2025-03-13 11:40 ` [PATCH v2 01/10] PCI: update current bus speed as part of pci_bus_add_devices() Krishna Chaitanya Chundru
2025-03-13 17:00 ` Bjorn Helgaas
2025-04-25 15:46 ` Manivannan Sadhasivam
2025-03-13 17:00 ` Bjorn Helgaas
2025-03-13 11:40 ` Krishna Chaitanya Chundru [this message]
2025-04-25 15:57 ` [PATCH v2 02/10] PCI/bwctrl: Add support to scale bandwidth before & after link re-training Manivannan Sadhasivam
2025-05-16 12:49 ` Krishna Chaitanya Chundru
2025-03-13 11:40 ` [PATCH v2 03/10] PCI: dwc: Implement .pre_scale_bus_bw() & .post_scale_bus_bw hook Krishna Chaitanya Chundru
2025-04-25 16:02 ` Manivannan Sadhasivam
2025-03-13 11:40 ` [PATCH v2 04/10] PCI: qcom: Extract core logic from qcom_pcie_icc_opp_update() Krishna Chaitanya Chundru
2025-03-13 11:40 ` [PATCH v2 05/10] PCI: qcom: Add support for PCIe bus bw scaling Krishna Chaitanya Chundru
2025-04-25 16:07 ` Manivannan Sadhasivam
2025-03-13 11:40 ` [PATCH v2 06/10] bus: mhi: host: Add support to read MHI capabilities Krishna Chaitanya Chundru
2025-03-13 17:05 ` Bjorn Helgaas
2025-04-25 16:18 ` Manivannan Sadhasivam
2025-03-13 11:40 ` [PATCH v2 07/10] bus: mhi: host: Add support for Bandwidth scale Krishna Chaitanya Chundru
2025-04-25 16:43 ` Manivannan Sadhasivam
2025-05-06 4:29 ` Krishna Chaitanya Chundru
2025-05-17 2:20 ` Krishna Chaitanya Chundru
2025-03-13 11:40 ` [PATCH v2 08/10] PCI: Export pci_set_target_speed() Krishna Chaitanya Chundru
2025-03-13 11:40 ` [PATCH v2 09/10] PCI: Add function to convert lnkctl2speed to pci_bus_speed Krishna Chaitanya Chundru
2025-03-13 17:16 ` Bjorn Helgaas
2025-03-13 23:48 ` Jeff Johnson
2025-03-13 11:40 ` [PATCH v2 10/10] wifi: ath11k: add support for MHI bandwidth scaling Krishna Chaitanya Chundru
2025-03-13 17:28 ` Bjorn Helgaas
2025-03-18 5:23 ` Krishna Chaitanya Chundru
2025-03-13 23:53 ` Jeff Johnson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250313-mhi_bw_up-v2-2-869ca32170bf@oss.qualcomm.com \
--to=krishna.chundru@oss.qualcomm.com \
--cc=ath11k@lists.infradead.org \
--cc=bhelgaas@google.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=jeff.johnson@oss.qualcomm.com \
--cc=jingoohan1@gmail.com \
--cc=jjohnson@kernel.org \
--cc=johannes@sipsolutions.net \
--cc=kw@linux.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=mhi@lists.linux.dev \
--cc=quic_mrana@quicinc.com \
--cc=quic_pyarlaga@quicinc.com \
--cc=quic_vbadigan@quicinc.com \
--cc=quic_vpernami@quicinc.com \
--cc=robh@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®