kaluga: starting net_socket server for each of the cards.
[barrelfish] / usr / kaluga / main.c
1 /**
2  * \file
3  * \brief Device manager for Barrelfish.
4  *
5  * Interacts with the SKB / PCI to start cores, drivers etc.
6  *
7  */
8
9 /*
10  * Copyright (c) 2007-2010, ETH Zurich.
11  * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
12  * All rights reserved.
13  *
14  * This file is distributed under the terms in the attached LICENSE file.
15  * If you do not find this file, copies can be found by writing to:
16  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
17  */
18
19 #include <stdlib.h>
20 #include <stdbool.h>
21 #include <stdio.h>
22 #include <assert.h>
23 #include <string.h>
24 #include <errors/errno.h>
25
26 #include <barrelfish/barrelfish.h>
27 #include <barrelfish/cpu_arch.h>
28 #include <barrelfish/nameservice_client.h>
29
30 #include <if/monitor_defs.h>
31
32 #include <vfs/vfs.h>
33 #include <pci/pci.h> // for pci_addr
34 #include <octopus/octopus.h>
35 #include <thc/thc.h>
36
37 #include <trace/trace.h>
38
39 #include "kaluga.h"
40
41
42 coreid_t my_core_id = 0;  // Core ID
43 uint32_t my_arch_id = 0;  // APIC ID
44 struct pci_address eth0 = {0xff, 0xff, 0xff};
45 size_t cpu_count = 0;
46
47 static void add_start_function_overrides(void)
48 {
49
50     set_start_function("e10k", start_networking);
51     set_start_function("net_sockets_server", start_networking);
52     set_start_function("sfn5122f", start_networking);
53     set_start_function("rtl8029", start_networking);
54     set_start_function("corectrl", start_boot_driver);
55 #ifdef __ARM_ARCH_7A__
56     set_start_function("driverdomain", newstyle_start_function);
57 #endif
58 }
59
60 static void parse_arguments(int argc, char** argv, char ** add_device_db_file, size_t *cpu_count)
61 {
62     for (int i = 1; i < argc; i++) {
63         if (strncmp(argv[i], "apicid=", 7) == 0) {
64             my_arch_id = strtol(argv[i] + 7, NULL, 10);
65         } else if (strncmp(argv[i], "eth0=", 5) == 0) {
66             int parsed = sscanf(argv[i], "eth0=%" SCNu8 ":%" SCNu8 ":%" SCNu8,
67                                 &eth0.bus, &eth0.device, &eth0.function);
68             printf("Kaluga using eth0=%u:%u:%u as network device\n", eth0.bus,
69                          eth0.device, eth0.function);
70             if (parsed != 3) {
71                 eth0.bus = 0xff;
72                 eth0.device = 0xff;
73                 eth0.function = 0xff;
74             }
75         } else if (strcmp(argv[i], "boot") == 0) {
76             // ignored
77         } else if (strncmp(argv[i],"add_device_db=", strlen("add_device_db=")) == 0){
78            *add_device_db_file = argv[i] + strlen("add_device_db=");
79            printf("Kaluga using additional device_db file: %s.\n", *add_device_db_file);
80         } else if (strncmp(argv[i], "cpu_count=", strlen("cpu_count=")) == 0) {
81             sscanf(argv[i], "cpu_count=%zu", cpu_count);
82         }
83     }
84 }
85
86 static inline errval_t wait_for_pci(void)
87 {
88     iref_t iref;
89     return nameservice_blocking_lookup("pci_discovery_done", &iref);
90 }
91
92 int main(int argc, char** argv)
93 {
94     vfs_init();
95     init_environ();
96
97     errval_t err;
98
99     my_core_id = disp_get_core_id();
100     char * add_device_db_file = NULL;
101     parse_arguments(argc, argv, &add_device_db_file, &cpu_count);
102
103     err = oct_init();
104     if (err_is_fail(err)) {
105         USER_PANIC_ERR(err, "Initialize octopus service.");
106     }
107
108     KALUGA_DEBUG("Kaluga: parse boot modules...\n");
109
110     ddomain_controller_init();
111
112     err = init_boot_modules();
113     if (err_is_fail(err)) {
114         USER_PANIC_ERR(err, "Parse boot modules.");
115     }
116
117     add_start_function_overrides();
118
119     err = arch_startup(add_device_db_file);
120     if (err_is_fail(err)) {
121         USER_PANIC_ERR(err, "arch startup");
122     }
123
124     THCFinish();
125     return EXIT_SUCCESS;
126 }