1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "config_clock.h"
9 
10 #include <mod_dvfs.h>
11 #include <mod_scmi_perf.h>
12 
13 #include <fwk_element.h>
14 #include <fwk_id.h>
15 #include <fwk_macros.h>
16 #include <fwk_module.h>
17 #include <fwk_module_idx.h>
18 
19 static struct mod_dvfs_opp opps[] = { {
20                                           .level = 1313 * 1000000UL,
21                                           .frequency = 1313 * FWK_KHZ,
22                                           .voltage = 100,
23                                       },
24                                       {
25                                           .level = 1531 * 1000000UL,
26                                           .frequency = 1531 * FWK_KHZ,
27                                           .voltage = 200,
28                                       },
29                                       {
30                                           .level = 1750 * 1000000UL,
31                                           .frequency = 1750 * FWK_KHZ,
32                                           .voltage = 300,
33                                       },
34                                       {
35                                           .level = 2100 * 1000000UL,
36                                           .frequency = 2100 * FWK_KHZ,
37                                           .voltage = 400,
38                                       },
39                                       {
40                                           .level = 2600 * 1000000UL,
41                                           .frequency = 2600 * FWK_KHZ,
42                                           .voltage = 500,
43                                       },
44                                       { 0 } };
45 
46 static const struct mod_dvfs_domain_config cpu_group0 = {
47     .psu_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PSU, 0),
48     .clock_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_IDX_CPU_GROUP0),
49     .alarm_id = FWK_ID_SUB_ELEMENT_INIT(FWK_MODULE_IDX_TIMER, 0, 0),
50     .retry_ms = 1,
51     .latency = 1200,
52     .sustained_idx = 2,
53     .opps = opps,
54 };
55 
56 static const struct mod_dvfs_domain_config cpu_group1 = {
57     .psu_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PSU, 1),
58     .clock_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_IDX_CPU_GROUP1),
59     .alarm_id = FWK_ID_SUB_ELEMENT_INIT(FWK_MODULE_IDX_TIMER, 0, 1),
60     .retry_ms = 1,
61     .latency = 1200,
62     .sustained_idx = 2,
63     .opps = opps,
64 };
65 
66 static const struct fwk_element element_table[] = {
67     [0] = {
68         .name = "GROUP0",
69         .data = &cpu_group0,
70     },
71     [1] = {
72         .name = "GROUP1",
73         .data = &cpu_group1,
74     },
75     { 0 }
76 };
77 
dvfs_get_element_table(fwk_id_t module_id)78 static const struct fwk_element *dvfs_get_element_table(fwk_id_t module_id)
79 {
80     return element_table;
81 }
82 
83 const struct fwk_module_config config_dvfs = {
84     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(dvfs_get_element_table),
85 };
86