1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2020-2024, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "config_dvfs.h"
9 #include "juno_alarm_idx.h"
10 #include "juno_scmi.h"
11 #include "software_mmap.h"
12 
13 #include <internal/scmi_perf.h>
14 #include <mod_scmi_perf.h>
15 
16 #include <fwk_element.h>
17 #include <fwk_id.h>
18 #include <fwk_macros.h>
19 #include <fwk_module.h>
20 #include <fwk_module_idx.h>
21 
22 #include <stddef.h>
23 #include <stdint.h>
24 
25 #ifdef BUILD_HAS_MOD_STATISTICS
26 #    include <mod_stats.h>
27 #endif
28 
29 static const struct mod_scmi_perf_domain_config
30     domains[DVFS_ELEMENT_IDX_COUNT] = {
31         [DVFS_ELEMENT_IDX_BIG] = {
32 #ifdef BUILD_HAS_SCMI_PERF_FAST_CHANNELS
33          .fch_config = (struct scmi_perf_fch_config[]) {
34             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_SET] =
35                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_BIG_LEVEL_SET),
36             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_SET] =
37                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_BIG_LIMIT_SET),
38             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_GET] =
39                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_BIG_LEVEL_GET),
40             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_GET] =
41                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_BIG_LIMIT_GET),
42         },
43         .supports_fast_channels = true,
44 #endif
45 #ifdef BUILD_HAS_STATISTICS
46         .stats_collected = true,
47 #endif
48         },
49         [DVFS_ELEMENT_IDX_LITTLE] = {
50 #ifdef BUILD_HAS_SCMI_PERF_FAST_CHANNELS
51          .fch_config = (struct scmi_perf_fch_config[]) {
52             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_SET] =
53                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_LITTLE_LEVEL_SET),
54             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_SET] =
55                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_LITTLE_LIMIT_SET),
56             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_GET] =
57                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_LITTLE_LEVEL_GET),
58             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_GET] =
59                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_LITTLE_LIMIT_GET),
60         },
61         .supports_fast_channels = true,
62 #endif
63 #ifdef BUILD_HAS_STATISTICS
64         .stats_collected = true,
65 #endif
66         },
67         [DVFS_ELEMENT_IDX_GPU] = {
68 #ifdef BUILD_HAS_SCMI_PERF_FAST_CHANNELS
69          .fch_config = (struct scmi_perf_fch_config[]) {
70             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_SET] =
71                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_GPU_LEVEL_SET),
72             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_SET] =
73                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_GPU_LIMIT_SET),
74             [MOD_SCMI_PERF_FAST_CHANNEL_LEVEL_GET] =
75                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_GPU_LEVEL_GET),
76             [MOD_SCMI_PERF_FAST_CHANNEL_LIMIT_GET] =
77                 FCH_INIT(JUNO_TRANSPORT_SCMI_PERF_FCH_GPU_LIMIT_GET),
78         },
79         .supports_fast_channels = true,
80 #    ifdef BUILD_HAS_STATISTICS
81         .stats_collected = true,
82 #    endif
83 #endif
84         }
85 };
86 
87 struct fwk_module_config config_scmi_perf = {
88     .data = &((struct mod_scmi_perf_config){
89         .domains = &domains,
90         .perf_doms_count = FWK_ARRAY_SIZE(domains),
91 #ifdef BUILD_HAS_SCMI_PERF_FAST_CHANNELS
92         .fast_channels_rate_limit = SCMI_PERF_FC_MIN_RATE_LIMIT,
93 #endif
94 #ifdef BUILD_HAS_MOD_STATISTICS
95         .stats_enabled = true,
96 #endif
97     }),
98 };
99