Devicetree
 help / color / mirror / Atom feed
From: Viresh Kumar <viresh.kumar@linaro.org>
To: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
Cc: "Viresh Kumar" <vireshk@kernel.org>, "Nishanth Menon" <nm@ti.com>,
	"Stephen Boyd" <sboyd@kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	"Manivannan Sadhasivam" <mani@kernel.org>,
	"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
	"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
	"Rob Herring" <robh@kernel.org>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Bjorn Andersson" <andersson@kernel.org>,
	"Konrad Dybcio" <konradybcio@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-pci@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	devicetree@vger.kernel.org
Subject: Re: [PATCH v4 1/7] OPP: Add support to find OPP for a set of keys
Date: Fri, 22 Aug 2025 12:20:26 +0530	[thread overview]
Message-ID: <20250822065026.2ve2uscdjfismm7v@vireshk-i7> (raw)
In-Reply-To: <20250820-opp_pcie-v4-1-273b8944eed0@oss.qualcomm.com>

On 20-08-25, 13:58, Krishna Chaitanya Chundru wrote:
> Some clients, such as PCIe, may operate at the same clock frequency
> across different data rates by varying link width. In such cases,
> frequency alone is not sufficient to uniquely identify an OPP.
> To support these scenarios, introduce a new API
> dev_pm_opp_find_key_exact() that allows OPP lookup with different
> set of keys like freq, level & bandwidth.
> 
> Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
> ---
>  drivers/opp/core.c     | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/pm_opp.h | 30 ++++++++++++++++
>  2 files changed, 127 insertions(+)

Applied with this diff:

diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index a36c3daac39c..bba4f7daff8c 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -476,7 +476,8 @@ static unsigned long _read_bw(struct dev_pm_opp *opp, int index)
        return opp->bandwidth[index].peak;
 }

