1/* 2 * drv_configs.h: Interface to apply PMU specific configuration 3 * Copyright (c) 2016-2018, Linaro Ltd. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 */ 15 16#include "drv_configs.h" 17#include "evlist.h" 18#include "evsel.h" 19#include "pmu.h" 20#include <errno.h> 21 22static int 23perf_evsel__apply_drv_configs(struct perf_evsel *evsel, 24 struct perf_evsel_config_term **err_term) 25{ 26 bool found = false; 27 int err = 0; 28 struct perf_evsel_config_term *term; 29 struct perf_pmu *pmu = NULL; 30 31 while ((pmu = perf_pmu__scan(pmu)) != NULL) 32 if (pmu->type == evsel->attr.type) { 33 found = true; 34 break; 35 } 36 37 list_for_each_entry(term, &evsel->config_terms, list) { 38 if (term->type != PERF_EVSEL__CONFIG_TERM_DRV_CFG) 39 continue; 40 41 /* 42 * We have a configuration term, report an error if we 43 * can't find the PMU or if the PMU driver doesn't support 44 * cmd line driver configuration. 45 */ 46 if (!found || !pmu->set_drv_config) { 47 err = -EINVAL; 48 *err_term = term; 49 break; 50 } 51 52 err = pmu->set_drv_config(term); 53 if (err) { 54 *err_term = term; 55 break; 56 } 57 } 58 59 return err; 60} 61 62int perf_evlist__apply_drv_configs(struct perf_evlist *evlist, 63 struct perf_evsel **err_evsel, 64 struct perf_evsel_config_term **err_term) 65{ 66 struct perf_evsel *evsel; 67 int err = 0; 68 69 evlist__for_each_entry(evlist, evsel) { 70 err = perf_evsel__apply_drv_configs(evsel, err_term); 71 if (err) { 72 *err_evsel = evsel; 73 break; 74 } 75 } 76 77 return err; 78} 79