@@ -344,6 +344,7 @@ scmi_clock_info_get(const struct scmi_protocol_handle *ph, u32 clk_id)
}
static const struct scmi_clk_proto_ops clk_proto_ops = {
+ .version_get = scmi_protocol_version_get,
.count_get = scmi_clock_count_get,
.info_get = scmi_clock_info_get,
.rate_get = scmi_clock_rate_get,
@@ -269,6 +269,26 @@ struct scmi_xfer_ops {
struct scmi_xfer *xfer);
};
+/**
+ * scmi_protocol_version_get - Common helper to get protocol version
+ *
+ * @ph: A reference to an initialized protocol handle
+ *
+ * Exposed as .version_get for each protocol operations, it can be called by
+ * SCMI drivers only on initialized protocol instances so it cannot fail.
+ *
+ * Return: Protocol version for the specified protocol handle
+ */
+static inline
+unsigned int scmi_protocol_version_get(struct scmi_protocol_handle *ph)
+{
+ u32 version = 0;
+
+ ph->xops->version_get(ph, &version);
+
+ return version;
+}
+
struct scmi_revision_info *
scmi_revision_area_get(const struct scmi_protocol_handle *ph);
int scmi_handle_put(const struct scmi_handle *handle);
@@ -756,6 +756,7 @@ static bool scmi_power_scale_mw_get(const struct scmi_protocol_handle *ph)
}
static const struct scmi_perf_proto_ops perf_proto_ops = {
+ .version_get = scmi_protocol_version_get,
.limits_set = scmi_perf_limits_set,
.limits_get = scmi_perf_limits_get,
.level_set = scmi_perf_level_set,
@@ -184,6 +184,7 @@ static char *scmi_power_name_get(const struct scmi_protocol_handle *ph,
}
static const struct scmi_power_proto_ops power_proto_ops = {
+ .version_get = scmi_protocol_version_get,
.num_domains_get = scmi_power_num_domains_get,
.name_get = scmi_power_name_get,
.state_set = scmi_power_state_set,
@@ -196,6 +196,7 @@ scmi_reset_domain_deassert(const struct scmi_protocol_handle *ph, u32 domain)
}
static const struct scmi_reset_proto_ops reset_proto_ops = {
+ .version_get = scmi_protocol_version_get,
.num_domains_get = scmi_reset_num_domains_get,
.name_get = scmi_reset_name_get,
.latency_get = scmi_reset_latency_get,
@@ -828,6 +828,7 @@ static int scmi_sensor_count_get(const struct scmi_protocol_handle *ph)
}
static const struct scmi_sensor_proto_ops sensor_proto_ops = {
+ .version_get = scmi_protocol_version_get,
.count_get = scmi_sensor_count_get,
.info_get = scmi_sensor_info_get,
.trip_point_config = scmi_sensor_trip_point_config,
@@ -33,6 +33,10 @@ struct scmi_system_info {
u32 version;
};
+static struct scmi_system_proto_ops system_proto_ops = {
+ .version_get = scmi_protocol_version_get,
+};
+
static int scmi_system_request_notify(const struct scmi_protocol_handle *ph,
bool enable)
{
@@ -136,7 +140,7 @@ static const struct scmi_protocol scmi_system = {
.id = SCMI_PROTOCOL_SYSTEM,
.owner = THIS_MODULE,
.instance_init = &scmi_system_protocol_init,
- .ops = NULL,
+ .ops = &system_proto_ops,
.events = &system_protocol_events,
};
@@ -324,6 +324,7 @@ static int scmi_voltage_domains_num_get(const struct scmi_protocol_handle *ph)
}
static struct scmi_voltage_proto_ops voltage_proto_ops = {
+ .version_get = scmi_protocol_version_get,
.num_domains_get = scmi_voltage_domains_num_get,
.info_get = scmi_voltage_info_get,
.config_set = scmi_voltage_config_set,
@@ -65,6 +65,7 @@ struct scmi_protocol_handle;
* struct scmi_clk_proto_ops - represents the various operations provided
* by SCMI Clock Protocol
*
+ * @version_get: get the protocol version implemented by this SCMI instance
* @count_get: get the count of clocks provided by SCMI
* @info_get: get the information of the specified clock
* @rate_get: request the current clock rate of a clock
@@ -73,6 +74,7 @@ struct scmi_protocol_handle;
* @disable: disables the specified clock
*/
struct scmi_clk_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
int (*count_get)(const struct scmi_protocol_handle *ph);
const struct scmi_clock_info *(*info_get)
@@ -92,6 +94,7 @@ struct scmi_clk_proto_ops {
* struct scmi_perf_proto_ops - represents the various operations provided
* by SCMI Performance Protocol
*
+ * @version_get: get the protocol version implemented by this SCMI instance
* @limits_set: sets limits on the performance level of a domain
* @limits_get: gets limits on the performance level of a domain
* @level_set: sets the performance level of a domain
@@ -111,6 +114,7 @@ struct scmi_clk_proto_ops {
* or in some other (abstract) scale
*/
struct scmi_perf_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
int (*limits_set)(const struct scmi_protocol_handle *ph, u32 domain,
u32 max_perf, u32 min_perf);
int (*limits_get)(const struct scmi_protocol_handle *ph, u32 domain,
@@ -139,12 +143,14 @@ struct scmi_perf_proto_ops {
* struct scmi_power_proto_ops - represents the various operations provided
* by SCMI Power Protocol
*
+ * @version_get: get the protocol version implemented by this SCMI instance
* @num_domains_get: get the count of power domains provided by SCMI
* @name_get: gets the name of a power domain
* @state_set: sets the power state of a power domain
* @state_get: gets the power state of a power domain
*/
struct scmi_power_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
int (*num_domains_get)(const struct scmi_protocol_handle *ph);
char *(*name_get)(const struct scmi_protocol_handle *ph, u32 domain);
#define SCMI_POWER_STATE_TYPE_SHIFT 30
@@ -442,6 +448,7 @@ enum scmi_sensor_class {
* struct scmi_sensor_proto_ops - represents the various operations provided
* by SCMI Sensor Protocol
*
+ * @version_get: get the protocol version implemented by this SCMI instance
* @count_get: get the count of sensors provided by SCMI
* @info_get: get the information of the specified sensor
* @trip_point_config: selects and configures a trip-point of interest
@@ -455,6 +462,7 @@ enum scmi_sensor_class {
* @config_set: Set sensor current configuration
*/
struct scmi_sensor_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
int (*count_get)(const struct scmi_protocol_handle *ph);
const struct scmi_sensor_info *(*info_get)
(const struct scmi_protocol_handle *ph, u32 sensor_id);
@@ -475,6 +483,7 @@ struct scmi_sensor_proto_ops {
* struct scmi_reset_proto_ops - represents the various operations provided
* by SCMI Reset Protocol
*
+ * @version_get: get the protocol version implemented by this SCMI instance
* @num_domains_get: get the count of reset domains provided by SCMI
* @name_get: gets the name of a reset domain
* @latency_get: gets the reset latency for the specified reset domain
@@ -483,6 +492,7 @@ struct scmi_sensor_proto_ops {
* @deassert: explicitly deassert reset signal of the specified reset domain
*/
struct scmi_reset_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
int (*num_domains_get)(const struct scmi_protocol_handle *ph);
char *(*name_get)(const struct scmi_protocol_handle *ph, u32 domain);
int (*latency_get)(const struct scmi_protocol_handle *ph, u32 domain);
@@ -526,6 +536,7 @@ struct scmi_voltage_info {
* struct scmi_voltage_proto_ops - represents the various operations provided
* by SCMI Voltage Protocol
*
+ * @version_get: get the protocol version implemented by this SCMI instance
* @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
@@ -534,6 +545,7 @@ struct scmi_voltage_info {
* @level_get: get the voltage level of the specified domain
*/
struct scmi_voltage_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
int (*num_domains_get)(const struct scmi_protocol_handle *ph);
const struct scmi_voltage_info __must_check *(*info_get)
(const struct scmi_protocol_handle *ph, u32 domain_id);
@@ -549,6 +561,16 @@ struct scmi_voltage_proto_ops {
s32 *volt_uV);
};
+/**
+ * struct scmi_system_proto_ops - represents the various operations provided
+ * by SCMI System Power Protocol
+ *
+ * @version_get: get the protocol version implemented by this SCMI instance
+ */
+struct scmi_system_proto_ops {
+ unsigned int (*version_get)(struct scmi_protocol_handle *ph);
+};
+
/**
* struct scmi_notify_ops - represents notifications' operations provided by
* SCMI core
Add new .version_get protocol operation so as to allow interested SCMI driver users to lookup protocol versions implemented by the underlying SCMI platform. Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> --- drivers/firmware/arm_scmi/clock.c | 1 + drivers/firmware/arm_scmi/common.h | 20 ++++++++++++++++++++ drivers/firmware/arm_scmi/perf.c | 1 + drivers/firmware/arm_scmi/power.c | 1 + drivers/firmware/arm_scmi/reset.c | 1 + drivers/firmware/arm_scmi/sensors.c | 1 + drivers/firmware/arm_scmi/system.c | 6 +++++- drivers/firmware/arm_scmi/voltage.c | 1 + include/linux/scmi_protocol.h | 22 ++++++++++++++++++++++ 9 files changed, 53 insertions(+), 1 deletion(-)