Bugfixes Xeon Phi Driver startup - removed check for boot info - added initialization...
[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 <vfs/vfs.h>
20 #include <pci/pci.h>
21
22 #include <xeon_phi/xeon_phi_manager_client.h>
23 #include <xeon_phi/xeon_phi_messaging.h>
24
25 #include "xeon_phi.h"
26 #include "smpt.h"
27 #include "service.h"
28 #include "messaging.h"
29 #include "sysmem_caps.h"
30
31 volatile uint32_t bootstrap_done = 0;
32
33 struct xeon_phi xphi;
34
35 struct xeon_phi_messaging_cb msg_cb = {
36     .open_iface = messaging_send_open,
37     .spawn = messaging_send_spawn
38 };
39
40 int main(int argc,
41          char *argv[])
42 {
43     errval_t err;
44     debug_printf("Xeon Phi host module started.\n");
45
46     uint32_t vendor_id, device_id;
47     uint32_t bus = PCI_DONT_CARE,  dev = PCI_DONT_CARE, fun = PCI_DONT_CARE;
48
49     if (argc > 1) {
50         uint32_t parsed = sscanf(argv[argc-1], "%x:%x:%x:%x:%x",
51                                  &vendor_id, &device_id,
52                                  &bus, &dev, &fun);
53         if (parsed != 5) {
54             debug_printf("WARNING: parsing cmdline argument failed. >"
55                             "Switching back to unknown PCI address [0,0,0]");
56             bus = PCI_DONT_CARE;
57             dev = PCI_DONT_CARE;
58             fun = PCI_DONT_CARE;
59         } else {
60             if (vendor_id != 0x8086 || ((device_id & 0xFFF0) != 0x2250)) {
61                 debug_printf("ERROR: Unexpected vendor / device ID"
62                                 "was: [%x, %x] expected: [%x, %x]",
63                                 vendor_id, (device_id & 0xFF00), 0x8086, 0x2500);
64                 return -1;
65             }
66             debug_printf("Initializing Xeon Phi with PCI address "
67                                  "[%u,%u,%u]\n", bus, dev, fun);
68         }
69     } else {
70         debug_printf("WARNING: Initializing Xeon Phi with unknown PCI address "
71                      "[0,0,0]\n");
72     }
73
74     xphi.is_client = 0x0;
75
76 #if 0
77     err = host_bootstrap();
78     if (err_is_fail(err)) {
79         USER_PANIC_ERR(err, "could not do the host bootstrap\n");
80     }
81
82
83     while (bootstrap_done == 0) {
84         messages_wait_and_handle_next();
85     }
86 #endif
87
88     vfs_init();
89
90     err = service_init(&xphi);
91     if (err_is_fail(err)) {
92         USER_PANIC_ERR(err, "could not start the driver service\n");
93     }
94
95     uint8_t num;
96     iref_t *irefs;
97     err = xeon_phi_manager_client_register(xphi.iref, &xphi.id, &num, &irefs);
98     if (err_is_fail(err)) {
99         USER_PANIC_ERR(err, "could not register with the Xeon Phi manager\n");
100     }
101
102     xphi.state = XEON_PHI_STATE_NULL;
103
104     err = xeon_phi_init(&xphi, bus, dev, fun);
105     if (err_is_fail(err)) {
106         USER_PANIC_ERR(err, "could not do the card initialization\n");
107     }
108
109     err = xeon_phi_boot(&xphi, XEON_PHI_BOOTLOADER, XEON_PHI_MULTIBOOT);
110     if (err_is_fail(err)) {
111         USER_PANIC_ERR(err, "could not boot the card\n");
112     }
113
114     err = service_register(&xphi, irefs, num);
115     if (err_is_fail(err)) {
116         USER_PANIC_ERR(err, "could not register with the other drivers");
117     }
118
119     err = xeon_phi_messaging_service_init(&msg_cb);
120     if (err_is_fail(err)) {
121         USER_PANIC_ERR(err, "could not initialize the messaging service");
122     }
123
124     err = xeon_phi_messaging_service_start_phi(xphi.id);
125     if (err_is_fail(err)) {
126         USER_PANIC_ERR(err, "could not export the service");
127     }
128
129     service_start(&xphi);
130
131     debug_printf("Xeon Phi host module terminated.\n");
132
133     return 0;
134 }