9f15a90c9c88ed7cabcbbbd179567e1ed75be5c0
[barrelfish] / kernel / arch / armv8 / plat_imx8x.c
1 /**
2  * \file plat_arm_vm.c
3  * \brief
4  */
5
6
7 /*
8  * Copyright (c) 2016 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, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
14  */
15
16 #include <kernel.h>
17 #include <offsets.h>
18 #include <arch/arm/platform.h>
19 #include <serial.h>
20 #include <arch/arm/lpuart.h>
21 #include <arch/arm/gic.h>
22
23 #include <getopt/getopt.h>
24 #include <sysreg.h>
25 #include <dev/armv8_dev.h>
26 #include <barrelfish_kpi/arm_core_data.h>
27 #include <psci.h>
28 #include <arch/armv8/global.h>
29
30 /* RAM starts at 0, provided by the MMAP */
31 lpaddr_t phys_memory_start= 0;
32
33 /*
34  * ----------------------------------------------------------------------------
35  * GIC
36  * ----------------------------------------------------------------------------
37  */
38
39 lpaddr_t platform_gic_distributor_base = 0x8000000;
40 lpaddr_t platform_gic_redistributor_base = 0x80a0000;
41
42 /*
43  * ----------------------------------------------------------------------------
44  * UART
45  * ----------------------------------------------------------------------------
46  */
47
48 /* the maximum number of UARTS supported */
49 #define MAX_NUM_UARTS 1
50
51 /* the serial console port */
52 unsigned int serial_console_port = 0;
53
54 /* the debug console port */
55 unsigned int serial_debug_port = 0;
56
57 /* the number of physical ports */
58 unsigned serial_num_physical_ports = 1;
59
60 /* uart bases */
61 lpaddr_t platform_uart_base[MAX_NUM_UARTS] =
62 {
63         0x5A090000
64 };
65
66 /* uart sizes */
67 size_t platform_uart_size[MAX_NUM_UARTS] =
68 {
69     0x10000
70 };
71
72 errval_t serial_init(unsigned port, bool initialize_hw)
73 {
74     lvaddr_t base = local_phys_to_mem(platform_uart_base[port]);
75     lpuart_init(port, base, initialize_hw);
76     return SYS_ERR_OK;
77 };
78
79 /*
80  * Do any extra initialisation for this particular CPU (e.g. A9/A15).
81  */
82 void platform_revision_init(void)
83 {
84
85 }
86
87 /*
88  * Figure out how much RAM we have
89  */
90 size_t platform_get_ram_size(void)
91 {
92     return 0;
93 }
94
95 /*
96  * Boot secondary processors
97  */
98 errval_t platform_boot_core(hwid_t target, genpaddr_t gen_entry, genpaddr_t context)
99 {
100     printf("Invoking PSCI on: cpu=0x%lx, entry=0x%lx, context=0x%lx\n", target, gen_entry, context);
101     struct armv8_core_data *cd = (struct armv8_core_data *)local_phys_to_mem(context);
102     cd->page_table_root = armv8_TTBR1_EL1_rd(NULL);
103     cd->cpu_driver_globals_pointer = (uintptr_t)global;
104     __asm volatile("dsb   sy\n"
105                    "dmb   sy\n"
106                    "isb     \n");
107     return psci_cpu_on(target, gen_entry, context);
108 }
109
110 void platform_notify_bsp(lpaddr_t *mailbox)
111 {
112
113 }
114
115
116 /*
117  * Return the core count
118  */
119 size_t platform_get_core_count(void)
120 {
121     return 0;
122 }
123
124 /*
125  * Print system identification. MMU is NOT yet enabled.
126  */
127 void platform_print_id(void)
128 {
129
130 }
131
132 /*
133  * Fill out provided `struct platform_info`
134  */
135 void platform_get_info(struct platform_info *pi)
136 {
137     pi->arch = PI_ARCH_ARMV8A;
138     pi->platform = PI_PLATFORM_IMX8X;
139 }
140
141 void armv8_get_info(struct arch_info_armv8 *ai)
142 {
143
144 }