1 // © 2021 Qualcomm Innovation Center, Inc. All rights reserved.
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #include <assert.h>
6 #include <hyptypes.h>
7 
8 #include <cpulocal.h>
9 #include <ipi.h>
10 #include <list.h>
11 #include <spinlock.h>
12 
13 #include "event_handlers.h"
14 #include "psci_pm_list.h"
15 
16 CPULOCAL_DECLARE_STATIC(list_t, vcpu_pm_list);
17 CPULOCAL_DECLARE_STATIC(spinlock_t, vcpu_pm_list_lock);
18 
19 void
psci_pm_list_init(void)20 psci_pm_list_init(void)
21 {
22 	for (cpu_index_t cpu = 0U; cpu < PLATFORM_MAX_CORES; cpu++) {
23 		list_init(&CPULOCAL_BY_INDEX(vcpu_pm_list, cpu));
24 		spinlock_init(&CPULOCAL_BY_INDEX(vcpu_pm_list_lock, cpu));
25 	}
26 }
27 
28 list_t *
psci_pm_list_get_self(void)29 psci_pm_list_get_self(void)
30 {
31 	return &CPULOCAL(vcpu_pm_list);
32 }
33 
34 void
psci_pm_list_insert(cpu_index_t cpu_index,thread_t * vcpu)35 psci_pm_list_insert(cpu_index_t cpu_index, thread_t *vcpu)
36 {
37 	list_t *list = &CPULOCAL_BY_INDEX(vcpu_pm_list, cpu_index);
38 
39 	spinlock_acquire(&CPULOCAL_BY_INDEX(vcpu_pm_list_lock, cpu_index));
40 	list_insert_at_tail_release(list, &vcpu->psci_pm_list_node);
41 	spinlock_release(&CPULOCAL_BY_INDEX(vcpu_pm_list_lock, cpu_index));
42 }
43 
44 void
psci_pm_list_delete(cpu_index_t cpu_index,thread_t * vcpu)45 psci_pm_list_delete(cpu_index_t cpu_index, thread_t *vcpu)
46 {
47 	list_t *list = &CPULOCAL_BY_INDEX(vcpu_pm_list, cpu_index);
48 
49 	spinlock_acquire(&CPULOCAL_BY_INDEX(vcpu_pm_list_lock, cpu_index));
50 	(void)list_delete_node(list, &vcpu->psci_pm_list_node);
51 	spinlock_release(&CPULOCAL_BY_INDEX(vcpu_pm_list_lock, cpu_index));
52 
53 	ipi_one_idle(IPI_REASON_IDLE, cpu_index);
54 }
55