]> Git Repo - linux.git/blob - tools/perf/pmu-events/models.py
Linux 6.14-rc3
[linux.git] / tools / perf / pmu-events / models.py
1 #!/usr/bin/env python3
2 # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
3 """List model names from mapfile.csv files."""
4 import argparse
5 import csv
6 import os
7 import re
8 from typing import List
9
10 def main() -> None:
11     def dir_path(path: str) -> str:
12         """Validate path is a directory for argparse."""
13         if os.path.isdir(path):
14             return path
15         raise argparse.ArgumentTypeError(f'\'{path}\' is not a valid directory')
16
17     def find_archs(start_dir: str, arch: str) -> List[str]:
18         archs = []
19         for item in os.scandir(start_dir):
20             if not item.is_dir():
21                 continue
22             if arch in (item.name, 'all'):
23                 archs.append(item.name)
24
25         if len(archs) < 1:
26             raise IOError(f'Missing architecture directory \'{arch}\'')
27
28         return archs
29
30     def find_mapfiles(start_dir: str, archs: List[str]) -> List[str]:
31         result = []
32         for arch in archs:
33             for item in os.scandir(f'{start_dir}/{arch}'):
34                 if item.is_dir():
35                     continue
36                 if item.name == 'mapfile.csv':
37                     result.append(f'{start_dir}/{arch}/mapfile.csv')
38         return result
39
40     def find_cpuids(mapfiles: List[str], cpuids: str) -> List[str]:
41         result = []
42         for mapfile in mapfiles:
43             with open(mapfile, encoding='utf-8') as csvfile:
44                 first = False
45                 table = csv.reader(csvfile)
46                 for row in table:
47                     if not first or len(row) == 0 or row[0].startswith('#'):
48                         first = True
49                         continue
50                     # Python regular expressions don't handle xdigit.
51                     regex = row[0].replace('[[:xdigit:]]', '[0-9a-fA-F]')
52                     for cpuid in cpuids.split(','):
53                         if re.match(regex, cpuid):
54                             result.append(row[2])
55         return result
56
57     ap = argparse.ArgumentParser()
58     ap.add_argument('arch', help='Architecture name like x86')
59     ap.add_argument('cpuid', default='all', help='List of cpuids to convert to model names')
60     ap.add_argument(
61         'starting_dir',
62         type=dir_path,
63         help='Root of tree containing architecture directories containing json files'
64     )
65     args = ap.parse_args()
66
67     archs = find_archs(args.starting_dir, args.arch)
68     mapfiles = find_mapfiles(args.starting_dir, archs)
69     models = find_cpuids(mapfiles, args.cpuid)
70     print(','.join(models))
71
72 if __name__ == '__main__':
73     main()
This page took 0.033522 seconds and 4 git commands to generate.