blob: 28cbb1ed34935c02fb9fa1596c332165af01139d [file] [log] [blame]
Jacky Baid1806aa2023-09-21 11:06:34 +08001/* 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 */
18enum 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 */
32struct 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
44struct 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
57struct scmi_sensor_description_get_a2p {
58 uint32_t desc_index;
59};
60
61struct scmi_sensor_description_get_p2a {
62 int32_t status;
63 uint32_t num_sensor_flags;
64};
65
66struct scmi_sensor_config_get_a2p {
67 uint32_t sensor_id;
68};
69
70struct scmi_sensor_config_get_p2a {
71 int32_t status;
72 uint32_t sensor_config;
73};
74
75/*
76 * Sensor Reading Get
77 */
78struct scmi_sensor_reading_get_a2p {
79 uint32_t sensor_id;
80 uint32_t flags;
81};
82
83struct 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
90struct scmi_sensor_reading_get_p2a {
91 int32_t status;
92 struct scmi_sensor_val val;
93};
94
95typedef 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
123extern const plat_scmi_sensor_ops_t sensor_ops;
124
125#endif /* SCMI_MSG_SENSOR_H */