Patches b03c1b through 3f00b5
[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 /*
16  * Common setting values
17  */
18
19 /// the name of the Xeon Phi bootloader image
20 #define XEON_PHI_BOOTLOADER "weever"
21
22 /// the name of the Xeon Phi multiboot image containint the modules
23 #define XEON_PHI_MULTIBOOT "xeon_phi_multiboot"
24
25 /// if we use MSIX interrupts or legacy interrupts
26 #define XEON_PHI_MSIX_ENABLED 1
27
28 /// the number of MSIX interrupts we use
29 #define XEON_PHI_MSIX_NUM     1
30
31 /*
32  * Debug output switches
33  */
34 #define XDEBUG_ENABLED  1
35 #define XDEBUG_BOOT     1
36 #define XDEBUG_DMA      1
37 #define XDEBUG_INT      1
38 #define XDEBUG_SMPT     1
39 #define XDEBUG_SERVICE  1
40
41 /*
42  * This defines are used to reference the MMIO registers on the host side.
43  *
44  * The Mackerel Specifications use the SBOX or DBOX baseaddress as their
45  * register base. however the SBOX or DBOX have a certain offset into the
46  * MMIO range.
47  */
48 #define HOST_DBOX_OFFSET      0x00000000
49 #define HOST_SBOX_OFFSET      0x00010000
50
51 #define XEON_PHI_MMIO_TO_SBOX(phi) \
52     ((mackerel_addr_t)((lvaddr_t)(phi->mmio.vbase)+HOST_SBOX_OFFSET))
53 #define XEON_PHI_MMIO_TO_DBOX(phi) \
54     ((mackerel_addr_t)((lvaddr_t)(phi->mmio.vbase)+HOST_DBOX_OFFSET))
55
56 /*
57  * --------------------------------------------------------------------------
58  * Debug output generation
59  */
60 #if XDEBUG_ENABLED
61 #define XDEBUG_PRINT(x...) debug_printf(x)
62 #else
63 #define XDEBUG_PRINT(x... )
64 #endif
65 #if XDEBUG_BOOT
66 #define XBOOT_DEBUG(x...) XDEBUG_PRINT(" BOOT | " x)
67 #else
68 #define XBOOT_DEBUG(x...)
69 #endif
70 #if XDEBUG_DMA
71 #define XDMA_DEBUG(x...) XDEBUG_PRINT(" DMA | " x)
72 #else
73 #define XDMA_DEBUG(x...)
74 #endif
75 #if XDEBUG_INT
76 #define XINT_DEBUG(x...) XDEBUG_PRINT(" INT | " x)
77 #else
78 #define XINT_DEBUG(x...)
79 #endif
80 #if XDEBUG_SMPT
81 #define XSMPT_DEBUG(x...) XDEBUG_PRINT(" SMPT | " x)
82 #else
83 #define XSMPT_DEBUG(x...)
84 #endif
85 #if XDEBUG_SERVICE
86 #define XSERVICE_DEBUG(x...) XDEBUG_PRINT(" SVC | " x)
87 #else
88 #define XSERVICE_DEBUG(x...)
89 #endif
90
91 /*
92  * --------------------------------------------------------------------------
93  * Xeon Phi Management structure
94  */
95
96 /// represents the state of the Xeon Phi
97 typedef enum xeon_phi_state
98 {
99     XEON_PHI_STATE_NULL,    ///< The card has not yet been initialized
100     XEON_PHI_STATE_PCI_OK,  ///< The card has been registered with PCI
101     XEON_PHI_STATE_RESET,   ///< The card has been reset
102     XEON_PHI_STATE_READY,   ///< The card is ready to load the os
103     XEON_PHI_STATE_BOOTING,  ///< The card is in the booting state
104     XEON_PHI_STATE_ONLINE   ///< the card has booted and is online
105 } xeon_phi_state_t;
106
107 typedef enum xnode_state {
108     XNODE_STATE_NONE,
109     XNODE_STATE_REGISTERING,
110     XNODE_STATE_READY,
111     XNODE_STATE_FAILURE
112 } xnode_state_t;
113
114 /// represents the memory ranges occupied by the Xeon Phi card
115 struct mbar
116 {
117     lvaddr_t vbase;
118     lpaddr_t pbase;
119     size_t length;
120     /*
121      * XXX: may it be useful to store the cap here aswell ?
122      */
123 };
124
125 struct xnode
126 {
127     struct xeon_phi_binding *binding;
128     iref_t                   iref;
129     xnode_state_t state;
130     uint8_t         id;
131     struct xeon_phi *local;
132 };
133
134 struct xeon_phi
135 {
136     xeon_phi_state_t state;
137     struct mbar mmio;       ///< pointer to the MMIO address range
138     struct mbar apt;        ///< pointer to the aperture address range
139
140     lvaddr_t os_offset;     ///< offset of the OS image into the aperture
141     uint32_t os_size;       ///< the size of the OS image
142     char *cmdline;          ///< pointer to the bootloader cmdline
143     uint32_t cmdlen;     ///< the length of the cmd line
144
145     uint8_t id;             ///< card id for identifying the card
146     iref_t iref;
147     uint32_t apicid;        ///< APIC id used for sending the boot interrupt
148
149     uint8_t      connected;
150     struct xnode topology[XEON_PHI_NUM_MAX];
151
152
153
154     struct smpt_info *smpt;  ///< pointer to the SMPT information struct
155     struct irq_info *irq;  ///< pointer to the IRQ information struct
156     struct dma_info *dma;  ///< pointer to the DMA information struct
157     struct msg_info *msg;
158 };
159
160 /**
161  * \brief starts the serial receive thread
162  *
163  * \param phi   pointer to the card information
164  */
165 errval_t xeon_phi_serial_start_recv_thread(struct xeon_phi *phi);
166
167 /**
168  * \brief initializes the serial receiver
169  *
170  * \param phi   pointer to the card information
171  */
172 errval_t xeon_phi_serial_init(struct xeon_phi *phi);
173
174 /**
175  * \brief checks if there is a message waiting on the serial and reads
176  *        it into the buffer.
177  *
178  * \return 0: There was no message
179  *         1: There was a message waiting and it porocessed.
180  */
181 uint32_t xeon_phi_serial_handle_recv(void);
182
183 /**
184  * \brief boots the card with the given loader and multiboot image
185  *
186  * \param phi           pointer to the card information
187  * \param xloader_img   pointer to the card bootloader image
188  * \param multiboot_img pointer to the card multiboot image
189  */
190 errval_t xeon_phi_boot(struct xeon_phi *phi,
191                        char *xloader_img,
192                        char *multiboot_img);
193
194 /**
195  * \brief performs a soft reset of the card
196  *
197  * \param phi   pointer to the card information
198  */
199 errval_t xeon_phi_reset(struct xeon_phi *phi);
200
201 /**
202  * \brief initializes the coprocessor card
203  *
204  * \param phi pointer to the information structure
205  */
206 errval_t xeon_phi_init(struct xeon_phi *phi);
207
208 /**
209  * \brief Bootstraps the host driver to get the multiboot images of the
210  *        xeon phi loader and the xeon phi multiboot image
211  */
212 errval_t host_bootstrap(void);
213
214 #endif /* XEON_PHI_H_ */