1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <tc0_dvfs.h>
9 
10 #include <mod_tc0_power_model.h>
11 #include <mod_thermal_mgmt.h>
12 
13 #include <fwk_element.h>
14 #include <fwk_id.h>
15 #include <fwk_module.h>
16 
17 #include <stddef.h>
18 #include <stdint.h>
19 
20 static struct mod_thermal_mgmt_actor_config actor_table_domain0[3] = {
21     [0] = {
22         .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TC0_POWER_MODEL, 0),
23         .dvfs_domain_id =
24             FWK_ID_ELEMENT_INIT(
25                 FWK_MODULE_IDX_DVFS, DVFS_ELEMENT_IDX_KLEIN),
26         .weight = 100,
27     },
28     [1] = {
29         .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TC0_POWER_MODEL, 1),
30         .dvfs_domain_id =
31             FWK_ID_ELEMENT_INIT(
32                 FWK_MODULE_IDX_DVFS, DVFS_ELEMENT_IDX_MATTERHORN),
33         .weight = 100,
34     },
35     [2] = {
36         .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TC0_POWER_MODEL, 2),
37         .dvfs_domain_id =
38             FWK_ID_ELEMENT_INIT(
39                 FWK_MODULE_IDX_DVFS, DVFS_ELEMENT_IDX_MATTERHORN_ELP_ARM),
40         .weight = 100,
41     },
42 };
43 
44 static const struct fwk_element thermal_mgmt_domains_elem_table[2] = {
45     [0] = {
46         .name = "Thermal Domain 0",
47         .data = &((struct mod_thermal_mgmt_dev_config){
48             .slow_loop_mult = 25,
49             .tdp = 10,
50             .pi_controller = {
51                 .switch_on_temperature = 50,
52                 .control_temperature = 60,
53                 .integral_cutoff = 0,
54                 .integral_max = 100,
55                 .k_p_undershoot = 1,
56                 .k_p_overshoot = 1,
57                 .k_integral = 1,
58             },
59             .sensor_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SENSOR, 0),
60             .driver_api_id = FWK_ID_API_INIT(
61                 FWK_MODULE_IDX_TC0_POWER_MODEL,
62                 MOD_TC0_POWER_MODEL_THERMAL_DRIVER_API_IDX),
63             .thermal_actors_table = actor_table_domain0,
64             .thermal_actors_count = FWK_ARRAY_SIZE(actor_table_domain0),
65         }),
66     },
67     [1] = { 0 } /* Termination description */
68 };
69 
get_element_table(fwk_id_t module_id)70 static const struct fwk_element *get_element_table(fwk_id_t module_id)
71 {
72     return thermal_mgmt_domains_elem_table;
73 }
74 
75 struct fwk_module_config config_thermal_mgmt = {
76     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(get_element_table),
77 };
78