diff options
author | 2025-03-08 22:04:20 +0800 | |
---|---|---|
committer | 2025-03-08 22:04:20 +0800 | |
commit | a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a (patch) | |
tree | 84f21bd0bf7071bc5fc7dd989e77d7ceb5476682 /arch/mips/sni/setup.c | |
download | ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.tar.gz ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.zip |
Initial commit: OpenHarmony-v4.0-ReleaseOpenHarmony-v4.0-Release
Diffstat (limited to 'arch/mips/sni/setup.c')
-rw-r--r-- | arch/mips/sni/setup.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c new file mode 100644 index 000000000..efad85c8c --- /dev/null +++ b/arch/mips/sni/setup.c | |||
@@ -0,0 +1,263 @@ | |||
1 | /* | ||
2 | * Setup pointers to hardware-dependent routines. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 1996, 97, 98, 2000, 03, 04, 06 Ralf Baechle (ralf@linux-mips.org) | ||
9 | * Copyright (C) 2006,2007 Thomas Bogendoerfer (tsbogend@alpha.franken.de) | ||
10 | */ | ||
11 | #include <linux/eisa.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/export.h> | ||
14 | #include <linux/console.h> | ||
15 | #include <linux/fb.h> | ||
16 | #include <linux/screen_info.h> | ||
17 | |||
18 | #ifdef CONFIG_FW_ARC | ||
19 | #include <asm/fw/arc/types.h> | ||
20 | #include <asm/sgialib.h> | ||
21 | #endif | ||
22 | |||
23 | #ifdef CONFIG_FW_SNIPROM | ||
24 | #include <asm/mipsprom.h> | ||
25 | #endif | ||
26 | |||
27 | #include <asm/bootinfo.h> | ||
28 | #include <asm/cpu.h> | ||
29 | #include <asm/io.h> | ||
30 | #include <asm/reboot.h> | ||
31 | #include <asm/sni.h> | ||
32 | |||
33 | unsigned int sni_brd_type; | ||
34 | EXPORT_SYMBOL(sni_brd_type); | ||
35 | |||
36 | extern void sni_machine_restart(char *command); | ||
37 | extern void sni_machine_power_off(void); | ||
38 | |||
39 | static void __init sni_display_setup(void) | ||
40 | { | ||
41 | #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) && defined(CONFIG_FW_ARC) | ||
42 | struct screen_info *si = &screen_info; | ||
43 | DISPLAY_STATUS *di; | ||
44 | |||
45 | di = ArcGetDisplayStatus(1); | ||
46 | |||
47 | if (di) { | ||
48 | si->orig_x = di->CursorXPosition; | ||
49 | si->orig_y = di->CursorYPosition; | ||
50 | si->orig_video_cols = di->CursorMaxXPosition; | ||
51 | si->orig_video_lines = di->CursorMaxYPosition; | ||
52 | si->orig_video_isVGA = VIDEO_TYPE_VGAC; | ||
53 | si->orig_video_points = 16; | ||
54 | } | ||
55 | #endif | ||
56 | } | ||
57 | |||
58 | static void __init sni_console_setup(void) | ||
59 | { | ||
60 | #ifndef CONFIG_FW_ARC | ||
61 | char *ctype; | ||
62 | char *cdev; | ||
63 | char *baud; | ||
64 | int port; | ||
65 | static char options[8] __initdata; | ||
66 | |||
67 | cdev = prom_getenv("console_dev"); | ||
68 | if (strncmp(cdev, "tty", 3) == 0) { | ||
69 | ctype = prom_getenv("console"); | ||
70 | switch (*ctype) { | ||
71 | default: | ||
72 | case 'l': | ||
73 | port = 0; | ||
74 | baud = prom_getenv("lbaud"); | ||
75 | break; | ||
76 | case 'r': | ||
77 | port = 1; | ||
78 | baud = prom_getenv("rbaud"); | ||
79 | break; | ||
80 | } | ||
81 | if (baud) | ||
82 | strcpy(options, baud); | ||
83 | if (strncmp(cdev, "tty552", 6) == 0) | ||
84 | add_preferred_console("ttyS", port, | ||
85 | baud ? options : NULL); | ||
86 | else | ||
87 | add_preferred_console("ttySC", port, | ||
88 | baud ? options : NULL); | ||
89 | } | ||
90 | #endif | ||
91 | } | ||
92 | |||
93 | #ifdef DEBUG | ||
94 | static void __init sni_idprom_dump(void) | ||
95 | { | ||
96 | int i; | ||
97 | |||
98 | pr_debug("SNI IDProm dump:\n"); | ||
99 | for (i = 0; i < 256; i++) { | ||
100 | if (i%16 == 0) | ||
101 | pr_debug("%04x ", i); | ||
102 | |||
103 | printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); | ||
104 | |||
105 | if (i % 16 == 15) | ||
106 | printk("\n"); | ||
107 | } | ||
108 | } | ||
109 | #endif | ||
110 | |||
111 | void __init plat_mem_setup(void) | ||
112 | { | ||
113 | int cputype; | ||
114 | |||
115 | set_io_port_base(SNI_PORT_BASE); | ||
116 | // ioport_resource.end = sni_io_resource.end; | ||
117 | |||
118 | /* | ||
119 | * Setup (E)ISA I/O memory access stuff | ||
120 | */ | ||
121 | #ifdef CONFIG_EISA | ||
122 | EISA_bus = 1; | ||
123 | #endif | ||
124 | |||
125 | sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; | ||
126 | cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE; | ||
127 | switch (sni_brd_type) { | ||
128 | case SNI_BRD_TOWER_OASIC: | ||
129 | switch (cputype) { | ||
130 | case SNI_CPU_M8030: | ||
131 | system_type = "RM400-330"; | ||
132 | break; | ||
133 | case SNI_CPU_M8031: | ||
134 | system_type = "RM400-430"; | ||
135 | break; | ||
136 | case SNI_CPU_M8037: | ||
137 | system_type = "RM400-530"; | ||
138 | break; | ||
139 | case SNI_CPU_M8034: | ||
140 | system_type = "RM400-730"; | ||
141 | break; | ||
142 | default: | ||
143 | system_type = "RM400-xxx"; | ||
144 | break; | ||
145 | } | ||
146 | break; | ||
147 | case SNI_BRD_MINITOWER: | ||
148 | switch (cputype) { | ||
149 | case SNI_CPU_M8021: | ||
150 | case SNI_CPU_M8043: | ||
151 | system_type = "RM400-120"; | ||
152 | break; | ||
153 | case SNI_CPU_M8040: | ||
154 | system_type = "RM400-220"; | ||
155 | break; | ||
156 | case SNI_CPU_M8053: | ||
157 | system_type = "RM400-225"; | ||
158 | break; | ||
159 | case SNI_CPU_M8050: | ||
160 | system_type = "RM400-420"; | ||
161 | break; | ||
162 | default: | ||
163 | system_type = "RM400-xxx"; | ||
164 | break; | ||
165 | } | ||
166 | break; | ||
167 | case SNI_BRD_PCI_TOWER: | ||
168 | system_type = "RM400-Cxx"; | ||
169 | break; | ||
170 | case SNI_BRD_RM200: | ||
171 | system_type = "RM200-xxx"; | ||
172 | break; | ||
173 | case SNI_BRD_PCI_MTOWER: | ||
174 | system_type = "RM300-Cxx"; | ||
175 | break; | ||
176 | case SNI_BRD_PCI_DESKTOP: | ||
177 | switch (read_c0_prid() & PRID_IMP_MASK) { | ||
178 | case PRID_IMP_R4600: | ||
179 | case PRID_IMP_R4700: | ||
180 | system_type = "RM200-C20"; | ||
181 | break; | ||
182 | case PRID_IMP_R5000: | ||
183 | system_type = "RM200-C40"; | ||
184 | break; | ||
185 | default: | ||
186 | system_type = "RM200-Cxx"; | ||
187 | break; | ||
188 | } | ||
189 | break; | ||
190 | case SNI_BRD_PCI_TOWER_CPLUS: | ||
191 | system_type = "RM400-Exx"; | ||
192 | break; | ||
193 | case SNI_BRD_PCI_MTOWER_CPLUS: | ||
194 | system_type = "RM300-Exx"; | ||
195 | break; | ||
196 | } | ||
197 | pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type, system_type); | ||
198 | |||
199 | #ifdef DEBUG | ||
200 | sni_idprom_dump(); | ||
201 | #endif | ||
202 | |||
203 | switch (sni_brd_type) { | ||
204 | case SNI_BRD_10: | ||
205 | case SNI_BRD_10NEW: | ||
206 | case SNI_BRD_TOWER_OASIC: | ||
207 | case SNI_BRD_MINITOWER: | ||
208 | sni_a20r_init(); | ||
209 | break; | ||
210 | |||
211 | case SNI_BRD_PCI_TOWER: | ||
212 | case SNI_BRD_PCI_TOWER_CPLUS: | ||
213 | sni_pcit_init(); | ||
214 | break; | ||
215 | |||
216 | case SNI_BRD_RM200: | ||
217 | sni_rm200_init(); | ||
218 | break; | ||
219 | |||
220 | case SNI_BRD_PCI_MTOWER: | ||
221 | case SNI_BRD_PCI_DESKTOP: | ||
222 | case SNI_BRD_PCI_MTOWER_CPLUS: | ||
223 | sni_pcimt_init(); | ||
224 | break; | ||
225 | } | ||
226 | |||
227 | _machine_restart = sni_machine_restart; | ||
228 | pm_power_off = sni_machine_power_off; | ||
229 | |||
230 | sni_display_setup(); | ||
231 | sni_console_setup(); | ||
232 | } | ||
233 | |||
234 | #ifdef CONFIG_PCI | ||
235 | |||
236 | #include <linux/pci.h> | ||
237 | #include <video/vga.h> | ||
238 | #include <video/cirrus.h> | ||
239 | |||
240 | static void quirk_cirrus_ram_size(struct pci_dev *dev) | ||
241 | { | ||
242 | u16 cmd; | ||
243 | |||
244 | /* | ||
245 | * firmware doesn't set the ram size correct, so we | ||
246 | * need to do it here, otherwise we get screen corruption | ||
247 | * on older Cirrus chips | ||
248 | */ | ||
249 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
250 | if ((cmd & (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) | ||
251 | == (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) { | ||
252 | vga_wseq(NULL, CL_SEQR6, 0x12); /* unlock all extension registers */ | ||
253 | vga_wseq(NULL, CL_SEQRF, 0x18); | ||
254 | } | ||
255 | } | ||
256 | |||
257 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5434_8, | ||
258 | quirk_cirrus_ram_size); | ||
259 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5436, | ||
260 | quirk_cirrus_ram_size); | ||
261 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, | ||
262 | quirk_cirrus_ram_size); | ||
263 | #endif | ||