/*
 * Copyright 2019, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

import <std_connector.camkes>;
import <global-connectors.camkes>;
import <Ethdriver/Ethdriver.camkes>;
import <PicoServer/PicoServer.camkes>;
import <TimeServer/TimeServer.camkes>;
#include <camkes-picotcp-base.h>

component Echo {
    control;

    uses PicoControl echo_control;
    uses PicoRecv echo_recv;
    uses PicoSend echo_send;

    /* This field is exclusive to this application and not necessary elsewhere */
    attribute string ip_addr;
}

component Listener {
    control;

    uses PicoControl listener_control;
    uses PicoRecv listener_recv;
    uses PicoSend listener_send;

    /* This field is exclusive to this application and not necessary elsewhere */
    attribute string ip_addr;
}

assembly {
    composition {
        /* Echo component */
        component Echo echo;

        /* Listener component */
        component Listener listener;

        /* PicoServer component */
        component PicoServer picoserver;

        /* Ethdriver component */
#ifdef KernelArchArm
        component EthdriverARMPlat ethdriver;
#endif /* KernelArchArm */
#ifdef KernelArchX86
        component Ethdriver82574 ethdriver;
        component HWEthDriver82574 hwethdriver;
#endif /* KernelArchX86 */

        /* Timer component */
        component TimeServer time_server;

        /*
         * Connections
         */

#ifdef KernelArchX86
        connection seL4HardwareMMIO ethdrivermmio(from ethdriver.EthDriver, to hwethdriver.mmio);
        connection seL4HardwareInterrupt hwethirq(from hwethdriver.irq, to ethdriver.irq);
#endif /* KernelArchX86 */
        picotcp_base_connections(picoserver, pico_base, time_server.the_timer)

        /* Driver to PicoServer */
        connection seL4Ethdriver eth_driver_conn(from picoserver.ethdriver, to ethdriver.client);

        /* PicoServer to Echo */
        connection seL4PicoServerSignal echo_server_control(from echo.echo_control, to picoserver.pico_control);
        connection seL4PicoServer echo_server_recv(from echo.echo_recv, to picoserver.pico_recv);
        connection seL4PicoServer echo_server_send(from echo.echo_send, to picoserver.pico_send);

        /* PicoServer to Listener */
        connection seL4PicoServerSignal listener_server_control(from listener.listener_control, to picoserver.pico_control);
        connection seL4PicoServer listener_server_recv(from listener.listener_recv, to picoserver.pico_recv);
        connection seL4PicoServer listener_server_send(from listener.listener_send, to picoserver.pico_send);
    }

    configuration {

        /*
         * Non-platform specific configurations
         */

        /* Ethernet driver configuration */
        ethdriver.simple = true;
        ethdriver.cnode_size_bits = 12;
        ethdriver.simple_untyped20_pool = 2;
        ethdriver.heap_size = 0x10000;
        ethdriver.dma_pool = 0x200000;

        time_server.timers_per_client = 8;

        /*
         * Echo config
         */

        /*
         * The attributes of the *_(control/send/recv) interfaces should be the same and unique between
         * different components, this determines the client ID of this component with respect to
         * the PicoServer component
         */
        echo.echo_control_attributes = "1";
        echo.echo_recv_attributes = "1";
        echo.echo_recv_shmem_size = 0x1000;
        echo.echo_send_attributes = "1";
        echo.echo_send_shmem_size = 0x1000;
        echo.ip_addr = PICOSERVER_IP_ADDR;

        /*
         * Listener config
         */
        listener.listener_control_attributes = "2";
        listener.listener_recv_attributes = "2";
        listener.listener_recv_shmem_size = 0x1000;
        listener.listener_send_attributes = "2";
        listener.listener_send_shmem_size = 0x1000;
        listener.ip_addr = PICOSERVER_IP_ADDR;

        /*
         * PicoServer config
         */
        /* IP and multicast address to assign to the networking device */
        picotcp_base_configuration(picoserver, pico_base, PICOSERVER_IP_ADDR, "0.0.0.0")

        picoserver.ethdriver_shmem_size = 0x1000;
        picoserver.heap_size = 0x40000;

        /*
         * Platform specific configurations. Depending on the system or board, you will need
         * to modify these configurations accordingly.
         */

        /* x86 */

#ifdef KernelArchX86
        /* Ethernet card configuration */
        hwethdriver.mmio_paddr = 0xf7f00000;
        hwethdriver.mmio_size = 0x20000;
        hwethdriver.irq_irq_type = "pci";
        hwethdriver.irq_irq_ioapic = 0;
        hwethdriver.irq_irq_ioapic_pin = 20;
        hwethdriver.irq_irq_vector = 20;

        /* Ethernet driver configuration */
        ethdriver.iospaces = "0x12:0x0:0x19:0";
        ethdriver.iospace_id = 0x12;
        ethdriver.pci_bdf = "0:0x19.0";
#endif /* KernelArchX86 */

        /* ARM */

#ifdef KernelArchArm
        /* Ethernet driver configuration */
        ethdriver.promiscuous_mode = 0;
#endif /* KernelArchArm */
    }
}
