Added: Xeon Phi Manager
[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 "xeon_phi_bootloader"
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     uint8_t id;             ///< card id for identifying the card
141     iref_t iref;
142     uint32_t apicid;        ///< APIC id used for sending the boot interrupt
143
144     uint8_t      connected;
145     struct xnode topology[XEON_PHI_NUM_MAX];
146
147     char *cmdline;          ///< pointer to the bootloader cmdline
148
149     struct smpt_info *smpt;  ///< pointer to the SMPT information struct
150     struct irq_info *irq;  ///< pointer to the IRQ information struct
151     struct dma_infi *dma;  ///< pointer to the DMA information struct
152 };
153
154 /**
155  * \brief initializes the serial receive thread from the xeon phi
156  *
157  * \param phi   pointer to the card information
158  */
159 errval_t serial_start_recv_thread(struct xeon_phi *phi);
160
161 /**
162  * \brief boots the card with the given loader and multiboot image
163  *
164  * \param phi           pointer to the card information
165  * \param xloader_img   pointer to the card bootloader image
166  * \param multiboot_img pointer to the card multiboot image
167  */
168 errval_t xeon_phi_boot(struct xeon_phi *phi,
169                        char *xloader_img,
170                        char *multiboot_img);
171
172 /**
173  * \brief performs a soft reset of the card
174  *
175  * \param phi   pointer to the card information
176  */
177 errval_t xeon_phi_reset(struct xeon_phi *phi);
178
179 /**
180  * \brief initializes the coprocessor card
181  *
182  * \param phi pointer to the information structure
183  */
184 errval_t xeon_phi_init(struct xeon_phi *phi);
185
186 /**
187  * \brief Bootstraps the host driver to get the multiboot images of the
188  *        xeon phi loader and the xeon phi multiboot image
189  */
190 errval_t host_bootstrap(void);
191
192 #endif /* XEON_PHI_H_ */