Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/netlogic/xlr/setup.c
10821 views
1
/*
2
* Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
3
* reserved.
4
*
5
* This software is available to you under a choice of one of two
6
* licenses. You may choose to be licensed under the terms of the GNU
7
* General Public License (GPL) Version 2, available from the file
8
* COPYING in the main directory of this source tree, or the NetLogic
9
* license below:
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
*
15
* 1. Redistributions of source code must retain the above copyright
16
* notice, this list of conditions and the following disclaimer.
17
* 2. Redistributions in binary form must reproduce the above copyright
18
* notice, this list of conditions and the following disclaimer in
19
* the documentation and/or other materials provided with the
20
* distribution.
21
*
22
* THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
23
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
32
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
*/
34
35
#include <linux/kernel.h>
36
#include <linux/serial_8250.h>
37
#include <linux/pm.h>
38
39
#include <asm/reboot.h>
40
#include <asm/time.h>
41
#include <asm/bootinfo.h>
42
#include <asm/smp-ops.h>
43
44
#include <asm/netlogic/interrupt.h>
45
#include <asm/netlogic/psb-bootinfo.h>
46
47
#include <asm/netlogic/xlr/xlr.h>
48
#include <asm/netlogic/xlr/iomap.h>
49
#include <asm/netlogic/xlr/pic.h>
50
#include <asm/netlogic/xlr/gpio.h>
51
52
unsigned long netlogic_io_base = (unsigned long)(DEFAULT_NETLOGIC_IO_BASE);
53
unsigned long nlm_common_ebase = 0x0;
54
struct psb_info nlm_prom_info;
55
56
static void nlm_early_serial_setup(void)
57
{
58
struct uart_port s;
59
nlm_reg_t *uart_base;
60
61
uart_base = netlogic_io_mmio(NETLOGIC_IO_UART_0_OFFSET);
62
memset(&s, 0, sizeof(s));
63
s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST;
64
s.iotype = UPIO_MEM32;
65
s.regshift = 2;
66
s.irq = PIC_UART_0_IRQ;
67
s.uartclk = PIC_CLKS_PER_SEC;
68
s.serial_in = nlm_xlr_uart_in;
69
s.serial_out = nlm_xlr_uart_out;
70
s.mapbase = (unsigned long)uart_base;
71
s.membase = (unsigned char __iomem *)uart_base;
72
early_serial_setup(&s);
73
}
74
75
static void nlm_linux_exit(void)
76
{
77
nlm_reg_t *mmio;
78
79
mmio = netlogic_io_mmio(NETLOGIC_IO_GPIO_OFFSET);
80
/* trigger a chip reset by writing 1 to GPIO_SWRESET_REG */
81
netlogic_write_reg(mmio, NETLOGIC_GPIO_SWRESET_REG, 1);
82
for ( ; ; )
83
cpu_wait();
84
}
85
86
void __init plat_mem_setup(void)
87
{
88
panic_timeout = 5;
89
_machine_restart = (void (*)(char *))nlm_linux_exit;
90
_machine_halt = nlm_linux_exit;
91
pm_power_off = nlm_linux_exit;
92
}
93
94
const char *get_system_type(void)
95
{
96
return "Netlogic XLR/XLS Series";
97
}
98
99
void __init prom_free_prom_memory(void)
100
{
101
/* Nothing yet */
102
}
103
104
static void build_arcs_cmdline(int *argv)
105
{
106
int i, remain, len;
107
char *arg;
108
109
remain = sizeof(arcs_cmdline) - 1;
110
arcs_cmdline[0] = '\0';
111
for (i = 0; argv[i] != 0; i++) {
112
arg = (char *)(long)argv[i];
113
len = strlen(arg);
114
if (len + 1 > remain)
115
break;
116
strcat(arcs_cmdline, arg);
117
strcat(arcs_cmdline, " ");
118
remain -= len + 1;
119
}
120
121
/* Add the default options here */
122
if ((strstr(arcs_cmdline, "console=")) == NULL) {
123
arg = "console=ttyS0,38400 ";
124
len = strlen(arg);
125
if (len > remain)
126
goto fail;
127
strcat(arcs_cmdline, arg);
128
remain -= len;
129
}
130
#ifdef CONFIG_BLK_DEV_INITRD
131
if ((strstr(arcs_cmdline, "rdinit=")) == NULL) {
132
arg = "rdinit=/sbin/init ";
133
len = strlen(arg);
134
if (len > remain)
135
goto fail;
136
strcat(arcs_cmdline, arg);
137
remain -= len;
138
}
139
#endif
140
return;
141
fail:
142
panic("Cannot add %s, command line too big!", arg);
143
}
144
145
static void prom_add_memory(void)
146
{
147
struct nlm_boot_mem_map *bootm;
148
u64 start, size;
149
u64 pref_backup = 512; /* avoid pref walking beyond end */
150
int i;
151
152
bootm = (void *)(long)nlm_prom_info.psb_mem_map;
153
for (i = 0; i < bootm->nr_map; i++) {
154
if (bootm->map[i].type != BOOT_MEM_RAM)
155
continue;
156
start = bootm->map[i].addr;
157
size = bootm->map[i].size;
158
159
/* Work around for using bootloader mem */
160
if (i == 0 && start == 0 && size == 0x0c000000)
161
size = 0x0ff00000;
162
163
add_memory_region(start, size - pref_backup, BOOT_MEM_RAM);
164
}
165
}
166
167
void __init prom_init(void)
168
{
169
int *argv, *envp; /* passed as 32 bit ptrs */
170
struct psb_info *prom_infop;
171
172
/* truncate to 32 bit and sign extend all args */
173
argv = (int *)(long)(int)fw_arg1;
174
envp = (int *)(long)(int)fw_arg2;
175
prom_infop = (struct psb_info *)(long)(int)fw_arg3;
176
177
nlm_prom_info = *prom_infop;
178
179
nlm_early_serial_setup();
180
build_arcs_cmdline(argv);
181
nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1));
182
prom_add_memory();
183
184
#ifdef CONFIG_SMP
185
nlm_wakeup_secondary_cpus(nlm_prom_info.online_cpu_map);
186
register_smp_ops(&nlm_smp_ops);
187
#endif
188
}
189
190