Linux 6.7-rc7
[linux-modified.git] / arch / mips / sni / setup.c
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_VGA_CONSOLE) && defined(CONFIG_FW_ARC)
42         static struct screen_info si;
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                 vgacon_register_screen(&si);
56         }
57 #endif
58 }
59
60 static void __init sni_console_setup(void)
61 {
62 #ifndef CONFIG_FW_ARC
63         char *ctype;
64         char *cdev;
65         char *baud;
66         int port;
67         static char options[8] __initdata;
68
69         cdev = prom_getenv("console_dev");
70         if (strncmp(cdev, "tty", 3) == 0) {
71                 ctype = prom_getenv("console");
72                 switch (*ctype) {
73                 default:
74                 case 'l':
75                         port = 0;
76                         baud = prom_getenv("lbaud");
77                         break;
78                 case 'r':
79                         port = 1;
80                         baud = prom_getenv("rbaud");
81                         break;
82                 }
83                 if (baud)
84                         strcpy(options, baud);
85                 if (strncmp(cdev, "tty552", 6) == 0)
86                         add_preferred_console("ttyS", port,
87                                               baud ? options : NULL);
88                 else
89                         add_preferred_console("ttySC", port,
90                                               baud ? options : NULL);
91         }
92 #endif
93 }
94
95 #ifdef DEBUG
96 static void __init sni_idprom_dump(void)
97 {
98         int     i;
99
100         pr_debug("SNI IDProm dump:\n");
101         for (i = 0; i < 256; i++) {
102                 if (i%16 == 0)
103                         pr_debug("%04x ", i);
104
105                 printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i));
106
107                 if (i % 16 == 15)
108                         printk("\n");
109         }
110 }
111 #endif
112
113 void __init plat_mem_setup(void)
114 {
115         int cputype;
116
117         set_io_port_base(SNI_PORT_BASE);
118 //      ioport_resource.end = sni_io_resource.end;
119
120         /*
121          * Setup (E)ISA I/O memory access stuff
122          */
123 #ifdef CONFIG_EISA
124         EISA_bus = 1;
125 #endif
126
127         sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE;
128         cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE;
129         switch (sni_brd_type) {
130         case SNI_BRD_TOWER_OASIC:
131                 switch (cputype) {
132                 case SNI_CPU_M8030:
133                         system_type = "RM400-330";
134                         break;
135                 case SNI_CPU_M8031:
136                         system_type = "RM400-430";
137                         break;
138                 case SNI_CPU_M8037:
139                         system_type = "RM400-530";
140                         break;
141                 case SNI_CPU_M8034:
142                         system_type = "RM400-730";
143                         break;
144                 default:
145                         system_type = "RM400-xxx";
146                         break;
147                 }
148                 break;
149         case SNI_BRD_MINITOWER:
150                 switch (cputype) {
151                 case SNI_CPU_M8021:
152                 case SNI_CPU_M8043:
153                         system_type = "RM400-120";
154                         break;
155                 case SNI_CPU_M8040:
156                         system_type = "RM400-220";
157                         break;
158                 case SNI_CPU_M8053:
159                         system_type = "RM400-225";
160                         break;
161                 case SNI_CPU_M8050:
162                         system_type = "RM400-420";
163                         break;
164                 default:
165                         system_type = "RM400-xxx";
166                         break;
167                 }
168                 break;
169         case SNI_BRD_PCI_TOWER:
170                 system_type = "RM400-Cxx";
171                 break;
172         case SNI_BRD_RM200:
173                 system_type = "RM200-xxx";
174                 break;
175         case SNI_BRD_PCI_MTOWER:
176                 system_type = "RM300-Cxx";
177                 break;
178         case SNI_BRD_PCI_DESKTOP:
179                 switch (read_c0_prid() & PRID_IMP_MASK) {
180                 case PRID_IMP_R4600:
181                 case PRID_IMP_R4700:
182                         system_type = "RM200-C20";
183                         break;
184                 case PRID_IMP_R5000:
185                         system_type = "RM200-C40";
186                         break;
187                 default:
188                         system_type = "RM200-Cxx";
189                         break;
190                 }
191                 break;
192         case SNI_BRD_PCI_TOWER_CPLUS:
193                 system_type = "RM400-Exx";
194                 break;
195         case SNI_BRD_PCI_MTOWER_CPLUS:
196                 system_type = "RM300-Exx";
197                 break;
198         }
199         pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type, system_type);
200
201 #ifdef DEBUG
202         sni_idprom_dump();
203 #endif
204
205         switch (sni_brd_type) {
206         case SNI_BRD_10:
207         case SNI_BRD_10NEW:
208         case SNI_BRD_TOWER_OASIC:
209         case SNI_BRD_MINITOWER:
210                 sni_a20r_init();
211                 break;
212
213         case SNI_BRD_PCI_TOWER:
214         case SNI_BRD_PCI_TOWER_CPLUS:
215                 sni_pcit_init();
216                 break;
217
218         case SNI_BRD_RM200:
219                 sni_rm200_init();
220                 break;
221
222         case SNI_BRD_PCI_MTOWER:
223         case SNI_BRD_PCI_DESKTOP:
224         case SNI_BRD_PCI_MTOWER_CPLUS:
225                 sni_pcimt_init();
226                 break;
227         }
228
229         _machine_restart = sni_machine_restart;
230         pm_power_off = sni_machine_power_off;
231
232         sni_display_setup();
233         sni_console_setup();
234 }
235
236 #ifdef CONFIG_PCI
237
238 #include <linux/pci.h>
239 #include <video/vga.h>
240 #include <video/cirrus.h>
241
242 static void quirk_cirrus_ram_size(struct pci_dev *dev)
243 {
244         u16 cmd;
245
246         /*
247          * firmware doesn't set the ram size correct, so we
248          * need to do it here, otherwise we get screen corruption
249          * on older Cirrus chips
250          */
251         pci_read_config_word(dev, PCI_COMMAND, &cmd);
252         if ((cmd & (PCI_COMMAND_IO|PCI_COMMAND_MEMORY))
253                 == (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) {
254                 vga_wseq(NULL, CL_SEQR6, 0x12); /* unlock all extension registers */
255                 vga_wseq(NULL, CL_SEQRF, 0x18);
256         }
257 }
258
259 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5434_8,
260                         quirk_cirrus_ram_size);
261 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5436,
262                         quirk_cirrus_ram_size);
263 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446,
264                         quirk_cirrus_ram_size);
265 #endif