Added: new boot.S, serial out for Xeon Phi
[barrelfish] / kernel / arch / k1om / serial.c
1 /**
2  * \file
3  * \brief A basic (virtual) serial output for the Xeon Phi
4  *
5  */
6
7 /*
8  * Copyright (c) 2014 ETH Zurich.
9  * All rights reserved.
10  *
11  * This file is distributed under the terms in the attached LICENSE file.
12  * If you do not find this file, copies can be found by writing to:
13  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
14  */
15
16 #include <kernel.h>
17 #include <x86.h>
18 #include <serial.h>
19
20 #define SBOX_BASE               0x08007D0000ULL
21 #define SBOX_SCRATCH14          0x0000AB58
22 #define SBOX_SCRATCH15          0x0000AB5C
23 #define SBOX_SCRATCH8           0x0000AB40
24
25 //static uint8_t *sbox_base = (uint8_t *)SBOX_BASE;
26
27 /* todo: get rid of those */
28 unsigned serial_console_port;
29 unsigned serial_debug_port;
30 int serial_portbase;
31
32 union xeon_phi_message {
33         uint32_t val;
34         char c[4];
35 };
36
37 /** \brief Initialise the serial driver. */
38 errval_t serial_init(unsigned port) {
39
40         // XXX: if non-BSP core, assume HW is already initialised
41         if (!arch_core_is_bsp()) {
42                 return SYS_ERR_OK;
43         }
44
45         return SYS_ERR_OK;
46 }
47
48 errval_t serial_early_init(unsigned port) {
49
50         /* clear out the control register */
51         uint32_t *signal = (uint32_t*) ((void *) SBOX_BASE + SBOX_SCRATCH8);
52         *signal = 0;
53         return SYS_ERR_OK;
54 }
55
56 union xeon_phi_message data_buf;
57 union xeon_phi_message data_ctrl;
58 uint32_t didx = 0;
59
60
61 /** \brief Prints a single character to the default serial port. */
62 void serial_putchar(unsigned port, char c) {
63         volatile uint32_t *ctrl = ((uint32_t *) (SBOX_BASE + SBOX_SCRATCH8));
64         volatile uint32_t *data = ((uint32_t *) (SBOX_BASE + SBOX_SCRATCH15));
65
66         data_buf.c[didx] = c;
67         data_ctrl.c[didx] = 0x7A;
68         ++didx;
69
70         if (c == '\n' || didx == 4) {
71                 // write
72                 while ((*ctrl))
73                         ;
74
75                 *data = data_buf.val;
76                 (*ctrl) = data_ctrl.val;
77                 data_buf.val = 0;
78                 data_ctrl.val = 0;
79                 didx = 0;
80         }
81 }
82
83 /** \brief Reads a single character from the default serial port.
84  * This function spins waiting for a character to arrive.
85  */
86 char serial_getchar(unsigned port) {
87         assert(!"Not possible to get input from Host");
88         return '\0';
89 }