3 * @author Michael Trimarchi <trimarchimichael@yahoo.it>
4 * Dario Faggioli <faggioli@gandalf.sssup.it>
6 * @brief FRSH core thread related functions not implamented in managers..
13 #include <fres_contract.h>
14 #include <fres_contract_idl.h>
15 #include <fres_blocks.h>
17 #include <fra_generic.h>
18 #include <frsh_forb.h>
19 #include "frsh_resources.h"
20 #ifdef CONFIG_ACPI_CPU
21 # include <fra_acpi_cpu.h>
23 #ifdef CONFIG_ACPI_LCD
24 # include <fra_acpi_lcd.h>
28 static inline int __is_a_valid_power(level)
30 if (level >=0 && level < 3 )
36 int frsh_contract_set_min_expiration(frsh_contract_t *contract,
37 frsh_rel_time_t min_expiration)
39 fres_block_power_management *p;
42 if (!contract || !*contract)
43 return FRSH_ERR_BAD_ARGUMENT;
45 p = fres_contract_get_power_management(*contract);
47 p = malloc(sizeof(*p));
48 if (!p) return ENOMEM;
50 p->min_expiration = min_expiration;
52 fres_contract_del_power_management(*contract);
53 ret = fres_contract_add_power_management(*contract, p);
62 int frsh_contract_set_min_budget_pow
63 (frsh_contract_t *contract,
64 frsh_power_level_t power_level,
65 const frsh_rel_time_t *pow_min_budget)
67 fres_block_power_management *b;
70 if (!contract || !*contract ||
72 return FRSH_ERR_BAD_ARGUMENT;
74 b = fres_contract_get_power_management(*contract);
76 b = malloc(sizeof(*b));
77 if (!b) return ENOMEM;
79 b->min_budget[power_level] = *pow_min_budget;
81 fres_contract_del_power_management(*contract);
82 ret = fres_contract_add_power_management(*contract, b);
91 int frsh_contract_get_min_budget_pow
92 (const frsh_contract_t *contract,
93 frsh_power_level_t power_level,
94 frsh_rel_time_t *pow_min_budget)
96 fres_block_power_management *b;
98 if (!contract || !*contract ||
99 !__is_a_valid_power(power_level))
100 return FRSH_ERR_BAD_ARGUMENT;
102 b = fres_contract_get_power_management(*contract);
104 return FRSH_ERR_BAD_ARGUMENT;
106 *pow_min_budget = b->min_budget[power_level];
108 return FRSH_NO_ERROR;
111 int frsh_contract_set_max_budget_pow
112 (frsh_contract_t *contract,
113 frsh_power_level_t power_level,
114 const frsh_rel_time_t *pow_max_budget)
116 fres_block_power_management *b;
119 if (!contract || !*contract ||
120 !pow_max_budget || !__is_a_valid_power(power_level))
121 return FRSH_ERR_BAD_ARGUMENT;
123 b = fres_contract_get_power_management(*contract);
125 b = malloc(sizeof(*b));
126 if (!b) return ENOMEM;
128 b->max_budget[power_level] = *pow_max_budget;
130 fres_contract_del_power_management(*contract);
131 ret = fres_contract_add_power_management(*contract, b);
137 return FRSH_NO_ERROR;
140 int frsh_contract_get_max_budget_pow(const frsh_contract_t *contract,
141 frsh_power_level_t power_level,
142 frsh_rel_time_t *pow_max_budget)
144 fres_block_power_management *b;
146 if (!contract || !*contract ||
147 !__is_a_valid_power(power_level)) {
148 return FRSH_ERR_BAD_ARGUMENT;
151 b = fres_contract_get_power_management(*contract);
153 return FRSH_ERR_BAD_ARGUMENT;
155 *pow_max_budget = b->max_budget[power_level];
157 return FRSH_NO_ERROR;
160 int frsh_contract_set_utilization_pow
161 (frsh_contract_t *contract,
162 frsh_power_level_t power_level,
163 const frsh_rel_time_t *budget,
164 const frsh_rel_time_t *period,
165 const frsh_rel_time_t *deadline)
167 return FRSH_ERR_NOT_IMPLEMENTED;
170 int frsh_contract_get_utilization_pow
171 (const frsh_contract_t *contract,
172 frsh_power_level_t power_level,
173 frsh_rel_time_t *budget,
174 frsh_rel_time_t *period,
175 frsh_rel_time_t *deadline)
177 return FRSH_ERR_NOT_IMPLEMENTED;;
180 /* FIXME: What happens when one application set one power-level and
181 * second application different level. I think this function should
182 * not be part of API. It should be used internally (e.g. by contract
183 * broker) to achieve the requirements specified by
184 * frsh_contract_set_min_expiration() and similar functions.
186 * This implementation also skips FCB when doing changes to resources,
187 * which is certainly not good, because resource manager does not know
190 int frsh_resource_set_power_level
191 (frsh_resource_type_t resource_type,
192 frsh_resource_id_t resource_id,
193 frsh_power_level_t power_level)
196 switch(resource_type)
198 #ifdef CONFIG_ACPI_CPU
199 case FRSH_RT_PROCESSOR:
202 ret = fra_CPU_frequency_init(resource_id);
203 if (ret) return FRSH_ERR_INTERNAL_ERROR;
205 ret = fra_CPU_set_frequency(resource_id, power_level);
206 if (ret) return FRSH_ERR_INTERNAL_ERROR;
210 * if (i budget sono effettivamente diversi)
211 * rinegozia i contratti coi nuovi valori
216 #ifdef CONFIG_ACPI_LCD
220 ret = fra_LCD_brightness_init(resource_id);
221 if (ret) return FRSH_ERR_INTERNAL_ERROR;
223 ret = fra_LCD_set_brightness(resource_id, power_level);
224 if (ret) return FRSH_ERR_INTERNAL_ERROR;
229 return FRSH_ERR_NOT_IMPLEMENTED;
232 return FRSH_NO_ERROR;
235 int frsh_resource_get_power_level
236 (frsh_resource_type_t resource_type,
237 frsh_resource_id_t resource_id,
238 frsh_power_level_t *power_level)
240 switch(resource_type)
242 #ifdef CONFIG_ACPI_CPU
243 case FRSH_RT_PROCESSOR:
246 ret = fra_CPU_get_level(resource_id,
248 if (ret) return FRSH_ERR_INTERNAL_ERROR;
253 #ifdef CONFIG_ACPI_LCD
257 ret = fra_LCD_get_level(resource_id,
259 if (ret) return FRSH_ERR_INTERNAL_ERROR;
265 return FRSH_ERR_NOT_IMPLEMENTED;
268 return FRSH_NO_ERROR;
271 int frsh_resource_get_num_power_levels
272 (frsh_resource_type_t resource_type,
273 frsh_resource_id_t resource_id,
274 frsh_power_level_t *num_power_levels)
278 * This looks tremendous... But the number '3' is hardcoded
279 * whereever in the headers as the number of power level, so...
281 *num_power_levels = 3;
283 return FRSH_NO_ERROR;
286 int frsh_battery_get_expiration(frsh_abs_time_t *expiration)
288 #ifdef CONFIG_ACPI_CPU
289 frsh_rel_time_t interval;
292 ret = fra_CPU_battery_expiration(&interval);
293 if (ret) return FRSH_ERR_INTERNAL_ERROR;
295 fosa_clock_get_time(FOSA_CLOCK_REALTIME, expiration);
296 *expiration = fosa_abs_time_incr(*expiration, interval);
298 return FRSH_NO_ERROR;
300 return FRSH_ERR_NOT_IMPLEMENTED;