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