1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/*
* Arm SCP/MCP Software
* Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "tc0_core.h"
#include <mod_power_domain.h>
#include <mod_ppu_v1.h>
#include <mod_system_power.h>
#include <mod_tc0_system.h>
#include <fwk_element.h>
#include <fwk_id.h>
#include <fwk_macros.h>
#include <fwk_module.h>
#include <fwk_module_idx.h>
#include <fmw_cmsis.h>
#include <stdint.h>
static const uint8_t system_power_to_sys_ppu0_state[] = {
[MOD_PD_STATE_ON] = (uint8_t)MOD_PD_STATE_ON,
[MOD_SYSTEM_POWER_POWER_STATE_SLEEP0] = (uint8_t)MOD_PD_STATE_OFF,
[MOD_PD_STATE_OFF] = (uint8_t)MOD_PD_STATE_OFF,
};
static const uint8_t system_power_to_sys_ppu1_state[] = {
[MOD_PD_STATE_ON] = (uint8_t)MOD_PD_STATE_ON,
[MOD_SYSTEM_POWER_POWER_STATE_SLEEP0] = (uint8_t)MOD_PD_STATE_ON,
[MOD_PD_STATE_OFF] = (uint8_t)MOD_PD_STATE_OFF,
};
static struct fwk_element system_power_element_table[] = {
[0] =
{
.name = "SYS-PPU-0",
.data = &((struct mod_system_power_dev_config){
.api_id = FWK_ID_API_INIT(
FWK_MODULE_IDX_PPU_V1,
MOD_PPU_V1_API_IDX_POWER_DOMAIN_DRIVER),
.sys_state_table = system_power_to_sys_ppu0_state,
}),
},
[1] =
{
.name = "SYS-PPU-1",
.data = &((struct mod_system_power_dev_config){
.api_id = FWK_ID_API_INIT(
FWK_MODULE_IDX_PPU_V1,
MOD_PPU_V1_API_IDX_POWER_DOMAIN_DRIVER),
.sys_state_table = system_power_to_sys_ppu1_state,
}),
},
[2] = { 0 }, /* Termination description */
};
static struct mod_system_power_config system_power_config = {
.soc_wakeup_irq = SOC_WAKEUP0_IRQ,
/* System driver */
.driver_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_TC0_SYSTEM),
.driver_api_id = FWK_ID_API_INIT(
FWK_MODULE_IDX_TC0_SYSTEM,
MOD_TC0_SYSTEM_API_IDX_SYSTEM_POWER_DRIVER),
/* Initial system state */
.initial_system_power_state = MOD_PD_STATE_OFF,
};
static const struct fwk_element *tc0_system_get_element_table(fwk_id_t unused)
{
struct mod_system_power_dev_config *dev_config_table;
unsigned int i;
/* The system PPUs are placed after the core and cluster PPUs */
unsigned int ppu_idx_base =
tc0_core_get_core_count() + tc0_core_get_cluster_count();
for (i = 0; i < (FWK_ARRAY_SIZE(system_power_element_table) - 1); i++) {
dev_config_table =
(struct mod_system_power_dev_config *)system_power_element_table[i]
.data;
dev_config_table->sys_ppu_id =
fwk_id_build_element_id(fwk_module_id_ppu_v1, ppu_idx_base + i);
}
return system_power_element_table;
}
const struct fwk_module_config config_system_power = {
.elements = FWK_MODULE_DYNAMIC_ELEMENTS(tc0_system_get_element_table),
.data = &system_power_config,
};
|