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