resource-manager: Add API for fine-tuned event listening
[platform/core/system/libsyscommon.git] / include / libsyscommon / resource-manager.h
1 /* MIT License
2  *
3  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is furnished
10  * to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all
13  * copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21  * THE SOFTWARE. */
22
23 #ifndef __RESOURCE_MANAGER_H__
24 #define __RESOURCE_MANAGER_H__
25
26 // common.h
27
28 #include <stdbool.h>
29 #include <sys/time.h>
30 #include <errno.h>
31 #include <glib.h>
32
33 #define SYSCOMMON_RESMAN_BUFF_MAX       255
34
35 enum syscommon_resman_listener_type;
36
37 struct syscommon_resman_resource_attribute;
38 struct syscommon_resman_resource_control;
39
40 struct syscommon_resman_array_value {
41         int type;
42         int length;
43         void *data;
44 };
45
46 struct syscommon_resman_resource_attribute_value {
47         int type;
48         void *data;
49 };
50
51 struct syscommon_resman_resource_attribute_ops {
52         int (*set)(int resource_id,
53                         const struct syscommon_resman_resource_attribute *attr,
54                         const void *data, int count);
55         int (*set_2_tuple)(int resource_id,
56                         const struct syscommon_resman_resource_attribute *attr,
57                         const void *data1, const void *data2,
58                         int count1, int count2);
59         int (*set_3_tuple)(int resource_id,
60                         const struct syscommon_resman_resource_attribute *attr,
61                         const void *data1, const void *data2, const void *data3,
62                         int count1, int count2, int count3);
63         int (*set_4_tuple)(int resource_id,
64                         const struct syscommon_resman_resource_attribute *attr,
65                         const void *data1, const void *data2, const void *data3, const void *data4,
66                         int count1, int count2, int count3, int count4);
67         int (*get)(int resource_id,
68                    const struct syscommon_resman_resource_attribute *attr,
69                    void *data);
70         int (*get_with_1_user_data)(int resource_id,
71                    const struct syscommon_resman_resource_attribute *attr,
72                    void *user_data1, int user_count1, void *data);
73         int (*get_with_2_user_data)(int resource_id,
74                    const struct syscommon_resman_resource_attribute *attr,
75                    void *user_data1, void *user_data2,
76                    int user_count1, int user_count2, void *data);
77         /*
78          * If .is_supported ops is not implemented, use .get ops in order to
79          * check whether the resource attribute is supported or not.
80          */
81         bool (*is_supported)(int resource_id,
82                    const struct syscommon_resman_resource_attribute *attr);
83 };
84
85 struct syscommon_resman_resource_attribute_monitor_ops {
86         int (*get)(int resource_id,
87                    const struct syscommon_resman_resource_attribute *attr,
88                    void *data);
89         /*
90          * If .is_supported ops is not implemented, use .get ops in order to
91          * check whether the resource attribute is supported or not.
92          */
93         bool (*is_supported)(int resource_id,
94                    const struct syscommon_resman_resource_attribute *attr);
95 };
96
97 struct syscommon_resman_resource_attribute_listener_ops {
98         int (*init)(int resource_id, const struct syscommon_resman_resource_attribute *attr);
99         void (*exit)(int resource_id, const struct syscommon_resman_resource_attribute *attr);
100         void (*action)(int resource_id, const struct syscommon_resman_resource_attribute *attr,
101                        void *param, enum syscommon_resman_listener_type listener_type);
102 };
103
104 struct syscommon_resman_resource_attribute {
105         const char name[SYSCOMMON_RESMAN_BUFF_MAX];
106         const u_int64_t id;
107         const int type;
108         const u_int64_t flag;
109         const struct syscommon_resman_resource_attribute_ops ops;
110         const struct syscommon_resman_resource_attribute_monitor_ops monitor_ops;
111         const struct syscommon_resman_resource_attribute_listener_ops listener_ops;
112 };
113
114 struct syscommon_resman_resource_control_ops {
115         const int (*set)(int resource_id,
116                          const struct syscommon_resman_resource_control *ctrl,
117                          const void *data);
118         const int (*get)(int resource_id,
119                          const struct syscommon_resman_resource_control *ctrl,
120                          void **data);
121 };
122
123 struct syscommon_resman_resource_control {
124         const char name[SYSCOMMON_RESMAN_BUFF_MAX];
125         const u_int64_t id;
126         const struct syscommon_resman_resource_control_ops ops;
127 };
128
129 struct syscommon_resman_resource_driver_ops {
130         int (*init)(void);
131         void (*exit)(void);
132         int (*create)(int resource_id);
133         void (*delete)(int resource_id);
134         /*
135          * If prepare_update is specified, it will be called
136          * at every update_resource_attrs().
137          */
138         int (*prepare_update)(int resource_id);
139 };
140
141 struct syscommon_resman_resource_driver {
142         const char *name;
143         const int type;
144         const u_int64_t flag;
145         const int num_attrs;
146         const struct syscommon_resman_resource_attribute *attrs;
147         const int num_ctrls;
148         const struct syscommon_resman_resource_control *ctrls;
149         const struct syscommon_resman_resource_driver_ops ops;
150 };
151
152 #define SYSCOMMON_RESMAN_RESOURCE_DRIVER_REGISTER(resource_driver)      \
153 static void __attribute__((constructor)) __syscommon_resman_module_init(void)   \
154 {       \
155         syscommon_resman_add_resource_driver(resource_driver);  \
156 }       \
157 static void __attribute__((destructor)) __syscommon_resman_module_exit(void)    \
158 {       \
159         syscommon_resman_remove_resource_driver(resource_driver);       \
160 }
161
162 /* Add/remove resource driver and device */
163 const struct syscommon_resman_resource_driver *
164 syscommon_resman_find_resource_driver(int resource_type);
165 void syscommon_resman_add_resource_driver(const struct syscommon_resman_resource_driver *resource_driver);
166 void syscommon_resman_remove_resource_driver(const struct syscommon_resman_resource_driver *resource_driver);
167
168 /* Create/delete resource instance */
169 int syscommon_resman_create_resource(int *resource_id, int resource_type);
170 int syscommon_resman_monitor_create_resource(int *resource_id, int resource_type);
171 void syscommon_resman_delete_resource(int resource_id);
172
173 /* Set flag of the resource to given flag mask */
174 int syscommon_resman_set_resource_flag(int resource_id, u_int64_t flag_mask);
175
176 /* Handle resource control */
177 int syscommon_resman_set_resource_control(int resource_id, u_int64_t ctrl_id, const void *data);
178 const char *syscommon_resman_get_resource_control_name(int resource_id, u_int64_t ctrl_id);
179
180 /* Handle resource attribute */
181 int syscommon_resman_monitor_update_resource_attrs(int resource_id);
182 const struct syscommon_resman_resource_attribute *
183 syscommon_resman_get_resource_attr(int resource_id, u_int64_t attr_id);
184 struct syscommon_resman_resource_attribute_value *
185 syscommon_resman_get_resource_attr_value(int resource_id, u_int64_t attr_id);
186 int syscommon_resman_is_resource_attr_supported(int resource_id, u_int64_t attr_id, bool *supported);
187 int syscommon_resman_monitor_is_resource_attr_supported(int resource_id, u_int64_t attr_id, bool *supported);
188
189 static inline bool
190 syscommon_resman_resource_attr_supported_always(int resource_id,
191                                const struct syscommon_resman_resource_attribute *attr)
192 {
193         return true;
194 }
195
196 int syscommon_resman_monitor_get_resource_attrs_json(int resource_id, char **json_string);
197 int syscommon_resman_monitor_get_resource_attr_json(int resource_id, u_int64_t attr_id, char **json_string);
198 int syscommon_resman_get_resource_list_json(char **json_string);
199 int syscommon_resman_get_number_of_resource_instance(int resource_type, int *n_instance);
200 int syscommon_resman_get_resource_id(int resource_type, int *resource_id);
201 #define SYSCOMMON_RESOURCE_ID(resource_type) ({                         \
202         int _id;                                                        \
203         int _ret;                                                       \
204         if (syscommon_resman_get_resource_id(resource_type, &_id) >= 0) \
205                 _ret = _id;                                             \
206         else                                                            \
207                 _ret = -1;                                              \
208         _ret;                                                           \
209         })
210
211 int syscommon_resman_get_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t *data);
212 int syscommon_resman_get_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t *data);
213 int syscommon_resman_get_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t *data);
214 int syscommon_resman_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t *data);
215 int syscommon_resman_get_resource_attr_uint64_with_1_user_data(int resource_id, u_int64_t attr_id,
216                                         u_int64_t *user_data1, u_int64_t *data);
217 int syscommon_resman_get_resource_attr_uint64_with_2_user_data(int resource_id, u_int64_t attr_id,
218                                         u_int64_t *user_data1, u_int64_t *user_data2, u_int64_t *data);
219 int syscommon_resman_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data);
220 int syscommon_resman_get_resource_attr_string(int resource_id, u_int64_t attr_id, char *data);
221 int syscommon_resman_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data);
222 int syscommon_resman_get_resource_attr_ptr(int resource_id, u_int64_t attr_id, void **data);
223
224 int syscommon_resman_monitor_get_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t *data);
225 int syscommon_resman_monitor_get_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t *data);
226 int syscommon_resman_monitor_get_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t *data);
227 int syscommon_resman_monitor_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t *data);
228 int syscommon_resman_monitor_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data);
229 int syscommon_resman_monitor_get_resource_attr_string(int resource_id, u_int64_t attr_id, char *data);
230 int syscommon_resman_monitor_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data);
231 int syscommon_resman_monitor_get_resource_attr_ptr(int resource_id, u_int64_t attr_id, void **data);
232
233 int syscommon_resman_set_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t data);
234 int syscommon_resman_set_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t data);
235 int syscommon_resman_set_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t data);
236 int syscommon_resman_set_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t data);
237 int syscommon_resman_set_resource_attr_uint64_2(int resource_id, u_int64_t attr_id,
238                                         u_int64_t data1, u_int64_t data2);
239 int syscommon_resman_set_resource_attr_uint64_3(int resource_id, u_int64_t attr_id,
240                                         u_int64_t data1, u_int64_t data2, u_int64_t data3);
241 int syscommon_resman_set_resource_attr_uint64_4(int resource_id, u_int64_t attr_id,
242                                         u_int64_t data1, u_int64_t data2, u_int64_t data3, u_int64_t data4);
243 int syscommon_resman_set_resource_attr_double(int resource_id, u_int64_t attr_id, double data);
244 int syscommon_resman_set_resource_attr_string(int resource_id, u_int64_t attr_id, char data);
245 int syscommon_resman_set_resource_attr_array(int resource_id, u_int64_t attr_id, void *data, int count);
246 int syscommon_resman_set_resource_attr_ptr(int resource_id, u_int64_t attr_id, void *data);
247
248 int syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_mask);
249 int syscommon_resman_unset_resource_attr_interest(int resource_id, u_int64_t interest_mask);
250 bool syscommon_resman_is_resource_attr_interested(int resource_id, u_int64_t interest_mask);
251
252 typedef void (*syscommon_resman_resource_event_cb) (int resource_type,
253         int resource_id, int attr_id, const void *data, void *user_data, int count);
254
255 int syscommon_resman_subscribe_resource_attribute_event(int resource_type,
256         u_int64_t attr_mask, syscommon_resman_resource_event_cb callback, void *user_data, int *id);
257 int syscommon_resman_subscribe_resource_event(int resource_type,
258         syscommon_resman_resource_event_cb callback, void *user_data, int *id);
259 int syscommon_resman_subscribe_event(syscommon_resman_resource_event_cb callback,
260         void *user_data, int *id);
261 void syscommon_resman_unsubscribe_event(int id);
262
263 const char *syscommon_resman_get_resource_attr_name(int resource_id, u_int64_t attr_id);
264 const char *syscommon_resman_get_resource_name(int resource_id);
265 void *syscommon_resman_get_resource_privdata(int resource_id);
266 int syscommon_resman_get_resource_type(int resource_id);
267
268 int syscommon_resman_set_resource_privdata(int resource_id, void *priv);
269
270 void syscommon_resman_init_resource_drivers(void);
271 void syscommon_resman_exit_resource_drivers(void);
272 #endif