Bugfixes Xeon Phi Driver startup - removed check for boot info - added initialization...
[barrelfish] / usr / drivers / xeon_phi / xeon_phi.h
1 /*
2  * Copyright (c) 2014 ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #ifndef XEON_PHI_H_
11 #define XEON_PHI_H_
12
13 #include <xeon_phi/xeon_phi.h>
14
15 #include "debug.h"
16
17 /*
18  * Common setting values
19  */
20
21 /// the name of the Xeon Phi bootloader image
22 #define XEON_PHI_BOOTLOADER "/weever"
23
24 /// the name of the Xeon Phi multiboot image containint the modules
25 #define XEON_PHI_MULTIBOOT "/xeon_phi_multiboot"
26
27 /// if we use MSIX interrupts or legacy interrupts
28 #define XEON_PHI_MSIX_ENABLED 1
29
30 /// the number of MSIX interrupts we use
31 #define XEON_PHI_MSIX_NUM     1
32
33 #define XEON_PHI_APERTURE_INIT_SIZE (1024*1024*1024)
34
35 /*
36  * This defines are used to reference the MMIO registers on the host side.
37  *
38  * The Mackerel Specifications use the SBOX or DBOX baseaddress as their
39  * register base. however the SBOX or DBOX have a certain offset into the
40  * MMIO range.
41  */
42 #define XEON_PHI_HOST_DBOX_OFFSET      0x00000000
43 #define XEON_PHI_HOST_SBOX_OFFSET      0x00010000
44
45 #define XEON_PHI_MMIO_TO_SBOX(phi) \
46     ((mackerel_addr_t)((lvaddr_t)(phi->mmio.vbase)+XEON_PHI_HOST_SBOX_OFFSET))
47 #define XEON_PHI_MMIO_TO_DBOX(phi) \
48     ((mackerel_addr_t)((lvaddr_t)(phi->mmio.vbase)+XEON_PHI_HOST_DBOX_OFFSET))
49
50 /*
51  * --------------------------------------------------------------------------
52  * Xeon Phi Management structure
53  */
54
55 /// represents the state of the Xeon Phi
56 typedef enum xeon_phi_state
57 {
58     XEON_PHI_STATE_NULL,    ///< The card has not yet been initialized
59     XEON_PHI_STATE_PCI_OK,  ///< The card has been registered with PCI
60     XEON_PHI_STATE_RESET,   ///< The card has been reset
61     XEON_PHI_STATE_READY,   ///< The card is ready to load the os
62     XEON_PHI_STATE_BOOTING,  ///< The card is in the booting state
63     XEON_PHI_STATE_ONLINE   ///< the card has booted and is online
64 } xeon_phi_state_t;
65
66 typedef enum xnode_state {
67     XNODE_STATE_NONE,
68     XNODE_STATE_REGISTERING,
69     XNODE_STATE_READY,
70     XNODE_STATE_FAILURE
71 } xnode_state_t;
72
73 /// represents the memory ranges occupied by the Xeon Phi card
74 struct mbar
75 {
76     lvaddr_t vbase;     ///< virtual address of the mbar if mapped
77     lpaddr_t pbase;     ///< physical address of the mbar
78     size_t length;      ///< length of the mapped area
79     struct capref cap;  ///< capability of the mbar
80     uint8_t bits;       ///< size of the capability in bits
81 };
82
83 struct xnode
84 {
85     struct xeon_phi_binding *binding;
86     iref_t                   iref;
87     xnode_state_t state;
88     uint8_t         id;
89     struct xeon_phi *local;
90 };
91
92 struct xeon_phi
93 {
94     xeon_phi_state_t state;
95     struct mbar mmio;       ///< pointer to the MMIO address range
96     struct mbar apt;        ///< pointer to the aperture address range
97
98     lvaddr_t os_offset;     ///< offset of the OS image into the aperture
99     uint32_t os_size;       ///< the size of the OS image
100     char *cmdline;          ///< pointer to the bootloader cmdline
101     uint32_t cmdlen;     ///< the length of the cmd line
102
103     uint8_t id;             ///< card id for identifying the card
104     iref_t iref;
105     uint32_t apicid;        ///< APIC id used for sending the boot interrupt
106
107     uint8_t      connected;
108     struct xnode topology[XEON_PHI_NUM_MAX];
109
110     uint8_t is_client;
111
112     struct smpt_info *smpt;  ///< pointer to the SMPT information struct
113     struct irq_info *irq;  ///< pointer to the IRQ information struct
114     struct dma_info *dma;  ///< pointer to the DMA information struct
115     struct msg_info *msg;
116 };
117
118 /**
119  * \brief starts the serial receive thread
120  *
121  * \param phi   pointer to the card information
122  */
123 errval_t xeon_phi_serial_start_recv_thread(struct xeon_phi *phi);
124
125 /**
126  * \brief initializes the serial receiver
127  *
128  * \param phi   pointer to the card information
129  */
130 errval_t xeon_phi_serial_init(struct xeon_phi *phi);
131
132 /**
133  * \brief checks if there is a message waiting on the serial and reads
134  *        it into the buffer.
135  *
136  * \return 0: There was no message
137  *         1: There was a message waiting and it porocessed.
138  */
139 uint32_t xeon_phi_serial_handle_recv(void);
140
141 /**
142  * \brief boots the card with the given loader and multiboot image
143  *
144  * \param phi           pointer to the card information
145  * \param xloader_img   pointer to the card bootloader image
146  * \param multiboot_img pointer to the card multiboot image
147  */
148 errval_t xeon_phi_boot(struct xeon_phi *phi,
149                        char *xloader_img,
150                        char *multiboot_img);
151
152 /**
153  * \brief performs a soft reset of the card
154  *
155  * \param phi   pointer to the card information
156  */
157 errval_t xeon_phi_reset(struct xeon_phi *phi);
158
159 /**
160  * \brief initializes the coprocessor card
161  *
162  * \param phi pointer to the information structure
163  */
164 errval_t xeon_phi_init(struct xeon_phi *phi, uint32_t bus, uint32_t dev, uint32_t fun);
165
166 /**
167  * \brief Bootstraps the host driver to get the multiboot images of the
168  *        xeon phi loader and the xeon phi multiboot image
169  */
170 errval_t host_bootstrap(void);
171
172
173 /**
174  * \brief maps the aperture memory range of the Xeon Phi into the drivers
175  *        vspace to be able to load the coprocessor OS onto the card
176  *
177  * \param phi   pointer to the Xeon Phi structure holding aperture information
178  * \param range how much bytes to map
179  *
180  * \returns SYS_ERR_OK on success
181  */
182 errval_t xeon_phi_map_aperture(struct xeon_phi *phi,
183                                size_t range);
184
185 /**
186  * \brief unmaps the previously mapped aperture range when the programming
187  *        completes.
188  *
189  * \param phi pointer to the Xeon Phi structure holiding mapping information
190  *
191  * \return SYS_ERR_OK on success
192  */
193 errval_t xeon_phi_unmap_aperture(struct xeon_phi *phi);
194
195
196 #endif /* XEON_PHI_H_ */