1bfad0948SLuca Vizzarro# SPDX-License-Identifier: BSD-3-Clause 2bfad0948SLuca Vizzarro# Copyright(c) 2024 Arm Limited 3bfad0948SLuca Vizzarro 4bfad0948SLuca Vizzarro"""Base interactive shell for DPDK applications. 5bfad0948SLuca Vizzarro 6bfad0948SLuca VizzarroProvides a base class to create interactive shells based on DPDK. 7bfad0948SLuca Vizzarro""" 8bfad0948SLuca Vizzarro 9bfad0948SLuca Vizzarro 10bfad0948SLuca Vizzarrofrom abc import ABC 11bfad0948SLuca Vizzarrofrom pathlib import PurePath 12bfad0948SLuca Vizzarro 13bfad0948SLuca Vizzarrofrom framework.params.eal import EalParams 142b648cd4SJeremy Spewockfrom framework.remote_session.single_active_interactive_shell import ( 152b648cd4SJeremy Spewock SingleActiveInteractiveShell, 162b648cd4SJeremy Spewock) 17bfad0948SLuca Vizzarrofrom framework.settings import SETTINGS 18bfad0948SLuca Vizzarrofrom framework.testbed_model.cpu import LogicalCoreCount, LogicalCoreList 19bfad0948SLuca Vizzarrofrom framework.testbed_model.sut_node import SutNode 20bfad0948SLuca Vizzarro 21bfad0948SLuca Vizzarro 22bfad0948SLuca Vizzarrodef compute_eal_params( 23bfad0948SLuca Vizzarro sut_node: SutNode, 24bfad0948SLuca Vizzarro params: EalParams | None = None, 25bfad0948SLuca Vizzarro lcore_filter_specifier: LogicalCoreCount | LogicalCoreList = LogicalCoreCount(), 26bfad0948SLuca Vizzarro ascending_cores: bool = True, 27bfad0948SLuca Vizzarro append_prefix_timestamp: bool = True, 28bfad0948SLuca Vizzarro) -> EalParams: 29bfad0948SLuca Vizzarro """Compute EAL parameters based on the node's specifications. 30bfad0948SLuca Vizzarro 31bfad0948SLuca Vizzarro Args: 32bfad0948SLuca Vizzarro sut_node: The SUT node to compute the values for. 33bfad0948SLuca Vizzarro params: If :data:`None`, a new object is created and returned. Otherwise `params.lcore_list` 34bfad0948SLuca Vizzarro is modified according to `lcore_filter_specifier`. A DPDK file prefix is also added. If 35bfad0948SLuca Vizzarro `params.ports` is :data:`None`, then `sut_node.ports` is assigned to it. 36bfad0948SLuca Vizzarro lcore_filter_specifier: A number of lcores/cores/sockets to use or a list of lcore ids to 37bfad0948SLuca Vizzarro use. The default will select one lcore for each of two cores on one socket, in ascending 38bfad0948SLuca Vizzarro order of core ids. 39bfad0948SLuca Vizzarro ascending_cores: Sort cores in ascending order (lowest to highest IDs). If :data:`False`, 40bfad0948SLuca Vizzarro sort in descending order. 41bfad0948SLuca Vizzarro append_prefix_timestamp: If :data:`True`, will append a timestamp to DPDK file prefix. 42bfad0948SLuca Vizzarro """ 43bfad0948SLuca Vizzarro if params is None: 44bfad0948SLuca Vizzarro params = EalParams() 45bfad0948SLuca Vizzarro 46bfad0948SLuca Vizzarro if params.lcore_list is None: 47bfad0948SLuca Vizzarro params.lcore_list = LogicalCoreList( 48bfad0948SLuca Vizzarro sut_node.filter_lcores(lcore_filter_specifier, ascending_cores) 49bfad0948SLuca Vizzarro ) 50bfad0948SLuca Vizzarro 51bfad0948SLuca Vizzarro prefix = params.prefix 52bfad0948SLuca Vizzarro if append_prefix_timestamp: 53bfad0948SLuca Vizzarro prefix = f"{prefix}_{sut_node.dpdk_timestamp}" 54bfad0948SLuca Vizzarro prefix = sut_node.main_session.get_dpdk_file_prefix(prefix) 55bfad0948SLuca Vizzarro if prefix: 56bfad0948SLuca Vizzarro sut_node.dpdk_prefix_list.append(prefix) 57bfad0948SLuca Vizzarro params.prefix = prefix 58bfad0948SLuca Vizzarro 59*0264e408SLuca Vizzarro if params.allowed_ports is None: 60*0264e408SLuca Vizzarro params.allowed_ports = sut_node.ports 61bfad0948SLuca Vizzarro 62bfad0948SLuca Vizzarro return params 63bfad0948SLuca Vizzarro 64bfad0948SLuca Vizzarro 652b648cd4SJeremy Spewockclass DPDKShell(SingleActiveInteractiveShell, ABC): 66bfad0948SLuca Vizzarro """The base class for managing DPDK-based interactive shells. 67bfad0948SLuca Vizzarro 68bfad0948SLuca Vizzarro This class shouldn't be instantiated directly, but instead be extended. 69bfad0948SLuca Vizzarro It automatically injects computed EAL parameters based on the node in the 70bfad0948SLuca Vizzarro supplied app parameters. 71bfad0948SLuca Vizzarro """ 72bfad0948SLuca Vizzarro 73bfad0948SLuca Vizzarro _node: SutNode 74bfad0948SLuca Vizzarro _app_params: EalParams 75bfad0948SLuca Vizzarro 76bfad0948SLuca Vizzarro def __init__( 77bfad0948SLuca Vizzarro self, 78bfad0948SLuca Vizzarro node: SutNode, 79bfad0948SLuca Vizzarro privileged: bool = True, 80bfad0948SLuca Vizzarro timeout: float = SETTINGS.timeout, 81bfad0948SLuca Vizzarro lcore_filter_specifier: LogicalCoreCount | LogicalCoreList = LogicalCoreCount(), 82bfad0948SLuca Vizzarro ascending_cores: bool = True, 83bfad0948SLuca Vizzarro append_prefix_timestamp: bool = True, 84bfad0948SLuca Vizzarro app_params: EalParams = EalParams(), 8565a1b4e8SJeremy Spewock name: str | None = None, 86bfad0948SLuca Vizzarro ) -> None: 87bfad0948SLuca Vizzarro """Extends :meth:`~.interactive_shell.InteractiveShell.__init__`. 88bfad0948SLuca Vizzarro 89bfad0948SLuca Vizzarro Adds the `lcore_filter_specifier`, `ascending_cores` and `append_prefix_timestamp` arguments 90bfad0948SLuca Vizzarro which are then used to compute the EAL parameters based on the node's configuration. 91bfad0948SLuca Vizzarro """ 92bfad0948SLuca Vizzarro app_params = compute_eal_params( 93bfad0948SLuca Vizzarro node, 94bfad0948SLuca Vizzarro app_params, 95bfad0948SLuca Vizzarro lcore_filter_specifier, 96bfad0948SLuca Vizzarro ascending_cores, 97bfad0948SLuca Vizzarro append_prefix_timestamp, 98bfad0948SLuca Vizzarro ) 99bfad0948SLuca Vizzarro 10065a1b4e8SJeremy Spewock super().__init__(node, privileged, timeout, app_params, name) 101bfad0948SLuca Vizzarro 102bfad0948SLuca Vizzarro def _update_real_path(self, path: PurePath) -> None: 103bfad0948SLuca Vizzarro """Extends :meth:`~.interactive_shell.InteractiveShell._update_real_path`. 104bfad0948SLuca Vizzarro 105bfad0948SLuca Vizzarro Adds the remote DPDK build directory to the path. 106bfad0948SLuca Vizzarro """ 107f9957667STomáš Ďurovec super()._update_real_path(PurePath(self._node.remote_dpdk_build_dir).joinpath(path)) 108