-static unsigned long _read_opp_key(struct dev_pm_opp *opp, int index, struct dev_pm_opp_key *key)
+static unsigned long _read_opp_key(struct dev_pm_opp *opp, int index,
+                                  struct dev_pm_opp_key *key)
 {
        key->bw = opp->bandwidth ? opp->bandwidth[index].peak : 0;
        key->freq = opp->rates[index];
@@ -518,12 +519,13 @@ static bool _compare_floor(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,
        return false;
 }

-static bool _compare_opp_key_exact(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,
-                                  struct dev_pm_opp_key opp_key, struct dev_pm_opp_key key)
+static bool _compare_opp_key_exact(struct dev_pm_opp **opp,
+               struct dev_pm_opp *temp_opp, struct dev_pm_opp_key *opp_key,
+               struct dev_pm_opp_key *key)
 {
-       bool level_match = (key.level == OPP_LEVEL_UNSET || opp_key.level == key.level);
-       bool freq_match = (key.freq == 0 || opp_key.freq == key.freq);
-       bool bw_match = (key.bw == 0 || opp_key.bw == key.bw);
+       bool level_match = (key->level == OPP_LEVEL_UNSET || opp_key->level == key->level);
+       bool freq_match = (key->freq == 0 || opp_key->freq == key->freq);
+       bool bw_match = (key->bw == 0 || opp_key->bw == key->bw);

        if (freq_match && level_match && bw_match) {
                *opp = temp_opp;
@@ -570,7 +572,7 @@ static struct dev_pm_opp *_opp_table_find_opp_key(struct opp_table *opp_table,
                unsigned long (*read)(struct dev_pm_opp *opp, int index,
                                      struct dev_pm_opp_key *key),
                bool (*compare)(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,
-                               struct dev_pm_opp_key opp_key, struct dev_pm_opp_key key),
+                               struct dev_pm_opp_key *opp_key, struct dev_pm_opp_key *key),
                bool (*assert)(struct opp_table *opp_table, unsigned int index))
 {
        struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
@@ -585,9 +587,8 @@ static struct dev_pm_opp *_opp_table_find_opp_key(struct opp_table *opp_table,
        list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
                if (temp_opp->available == available) {
                        read(temp_opp, 0, &temp_key);
-                       if (compare(&opp, temp_opp, temp_key, *key)) {
+                       if (compare(&opp, temp_opp, &temp_key, key)) {
                                /* Increment the reference count of OPP */
-                               *key = temp_key;
                                dev_pm_opp_get(opp);
                                break;
                        }
@@ -689,20 +690,20 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
 EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact);

 /**
- * dev_pm_opp_find_key_exact() - Search for an exact OPP key
- * @dev:                Device for which the OPP is being searched
- * @key:                OPP key to match
- * @available:          true/false - match for available OPP
+ * dev_pm_opp_find_key_exact() - Search for an OPP with exact key set
+ * @dev:               Device for which the OPP is being searched
+ * @key:               OPP key set to match
+ * @available:         true/false - match for available OPP
  *
- * Search for an exact match the OPP key in the OPP table.
+ * Search for an exact match of the key set in the OPP table.
  *
- * Return: matching *opp, else returns ERR_PTR in case of error and should
- * be using IS_ERR. Error return values can be:
- * EINVAL:      for bad pointer
- * ERANGE:      no match found for search
- * ENODEV:      if device not found in list of registered devices
+ * Return: A matching opp on success, else ERR_PTR in case of error.
+ * Possible error values:
+ * EINVAL:     for bad pointers
+ * ERANGE:     no match found for search
+ * ENODEV:     if device not found in list of registered devices
  *
- * Note: 'available' is a modifier for the search. If 'available'=true,
+ * Note: 'available' is a modifier for the search. If 'available' == true,
  * then the match is for exact matching key and is available in the stored
  * OPP table. If false, the match is for exact key which is not available.
  *
@@ -713,7 +714,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact);
  * use.
  */
 struct dev_pm_opp *dev_pm_opp_find_key_exact(struct device *dev,
-                                            struct dev_pm_opp_key key,
+                                            struct dev_pm_opp_key *key,
                                             bool available)
 {
        struct opp_table *opp_table __free(put_opp_table) = _find_opp_table(dev);
@@ -724,8 +725,9 @@ struct dev_pm_opp *dev_pm_opp_find_key_exact(struct device *dev,
                return ERR_CAST(opp_table);
        }

-       return _opp_table_find_opp_key(opp_table, &key, available, _read_opp_key,
-                                      _compare_opp_key_exact, assert_single_clk);
+       return _opp_table_find_opp_key(opp_table, key, available,
+                                      _read_opp_key, _compare_opp_key_exact,
+                                      assert_single_clk);
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_find_key_exact);

diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index 5d244bf97489..789406d95e69 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -151,7 +151,7 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
                                              bool available);

 struct dev_pm_opp *dev_pm_opp_find_key_exact(struct device *dev,
-                                            struct dev_pm_opp_key key,
+                                            struct dev_pm_opp_key *key,
                                             bool available);

 struct dev_pm_opp *
@@ -313,7 +313,7 @@ static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
 }

 static inline struct dev_pm_opp *dev_pm_opp_find_key_exact(struct device *dev,
-                                                          struct dev_pm_opp_key key,
+                                                          struct dev_pm_opp_key *key,
                                                           bool available)
 {
        return ERR_PTR(-EOPNOTSUPP);

-- 
viresh

  reply	other threads:[~2025-08-22  6:50 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-20  8:28 [PATCH v4 0/7] OPP: Add support to find OPP for a set of keys Krishna Chaitanya Chundru
2025-08-20  8:28 ` [PATCH v4 1/7] " Krishna Chaitanya Chundru
2025-08-22  6:50   ` Viresh Kumar [this message]
2025-08-20  8:28 ` [PATCH v4 2/7] OPP: Move refcount and key update for readability in _opp_table_find_key() Krishna Chaitanya Chundru
2025-08-22  6:51   ` Viresh Kumar
2025-08-25 13:59   ` Marek Szyprowski
2025-08-25 15:56     ` Krishna Chaitanya Chundru
2025-08-26  6:10       ` Viresh Kumar
2025-08-26  6:06     ` Viresh Kumar
2025-08-26  7:26       ` Marek Szyprowski
2025-08-26  8:24         ` Viresh Kumar
2025-08-26 11:25     ` Krzysztof Kozlowski
2025-08-20  8:28 ` [PATCH v4 3/7] arm64: dts: qcom: sm8450: Add opp-level to indicate PCIe data rates Krishna Chaitanya Chundru
2025-08-26  5:57   ` Manivannan Sadhasivam
2025-08-26  6:08   ` Manivannan Sadhasivam
2025-08-20  8:28 ` [PATCH v4 4/7] arm64: dts: qcom: sm8550: " Krishna Chaitanya Chundru
2025-08-20  8:28 ` [PATCH v4 5/7] arm64: dts: qcom: sm8650: " Krishna Chaitanya Chundru
2025-08-20  8:28 ` [PATCH v4 6/7] arm64: dts: qcom: x1e80100: " Krishna Chaitanya Chundru
2025-08-20  8:28 ` [PATCH v4 7/7] PCI: qcom: Use frequency and level based OPP lookup Krishna Chaitanya Chundru
2025-08-20  8:55   ` Neil Armstrong
2025-08-26  5:54   ` Manivannan Sadhasivam
2025-08-25 16:44 ` [PATCH v4 0/7] OPP: Add support to find OPP for a set of keys Wasim Nazir
2025-08-26  5:20   ` Viresh Kumar
2025-08-26  5:36     ` Viresh Kumar
2025-08-26  8:27       ` Viresh Kumar

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=20250822065026.2ve2uscdjfismm7v@vireshk-i7 \
    --to=viresh.kumar@linaro.org \
    --cc=andersson@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=konradybcio@kernel.org \
    --cc=krishna.chundru@oss.qualcomm.com \
    --cc=krzk+dt@kernel.org \
    --cc=kwilczynski@kernel.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lpieralisi@kernel.org \
    --cc=mani@kernel.org \
    --cc=nm@ti.com \
    --cc=rafael@kernel.org \
    --cc=robh@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=vireshk@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