/'
 ' Copyright (c) 2021, Arm Limited. All rights reserved.
 '
 ' SPDX-License-Identifier: BSD-3-Clause
 '/

/'
TF-A SPMC Data Flow Diagram
'/

@startuml
digraph tfa_dfd {

    # Allow arrows to end on cluster boundaries
    compound=true

    # Default settings for edges and nodes
    edge [minlen=2 color="#8c1b07"]
    node [fillcolor="#ffb866" style=filled shape=box fixedsize=true width=1.6 height=0.7]

    # Nodes outside of the trust boundary
    nsec [label="NS Client"]
    ddr  [label="External memory (DDR)"]

    # Trust boundary cluster
    subgraph cluster_trusted {
        graph [style=dashed color="#f22430"]

        # HW IPs cluster
        subgraph cluster_ip {
            label ="Hardware IPs";
            graph [style=filled color="#000000" fillcolor="#ffd29e"]

            rank="same"
            gic [label="GIC" width=1.2 height=0.5]
            smmu [label="SMMU" width=1.2 height=0.5]
            uart [label="UART" width=1.2 height=0.5]
	    pe [label="PE" width=1.2 height=0.5]
        }

        # TF-A cluster
        subgraph cluster_tfa {
            label ="EL3 monitor";
            graph [style=filled color="#000000" fillcolor="#faf9cd"]

            bl31 [label="BL31" fillcolor="#ddffb3"];
            spmd [label="SPMD" fillcolor="#ddffb3" height=1]
        }

        # SPMC cluster
        subgraph cluster_spmc {
            label ="SPMC";
            graph [style=filled color="#000000" fillcolor="#faf9cd"]

            spmc [label="SPMC" fillcolor="#ddffb3" height=1]
        }
	bl2 [label="BL2" width=1.2 height=0.5]
    }

    # Secure Partitions cluster
    subgraph cluster_sp {
        label ="Secure Partitions";
        graph [style=filled color="#000000" fillcolor="#faf9cd"]

        sp1 [label="SP1" fillcolor="#ddffb3" height=1]
        sp2 [label="SP2" fillcolor="#ddffb3" height=1]
        spn [label="SP..." fillcolor="#ddffb3" height=1]
    }

    # Interactions between nodes
    sp1 -> spmc [dir="both" label="DF1"]
    spmc -> spmd [dir="both" label="DF2"]
    spmd -> nsec [dir="both" label="DF3"]
    sp1 -> sp2 [dir="both" label="DF4"]
    spmc -> smmu [lhead=cluster_spmc label="DF5"]
    bl2 -> spmc [lhead=cluster_spmc label="DF6"]
    bl2 -> spn [lhead=cluster_spmc label="DF6"]
    sp1 -> ddr [dir="both"  label="DF7"]
    spmc -> ddr [dir="both"  label="DF7"]
}

@enduml
