On Tue, 20 Jan 2026, Oleksii Moisieiev wrote:
> On 19/01/2026 23:12, Stefano Stabellini wrote:
> > On Mon, 19 Jan 2026, Oleksii Moisieiev wrote:
> >> On 16/01/2026 23:21, Stefano Stabellini wrote:
> >>> On Fri, 16 Jan 2026, Oleksii Moisieiev wrote:
> >>>> Hi Stefano,
> >>>> Please see below.
> >>>>
> >>>> On 15/01/2026 03:14, Stefano Stabellini wrote:
> >>>>> Hi Oleksii,
> >>>>>
> >>>>> I am fine with the goals and the strategy to achieve the goals but there
> >>>>> are some finer details that don't make sense to me. I apologize if I am
> >>>>> asking the same questions you have already answered as some time as
> >>>>> passed from the last interaction.
> >>>>>
> >>>>>
> >>>>> On Wed, 14 Jan 2026, Oleksii Moisieiev wrote:
> >>>>>> This patch introduces SCI driver to support for ARM EL3 Trusted
> >>>>>> Firmware-A
> >>>>>> (TF-A) which provides SCMI interface with multi-agent support, as shown
> >>>>>> below.
> >>>>>>
> >>>>>> +-----------------------------------------+
> >>>>>> | |
> >>>>>> | EL3 TF-A SCMI |
> >>>>>> +-------+--+-------+--+-------+--+-------++
> >>>>>> |shmem1 | |shmem0 | |shmem2 | |shmemX |
> >>>>>> +-----+-+ +---+---+ +--+----+ +---+---+
> >>>>>> smc-id1 | | | |
> >>>>>> agent1 | | | |
> >>>>>> +-----v--------+---------+-----------+----+
> >>>>>> | | | | |
> >>>>>> | | | | |
> >>>>>> +--------------+---------+-----------+----+
> >>>>>> smc-id0 | smc-id2| smc-idX|
> >>>>>> agent0 | agent2 | agentX |
> >>>>>> | | |
> >>>>>> +----v---+ +--v-----+ +--v-----+
> >>>>>> | | | | | |
> >>>>>> | Dom0 | | Dom1 | | DomX |
> >>>>>> | | | | | |
> >>>>>> | | | | | |
> >>>>>> +--------+ +--------+ +--------+
> >>>>>>
> >>>>>> The EL3 SCMI multi-agent firmware is expected to provide SCMI SMC
> >>>>>> shared
> >>>>>> memory transport for every Agent in the system.
> >>>>>>
> >>>>>> The SCMI Agent transport channel defined by pair:
> >>>>>> - smc-id: SMC id used for Doorbell
> >>>>>> - shmem: shared memory for messages transfer, Xen page
> >>>>>> aligned. Shared memort is mapped with the following flags:
> >>>>>> MT_DEVICE_nGnRE.
> >>>>>>
> >>>>>> The follwoing SCMI Agents are expected to be defined by SCMI FW to
> >>>>>> enable SCMI
> >>>>>> multi-agent functionality under Xen:
> >>>>>> - Xen management agent: trusted agents that accesses to the Base
> >>>>>> Protocol
> >>>>>> commands to configure agent specific permissions
> >>>>>> - OSPM VM agents: non-trusted agent, one for each Guest domain which is
> >>>>>> allowed direct HW access. At least one OSPM VM agent has to be
> >>>>>> provided
> >>>>>> by FW if HW is handled only by Dom0 or Driver Domain.
> >>>>>>
> >>>>>> The EL3 SCMI FW is expected to implement following Base protocol
> >>>>>> messages:
> >>>>>> - BASE_DISCOVER_AGENT (optional if agent_id was provided)
> >>>>>> - BASE_RESET_AGENT_CONFIGURATION (optional)
> >>>>>> - BASE_SET_DEVICE_PERMISSIONS (optional)
> >>>>>>
> >>>>>> The SCI SCMI SMC multi-agent driver implements following
> >>>>>> functionality:
> >>>>>> - The driver is initialized from the Xen SCMI container
> >>>>>> ``xen_scmi_config``
> >>>>>> (compatible ``xen,sci``) placed under ``/chosen/xen``. Only the
> >>>>>> ``arm,scmi-smc`` node that is a child of this container will bind
> >>>>>> to Xen;
> >>>>>> other SCMI nodes (for example under ``/firmware``) are ignored to
> >>>>>> avoid
> >>>>>> stealing the host OSPM instance.
> >>>>>>
> >>>>>> scmi_shm_1: sram@47ff1000 {
> >>>>>> compatible = "arm,scmi-shmem";
> >>>>>> reg = <0x0 0x47ff1000 0x0 0x1000>;
> >>>>>> };
> >>>>>> scmi_xen: scmi {
> >>>>>> compatible = "arm,scmi-smc";
> >>>>>> arm,smc-id = <0x82000003>; <--- Xen management agent smc-id
> >>>>>> #address-cells = < 1>;
> >>>>>> #size-cells = < 0>;
> >>>>>> #access-controller-cells = < 1>;
> >>>>>> shmem = <&scmi_shm_1>; <--- Xen management agent shmem
> >>>>>> };
> >>>>>>
> >>>>>> - The driver obtains Xen specific SCMI Agent's configuration from the
> >>>>>> Host DT, probes Agents and builds SCMI Agents list. The Agents
> >>>>>> configuration is taken from "scmi-secondary-agents" property where
> >>>>>> first item is "arm,smc-id", second - "arm,scmi-shmem" phandle and
> >>>>>> third is optional "agent_id":
> >>>>>>
> >>>>>> / {
> >>>>>> chosen {
> >>>>>> xen {
> >>>>>> ranges;
> >>>>>> xen_scmi_config {
> >>>>>> compatible = "xen,sci";
> >>>>>> #address-cells = <2>;
> >>>>>> #size-cells = <2>;
> >>>>>> ranges;
> >>>>>>
> >>>>>> scmi_shm_0: sram@47ff0000 {
> >>>>>> compatible = "arm,scmi-shmem";
> >>>>>> reg = <0x0 0x47ff0000 0x0 0x1000>;
> >>>>>> };
> >>>>>>
> >>>>>> /* Xen SCMI management channel */
> >>>>>> scmi_shm_1: sram@47ff1000 {
> >>>>>> compatible = "arm,scmi-shmem";
> >>>>>> reg = <0x0 0x47ff1000 0x0 0x1000>;
> >>>>>> };
> >>>>>>
> >>>>>> scmi_shm_2: sram@47ff2000 {
> >>>>>> compatible = "arm,scmi-shmem";
> >>>>>> reg = <0x0 0x47ff2000 0x0 0x1000>;
> >>>>>> };
> >>>>>>
> >>>>>> scmi_shm_3: sram@47ff3000 {
> >>>>>> compatible = "arm,scmi-shmem";
> >>>>>> reg = <0x0 0x47ff3000 0x0 0x1000>;
> >>>>>> };
> >>>>>>
> >>>>>> scmi-secondary-agents = <
> >>>>>> 0x82000002 &scmi_shm_0 0
> >>>>> 0x82000002 is the same func_id as...
> >>>>>
> >>>>>
> >>>>>> 0x82000004 &scmi_shm_2 2
> >>>>>> 0x82000005 &scmi_shm_3 3>; <--- func_id, shmem, agent_id
> >>>>>> #scmi-secondary-agents-cells = <3>;
> >>>>>>
> >>>>>> scmi_xen: scmi {
> >>>>>> compatible = "arm,scmi-smc";
> >>>>>> arm,smc-id = <0x82000002>; <--- Xen management agent
> >>>>>> func_id
> >>>>> as the one used for Xen. This cannot be right?
> >>>>>
> >>>> That's right. Here should be 0x82000003.
> >>>>>> #address-cells = <1>;
> >>>>>> #size-cells = <0>;
> >>>>>> #access-controller-cells = <1>;
> >>>>>> shmem = <&scmi_shm_1>; <--- Xen management agent shmem
> >>>>>> };
> >>>>>> };
> >>>>>> };
> >>>>>> };
> >>>>>> };
> >>>>>>
> >>>>>> / {
> >>>>>> /*
> >>>>>> * Host SCMI OSPM channel - provided to the Dom0 as is if SCMI
> >>>>>> * enabled for it, ignored by Xen multi-agent mediator
> >>>>>> */
> >>>>>> scmi_shm: sram@47ff0000 {
> >>>>>> compatible = "arm,scmi-shmem";
> >>>>>> reg = <0x0 0x47ff0000 0x0 0x1000>;
> >>>>>> };
> >>>>> this is the same as &scmi_shm_0 which I guess is intended?
> >>>>>
> >>>> it is. to match Host DT.
> >>>>>> firmware {
> >>>>>> scmi: scmi {
> >>>>>> compatible = "arm,scmi-smc";
> >>>>>> arm,smc-id = <0x82000002>; <--- Host OSPM agent smc-id
> >>>>> but this again is the same smc-id meant to be used by Xen.
> >>>>>
> >>>>> If 0x82000002 is the privileged interface, then it is OK for Xen and
> >>>>> also baremetal Linux to use it, but Linux Dom0 should not be using it?
> >>>>> Or is the smc-id interchangeable and not necessarily tied to the
> >>>>> agent-id?
> >>>>>
> >>>>> I think either way this detail should be clarified in the docs. Speaking
> >>>>> of docs, the next patch introducing the doc is not up-to-date with this
> >>>>> patch.
> >>>>>
> >>>> In my current configuration, I have the following setup:
> >>>>
> >>>> The Xen privileged interface operates through func_id 0x82000003.
> >>>> func_id 0x82000002 is used for Domain-0, in order to keep the Device
> >>>> Tree (DT) consistent between Xen and bare-metal configurations.
> >>>> I am unsure how best to document this, since the implementation does
> >>>> not strictly require this specific configuration and allows flexibility
> >>>> for the
> >>>> end user. My intention is to provide an example configuration in the DT
> >>>> examples that is most likely to be used as a reference for real-world
> >>>> setups.
> >>> Yes, I am aligned with that
> >>>
> >>>
> >>>> At this stage, I believe the most appropriate approach is to include a
> >>>> note
> >>>> in the documentation stating that the examples illustrate a configuration
> >>>> that aligns well with the Xen architecture, but other configurations are
> >>>> possible depending on user requirements.
> >>> Yes. The important detail is to explain that the same configuration
> >>> works for both Linux baremetal and Linux Dom0. In the Linux Dom0 case,
> >>> the privileged SCMI connection differs from the one of Linux Dom0 and it
> >>> is the one used by Xen.
> >>>
> >>> Baremetal Linux: func_id 0x82000002, scmi-shmem 0x47ff0000
> >>> Dom0 Linux: func_id 0x82000002, scmi-shmem 0x47ff0000
> >>> Xen: func_id 0x82000003, scmi-shmem 0x47ff1000
> >>>
> >>> This works because, I am guessing, the privileged SCMI connection is not
> >>> tied to func_id 0x82000002, scmi-shmem 0x47ff0000.
> >>>
> >>> The problem occurs when there can be only one privileged SCMI connection
> >>> and it is tied to func_id 0x82000002, scmi-shmem 0x47ff0000 which is the
> >>> one described in the Host DT. In which case, Linux Dom0 ends up with the
> >>> privileged connection, not Xen.
> >>>
> >>> I think we should explain why this problem does not occur.
> >>>
> >>>
> >>>>>> #address-cells = < 1>;
> >>>>>> #size-cells = < 0>;
> >>>>>> shmem = <&scmi_shm>; <--- Host OSPM agent shmem
> >>>>>>
> >>>>>> protocol@X{
> >>>>>> };
> >>>>>> };
> >>>>>> };
> >>>>>> };
> >>>>>>
> >>>>>> This approach allows defining multiple SCMI Agents by adding
> >>>>>> Xen-specific properties under the ``/chosen`` node to the Host Device
> >>>>>> Tree, leaving the main part unchanged. The Host DT SCMI channel will
> >>>>>> be passed to Dom0.
> >>>>>>
> >>>>>> The Xen management agent is described as a ``scmi_xen`` node under the
> >>>>>> ``xen,sci`` comaptible node, which is used by Xen to control other
> >>>>>> SCMI Agents in the system.
> >>>>>>
> >>>>>> All secondary agents' configurations are provided in the
> >>>>>> ``scmi-secondary-agents`` property with an optional ``agent_id`` field.
> >>>>>>
> >>>>>> The ``agent_id`` from the ``scmi-secondary-agents`` property is used
> >>>>>> to identify the agent in the system and can be omitted by setting
> >>>>>> ``#scmi-secondary-agents-cells = <2>``, so the Secondary Agents
> >>>>>> configuration will look like this:
> >>>>>>
> >>>>>> / {
> >>>>>> chosen {
> >>>>>> xen {
> >>>>>> xen_scmi_config {
> >>>>>> compatible = "xen,sci";
> >>>>>> #address-cells = <2>;
> >>>>>> #size-cells = <2>;
> >>>>>> ranges;
> >>>>>>
> >>>>>> /* Shared memory nodes as defined earlier */
> >>>>>>
> >>>>>> scmi-secondary-agents = <
> >>>>>> 0x82000003 &scmi_shm_0
> >>>>>> 0x82000004 &scmi_shm_2
> >>>>>> 0x82000005 &scmi_shm_3
> >>>>>> 0x82000006 &scmi_shm_4>;
> >>>>>> #scmi-secondary-agents-cells = <2>;
> >>>>>> };
> >>>>>> };
> >>>>>> };
> >>>>>> }
> >>>>>>
> >>>>>> In this case, Xen will use the ``SCMI_BASE_DISCOVER_AGENT`` call to
> >>>>>> discover the ``agent_id`` for each secondary agent. Providing the
> >>>>>> ``agent_id`` in the ``scmi-secondary-agents`` property allows skipping
> >>>>>> the discovery call, which is useful when the secondary agent's shared
> >>>>>> memory is not accessible by Xen or when boot time is important because
> >>>>>> it allows skipping the agent discovery procedure.
> >>>>>>
> >>>>>> Note that Xen is the only one entry in the system which need to
> >>>>>> know
> >>>>>> about SCMI multi-agent support.
> >>>>>>
> >>>>>> - It implements the SCI subsystem interface required for configuring
> >>>>>> and
> >>>>>> enabling SCMI functionality for Dom0/hwdom and Guest domains. To enable
> >>>>>> SCMI functionality for domain it has to be configured with unique
> >>>>>> supported
> >>>>>> SCMI Agent_id and use corresponding SCMI SMC shared memory transport
> >>>>>> [smc-id, shmem] defined for this SCMI Agent_id.
> >>>>>> - Once Xen domain is configured it can communicate with EL3 SCMI FW:
> >>>>>> -- zero-copy, the guest domain puts SCMI message in shmem;
> >>>>>> -- the guest triggers SMC exception with smc-id (doorbell);
> >>>>>> -- the Xen driver catches exception, do checks and synchronously
> >>>>>> forwards
> >>>>>> it to EL3 FW.
> >>>>>> - the Xen driver sends BASE_RESET_AGENT_CONFIGURATION message to Xen
> >>>>>> management agent channel on domain destroy event. This allows to
> >>>>>> reset
> >>>>>> resources used by domain and so implement use-case like domain
> >>>>>> reboot.
> >>>>>>
> >>>>>> Dom0 Enable SCMI SMC:
> >>>>>> - pass dom0_scmi_agent_id=<agent_id> in Xen command line. if not
> >>>>>> provided
> >>>>>> SCMI will be disabled for Dom0 and all SCMI nodes removed from
> >>>>>> Dom0 DT.
> >>>>>> The driver updates Dom0 DT SCMI node "arm,smc-id" value and fix
> >>>>>> up shmem
> >>>>>> node according to assigned agent_id.
> >>>>> Given that everything else, the entire configuration, is based on device
> >>>>> tree, I think it makes sense to also configure this via device tree
> >>>>> instead of a command line.
> >>>>>
> >>>>> This could be another parameter under xen_scmi_config. What do you
> >>>>> think?
> >>>>>
> >>>> The ``dom0_scmi_agent_id`` parameter was introduced to keep the Dom0
> >>>> configuration separate from the xen_scmi_config node, which is intended
> >>>> specifically for Xen SCMI configuration. In my opinion, adding
> >>>> Dom0-specific
> >>>> configuration to xen_scmi_config would mix the purposes of the node and
> >>>> reduce clarity.
> >>>>
> >>>> Additionally, the ``dom0_scmi_agent_id`` parameter is similar to the
> >>>> ``agent_id`` parameter used for arm_sci in xl.cfg. This approach ensures
> >>>> that
> >>>> the Dom0 configuration is as consistent as possible with the
> >>>> configuration for
> >>>> other domains.
> >>>>
> >>>> Overall, I believe this makes the configuration less confusing, as it
> >>>> allows
> >>>> us to set similar parameters for both Dom0 and other domains in a clear
> >>>> and organized manner.
> >>> We are heading in a direction where Dom0 has its own separate domain
> >>> node similarly to other Dom0less domains. Many of these changes have
> >>> already been committed as part of Hardware Domain / Control Domain
> >>> separation work by Jason.
> >>>
> >>> In a world where Dom0, like other DomUs, has its own configuration node
> >>> and also Dom0 can be split between Hardware Domain and Control Domain,
> >>> it doesn't make sense to use Dom0 command line options anymore. It is
> >>> already possible to assign Dom0 "powers" to a dom0less domain for
> >>> example.
> >>>
> >>> I can see it is worth discussing command line options for dom0 in
> >>> situations where Device Tree might not be present (datacenter
> >>> configuration on ACPI system) but in this case where Device Tree changes
> >>> are required, I think it doesn't make sense to add Dom0 command line
> >>> options as they are less flexible and a duplicate of other options we
> >>> must have anyway.
> >> That makes sense to me. Since we are moving to the Dom0 Device Tree
> >> configuration,
> >> I can move ``dom0_scmi_agent_id`` inside the ``xen,sci`` node and rename
> >> it as the
> >> ``agent_id`` property.
> >>
> >> Would you recommend dropping the ``dom0_scmi_agent_id`` command line
> >> parameter
> >> entirely, or should I keep it as a backup option?
> > I would drop the command line parameter entirely
> I would like to add one more observation from my
> implementation experience:
>
> The main difference between Dom0 and dom0less configurations is that,
> for dom0less, we have a separate node for each domain, for example:
>
> Dom0less configuration:
>
> xen,domain@1 {
> compatible = "xen,domain";
> xen,sci_type = "scmi_smc_multiagent";
> xen,sci-agent-id = <2>;
> /* other domain properties here */
> };
>
> However, for Dom0, we only have the following node:
>
> chosen {
> xen {
> ranges;
> xen_scmi_config {
> compatible = "xen,sci";
> ....
> };
> };
> };
>
> which describes the SCI configuration for Xen.
>
> Therefore, I believe that using the property name
> ``agent_id``` could be confusing in this context.
> I suggest naming it xen,dom0-sci-agent-id instead.
>
> The device tree would then look like this:
> chosen {
> xen {
> ranges;
> xen_scmi_config {
> compatible = "xen,sci";
> ....
> xen,dom0-sci-agent-id = <0>; /* Dom0 agent ID */ <-----
> };
> };
> };
>
> Does this approach look good to you?
Yes, it look OK.
It is already possible to create a dom0less device tree node for Dom0,
simply by using capabilities. However, the older device tree bindings
where dom0 doesn't have a node is also still supported and for that it
makes sense to introduce xen,dom0-sci-agent-id.