diff mbox series

[RFC,net-next,v3,03/27] net: pse-pd: Avoid setting max_uA in regulator constraints

Message ID 20241121-feature_poe_port_prio-v3-3-83299fa6967c@bootlin.com (mailing list archive)
State RFC
Delegated to: Netdev Maintainers
Headers show
Series Add support for PSE port priority | expand

Checks

Context Check Description
netdev/series_format fail Series longer than 15 patches
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; GEN HAS DIFF 2 files changed, 161 insertions(+);
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 3 this patch: 3
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang success Errors and warnings before: 3 this patch: 3
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 4 this patch: 4
netdev/checkpatch warning CHECK: From:/Signed-off-by: email comments mismatch: 'From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>' != 'Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>'
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Kory Maincent Nov. 21, 2024, 2:42 p.m. UTC
From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>

Setting the max_uA constraint in the regulator API imposes a current
limit during the regulator registration process. This behavior conflicts
with preserving the maximum PI power budget configuration across reboots.

Instead, compare the desired current limit to MAX_PI_CURRENT in the
pse_pi_set_current_limit() function to ensure proper handling of the
power budget.

Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
---

Change ni v3:
- New patch
---
 drivers/net/pse-pd/pse_core.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Oleksij Rempel Nov. 23, 2024, 6:29 a.m. UTC | #1
Hi Kory,

On Thu, Nov 21, 2024 at 03:42:29PM +0100, Kory Maincent wrote:
> From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
> 
> Setting the max_uA constraint in the regulator API imposes a current
> limit during the regulator registration process. This behavior conflicts
> with preserving the maximum PI power budget configuration across reboots.
> 
> Instead, compare the desired current limit to MAX_PI_CURRENT in the
> pse_pi_set_current_limit() function to ensure proper handling of the
> power budget.

Not enough coffee :) I still didn't correctly understood the problem.

MAX_PI_CURRENT is the hard limit according to the standard, so it is the
intial limit anyway. Why it is bad to set it on registration? It feels
still better compared to have no limit on init. Or do i'm missing
things?

Regards,
Oleksij
Kory Maincent Nov. 24, 2024, 11:47 a.m. UTC | #2
Hello Oleksij,

On Sat, 23 Nov 2024 07:29:29 +0100
Oleksij Rempel <o.rempel@pengutronix.de> wrote:

> Hi Kory,
> 
> On Thu, Nov 21, 2024 at 03:42:29PM +0100, Kory Maincent wrote:
> > From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
> > 
> > Setting the max_uA constraint in the regulator API imposes a current
> > limit during the regulator registration process. This behavior conflicts
> > with preserving the maximum PI power budget configuration across reboots.
> > 
> > Instead, compare the desired current limit to MAX_PI_CURRENT in the
> > pse_pi_set_current_limit() function to ensure proper handling of the
> > power budget.  
> 
> Not enough coffee :) I still didn't correctly understood the problem.

Don't worry, if you don't understand as a PSE Maintainer no one will. The cause
is the commit message.
 
> MAX_PI_CURRENT is the hard limit according to the standard, so it is the
> intial limit anyway. Why it is bad to set it on registration? It feels
> still better compared to have no limit on init. Or do i'm missing
> things?

Using constraints.max_uA to set the max current limit will cause regulator core
to call the set_current_limit callback when registering a regulator. This call
will be done using MAX_PI_CURRENT (1,92A) limit.

Is see two issues to this:
- There is a chance the power budget of the supply will be not sufficient for
  all the PIs configured to MAX_PI_CURRENT. On that case the power budget of
  the supply is exceeded and the next PI of the PSE power domain can't probe
  with success. It will have -ERANGE error returned from
  devm_regulator_register() call. So the PSE driver can't probe with success.
- The PI current limit is reset at each boot. The next patch series will tackle
  permanent configuration feature of the PD692x0. This will conflict as
  we want to keep the PI current limit saved.

Another solution would be to add a no_apply_max_uA_constraint flag.

Regards,
diff mbox series

Patch

diff --git a/drivers/net/pse-pd/pse_core.c b/drivers/net/pse-pd/pse_core.c
index 2906ce173f66..9fee4dd53515 100644
--- a/drivers/net/pse-pd/pse_core.c
+++ b/drivers/net/pse-pd/pse_core.c
@@ -357,6 +357,9 @@  static int pse_pi_set_current_limit(struct regulator_dev *rdev, int min_uA,
 	if (!ops->pi_set_current_limit)
 		return -EOPNOTSUPP;
 
+	if (max_uA > MAX_PI_CURRENT)
+		return -ERANGE;
+
 	id = rdev_get_id(rdev);
 	mutex_lock(&pcdev->lock);
 	ret = ops->pi_set_current_limit(pcdev, id, max_uA);
@@ -403,11 +406,9 @@  devm_pse_pi_regulator_register(struct pse_controller_dev *pcdev,
 
 	rinit_data->constraints.valid_ops_mask = REGULATOR_CHANGE_STATUS;
 
-	if (pcdev->ops->pi_set_current_limit) {
+	if (pcdev->ops->pi_set_current_limit)
 		rinit_data->constraints.valid_ops_mask |=
 			REGULATOR_CHANGE_CURRENT;
-		rinit_data->constraints.max_uA = MAX_PI_CURRENT;
-	}
 
 	rinit_data->supply_regulator = "vpwr";