mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
firmware: arm_scmi: Add voltage domain management protocol support
SCMI v3.0 introduces voltage domain protocol which provides commands to: - Discover the voltage levels supported by a domain - Get the configuration and voltage level of a domain - Set the configuration and voltage level of a domain Let us add support for the same. Link: https://lore.kernel.org/r/20201119191051.46363-2-cristian.marussi@arm.com Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
This commit is contained in:
parent
0f80fcec08
commit
2add5cacff
5 changed files with 448 additions and 1 deletions
|
@ -209,6 +209,64 @@ struct scmi_reset_ops {
|
|||
int (*deassert)(const struct scmi_handle *handle, u32 domain);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_voltage_info - describe one available SCMI Voltage Domain
|
||||
*
|
||||
* @id: the domain ID as advertised by the platform
|
||||
* @segmented: defines the layout of the entries of array @levels_uv.
|
||||
* - when True the entries are to be interpreted as triplets,
|
||||
* each defining a segment representing a range of equally
|
||||
* space voltages: <lowest_volts>, <highest_volt>, <step_uV>
|
||||
* - when False the entries simply represent a single discrete
|
||||
* supported voltage level
|
||||
* @negative_volts_allowed: True if any of the entries of @levels_uv represent
|
||||
* a negative voltage.
|
||||
* @attributes: represents Voltage Domain advertised attributes
|
||||
* @name: name assigned to the Voltage Domain by platform
|
||||
* @num_levels: number of total entries in @levels_uv.
|
||||
* @levels_uv: array of entries describing the available voltage levels for
|
||||
* this domain.
|
||||
*/
|
||||
struct scmi_voltage_info {
|
||||
unsigned int id;
|
||||
bool segmented;
|
||||
bool negative_volts_allowed;
|
||||
unsigned int attributes;
|
||||
char name[SCMI_MAX_STR_SIZE];
|
||||
unsigned int num_levels;
|
||||
#define SCMI_VOLTAGE_SEGMENT_LOW 0
|
||||
#define SCMI_VOLTAGE_SEGMENT_HIGH 1
|
||||
#define SCMI_VOLTAGE_SEGMENT_STEP 2
|
||||
int *levels_uv;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_voltage_ops - represents the various operations provided
|
||||
* by SCMI Voltage Protocol
|
||||
*
|
||||
* @num_domains_get: get the count of voltage domains provided by SCMI
|
||||
* @info_get: get the information of the specified domain
|
||||
* @config_set: set the config for the specified domain
|
||||
* @config_get: get the config of the specified domain
|
||||
* @level_set: set the voltage level for the specified domain
|
||||
* @level_get: get the voltage level of the specified domain
|
||||
*/
|
||||
struct scmi_voltage_ops {
|
||||
int (*num_domains_get)(const struct scmi_handle *handle);
|
||||
const struct scmi_voltage_info __must_check *(*info_get)
|
||||
(const struct scmi_handle *handle, u32 domain_id);
|
||||
int (*config_set)(const struct scmi_handle *handle, u32 domain_id,
|
||||
u32 config);
|
||||
#define SCMI_VOLTAGE_ARCH_STATE_OFF 0x0
|
||||
#define SCMI_VOLTAGE_ARCH_STATE_ON 0x7
|
||||
int (*config_get)(const struct scmi_handle *handle, u32 domain_id,
|
||||
u32 *config);
|
||||
int (*level_set)(const struct scmi_handle *handle, u32 domain_id,
|
||||
u32 flags, s32 volt_uV);
|
||||
int (*level_get)(const struct scmi_handle *handle, u32 domain_id,
|
||||
s32 *volt_uV);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_notify_ops - represents notifications' operations provided by
|
||||
* SCMI core
|
||||
|
@ -262,6 +320,7 @@ struct scmi_notify_ops {
|
|||
* @clk_ops: pointer to set of clock protocol operations
|
||||
* @sensor_ops: pointer to set of sensor protocol operations
|
||||
* @reset_ops: pointer to set of reset protocol operations
|
||||
* @voltage_ops: pointer to set of voltage protocol operations
|
||||
* @notify_ops: pointer to set of notifications related operations
|
||||
* @perf_priv: pointer to private data structure specific to performance
|
||||
* protocol(for internal use only)
|
||||
|
@ -273,6 +332,8 @@ struct scmi_notify_ops {
|
|||
* protocol(for internal use only)
|
||||
* @reset_priv: pointer to private data structure specific to reset
|
||||
* protocol(for internal use only)
|
||||
* @voltage_priv: pointer to private data structure specific to voltage
|
||||
* protocol(for internal use only)
|
||||
* @notify_priv: pointer to private data structure specific to notifications
|
||||
* (for internal use only)
|
||||
*/
|
||||
|
@ -284,6 +345,7 @@ struct scmi_handle {
|
|||
const struct scmi_power_ops *power_ops;
|
||||
const struct scmi_sensor_ops *sensor_ops;
|
||||
const struct scmi_reset_ops *reset_ops;
|
||||
const struct scmi_voltage_ops *voltage_ops;
|
||||
const struct scmi_notify_ops *notify_ops;
|
||||
/* for protocol internal use */
|
||||
void *perf_priv;
|
||||
|
@ -291,6 +353,7 @@ struct scmi_handle {
|
|||
void *power_priv;
|
||||
void *sensor_priv;
|
||||
void *reset_priv;
|
||||
void *voltage_priv;
|
||||
void *notify_priv;
|
||||
void *system_priv;
|
||||
};
|
||||
|
@ -303,6 +366,7 @@ enum scmi_std_protocol {
|
|||
SCMI_PROTOCOL_CLOCK = 0x14,
|
||||
SCMI_PROTOCOL_SENSOR = 0x15,
|
||||
SCMI_PROTOCOL_RESET = 0x16,
|
||||
SCMI_PROTOCOL_VOLTAGE = 0x17,
|
||||
};
|
||||
|
||||
enum scmi_system_events {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue