1 /*
2 * Arm SCP/MCP Software
3 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "clock_soc.h"
9 #include "config_dvfs.h"
10 #include "rd_alarm_idx.h"
11
12 #include <mod_dvfs.h>
13 #include <mod_scmi_perf.h>
14 #include <mod_sid.h>
15
16 #include <fwk_assert.h>
17 #include <fwk_element.h>
18 #include <fwk_id.h>
19 #include <fwk_macros.h>
20 #include <fwk_module.h>
21 #include <fwk_module_idx.h>
22 #include <fwk_status.h>
23
24 #define DVFS_ELEMENT_IDX(n) \
25 [DVFS_ELEMENT_IDX_CPU##n] = { .name = "GROUP" #n, .data = &cpu##n }
26
27 #define DVFS_DOMAIN_CPU_GROUP_IDX(n) \
28 { \
29 .psu_id = \
30 FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PSU, DVFS_ELEMENT_IDX_CPU##n), \
31 .clock_id = \
32 FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_IDX_CPU_GROUP##n), \
33 .retry_ms = 0, .latency = 1200, .sustained_idx = 2, .opps = opps \
34 }
35
36 /* The frequencies should match with the frequencies configured for css clock */
37 static struct mod_dvfs_opp opps[] = {
38 { .level = 65UL, .frequency = 1313 * FWK_KHZ, .voltage = 800 },
39 { .level = 75UL, .frequency = 1531 * FWK_KHZ, .voltage = 850 },
40 { .level = 85UL, .frequency = 1750 * FWK_KHZ, .voltage = 900 },
41 { .level = 105UL, .frequency = 2100 * FWK_KHZ, .voltage = 950 },
42 { .level = 130UL, .frequency = 2600 * FWK_KHZ, .voltage = 1000 },
43 { 0 }
44 };
45
46 static const struct mod_dvfs_domain_config cpu0 = DVFS_DOMAIN_CPU_GROUP_IDX(0);
47 static const struct mod_dvfs_domain_config cpu1 = DVFS_DOMAIN_CPU_GROUP_IDX(1);
48 static const struct mod_dvfs_domain_config cpu2 = DVFS_DOMAIN_CPU_GROUP_IDX(2);
49 static const struct mod_dvfs_domain_config cpu3 = DVFS_DOMAIN_CPU_GROUP_IDX(3);
50 static const struct mod_dvfs_domain_config cpu4 = DVFS_DOMAIN_CPU_GROUP_IDX(4);
51 static const struct mod_dvfs_domain_config cpu5 = DVFS_DOMAIN_CPU_GROUP_IDX(5);
52 static const struct mod_dvfs_domain_config cpu6 = DVFS_DOMAIN_CPU_GROUP_IDX(6);
53 static const struct mod_dvfs_domain_config cpu7 = DVFS_DOMAIN_CPU_GROUP_IDX(7);
54 static const struct mod_dvfs_domain_config cpu8 = DVFS_DOMAIN_CPU_GROUP_IDX(8);
55 static const struct mod_dvfs_domain_config cpu9 = DVFS_DOMAIN_CPU_GROUP_IDX(9);
56 static const struct mod_dvfs_domain_config cpu10 =
57 DVFS_DOMAIN_CPU_GROUP_IDX(10);
58 static const struct mod_dvfs_domain_config cpu11 =
59 DVFS_DOMAIN_CPU_GROUP_IDX(11);
60 static const struct mod_dvfs_domain_config cpu12 =
61 DVFS_DOMAIN_CPU_GROUP_IDX(12);
62 static const struct mod_dvfs_domain_config cpu13 =
63 DVFS_DOMAIN_CPU_GROUP_IDX(13);
64 static const struct mod_dvfs_domain_config cpu14 =
65 DVFS_DOMAIN_CPU_GROUP_IDX(14);
66 static const struct mod_dvfs_domain_config cpu15 =
67 DVFS_DOMAIN_CPU_GROUP_IDX(15);
68
69 static const struct fwk_element element_table[] = {
70 DVFS_ELEMENT_IDX(0),
71 DVFS_ELEMENT_IDX(1),
72 DVFS_ELEMENT_IDX(2),
73 DVFS_ELEMENT_IDX(3),
74 DVFS_ELEMENT_IDX(4),
75 DVFS_ELEMENT_IDX(5),
76 DVFS_ELEMENT_IDX(6),
77 DVFS_ELEMENT_IDX(7),
78 DVFS_ELEMENT_IDX(8),
79 DVFS_ELEMENT_IDX(9),
80 DVFS_ELEMENT_IDX(10),
81 DVFS_ELEMENT_IDX(11),
82 DVFS_ELEMENT_IDX(12),
83 DVFS_ELEMENT_IDX(13),
84 DVFS_ELEMENT_IDX(14),
85 DVFS_ELEMENT_IDX(15),
86 { 0 },
87 };
88
dvfs_get_element_table(fwk_id_t module_id)89 static const struct fwk_element *dvfs_get_element_table(fwk_id_t module_id)
90 {
91 return element_table;
92 }
93
94 const struct fwk_module_config config_dvfs = {
95 .elements = FWK_MODULE_DYNAMIC_ELEMENTS(dvfs_get_element_table)
96 };
97