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