summaryrefslogtreecommitdiff
path: root/tools/perf/pmu-events/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/pmu-events/models.py')
-rwxr-xr-xtools/perf/pmu-events/models.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/tools/perf/pmu-events/models.py b/tools/perf/pmu-events/models.py
new file mode 100755
index 000000000000..8f727d29c952
--- /dev/null
+++ b/tools/perf/pmu-events/models.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
+"""List model names from mapfile.csv files."""
+import argparse
+import csv
+import os
+import re
+from typing import List
+
+def main() -> None:
+ def dir_path(path: str) -> str:
+ """Validate path is a directory for argparse."""
+ if os.path.isdir(path):
+ return path
+ raise argparse.ArgumentTypeError(f'\'{path}\' is not a valid directory')
+
+ def find_archs(start_dir: str, arch: str) -> List[str]:
+ archs = []
+ for item in os.scandir(start_dir):
+ if not item.is_dir():
+ continue
+ if arch in (item.name, 'all'):
+ archs.append(item.name)
+
+ if len(archs) < 1:
+ raise IOError(f'Missing architecture directory \'{arch}\'')
+
+ return archs
+
+ def find_mapfiles(start_dir: str, archs: List[str]) -> List[str]:
+ result = []
+ for arch in archs:
+ for item in os.scandir(f'{start_dir}/{arch}'):
+ if item.is_dir():
+ continue
+ if item.name == 'mapfile.csv':
+ result.append(f'{start_dir}/{arch}/mapfile.csv')
+ return result
+
+ def find_cpuids(mapfiles: List[str], cpuids: str) -> List[str]:
+ result = []
+ for mapfile in mapfiles:
+ with open(mapfile, encoding='utf-8') as csvfile:
+ first = False
+ table = csv.reader(csvfile)
+ for row in table:
+ if not first or len(row) == 0 or row[0].startswith('#'):
+ first = True
+ continue
+ # Python regular expressions don't handle xdigit.
+ regex = row[0].replace('[[:xdigit:]]', '[0-9a-fA-F]')
+ for cpuid in cpuids.split(','):
+ if re.match(regex, cpuid):
+ result.append(row[2])
+ return result
+
+ ap = argparse.ArgumentParser()
+ ap.add_argument('arch', help='Architecture name like x86')
+ ap.add_argument('cpuid', default='all', help='List of cpuids to convert to model names')
+ ap.add_argument(
+ 'starting_dir',
+ type=dir_path,
+ help='Root of tree containing architecture directories containing json files'
+ )
+ args = ap.parse_args()
+
+ archs = find_archs(args.starting_dir, args.arch)
+ mapfiles = find_mapfiles(args.starting_dir, archs)
+ models = find_cpuids(mapfiles, args.cpuid)
+ print(','.join(models))
+
+if __name__ == '__main__':
+ main()