1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "fwk_element.h"
9 #include "fwk_id.h"
10 #include "fwk_module.h"
11 #include "fwk_module_idx.h"
12 #include "mod_metrics_analyzer.h"
13 
14 /*
15  * Providers domain indexes
16  */
17 
18 enum thermal_domain_idx {
19     THERMAL_DOMAIN_IDX_GPU,
20     THERMAL_DOMAIN_IDX_SOC,
21     THERMAL_DOMAIN_IDX_CPU,
22     THERMAL_DOMAIN_IDX_COUNT,
23 };
24 
25 enum power_capping_domain_idx {
26     POWER_CAPPING_DOMAIN_IDX_GPU,
27     POWER_CAPPING_DOMAIN_IDX_CPU,
28     POWER_CAPPING_DOMAIN_IDX_SOC,
29     POWER_CAPPING_DOMAIN_IDX_COUNT,
30 };
31 
32 enum hsp_domain_idx {
33     HSP_DOMAIN_IDX_SOC,
34     HSP_DOMAIN_IDX_GPU,
35     HSP_DOMAIN_IDX_CPU,
36     HSP_DOMAIN_IDX_COUNT,
37 };
38 
39 /*
40  * consumer domain indexes
41  */
42 enum consumer_domain_idx {
43     CONSUMER_DOMAIN_IDX_SOC,
44     CONSUMER_DOMAIN_IDX_GPU,
45     CONSUMER_DOMAIN_IDX_CPU,
46     CONSUMER_DOMAIN_IDX_COUNT,
47 };
48 
49 /* Metrics domain indexes */
50 enum metrics_domain_idx {
51     METRICS_ANALYZER_DOMAIN_IDX_SOC,
52     METRICS_ANALYZER_DOMAIN_IDX_GPU,
53     METRICS_ANALYZER_DOMAIN_IDX_CPU,
54     METRICS_ANALYZER_DOMAIN_IDX_COUNT,
55 };
56 
57 enum metric_idx {
58     METRICS_ANALYZER_METRIC_IDX_THERMAL,
59     METRICS_ANALYZER_METRIC_IDX_POWER_CAPPING,
60     METRICS_ANALYZER_METRIC_IDX_HSP,
61     METRICS_ANALYZER_METRIC_IDX_COUNT,
62 };
63 
64 #define ID(module, domain) \
65     FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_##module, module##_DOMAIN_IDX_##domain)
66 
67 /* Assume that all providers has their get_limit API index equal to zero */
68 #define PROVIDER_API_ID(module) FWK_ID_API_INIT(FWK_MODULE_IDX_##module, 0)
69 
70 /* Assume that the consumer has set_limit API index equal to zero */
71 #define CONSUMER_API_ID FWK_ID_API_INIT(FWK_MODULE_IDX_CONSUMER, 0)
72 
73 #define PROVIDER_ENTRY(name, domain) \
74     { \
75         .api_id = PROVIDER_API_ID(name), .domain_id = ID(name, domain), \
76     }
77 
78 #define CONSUMER_ENTRY(domain) \
79     { \
80         .api_id = CONSUMER_API_ID, .domain_id = ID(CONSUMER, domain), \
81     }
82 
83 const struct mod_metrics_analyzer_interactor soc_limits_providers[] = {
84     {
85         .api_id = PROVIDER_API_ID(THERMAL),
86         .domain_id = ID(THERMAL, SOC),
87     },
88     {
89         .api_id = PROVIDER_API_ID(POWER_CAPPING),
90         .domain_id = ID(POWER_CAPPING, SOC),
91     },
92 };
93 
94 const struct mod_metrics_analyzer_interactor cpu_limits_providers[] = {
95     {
96         .api_id = PROVIDER_API_ID(THERMAL),
97         .domain_id = ID(THERMAL, CPU),
98     },
99     {
100         .api_id = PROVIDER_API_ID(POWER_CAPPING),
101         .domain_id = ID(POWER_CAPPING, CPU),
102     },
103     {
104         .api_id = PROVIDER_API_ID(HSP),
105         .domain_id = ID(HSP, SOC),
106     }
107 };
108 
109 const struct mod_metrics_analyzer_interactor gpu_limits_providers[] = {
110     {
111         .api_id = PROVIDER_API_ID(THERMAL),
112         .domain_id = ID(THERMAL, GPU),
113     },
114     {
115         .api_id = PROVIDER_API_ID(POWER_CAPPING),
116         .domain_id = ID(POWER_CAPPING, GPU),
117     },
118 };
119 
120 static const struct fwk_element metrics_analyzer_domain[] = {
121     [METRICS_ANALYZER_DOMAIN_IDX_SOC] = {
122         .name = "SOC",
123         .sub_element_count = FWK_ARRAY_SIZE(soc_limits_providers),
124         .data = &(const struct mod_metrics_analyzer_domain_config) {
125             .limit_providers = soc_limits_providers,
126             .limit_consumer = CONSUMER_ENTRY(SOC),
127         },
128     },
129     [METRICS_ANALYZER_DOMAIN_IDX_CPU] = {
130         .name = "CPU",
131         .sub_element_count = FWK_ARRAY_SIZE(cpu_limits_providers),
132         .data = &(const struct mod_metrics_analyzer_domain_config) {
133             .limit_providers = cpu_limits_providers,
134             .limit_consumer = CONSUMER_ENTRY(CPU),
135         },
136     },
137     [METRICS_ANALYZER_DOMAIN_IDX_GPU] = {
138         .name = "GPU",
139         .sub_element_count = FWK_ARRAY_SIZE(gpu_limits_providers),
140         .data = &(const struct mod_metrics_analyzer_domain_config) {
141             .limit_providers = gpu_limits_providers,
142             .limit_consumer = CONSUMER_ENTRY(GPU),
143         },
144     },
145 };
146 
147 struct fwk_module_config module_config = {
148     .elements = FWK_MODULE_STATIC_ELEMENTS_PTR(metrics_analyzer_domain),
149 };
150