xref: /dpdk/dts/framework/remote_session/dpdk_shell.py (revision 0264e4087f9504a2847258c99c4dec0e9c42922e)
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