1 /* 2 * Arm SCP/MCP Software 3 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 * 7 * Description: 8 * Performance plugins handler. 9 * Please refer to the architecture documentation for further details. 10 */ 11 12 #ifndef PERF_PLUGINS_HANDLER_H 13 #define PERF_PLUGINS_HANDLER_H 14 15 /*! 16 * \addtogroup GroupSCMI_PERF SCMI Performance Domain Management Protocol 17 * @{ 18 */ 19 20 #include <mod_scmi_perf.h> 21 22 #include <fwk_element.h> 23 #include <fwk_id.h> 24 25 int perf_plugins_handler_bind(void); 26 27 int perf_plugins_handler_process_bind_request( 28 fwk_id_t source_id, 29 fwk_id_t target_id, 30 fwk_id_t api_id, 31 const void **api); 32 33 /*! 34 * \brief FastChannel Performance Update data container 35 * 36 * \note This data structure is passed between the plugins handler and the SCMI 37 * performance module. It contains: 38 * - limits that SCMI-Perf provides to the plugins handler for its logic. 39 * - adjusted limits that the plugins handler returns to SCMI-Perf ready 40 * for the DVFS module. 41 * These values come from the FastChannels and the plugins handler executes 42 * its logic in order to aggregate them before they can be forwarded to the 43 * DVFS module. 44 */ 45 struct fc_perf_update { 46 /*! DVFS domain identifier */ 47 fwk_id_t domain_id; 48 49 /*! Performance level */ 50 uint32_t level; 51 52 /*! Performance limit max to the plugins handler */ 53 uint32_t max_limit; 54 /*! Performance limit min to the plugins handler */ 55 uint32_t min_limit; 56 57 /*! Adjusted (by the plugins hanlder) performance limit max */ 58 uint32_t adj_max_limit; 59 /*! Adjusted (by the plugins hanlder) performance limit min */ 60 uint32_t adj_min_limit; 61 }; 62 63 /*! 64 * \brief FastChannel mirror 65 * 66 * \details Fastchannels addresses in memory are not necessarily contiguous, 67 * thus copy them into a temporary area for easy handling. Also for the 68 * purpose of managing performance requests, get_ are not required. 69 */ 70 struct fast_channels_mirror { 71 uint32_t level; 72 struct mod_scmi_perf_fast_channel_limit limits; 73 }; 74 75 /*! 76 * \brief Performance Plugins Handler Update 77 * 78 * \details Call the update logic for the Plugins Handler. This logic will take 79 * care of the aggregation of values for all the domains and all the 80 * plugins. 81 * 82 * \param perf_dom_idx Performance domain index 83 * \param fc_update FastChannel data. The Plugins Handler expects to receive the 84 * latest FastChannels values for the above particular performance domain 85 * and runst its internal logic of storing and aggregating. This is an 86 * input to the Plugins Handler. 87 */ 88 void perf_plugins_handler_update( 89 unsigned int perf_dom_idx, 90 struct fc_perf_update *fc_update); 91 92 /*! 93 * \brief Performance Plugins Handler Get 94 * 95 * \details Get the performance update for a performance domain. For a given 96 * domain, the final aggregated values are provided in the fc_perf_update 97 * container. It is meant to be called after all the updates have run. 98 * 99 * \param perf_dom_idx Performance domain index 100 * \param fc_update FastChannel data. The Plugins Handler expects to receive 101 * the latest FastChannels values for the above particular performance 102 * domain and runst its internal logic of storing and aggregating. This is 103 * an input and an output to/from the Plugins Handler. 104 */ 105 void perf_plugins_handler_get( 106 unsigned int perf_dom_idx, 107 struct fc_perf_update *fc_update); 108 109 void perf_plugins_handler_report(struct perf_plugins_perf_report *data); 110 111 fwk_id_t perf_plugins_get_dependency_id(unsigned int dom_idx); 112 113 int perf_plugins_handler_init(const struct mod_scmi_perf_config *config); 114 115 /*! 116 * @} 117 */ 118 119 #endif /* PERF_PLUGINS_HANDLER_H */ 120