renamed initialization functions of virtio devices to open instead of init.
[barrelfish] / usr / drivers / xeon_phi / main.c
1 /**
2  * \file
3  * \brief Driver for booting the Xeon Phi Coprocessor card on a Barrelfish Host
4  */
5
6 /*
7  * Copyright (c) 2014 ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include <stdio.h>
16 #include <string.h>
17 #include <barrelfish/barrelfish.h>
18
19 #include <pci/pci.h>
20
21 #include <xeon_phi/xeon_phi_manager_client.h>
22 #include <xeon_phi/xeon_phi_messaging.h>
23
24 #include "xeon_phi.h"
25 #include "smpt.h"
26 #include "service.h"
27 #include "messaging.h"
28 #include "sysmem_caps.h"
29
30 volatile uint32_t bootstrap_done = 0;
31
32 struct xeon_phi xphi;
33
34 struct xeon_phi_messaging_cb msg_cb = {
35     .open_iface = messaging_send_open,
36     .spawn = messaging_send_spawn
37 };
38
39 int main(int argc,
40          char *argv[])
41 {
42     errval_t err;
43     debug_printf("Xeon Phi host module started.\n");
44
45     uint32_t vendor_id, device_id;
46     uint32_t bus = PCI_DONT_CARE,  dev = PCI_DONT_CARE, fun = PCI_DONT_CARE;
47
48     if (argc > 1) {
49         uint32_t parsed = sscanf(argv[argc-1], "%x:%x:%x:%x:%x",
50                                  &vendor_id, &device_id,
51                                  &bus, &dev, &fun);
52         if (parsed != 5) {
53             debug_printf("WARNING: parsing cmdline argument failed. >"
54                             "Switching back to unknown PCI address [0,0,0]");
55             bus = PCI_DONT_CARE;
56             dev = PCI_DONT_CARE;
57             fun = PCI_DONT_CARE;
58         } else {
59             if (vendor_id != 0x8086 || ((device_id & 0xFFF0) != 0x2250)) {
60                 debug_printf("ERROR: Unexpected vendor / device ID"
61                                 "was: [%x, %x] expected: [%x, %x]",
62                                 vendor_id, (device_id & 0xFF00), 0x8086, 0x2500);
63                 return -1;
64             }
65             debug_printf("WARNING: Initializing Xeon Phi with PCI address "
66                                  "[%u,%u,%u]\n", bus, dev, fun);
67         }
68     } else {
69         debug_printf("WARNING: Initializing Xeon Phi with unknown PCI address "
70                      "[0,0,0]\n");
71     }
72
73     xphi.is_client = 0x0;
74
75 #if 0
76     err = host_bootstrap();
77     if (err_is_fail(err)) {
78         USER_PANIC_ERR(err, "could not do the host bootstrap\n");
79     }
80
81
82     while (bootstrap_done == 0) {
83         messages_wait_and_handle_next();
84     }
85 #endif
86     err = service_init(&xphi);
87     if (err_is_fail(err)) {
88         USER_PANIC_ERR(err, "could not start the driver service\n");
89     }
90
91     uint8_t num;
92     iref_t *irefs;
93     err = xeon_phi_manager_client_register(xphi.iref, &xphi.id, &num, &irefs);
94     if (err_is_fail(err)) {
95         USER_PANIC_ERR(err, "could not register with the Xeon Phi manager\n");
96     }
97
98     xphi.state = XEON_PHI_STATE_NULL;
99
100     err = xeon_phi_init(&xphi, bus, dev, fun);
101     if (err_is_fail(err)) {
102         USER_PANIC_ERR(err, "could not do the card initialization\n");
103     }
104
105     err = xeon_phi_boot(&xphi, XEON_PHI_BOOTLOADER, XEON_PHI_MULTIBOOT);
106     if (err_is_fail(err)) {
107         USER_PANIC_ERR(err, "could not boot the card\n");
108     }
109
110     err = service_register(&xphi, irefs, num);
111     if (err_is_fail(err)) {
112         USER_PANIC_ERR(err, "could not register with the other drivers");
113     }
114
115     err = xeon_phi_messaging_service_init(&msg_cb);
116     if (err_is_fail(err)) {
117         USER_PANIC_ERR(err, "could not initialize the messaging service");
118     }
119
120     err = xeon_phi_messaging_service_start_phi(xphi.id);
121     if (err_is_fail(err)) {
122         USER_PANIC_ERR(err, "could not export the service");
123     }
124
125     service_start(&xphi);
126
127     debug_printf("Xeon Phi host module terminated.\n");
128
129     return 0;
130 }