Lines Matching full:pr
132 static void lapic_timer_check_state(int state, struct acpi_processor *pr, in lapic_timer_check_state() argument
135 struct acpi_processor_power *pwr = &pr->power; in lapic_timer_check_state()
138 if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT)) in lapic_timer_check_state()
152 pr->power.timer_broadcast_on_state = state; in lapic_timer_check_state()
157 struct acpi_processor *pr = arg; in __lapic_timer_propagate_broadcast() local
159 if (pr->power.timer_broadcast_on_state < INT_MAX) in __lapic_timer_propagate_broadcast()
165 static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) in lapic_timer_propagate_broadcast() argument
167 smp_call_function_single(pr->id, __lapic_timer_propagate_broadcast, in lapic_timer_propagate_broadcast()
168 (void *)pr, 1); in lapic_timer_propagate_broadcast()
172 static bool lapic_timer_needs_broadcast(struct acpi_processor *pr, in lapic_timer_needs_broadcast() argument
175 return cx - pr->power.states >= pr->power.timer_broadcast_on_state; in lapic_timer_needs_broadcast()
180 static void lapic_timer_check_state(int state, struct acpi_processor *pr, in lapic_timer_check_state() argument
182 static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) { } in lapic_timer_propagate_broadcast() argument
184 static bool lapic_timer_needs_broadcast(struct acpi_processor *pr, in lapic_timer_needs_broadcast() argument
218 static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) in acpi_processor_get_power_info_fadt() argument
221 if (!pr->pblk) in acpi_processor_get_power_info_fadt()
225 pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2; in acpi_processor_get_power_info_fadt()
226 pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3; in acpi_processor_get_power_info_fadt()
239 pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4; in acpi_processor_get_power_info_fadt()
240 pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; in acpi_processor_get_power_info_fadt()
243 pr->power.states[ACPI_STATE_C2].latency = acpi_gbl_FADT.c2_latency; in acpi_processor_get_power_info_fadt()
244 pr->power.states[ACPI_STATE_C3].latency = acpi_gbl_FADT.c3_latency; in acpi_processor_get_power_info_fadt()
251 acpi_handle_debug(pr->handle, "C2 latency too large [%d]\n", in acpi_processor_get_power_info_fadt()
254 pr->power.states[ACPI_STATE_C2].address = 0; in acpi_processor_get_power_info_fadt()
262 acpi_handle_debug(pr->handle, "C3 latency too large [%d]\n", in acpi_processor_get_power_info_fadt()
265 pr->power.states[ACPI_STATE_C3].address = 0; in acpi_processor_get_power_info_fadt()
268 acpi_handle_debug(pr->handle, "lvl2[0x%08x] lvl3[0x%08x]\n", in acpi_processor_get_power_info_fadt()
269 pr->power.states[ACPI_STATE_C2].address, in acpi_processor_get_power_info_fadt()
270 pr->power.states[ACPI_STATE_C3].address); in acpi_processor_get_power_info_fadt()
272 snprintf(pr->power.states[ACPI_STATE_C2].desc, in acpi_processor_get_power_info_fadt()
274 pr->power.states[ACPI_STATE_C2].address); in acpi_processor_get_power_info_fadt()
275 snprintf(pr->power.states[ACPI_STATE_C3].desc, in acpi_processor_get_power_info_fadt()
277 pr->power.states[ACPI_STATE_C3].address); in acpi_processor_get_power_info_fadt()
279 if (!pr->power.states[ACPI_STATE_C2].address && in acpi_processor_get_power_info_fadt()
280 !pr->power.states[ACPI_STATE_C3].address) in acpi_processor_get_power_info_fadt()
286 static int acpi_processor_get_power_info_default(struct acpi_processor *pr) in acpi_processor_get_power_info_default() argument
288 if (!pr->power.states[ACPI_STATE_C1].valid) { in acpi_processor_get_power_info_default()
291 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1; in acpi_processor_get_power_info_default()
292 pr->power.states[ACPI_STATE_C1].valid = 1; in acpi_processor_get_power_info_default()
293 pr->power.states[ACPI_STATE_C1].entry_method = ACPI_CSTATE_HALT; in acpi_processor_get_power_info_default()
295 snprintf(pr->power.states[ACPI_STATE_C1].desc, in acpi_processor_get_power_info_default()
299 pr->power.states[ACPI_STATE_C0].valid = 1; in acpi_processor_get_power_info_default()
303 static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) in acpi_processor_get_power_info_cst() argument
310 ret = acpi_processor_evaluate_cst(pr->handle, pr->id, &pr->power); in acpi_processor_get_power_info_cst()
314 if (!pr->power.count) in acpi_processor_get_power_info_cst()
317 pr->flags.has_cst = 1; in acpi_processor_get_power_info_cst()
321 static void acpi_processor_power_verify_c3(struct acpi_processor *pr, in acpi_processor_power_verify_c3() argument
339 acpi_handle_debug(pr->handle, in acpi_processor_power_verify_c3()
347 acpi_processor_power_init_bm_check(&(pr->flags), pr->id); in acpi_processor_power_verify_c3()
348 bm_check_flag = pr->flags.bm_check; in acpi_processor_power_verify_c3()
349 bm_control_flag = pr->flags.bm_control; in acpi_processor_power_verify_c3()
351 pr->flags.bm_check = bm_check_flag; in acpi_processor_power_verify_c3()
352 pr->flags.bm_control = bm_control_flag; in acpi_processor_power_verify_c3()
355 if (pr->flags.bm_check) { in acpi_processor_power_verify_c3()
356 if (!pr->flags.bm_control) { in acpi_processor_power_verify_c3()
357 if (pr->flags.has_cst != 1) { in acpi_processor_power_verify_c3()
359 acpi_handle_debug(pr->handle, in acpi_processor_power_verify_c3()
364 acpi_handle_debug(pr->handle, in acpi_processor_power_verify_c3()
374 acpi_handle_debug(pr->handle, in acpi_processor_power_verify_c3()
420 static int acpi_processor_power_verify(struct acpi_processor *pr) in acpi_processor_power_verify() argument
428 pr->power.timer_broadcast_on_state = INT_MAX; in acpi_processor_power_verify()
431 struct acpi_processor_cx *cx = &pr->power.states[i]; in acpi_processor_power_verify()
445 acpi_processor_power_verify_c3(pr, cx); in acpi_processor_power_verify()
455 lapic_timer_check_state(i, pr, cx); in acpi_processor_power_verify()
462 acpi_cst_latency_sort(&pr->power.states[1], max_cstate); in acpi_processor_power_verify()
465 lapic_timer_propagate_broadcast(pr); in acpi_processor_power_verify()
470 static int acpi_processor_get_cstate_info(struct acpi_processor *pr) in acpi_processor_get_cstate_info() argument
478 memset(pr->power.states, 0, sizeof(pr->power.states)); in acpi_processor_get_cstate_info()
480 result = acpi_processor_get_power_info_cst(pr); in acpi_processor_get_cstate_info()
482 result = acpi_processor_get_power_info_fadt(pr); in acpi_processor_get_cstate_info()
487 acpi_processor_get_power_info_default(pr); in acpi_processor_get_cstate_info()
489 pr->power.count = acpi_processor_power_verify(pr); in acpi_processor_get_cstate_info()
490 pr->flags.power = 1; in acpi_processor_get_cstate_info()
600 static __always_inline bool acpi_idle_fallback_to_c1(struct acpi_processor *pr) in acpi_idle_fallback_to_c1() argument
602 return IS_ENABLED(CONFIG_HOTPLUG_CPU) && !pr->flags.has_cst && in acpi_idle_fallback_to_c1()
612 * @pr: Target processor
617 struct acpi_processor *pr, in acpi_idle_enter_bm() argument
633 bool dis_bm = pr->flags.bm_control; in acpi_idle_enter_bm()
681 struct acpi_processor *pr; in acpi_idle_enter() local
683 pr = __this_cpu_read(processors); in acpi_idle_enter()
684 if (unlikely(!pr)) in acpi_idle_enter()
688 if (cx->type == ACPI_STATE_C3 && pr->flags.bm_check) in acpi_idle_enter()
689 return acpi_idle_enter_bm(drv, pr, cx, index); in acpi_idle_enter()
692 if (acpi_idle_fallback_to_c1(pr) && num_online_cpus() > 1) { in acpi_idle_enter()
712 struct acpi_processor *pr = __this_cpu_read(processors); in acpi_idle_enter_s2idle() local
714 if (unlikely(!pr)) in acpi_idle_enter_s2idle()
717 if (pr->flags.bm_check) { in acpi_idle_enter_s2idle()
722 acpi_idle_enter_bm(drv, pr, cx, index); in acpi_idle_enter_s2idle()
735 static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr, in acpi_processor_setup_cpuidle_cx() argument
747 cx = &pr->power.states[i]; in acpi_processor_setup_cpuidle_cx()
754 if (lapic_timer_needs_broadcast(pr, cx)) in acpi_processor_setup_cpuidle_cx()
759 if (pr->flags.bm_check) in acpi_processor_setup_cpuidle_cx()
774 static int acpi_processor_setup_cstates(struct acpi_processor *pr) in acpi_processor_setup_cstates() argument
792 cx = &pr->power.states[i]; in acpi_processor_setup_cstates()
818 if (cx->type != ACPI_STATE_C1 && !acpi_idle_fallback_to_c1(pr)) in acpi_processor_setup_cstates()
856 static int acpi_processor_get_cstate_info(struct acpi_processor *pr) in acpi_processor_get_cstate_info() argument
861 static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr, in acpi_processor_setup_cpuidle_cx() argument
867 static int acpi_processor_setup_cstates(struct acpi_processor *pr) in acpi_processor_setup_cstates() argument
1043 static unsigned int flatten_lpi_states(struct acpi_processor *pr, in flatten_lpi_states() argument
1065 flpi = &pr->power.lpi_states[flat_state_cnt]; in flatten_lpi_states()
1094 static int acpi_processor_get_lpi_info(struct acpi_processor *pr) in acpi_processor_get_lpi_info() argument
1098 acpi_handle handle = pr->handle, pr_ahandle; in acpi_processor_get_lpi_info()
1104 ret = acpi_processor_ffh_lpi_probe(pr->id); in acpi_processor_get_lpi_info()
1116 handle = pr->handle; in acpi_processor_get_lpi_info()
1120 state_count = flatten_lpi_states(pr, 0, prev, NULL); in acpi_processor_get_lpi_info()
1142 state_count = flatten_lpi_states(pr, state_count, curr, prev); in acpi_processor_get_lpi_info()
1151 pr->power.lpi_states[i].index = i; in acpi_processor_get_lpi_info()
1153 pr->power.count = state_count; in acpi_processor_get_lpi_info()
1156 pr->flags.has_lpi = 1; in acpi_processor_get_lpi_info()
1157 pr->flags.power = 1; in acpi_processor_get_lpi_info()
1178 struct acpi_processor *pr; in acpi_idle_lpi_enter() local
1181 pr = __this_cpu_read(processors); in acpi_idle_lpi_enter()
1183 if (unlikely(!pr)) in acpi_idle_lpi_enter()
1186 lpi = &pr->power.lpi_states[index]; in acpi_idle_lpi_enter()
1193 static int acpi_processor_setup_lpi_states(struct acpi_processor *pr) in acpi_processor_setup_lpi_states() argument
1200 if (!pr->flags.has_lpi) in acpi_processor_setup_lpi_states()
1203 for (i = 0; i < pr->power.count && i < CPUIDLE_STATE_MAX; i++) { in acpi_processor_setup_lpi_states()
1204 lpi = &pr->power.lpi_states[i]; in acpi_processor_setup_lpi_states()
1227 * @pr: the ACPI processor
1229 static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr) in acpi_processor_setup_cpuidle_states() argument
1234 if (!pr->flags.power_setup_done || !pr->flags.power) in acpi_processor_setup_cpuidle_states()
1243 if (pr->flags.has_lpi) in acpi_processor_setup_cpuidle_states()
1244 return acpi_processor_setup_lpi_states(pr); in acpi_processor_setup_cpuidle_states()
1246 return acpi_processor_setup_cstates(pr); in acpi_processor_setup_cpuidle_states()
1253 * @pr: the ACPI processor
1256 static int acpi_processor_setup_cpuidle_dev(struct acpi_processor *pr, in acpi_processor_setup_cpuidle_dev() argument
1259 if (!pr->flags.power_setup_done || !pr->flags.power || !dev) in acpi_processor_setup_cpuidle_dev()
1262 dev->cpu = pr->id; in acpi_processor_setup_cpuidle_dev()
1263 if (pr->flags.has_lpi) in acpi_processor_setup_cpuidle_dev()
1264 return acpi_processor_ffh_lpi_probe(pr->id); in acpi_processor_setup_cpuidle_dev()
1266 return acpi_processor_setup_cpuidle_cx(pr, dev); in acpi_processor_setup_cpuidle_dev()
1269 static int acpi_processor_get_power_info(struct acpi_processor *pr) in acpi_processor_get_power_info() argument
1273 ret = acpi_processor_get_lpi_info(pr); in acpi_processor_get_power_info()
1275 ret = acpi_processor_get_cstate_info(pr); in acpi_processor_get_power_info()
1280 int acpi_processor_hotplug(struct acpi_processor *pr) in acpi_processor_hotplug() argument
1288 if (!pr->flags.power_setup_done) in acpi_processor_hotplug()
1291 dev = per_cpu(acpi_cpuidle_device, pr->id); in acpi_processor_hotplug()
1294 ret = acpi_processor_get_power_info(pr); in acpi_processor_hotplug()
1295 if (!ret && pr->flags.power) { in acpi_processor_hotplug()
1296 acpi_processor_setup_cpuidle_dev(pr, dev); in acpi_processor_hotplug()
1304 int acpi_processor_power_state_has_changed(struct acpi_processor *pr) in acpi_processor_power_state_has_changed() argument
1313 if (!pr->flags.power_setup_done) in acpi_processor_power_state_has_changed()
1322 if (pr->id == 0 && cpuidle_get_driver() == &acpi_idle_driver) { in acpi_processor_power_state_has_changed()
1338 acpi_processor_get_power_info(pr); in acpi_processor_power_state_has_changed()
1339 acpi_processor_setup_cpuidle_states(pr); in acpi_processor_power_state_has_changed()
1362 struct acpi_processor *pr; in acpi_processor_register_idle_driver() local
1373 pr = per_cpu(processors, cpu); in acpi_processor_register_idle_driver()
1374 if (!pr) in acpi_processor_register_idle_driver()
1377 ret = acpi_processor_get_power_info(pr); in acpi_processor_register_idle_driver()
1379 pr->flags.power_setup_done = 1; in acpi_processor_register_idle_driver()
1380 acpi_processor_setup_cpuidle_states(pr); in acpi_processor_register_idle_driver()
1403 void acpi_processor_power_init(struct acpi_processor *pr) in acpi_processor_power_init() argument
1419 if (!acpi_processor_get_power_info(pr)) in acpi_processor_power_init()
1420 pr->flags.power_setup_done = 1; in acpi_processor_power_init()
1422 if (!pr->flags.power) in acpi_processor_power_init()
1429 per_cpu(acpi_cpuidle_device, pr->id) = dev; in acpi_processor_power_init()
1431 acpi_processor_setup_cpuidle_dev(pr, dev); in acpi_processor_power_init()
1438 per_cpu(acpi_cpuidle_device, pr->id) = NULL; in acpi_processor_power_init()
1443 void acpi_processor_power_exit(struct acpi_processor *pr) in acpi_processor_power_exit() argument
1445 struct cpuidle_device *dev = per_cpu(acpi_cpuidle_device, pr->id); in acpi_processor_power_exit()
1450 if (pr->flags.power) { in acpi_processor_power_exit()
1455 pr->flags.power_setup_done = 0; in acpi_processor_power_exit()