mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 05:56:14 -04:00
net: pse-pd: Add new power limit get and set c33 features
This patch add a way to get and set the power limit of a PSE PI. For that it uses regulator API callbacks wrapper like get_voltage() and get/set_current_limit() as power is simply V * I. We used mW unit as defined by the IEEE 802.3-2022 standards. set_current_limit() uses the voltage return by get_voltage() and the desired power limit to calculate the current limit. get_voltage() callback is then mandatory to set the power limit. get_current_limit() callback is by default looking at a driver callback and fallback to extracting the current limit from _pse_ethtool_get_status() if the driver does not set its callback. We prefer let the user the choice because ethtool_get_status return much more information than the current limit. expand pse status with c33_pw_limit_ranges to return the ranges available to configure the power limit. Reviewed-by: Sai Krishna <saikrishnag@marvell.com> Acked-by: Oleksij Rempel <o.rempel@pengutronix.de> Signed-off-by: Kory Maincent <kory.maincent@bootlin.com> Link: https://patch.msgid.link/20240704-feature_poe_power_cap-v6-4-320003204264@bootlin.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
ae37dc5742
commit
4a83abcef5
@@ -9,6 +9,9 @@
|
||||
#include <linux/list.h>
|
||||
#include <uapi/linux/ethtool.h>
|
||||
|
||||
/* Maximum current in uA according to IEEE 802.3-2022 Table 145-1 */
|
||||
#define MAX_PI_CURRENT 1920000
|
||||
|
||||
struct phy_device;
|
||||
struct pse_controller_dev;
|
||||
|
||||
@@ -41,6 +44,12 @@ struct pse_control_config {
|
||||
* @c33_actual_pw: power currently delivered by the PSE in mW
|
||||
* IEEE 802.3-2022 30.9.1.1.23 aPSEActualPower
|
||||
* @c33_ext_state_info: extended state information of the PSE
|
||||
* @c33_avail_pw_limit: available power limit of the PSE in mW
|
||||
* IEEE 802.3-2022 145.2.5.4 pse_avail_pwr
|
||||
* @c33_pw_limit_ranges: supported power limit configuration range. The driver
|
||||
* is in charge of the memory allocation.
|
||||
* @c33_pw_limit_nb_ranges: number of supported power limit configuration
|
||||
* ranges
|
||||
*/
|
||||
struct pse_control_status {
|
||||
enum ethtool_podl_pse_admin_state podl_admin_state;
|
||||
@@ -50,6 +59,9 @@ struct pse_control_status {
|
||||
u32 c33_pw_class;
|
||||
u32 c33_actual_pw;
|
||||
struct ethtool_c33_pse_ext_state_info c33_ext_state_info;
|
||||
u32 c33_avail_pw_limit;
|
||||
struct ethtool_c33_pse_pw_limit_range *c33_pw_limit_ranges;
|
||||
u32 c33_pw_limit_nb_ranges;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -61,6 +73,14 @@ struct pse_control_status {
|
||||
* May also return negative errno.
|
||||
* @pi_enable: Configure the PSE PI as enabled.
|
||||
* @pi_disable: Configure the PSE PI as disabled.
|
||||
* @pi_get_voltage: Return voltage similarly to get_voltage regulator
|
||||
* callback.
|
||||
* @pi_get_current_limit: Get the configured current limit similarly to
|
||||
* get_current_limit regulator callback.
|
||||
* @pi_set_current_limit: Configure the current limit similarly to
|
||||
* set_current_limit regulator callback.
|
||||
* Should not return an error in case of MAX_PI_CURRENT
|
||||
* current value set.
|
||||
*/
|
||||
struct pse_controller_ops {
|
||||
int (*ethtool_get_status)(struct pse_controller_dev *pcdev,
|
||||
@@ -70,6 +90,11 @@ struct pse_controller_ops {
|
||||
int (*pi_is_enabled)(struct pse_controller_dev *pcdev, int id);
|
||||
int (*pi_enable)(struct pse_controller_dev *pcdev, int id);
|
||||
int (*pi_disable)(struct pse_controller_dev *pcdev, int id);
|
||||
int (*pi_get_voltage)(struct pse_controller_dev *pcdev, int id);
|
||||
int (*pi_get_current_limit)(struct pse_controller_dev *pcdev,
|
||||
int id);
|
||||
int (*pi_set_current_limit)(struct pse_controller_dev *pcdev,
|
||||
int id, int max_uA);
|
||||
};
|
||||
|
||||
struct module;
|
||||
@@ -156,6 +181,11 @@ int pse_ethtool_get_status(struct pse_control *psec,
|
||||
int pse_ethtool_set_config(struct pse_control *psec,
|
||||
struct netlink_ext_ack *extack,
|
||||
const struct pse_control_config *config);
|
||||
int pse_ethtool_set_pw_limit(struct pse_control *psec,
|
||||
struct netlink_ext_ack *extack,
|
||||
const unsigned int pw_limit);
|
||||
int pse_ethtool_get_pw_limit(struct pse_control *psec,
|
||||
struct netlink_ext_ack *extack);
|
||||
|
||||
bool pse_has_podl(struct pse_control *psec);
|
||||
bool pse_has_c33(struct pse_control *psec);
|
||||
@@ -185,6 +215,19 @@ static inline int pse_ethtool_set_config(struct pse_control *psec,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int pse_ethtool_set_pw_limit(struct pse_control *psec,
|
||||
struct netlink_ext_ack *extack,
|
||||
const unsigned int pw_limit)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int pse_ethtool_get_pw_limit(struct pse_control *psec,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline bool pse_has_podl(struct pse_control *psec)
|
||||
{
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user