xref: /rk3399_ARM-atf/drivers/scmi-msg/sensor.h (revision 1c408d3c40abbe48064c1e2ef5224c1d6edca3cd)
1*e63819f2SJacky Bai /* SPDX-License-Identifier: BSD-3-Clause */
2*e63819f2SJacky Bai /*
3*e63819f2SJacky Bai  * Copyright 2023-2024 NXP
4*e63819f2SJacky Bai  */
5*e63819f2SJacky Bai 
6*e63819f2SJacky Bai #ifndef SCMI_MSG_SENSOR_H
7*e63819f2SJacky Bai #define SCMI_MSG_SENSOR_H
8*e63819f2SJacky Bai 
9*e63819f2SJacky Bai #include <stdint.h>
10*e63819f2SJacky Bai 
11*e63819f2SJacky Bai #include <lib/utils_def.h>
12*e63819f2SJacky Bai 
13*e63819f2SJacky Bai #define SCMI_PROTOCOL_VERSION_SENSOR	0x20000U
14*e63819f2SJacky Bai 
15*e63819f2SJacky Bai /*
16*e63819f2SJacky Bai  * Identifiers of the SCMI SENSOR Protocol commands
17*e63819f2SJacky Bai  */
18*e63819f2SJacky Bai enum scmi_sensor_command_id {
19*e63819f2SJacky Bai 	SCMI_SENSOR_DESCRIPTION_GET = 0x003,
20*e63819f2SJacky Bai 	SCMI_SENSOR_TRIP_POINT_NOTIFY = 0x004,
21*e63819f2SJacky Bai 	SCMI_SENSOR_TRIP_POINT_CONFIG = 0x005,
22*e63819f2SJacky Bai 	SCMI_SENSOR_READING_GET = 0x006,
23*e63819f2SJacky Bai 	SCMI_SENSOR_AXIS_DESCRIPTION_GET = 0x007,
24*e63819f2SJacky Bai 	SCMI_SENSOR_LIST_UPDATE_INTERVALS = 0x008,
25*e63819f2SJacky Bai 	SCMI_SENSOR_CONFIG_GET = 0x009,
26*e63819f2SJacky Bai 	SCMI_SENSOR_CONFIG_SET = 0x00A,
27*e63819f2SJacky Bai 	SCMI_SENSOR_CONTINUOUS_UPDATE_NOTIFY = 0x00B,
28*e63819f2SJacky Bai 	SCMI_SENSOR_MAX = 0x00C,
29*e63819f2SJacky Bai };
30*e63819f2SJacky Bai 
31*e63819f2SJacky Bai /* Protocol attributes */
32*e63819f2SJacky Bai struct scmi_protocol_attributes_p2a_sensor {
33*e63819f2SJacky Bai 	int32_t status;
34*e63819f2SJacky Bai 	int16_t num_sensors;
35*e63819f2SJacky Bai 	uint8_t max_reqs;
36*e63819f2SJacky Bai 	uint8_t res;
37*e63819f2SJacky Bai 	uint32_t sensor_reg_low;
38*e63819f2SJacky Bai 	uint32_t sensor_reg_high;
39*e63819f2SJacky Bai 	uint32_t sensor_reg_len;
40*e63819f2SJacky Bai };
41*e63819f2SJacky Bai 
42*e63819f2SJacky Bai #define SCMI_SENSOR_NAME_LENGTH_MAX	16U
43*e63819f2SJacky Bai 
44*e63819f2SJacky Bai struct scmi_sensor_desc {
45*e63819f2SJacky Bai 	uint32_t id;
46*e63819f2SJacky Bai 	uint32_t attr_low;
47*e63819f2SJacky Bai 	uint32_t attr_high;
48*e63819f2SJacky Bai 	uint8_t name[SCMI_SENSOR_NAME_LENGTH_MAX];
49*e63819f2SJacky Bai 	uint32_t power;
50*e63819f2SJacky Bai 	uint32_t resolution;
51*e63819f2SJacky Bai 	int32_t min_range_low;
52*e63819f2SJacky Bai 	int32_t min_range_high;
53*e63819f2SJacky Bai 	int32_t max_range_low;
54*e63819f2SJacky Bai 	int32_t max_range_high;
55*e63819f2SJacky Bai };
56*e63819f2SJacky Bai 
57*e63819f2SJacky Bai struct scmi_sensor_description_get_a2p {
58*e63819f2SJacky Bai 	uint32_t desc_index;
59*e63819f2SJacky Bai };
60*e63819f2SJacky Bai 
61*e63819f2SJacky Bai struct scmi_sensor_description_get_p2a {
62*e63819f2SJacky Bai 	int32_t status;
63*e63819f2SJacky Bai 	uint32_t num_sensor_flags;
64*e63819f2SJacky Bai };
65*e63819f2SJacky Bai 
66*e63819f2SJacky Bai struct scmi_sensor_config_get_a2p {
67*e63819f2SJacky Bai 	uint32_t sensor_id;
68*e63819f2SJacky Bai };
69*e63819f2SJacky Bai 
70*e63819f2SJacky Bai struct scmi_sensor_config_get_p2a {
71*e63819f2SJacky Bai 	int32_t status;
72*e63819f2SJacky Bai 	uint32_t sensor_config;
73*e63819f2SJacky Bai };
74*e63819f2SJacky Bai 
75*e63819f2SJacky Bai /*
76*e63819f2SJacky Bai  * Sensor Reading Get
77*e63819f2SJacky Bai  */
78*e63819f2SJacky Bai struct scmi_sensor_reading_get_a2p {
79*e63819f2SJacky Bai 	uint32_t sensor_id;
80*e63819f2SJacky Bai 	uint32_t flags;
81*e63819f2SJacky Bai };
82*e63819f2SJacky Bai 
83*e63819f2SJacky Bai struct scmi_sensor_val {
84*e63819f2SJacky Bai 	uint32_t value_low;
85*e63819f2SJacky Bai 	uint32_t value_high;
86*e63819f2SJacky Bai 	uint32_t timestap_low;
87*e63819f2SJacky Bai 	uint32_t timestap_high;
88*e63819f2SJacky Bai };
89*e63819f2SJacky Bai 
90*e63819f2SJacky Bai struct scmi_sensor_reading_get_p2a {
91*e63819f2SJacky Bai 	int32_t status;
92*e63819f2SJacky Bai 	struct scmi_sensor_val val;
93*e63819f2SJacky Bai };
94*e63819f2SJacky Bai 
95*e63819f2SJacky Bai typedef struct {
96*e63819f2SJacky Bai 	uint16_t (*sensor_count)(unsigned int agent_id);
97*e63819f2SJacky Bai 	uint8_t (*sensor_max_request)(unsigned int agent_id);
98*e63819f2SJacky Bai 	uint32_t (*get_sensor_req)(unsigned int agent_id, unsigned int *addr);
99*e63819f2SJacky Bai 	int32_t (*sensor_reading_get)(uint32_t agent_id, uint16_t sensor_id,
100*e63819f2SJacky Bai 				      uint32_t *val);
101*e63819f2SJacky Bai 	uint32_t (*sensor_description_get)(unsigned int agent_id, uint16_t sensor_id,
102*e63819f2SJacky Bai 					  struct scmi_sensor_desc *desc);
103*e63819f2SJacky Bai 	uint32_t (*sensor_update_interval)(uint32_t agent_id, uint16_t sensor_id);
104*e63819f2SJacky Bai 	uint32_t (*sensor_state)(uint32_t agent_id, uint16_t sensor_id);
105*e63819f2SJacky Bai 	uint16_t (*sensor_timestamped)(uint32_t agent_id, uint16_t sensor_id);
106*e63819f2SJacky Bai } plat_scmi_sensor_ops_t;
107*e63819f2SJacky Bai 
108*e63819f2SJacky Bai #define REGISTER_SCMI_SENSOR_OPS(_sensor_count, _sensor_max_request, \
109*e63819f2SJacky Bai 				 _get_sensor_req, _sensor_reading_get, \
110*e63819f2SJacky Bai 				 _sensor_description_get, _sensor_update_interval, \
111*e63819f2SJacky Bai 				 _sensor_state, _sensor_timestamped) \
112*e63819f2SJacky Bai 	const plat_scmi_sensor_ops_t sensor_ops = { \
113*e63819f2SJacky Bai 		.sensor_count = _sensor_count, \
114*e63819f2SJacky Bai 		.sensor_max_request = _sensor_max_request, \
115*e63819f2SJacky Bai 		.get_sensor_req = _get_sensor_req, \
116*e63819f2SJacky Bai 		.sensor_reading_get = _sensor_reading_get, \
117*e63819f2SJacky Bai 		.sensor_description_get = _sensor_description_get, \
118*e63819f2SJacky Bai 		.sensor_update_interval = _sensor_update_interval, \
119*e63819f2SJacky Bai 		.sensor_state = _sensor_state, \
120*e63819f2SJacky Bai 		.sensor_timestamped = _sensor_timestamped, \
121*e63819f2SJacky Bai 	}
122*e63819f2SJacky Bai 
123*e63819f2SJacky Bai extern const plat_scmi_sensor_ops_t sensor_ops;
124*e63819f2SJacky Bai 
125*e63819f2SJacky Bai #endif /* SCMI_MSG_SENSOR_H */
126