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