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 <fra_acpi_cpu.h>
20 #include <fra_acpi_lcd.h>
23 static inline int __is_a_valid_power(level)
25 if (level >=0 && level < 3 )
31 int frsh_contract_set_min_expiration(frsh_contract_t *contract,
32 frsh_rel_time_t min_expiration)
34 fres_block_power_management *p;
37 if (!contract || !*contract)
38 return FRSH_ERR_BAD_ARGUMENT;
40 p = fres_contract_get_power_management(*contract);
42 p = malloc(sizeof(*p));
43 if (!p) return ENOMEM;
45 p->min_expiration = min_expiration;
47 fres_contract_del_power_management(*contract);
48 ret = fres_contract_add_power_management(*contract, p);
57 int frsh_contract_set_min_budget_pow
58 (frsh_contract_t *contract,
59 frsh_power_level_t power_level,
60 const frsh_rel_time_t *pow_min_budget)
62 fres_block_power_management *b;
65 if (!contract || !*contract ||
67 return FRSH_ERR_BAD_ARGUMENT;
69 b = fres_contract_get_power_management(*contract);
71 b = malloc(sizeof(*b));
72 if (!b) return ENOMEM;
74 b->min_budget[power_level] = *pow_min_budget;
76 fres_contract_del_power_management(*contract);
77 ret = fres_contract_add_power_management(*contract, b);
86 int frsh_contract_get_min_budget_pow
87 (const frsh_contract_t *contract,
88 frsh_power_level_t power_level,
89 frsh_rel_time_t *pow_min_budget)
91 fres_block_power_management *b;
93 if (!contract || !*contract ||
94 !__is_a_valid_power(power_level))
95 return FRSH_ERR_BAD_ARGUMENT;
97 b = fres_contract_get_power_management(*contract);
99 return FRSH_ERR_BAD_ARGUMENT;
101 *pow_min_budget = b->min_budget[power_level];
103 return FRSH_NO_ERROR;
106 int frsh_contract_set_max_budget_pow
107 (frsh_contract_t *contract,
108 frsh_power_level_t power_level,
109 const frsh_rel_time_t *pow_max_budget)
111 fres_block_power_management *b;
114 if (!contract || !*contract ||
115 !pow_max_budget || !__is_a_valid_power(power_level))
116 return FRSH_ERR_BAD_ARGUMENT;
118 b = fres_contract_get_power_management(*contract);
120 b = malloc(sizeof(*b));
121 if (!b) return ENOMEM;
123 b->max_budget[power_level] = *pow_max_budget;
125 fres_contract_del_power_management(*contract);
126 ret = fres_contract_add_power_management(*contract, b);
132 return FRSH_NO_ERROR;
135 int frsh_contract_get_max_budget_pow(const frsh_contract_t *contract,
136 frsh_power_level_t power_level,
137 frsh_rel_time_t *pow_max_budget)
139 fres_block_power_management *b;
141 if (!contract || !*contract ||
142 !__is_a_valid_power(power_level)) {
143 return FRSH_ERR_BAD_ARGUMENT;
146 b = fres_contract_get_power_management(*contract);
148 return FRSH_ERR_BAD_ARGUMENT;
150 *pow_max_budget = b->max_budget[power_level];
152 return FRSH_NO_ERROR;
155 int frsh_contract_set_utilization_pow
156 (frsh_contract_t *contract,
157 frsh_power_level_t power_level,
158 const frsh_rel_time_t *budget,
159 const frsh_rel_time_t *period,
160 const frsh_rel_time_t *deadline)
162 return FRSH_ERR_NOT_IMPLEMENTED;
165 int frsh_contract_get_utilization_pow
166 (const frsh_contract_t *contract,
167 frsh_power_level_t power_level,
168 frsh_rel_time_t *budget,
169 frsh_rel_time_t *period,
170 frsh_rel_time_t *deadline)
172 return FRSH_ERR_NOT_IMPLEMENTED;;
175 int frsh_resource_set_power_level
176 (frsh_resource_type_t resource_type,
177 frsh_resource_id_t resource_id,
178 frsh_power_level_t power_level)
182 switch(resource_type)
184 case FRSH_RT_PROCESSOR:
186 ret = fra_CPU_frequency_init(resource_id);
189 ret = fra_CPU_set_frequency(resource_id, power_level);
194 * if (i budget sono effettivamente diversi)
195 * rinegozia i contratti coi nuovi valori
202 ret = fra_LCD_brightness_init(resource_id);
205 ret = fra_LCD_set_brightness(resource_id, power_level);
211 return FRSH_ERR_NOT_IMPLEMENTED;
214 return FRSH_NO_ERROR;
216 return FRSH_ERR_INTERNAL_ERROR;
219 int frsh_resource_get_power_level
220 (frsh_resource_type_t resource_type,
221 frsh_resource_id_t resource_id,
222 frsh_power_level_t *power_level)
226 switch(resource_type)
228 case FRSH_RT_PROCESSOR:
230 ret = fra_CPU_get_level(resource_id,
238 ret = fra_LCD_get_level(resource_id,
245 return FRSH_ERR_NOT_IMPLEMENTED;
248 return FRSH_NO_ERROR;
250 return FRSH_ERR_INTERNAL_ERROR;
253 int frsh_resource_get_num_power_levels
254 (frsh_resource_type_t resource_type,
255 frsh_resource_id_t resource_id,
256 frsh_power_level_t *num_power_levels)
260 * This looks tremendous... But the number '3' is hardcoded
261 * whereever in the headers as the number of power level, so...
263 *num_power_levels = 3;
265 return FRSH_NO_ERROR;
268 int frsh_battery_get_expiration(frsh_abs_time_t *expiration)
270 frsh_rel_time_t interval;
273 ret = fra_CPU_battery_expiration(&interval);
274 if (ret) return FRSH_ERR_INTERNAL_ERROR;
276 fosa_clock_get_time(FOSA_CLOCK_REALTIME, expiration);
277 *expiration = fosa_abs_time_incr(*expiration, interval);
279 return FRSH_NO_ERROR;