• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  * Description:
7  *      System Control and Management Interface (SCMI) support.
8  */
9 
10 #ifndef INTERNAL_SCMI_SENSOR_H
11 #define INTERNAL_SCMI_SENSOR_H
12 
13 #include <stdint.h>
14 
15 #define SCMI_PROTOCOL_VERSION_SENSOR UINT32_C(0x10000)
16 
17 /*
18  * PROTOCOL_ATTRIBUTES
19  */
20 struct scmi_sensor_protocol_attributes_p2a {
21 	int32_t status;
22 	uint32_t attributes;
23 	uint32_t sensor_reg_address_low;
24 	uint32_t sensor_reg_address_high;
25 	uint32_t sensor_reg_len;
26 };
27 
28 /*
29  * SENSOR_READING_GET
30  */
31 #define SCMI_SENSOR_PROTOCOL_READING_GET_ASYNC_FLAG_MASK    (1 << 0)
32 
33 struct scmi_sensor_protocol_reading_get_a2p {
34 	uint32_t sensor_id;
35 	uint32_t flags;
36 };
37 
38 struct scmi_sensor_protocol_reading_get_p2a {
39 	int32_t status;
40 	uint32_t sensor_value_low;
41 	uint32_t sensor_value_high;
42 };
43 
44 /*
45  * SENSOR_DESCRIPTION_GET
46  */
47  #define SCMI_SENSOR_DESCS_MAX(MAILBOX_SIZE) \
48 	((sizeof(struct scmi_sensor_protocol_description_get_p2a) < MAILBOX_SIZE) \
49 	? ((MAILBOX_SIZE - \
50 	   sizeof(struct scmi_sensor_protocol_description_get_p2a)) \
51 	   / sizeof(struct scmi_sensor_desc)) \
52 	: 0)
53 
54 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_TYPE_POS              0
55 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_POS   11
56 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_POS 22
57 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_INTERVAL_POS   27
58 
59 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_TYPE_MASK \
60 	(UINT32_C(0xFF) << SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_TYPE_POS)
61 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_MASK \
62 	(UINT32_C(0x1F) << SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_POS)
63 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_MASK \
64 	(UINT32_C(0x1F) << \
65 	SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_POS)
66 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_INTERVAL_MASK \
67 	(UINT32_C(0x1F) << SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_INTERVAL_POS)
68 
69 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_MAX \
70 	(int32_t)(SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_MASK >> 1)
71 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_MIN \
72 	(-(SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_MAX + 1))
73 
74 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_MAX \
75 	(int32_t)(SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_INTERVAL_MASK >> 1)
76 #define SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_MIN \
77 	(-(SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_MAX + 1))
78 
79 #define SCMI_SENSOR_DESC_ATTRIBUTES_HIGH(SENSOR_TYPE, UNIT_MULTIPLIER, \
80 					 UPDATE_MULTIPLIER, UPDATE_INTERVAL) \
81 	( \
82 	(((SENSOR_TYPE) << \
83 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_TYPE_POS) & \
84 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_TYPE_MASK) | \
85 	   (((UNIT_MULTIPLIER) << \
86 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_POS) & \
87 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UNIT_MULTIPLIER_MASK) | \
88 	   (((UPDATE_MULTIPLIER) << \
89 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_POS) & \
90 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_MULTIPLIER_MASK) | \
91 	   (((UPDATE_INTERVAL) << \
92 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_INTERVAL_POS) & \
93 	   SCMI_SENSOR_DESC_ATTRS_HIGH_SENSOR_UPDATE_INTERVAL_MASK) \
94 	)
95 
96 #define SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_DESCS_POS              0
97 #define SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_REMAINING_DESCS_POS   16
98 
99 #define SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_DESCS_MASK \
100 	(UINT32_C(0xFFF) << SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_DESCS_POS)
101 #define SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_REMAINING_DESCS_MASK \
102 	(UINT32_C(0xFFFF) << SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_REMAINING_DESCS_POS)
103 
104 #define SCMI_SENSOR_NUM_SENSOR_FLAGS(NUM_DESCS, NUM_REMAINING_DESCS) \
105 	( \
106 	(((NUM_DESCS) << \
107 	  SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_DESCS_POS) & \
108 	  SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_DESCS_MASK) | \
109 	  (((NUM_REMAINING_DESCS) << \
110 	    SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_REMAINING_DESCS_POS) & \
111 	    SCMI_SENSOR_NUM_SENSOR_FLAGS_NUM_REMAINING_DESCS_MASK) \
112 	)
113 
114 #define SCMI_SENSOR_NAME_LEN    16
115 
116 struct scmi_sensor_desc {
117 	uint32_t sensor_id;
118 	uint32_t sensor_attributes_low;
119 	uint32_t sensor_attributes_high;
120 	char sensor_name[SCMI_SENSOR_NAME_LEN];
121 };
122 
123 struct scmi_sensor_protocol_description_get_a2p {
124 	uint32_t desc_index;
125 };
126 
127 struct scmi_sensor_protocol_description_get_p2a {
128 	int32_t status;
129 	uint32_t num_sensor_flags;
130 	struct scmi_sensor_desc sensor_desc[];
131 };
132 
133 /* Event indices */
134 enum scmi_sensor_api_idx {
135 	SCMI_SENSOR_EVENT_IDX_REQUEST,
136 	SCMI_SENSOR_EVENT_IDX_COUNT,
137 };
138 
139 #endif /* INTERNAL_SCMI_SENSOR_H */
140