1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2022-2024, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <mod_dvfs.h>
9 #include <mod_scmi_perf.h>
10 #include <mod_transport.h>
11 
12 #include <fwk_id.h>
13 #include <fwk_macros.h>
14 #include <fwk_module.h>
15 #include <fwk_module_idx.h>
16 
17 #include <stddef.h>
18 #include <stdint.h>
19 
20 #ifdef BUILD_HAS_SCMI_PERF_FAST_CHANNELS
21 #    include <config_fch.h>
22 #endif
23 
24 #define TEST_MODULE_IDX       0x5
25 #define TEST_SCMI_AGENT_IDX_0 0x1
26 
27 #define TEST_OPP_COUNT 0x5
28 
29 enum scmi_perf_element_idx {
30     SCMI_PERF_ELEMENT_IDX_0 = 0,
31     SCMI_PERF_ELEMENT_IDX_1,
32     SCMI_PERF_ELEMENT_IDX_2,
33     SCMI_PERF_ELEMENT_IDX_COUNT,
34 };
35 
36 enum dvfs_element_idx {
37     DVFS_ELEMENT_IDX_0 = SCMI_PERF_ELEMENT_IDX_0,
38     DVFS_ELEMENT_IDX_1 = SCMI_PERF_ELEMENT_IDX_1,
39     DVFS_ELEMENT_IDX_COUNT,
40 };
41 
42 #define PERF_DOMAINS_IDX_COUNT DVFS_ELEMENT_IDX_COUNT
43 
44 static const struct mod_scmi_perf_domain_config domains[] = {
45     [SCMI_PERF_ELEMENT_IDX_0] = {
46 #ifdef BUILD_HAS_SCMI_PERF_FAST_CHANNELS
47         .fch_config = (struct scmi_perf_fch_config[]) {
48             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_SET] = FCH_INIT(0),
49             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_SET] = FCH_INIT(1),
50             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_GET] = FCH_INIT(2),
51             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_GET] = FCH_INIT(3),
52             },
53         .supports_fast_channels = true,
54 #endif
55         .phy_group_id =
56             FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DVFS, DVFS_ELEMENT_IDX_0),
57     },
58     [SCMI_PERF_ELEMENT_IDX_1] = {
59         .phy_group_id =
60             FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DVFS, DVFS_ELEMENT_IDX_1),
61     },
62     [SCMI_PERF_ELEMENT_IDX_2] = {
63         .phy_group_id =
64             FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DVFS, DVFS_ELEMENT_IDX_1),
65     },
66 };
67 
68 static struct mod_scmi_perf_config perf_config = {
69     .domains = &domains,
70     .perf_doms_count = SCMI_PERF_ELEMENT_IDX_COUNT,
71 };
72 
73 struct fwk_module_config config_scmi_perf = {
74     .data = &perf_config,
75 };
76 
77 static const struct mod_dvfs_domain_config test_dvfs_config = {
78     .latency = 1200,
79     .sustained_idx = 2,
80     .opps =
81         (struct mod_dvfs_opp[]){
82             {
83                 .level = 100 * 1000000UL,
84                 .frequency = 101 * FWK_KHZ,
85                 .voltage = 102,
86             },
87             {
88                 .level = 200 * 1000000UL,
89                 .frequency = 201 * FWK_KHZ,
90                 .voltage = 202,
91             },
92             {
93                 .level = 300 * 1000000UL,
94                 .frequency = 301 * FWK_KHZ,
95                 .voltage = 302,
96             },
97             {
98                 .level = 400 * 1000000UL,
99                 .frequency = 401 * FWK_KHZ,
100                 .voltage = 402,
101             },
102             {
103                 .level = 500 * 1000000UL,
104                 .frequency = 501 * FWK_KHZ,
105                 .voltage = 502,
106             },
107             { 0 },
108         }
109 };
110 
111 #ifdef BUILD_HAS_SCMI_PERF_PLUGIN_HANDLER
112 static struct perf_plugins_api test_perf_plugins_api = {
113     .update = plugin_update,
114     .report = plugin_report,
115 };
116 #endif
117