FILE
core.c
File preview with syntax highlighting.
linux-6.19.14/drivers/platform/x86/intel/telemetry/core.c
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Intel SoC Core Telemetry Driver 4 * Copyright (C) 2015, Intel Corporation. 5 * All Rights Reserved. 6 * 7 * Telemetry Framework provides platform related PM and performance statistics. 8 * This file provides the core telemetry API implementation. 9 */ 10#include <linux/device.h> 11#include <linux/module.h> 12 13#include <asm/intel_telemetry.h> 14 15#define DRIVER_NAME "intel_telemetry_core" 16 17struct telemetry_core_config { 18 struct telemetry_plt_config *plt_config; 19 const struct telemetry_core_ops *telem_ops; 20}; 21 22static struct telemetry_core_config telm_core_conf; 23 24static int telemetry_def_get_trace_verbosity(enum telemetry_unit telem_unit, 25 u32 *verbosity) 26{ 27 return 0; 28} 29 30 31static int telemetry_def_set_trace_verbosity(enum telemetry_unit telem_unit, 32 u32 verbosity) 33{ 34 return 0; 35} 36 37static int telemetry_def_raw_read_eventlog(enum telemetry_unit telem_unit, 38 struct telemetry_evtlog *evtlog, 39 int len, int log_all_evts) 40{ 41 return 0; 42} 43 44static int telemetry_def_read_eventlog(enum telemetry_unit telem_unit, 45 struct telemetry_evtlog *evtlog, 46 int len, int log_all_evts) 47{ 48 return 0; 49} 50 51static const struct telemetry_core_ops telm_defpltops = { 52 .get_trace_verbosity = telemetry_def_get_trace_verbosity, 53 .set_trace_verbosity = telemetry_def_set_trace_verbosity, 54 .raw_read_eventlog = telemetry_def_raw_read_eventlog, 55 .read_eventlog = telemetry_def_read_eventlog, 56}; 57 58/** 59 * telemetry_read_events() - Fetches samples as specified by evtlog.telem_evt_id 60 * @telem_unit: Specify whether IOSS or PSS Read 61 * @evtlog: Array of telemetry_evtlog structs to fill data 62 * evtlog.telem_evt_id specifies the ids to read 63 * @len: Length of array of evtlog 64 * 65 * Return: number of eventlogs read for success, < 0 for failure 66 */ 67int telemetry_read_events(enum telemetry_unit telem_unit, 68 struct telemetry_evtlog *evtlog, int len) 69{ 70 return telm_core_conf.telem_ops->read_eventlog(telem_unit, evtlog, 71 len, 0); 72} 73EXPORT_SYMBOL_GPL(telemetry_read_events); 74 75/** 76 * telemetry_read_eventlog() - Fetch the Telemetry log from PSS or IOSS 77 * @telem_unit: Specify whether IOSS or PSS Read 78 * @evtlog: Array of telemetry_evtlog structs to fill data 79 * @len: Length of array of evtlog 80 * 81 * Return: number of eventlogs read for success, < 0 for failure 82 */ 83int telemetry_read_eventlog(enum telemetry_unit telem_unit, 84 struct telemetry_evtlog *evtlog, int len) 85{ 86 return telm_core_conf.telem_ops->read_eventlog(telem_unit, evtlog, 87 len, 1); 88} 89EXPORT_SYMBOL_GPL(telemetry_read_eventlog); 90 91/** 92 * telemetry_raw_read_eventlog() - Fetch the Telemetry log from PSS or IOSS 93 * @telem_unit: Specify whether IOSS or PSS Read 94 * @evtlog: Array of telemetry_evtlog structs to fill data 95 * @len: Length of array of evtlog 96 * 97 * The caller must take care of locking in this case. 98 * 99 * Return: number of eventlogs read for success, < 0 for failure 100 */ 101int telemetry_raw_read_eventlog(enum telemetry_unit telem_unit, 102 struct telemetry_evtlog *evtlog, int len) 103{ 104 return telm_core_conf.telem_ops->raw_read_eventlog(telem_unit, evtlog, 105 len, 1); 106} 107EXPORT_SYMBOL_GPL(telemetry_raw_read_eventlog); 108 109 110/** 111 * telemetry_get_trace_verbosity() - Get the IOSS & PSS Trace verbosity 112 * @telem_unit: Specify whether IOSS or PSS Read 113 * @verbosity: Pointer to return Verbosity 114 * 115 * Return: 0 success, < 0 for failure 116 */ 117int telemetry_get_trace_verbosity(enum telemetry_unit telem_unit, 118 u32 *verbosity) 119{ 120 return telm_core_conf.telem_ops->get_trace_verbosity(telem_unit, 121 verbosity); 122} 123EXPORT_SYMBOL_GPL(telemetry_get_trace_verbosity); 124 125 126/** 127 * telemetry_set_trace_verbosity() - Update the IOSS & PSS Trace verbosity 128 * @telem_unit: Specify whether IOSS or PSS Read 129 * @verbosity: Verbosity to set 130 * 131 * Return: 0 success, < 0 for failure 132 */ 133int telemetry_set_trace_verbosity(enum telemetry_unit telem_unit, u32 verbosity) 134{ 135 return telm_core_conf.telem_ops->set_trace_verbosity(telem_unit, 136 verbosity); 137} 138EXPORT_SYMBOL_GPL(telemetry_set_trace_verbosity); 139 140/** 141 * telemetry_set_pltdata() - Set the platform specific Data 142 * @ops: Pointer to ops structure 143 * @pltconfig: Platform config data 144 * 145 * Usage by other than telemetry pltdrv module is invalid 146 * 147 * Return: 0 success, < 0 for failure 148 */ 149int telemetry_set_pltdata(const struct telemetry_core_ops *ops, 150 struct telemetry_plt_config *pltconfig) 151{ 152 if (ops) 153 telm_core_conf.telem_ops = ops; 154 155 if (pltconfig) 156 telm_core_conf.plt_config = pltconfig; 157 158 return 0; 159} 160EXPORT_SYMBOL_GPL(telemetry_set_pltdata); 161 162/** 163 * telemetry_clear_pltdata() - Clear the platform specific Data 164 * 165 * Usage by other than telemetry pltdrv module is invalid 166 * 167 * Return: 0 success, < 0 for failure 168 */ 169int telemetry_clear_pltdata(void) 170{ 171 telm_core_conf.telem_ops = &telm_defpltops; 172 telm_core_conf.plt_config = NULL; 173 174 return 0; 175} 176EXPORT_SYMBOL_GPL(telemetry_clear_pltdata); 177 178/** 179 * telemetry_get_pltdata() - Return telemetry platform config 180 * 181 * May be used by other telemetry modules to get platform specific 182 * configuration. 183 */ 184struct telemetry_plt_config *telemetry_get_pltdata(void) 185{ 186 return telm_core_conf.plt_config; 187} 188EXPORT_SYMBOL_GPL(telemetry_get_pltdata); 189 190static inline int telemetry_get_pssevtname(enum telemetry_unit telem_unit, 191 const char **name, int len) 192{ 193 struct telemetry_unit_config psscfg; 194 int i; 195 196 if (!telm_core_conf.plt_config) 197 return -EINVAL; 198 199 psscfg = telm_core_conf.plt_config->pss_config; 200 201 if (len > psscfg.ssram_evts_used) 202 len = psscfg.ssram_evts_used; 203 204 for (i = 0; i < len; i++) 205 name[i] = psscfg.telem_evts[i].name; 206 207 return 0; 208} 209 210static inline int telemetry_get_iossevtname(enum telemetry_unit telem_unit, 211 const char **name, int len) 212{ 213 struct telemetry_unit_config iosscfg; 214 int i; 215 216 if (!(telm_core_conf.plt_config)) 217 return -EINVAL; 218 219 iosscfg = telm_core_conf.plt_config->ioss_config; 220 221 if (len > iosscfg.ssram_evts_used) 222 len = iosscfg.ssram_evts_used; 223 224 for (i = 0; i < len; i++) 225 name[i] = iosscfg.telem_evts[i].name; 226 227 return 0; 228 229} 230 231/** 232 * telemetry_get_evtname() - Checkif platform config is valid 233 * @telem_unit: Telemetry Unit to check 234 * @name: Array of character pointers to contain name 235 * @len: length of array name provided by user 236 * 237 * Usage by other than telemetry debugfs module is invalid 238 * 239 * Return: 0 success, < 0 for failure 240 */ 241int telemetry_get_evtname(enum telemetry_unit telem_unit, 242 const char **name, int len) 243{ 244 int ret = -EINVAL; 245 246 if (telem_unit == TELEM_PSS) 247 ret = telemetry_get_pssevtname(telem_unit, name, len); 248 249 else if (telem_unit == TELEM_IOSS) 250 ret = telemetry_get_iossevtname(telem_unit, name, len); 251 252 return ret; 253} 254EXPORT_SYMBOL_GPL(telemetry_get_evtname); 255 256static int __init telemetry_module_init(void) 257{ 258 pr_info(pr_fmt(DRIVER_NAME) " Init\n"); 259 260 telm_core_conf.telem_ops = &telm_defpltops; 261 return 0; 262} 263 264static void __exit telemetry_module_exit(void) 265{ 266} 267 268module_init(telemetry_module_init); 269module_exit(telemetry_module_exit); 270 271MODULE_AUTHOR("Souvik Kumar Chakravarty <souvik.k.chakravarty@intel.com>"); 272MODULE_DESCRIPTION("Intel SoC Telemetry Interface"); 273MODULE_LICENSE("GPL v2");
~/
Read-only file preview.