diff --git a/misc/config_tools/board_inspector/board_inspector.py b/misc/config_tools/board_inspector/board_inspector.py index 8c6562f31..1757de2f8 100755 --- a/misc/config_tools/board_inspector/board_inspector.py +++ b/misc/config_tools/board_inspector/board_inspector.py @@ -6,10 +6,12 @@ # import sys, os +import re import logging import subprocess # nosec import lxml.etree import argparse +from collections import namedtuple from importlib import import_module from cpuparser import parse_cpuid, get_online_cpu_ids, get_offline_cpu_ids @@ -18,6 +20,20 @@ sys.path.append(os.path.join(script_dir)) from inspectorlib import validator +class AddLLCCATAction(argparse.Action): + CATInfo = namedtuple("CATInfo", ["capacity_mask_length", "clos_number", "has_CDP"]) + + def __call__(self, parser, namespace, values, option_string=None): + pattern = re.compile("([0-9]+),([0-9]+),(true|false|y|n|yes|no)") + if option_string: + m = pattern.match(values.lower()) + if not m: + parser.error(f"{values} is ill-formed. The expected format is: ,,") + v = self.CATInfo(int(m.group(1)), int(m.group(2)), m.group(3) in ["true", "y", "yes"]) + else: + v = None + setattr(namespace, self.dest, v) + def check_deps(): # Check that the required tools are installed on the system BIN_LIST = ['cpuid', 'rdmsr', 'lspci', ' dmidecode', 'blkid', 'stty'] @@ -136,6 +152,8 @@ if __name__ == "__main__": parser.add_argument("--basic", action="store_true", default=False, help="do not extract advanced information such as ACPI namespace") parser.add_argument("--loglevel", default="warning", help="choose log level, e.g. info, warning or error") parser.add_argument("--check-device-status", action="store_true", default=False, help="filter out devices whose _STA object evaluates to 0") + parser.add_argument("--add-llc-cat", default=None, action=AddLLCCATAction, + metavar=",,", help="manually set the Cache Allocation Technology capability of the last level cache") args = parser.parse_args() try: logging.basicConfig(level=args.loglevel.upper()) diff --git a/misc/config_tools/board_inspector/extractors/20-cache.py b/misc/config_tools/board_inspector/extractors/20-cache.py index 1c0466b34..f39ce90cf 100644 --- a/misc/config_tools/board_inspector/extractors/20-cache.py +++ b/misc/config_tools/board_inspector/extractors/20-cache.py @@ -100,3 +100,16 @@ def extract(args, board_etree): caches_node = get_node(board_etree, "//caches") extract_topology(root_node, caches_node) extract_tcc_capabilities(caches_node) + + # Inject the explicitly specified CAT capability if exists + if args.add_llc_cat: + llc_node = get_node(root_node, "//caches/cache[@level='3']") + llc_cat_node = get_node(llc_node, "capability[@id='CAT']") + if llc_cat_node is None: + llc_cat_node = add_child(llc_node, "capability", None, id="CAT") + add_child(llc_cat_node, "capacity_mask_length", str(args.add_llc_cat.capacity_mask_length)) + add_child(llc_cat_node, "clos_number", str(args.add_llc_cat.clos_number)) + if args.add_llc_cat.has_CDP: + add_child(llc_node, "capability", None, id="CDP") + else: + logging.warning("The last level cache already reports CAT capability. The explicit settings from the command line options are ignored.")