]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/powerpc/kernel/setup_64.c
[PATCH] powerpc: Merge vdso's and add vdso support to 32 bits kernel
[karo-tx-linux.git] / arch / powerpc / kernel / setup_64.c
1 /*
2  * 
3  * Common boot and setup code.
4  *
5  * Copyright (C) 2001 PPC64 Team, IBM Corp
6  *
7  *      This program is free software; you can redistribute it and/or
8  *      modify it under the terms of the GNU General Public License
9  *      as published by the Free Software Foundation; either version
10  *      2 of the License, or (at your option) any later version.
11  */
12
13 #undef DEBUG
14
15 #include <linux/config.h>
16 #include <linux/module.h>
17 #include <linux/string.h>
18 #include <linux/sched.h>
19 #include <linux/init.h>
20 #include <linux/kernel.h>
21 #include <linux/reboot.h>
22 #include <linux/delay.h>
23 #include <linux/initrd.h>
24 #include <linux/ide.h>
25 #include <linux/seq_file.h>
26 #include <linux/ioport.h>
27 #include <linux/console.h>
28 #include <linux/utsname.h>
29 #include <linux/tty.h>
30 #include <linux/root_dev.h>
31 #include <linux/notifier.h>
32 #include <linux/cpu.h>
33 #include <linux/unistd.h>
34 #include <linux/serial.h>
35 #include <linux/serial_8250.h>
36 #include <asm/io.h>
37 #include <asm/prom.h>
38 #include <asm/processor.h>
39 #include <asm/pgtable.h>
40 #include <asm/smp.h>
41 #include <asm/elf.h>
42 #include <asm/machdep.h>
43 #include <asm/paca.h>
44 #include <asm/time.h>
45 #include <asm/cputable.h>
46 #include <asm/sections.h>
47 #include <asm/btext.h>
48 #include <asm/nvram.h>
49 #include <asm/setup.h>
50 #include <asm/system.h>
51 #include <asm/rtas.h>
52 #include <asm/iommu.h>
53 #include <asm/serial.h>
54 #include <asm/cache.h>
55 #include <asm/page.h>
56 #include <asm/mmu.h>
57 #include <asm/lmb.h>
58 #include <asm/iseries/it_lp_naca.h>
59 #include <asm/firmware.h>
60 #include <asm/xmon.h>
61 #include <asm/udbg.h>
62
63 #include "setup.h"
64
65 #ifdef DEBUG
66 #define DBG(fmt...) udbg_printf(fmt)
67 #else
68 #define DBG(fmt...)
69 #endif
70
71 /*
72  * Here are some early debugging facilities. You can enable one
73  * but your kernel will not boot on anything else if you do so
74  */
75
76 /* This one is for use on LPAR machines that support an HVC console
77  * on vterm 0
78  */
79 extern void udbg_init_debug_lpar(void);
80 /* This one is for use on Apple G5 machines
81  */
82 extern void udbg_init_pmac_realmode(void);
83 /* That's RTAS panel debug */
84 extern void call_rtas_display_status_delay(unsigned char c);
85 /* Here's maple real mode debug */
86 extern void udbg_init_maple_realmode(void);
87
88 #define EARLY_DEBUG_INIT() do {} while(0)
89
90 #if 0
91 #define EARLY_DEBUG_INIT() udbg_init_debug_lpar()
92 #define EARLY_DEBUG_INIT() udbg_init_maple_realmode()
93 #define EARLY_DEBUG_INIT() udbg_init_pmac_realmode()
94 #define EARLY_DEBUG_INIT()                                              \
95         do { udbg_putc = call_rtas_display_status_delay; } while(0)
96 #endif
97
98 int have_of = 1;
99 int boot_cpuid = 0;
100 int boot_cpuid_phys = 0;
101 dev_t boot_dev;
102 u64 ppc64_pft_size;
103
104 struct ppc64_caches ppc64_caches;
105 EXPORT_SYMBOL_GPL(ppc64_caches);
106
107 /*
108  * These are used in binfmt_elf.c to put aux entries on the stack
109  * for each elf executable being started.
110  */
111 int dcache_bsize;
112 int icache_bsize;
113 int ucache_bsize;
114
115 /* The main machine-dep calls structure
116  */
117 struct machdep_calls ppc_md;
118 EXPORT_SYMBOL(ppc_md);
119
120 #ifdef CONFIG_MAGIC_SYSRQ
121 unsigned long SYSRQ_KEY;
122 #endif /* CONFIG_MAGIC_SYSRQ */
123
124
125 static int ppc64_panic_event(struct notifier_block *, unsigned long, void *);
126 static struct notifier_block ppc64_panic_block = {
127         .notifier_call = ppc64_panic_event,
128         .priority = INT_MIN /* may not return; must be done last */
129 };
130
131 #ifdef CONFIG_SMP
132
133 static int smt_enabled_cmdline;
134
135 /* Look for ibm,smt-enabled OF option */
136 static void check_smt_enabled(void)
137 {
138         struct device_node *dn;
139         char *smt_option;
140
141         /* Allow the command line to overrule the OF option */
142         if (smt_enabled_cmdline)
143                 return;
144
145         dn = of_find_node_by_path("/options");
146
147         if (dn) {
148                 smt_option = (char *)get_property(dn, "ibm,smt-enabled", NULL);
149
150                 if (smt_option) {
151                         if (!strcmp(smt_option, "on"))
152                                 smt_enabled_at_boot = 1;
153                         else if (!strcmp(smt_option, "off"))
154                                 smt_enabled_at_boot = 0;
155                 }
156         }
157 }
158
159 /* Look for smt-enabled= cmdline option */
160 static int __init early_smt_enabled(char *p)
161 {
162         smt_enabled_cmdline = 1;
163
164         if (!p)
165                 return 0;
166
167         if (!strcmp(p, "on") || !strcmp(p, "1"))
168                 smt_enabled_at_boot = 1;
169         else if (!strcmp(p, "off") || !strcmp(p, "0"))
170                 smt_enabled_at_boot = 0;
171
172         return 0;
173 }
174 early_param("smt-enabled", early_smt_enabled);
175
176 #else
177 #define check_smt_enabled()
178 #endif /* CONFIG_SMP */
179
180 extern struct machdep_calls pSeries_md;
181 extern struct machdep_calls pmac_md;
182 extern struct machdep_calls maple_md;
183 extern struct machdep_calls cell_md;
184 extern struct machdep_calls iseries_md;
185
186 /* Ultimately, stuff them in an elf section like initcalls... */
187 static struct machdep_calls __initdata *machines[] = {
188 #ifdef CONFIG_PPC_PSERIES
189         &pSeries_md,
190 #endif /* CONFIG_PPC_PSERIES */
191 #ifdef CONFIG_PPC_PMAC
192         &pmac_md,
193 #endif /* CONFIG_PPC_PMAC */
194 #ifdef CONFIG_PPC_MAPLE
195         &maple_md,
196 #endif /* CONFIG_PPC_MAPLE */
197 #ifdef CONFIG_PPC_CELL
198         &cell_md,
199 #endif
200 #ifdef CONFIG_PPC_ISERIES
201         &iseries_md,
202 #endif
203         NULL
204 };
205
206 /*
207  * Early initialization entry point. This is called by head.S
208  * with MMU translation disabled. We rely on the "feature" of
209  * the CPU that ignores the top 2 bits of the address in real
210  * mode so we can access kernel globals normally provided we
211  * only toy with things in the RMO region. From here, we do
212  * some early parsing of the device-tree to setup out LMB
213  * data structures, and allocate & initialize the hash table
214  * and segment tables so we can start running with translation
215  * enabled.
216  *
217  * It is this function which will call the probe() callback of
218  * the various platform types and copy the matching one to the
219  * global ppc_md structure. Your platform can eventually do
220  * some very early initializations from the probe() routine, but
221  * this is not recommended, be very careful as, for example, the
222  * device-tree is not accessible via normal means at this point.
223  */
224
225 void __init early_setup(unsigned long dt_ptr)
226 {
227         struct paca_struct *lpaca = get_paca();
228         static struct machdep_calls **mach;
229
230         /*
231          * Enable early debugging if any specified (see top of
232          * this file)
233          */
234         EARLY_DEBUG_INIT();
235
236         DBG(" -> early_setup()\n");
237
238         /*
239          * Do early initializations using the flattened device
240          * tree, like retreiving the physical memory map or
241          * calculating/retreiving the hash table size
242          */
243         early_init_devtree(__va(dt_ptr));
244
245         /*
246          * Iterate all ppc_md structures until we find the proper
247          * one for the current machine type
248          */
249         DBG("Probing machine type for platform %x...\n", _machine);
250
251         for (mach = machines; *mach; mach++) {
252                 if ((*mach)->probe(_machine))
253                         break;
254         }
255         /* What can we do if we didn't find ? */
256         if (*mach == NULL) {
257                 DBG("No suitable machine found !\n");
258                 for (;;);
259         }
260         ppc_md = **mach;
261
262         DBG("Found, Initializing memory management...\n");
263
264         /*
265          * Initialize the MMU Hash table and create the linear mapping
266          * of memory. Has to be done before stab/slb initialization as
267          * this is currently where the page size encoding is obtained
268          */
269         htab_initialize();
270
271         /*
272          * Initialize stab / SLB management except on iSeries
273          */
274         if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
275                 if (cpu_has_feature(CPU_FTR_SLB))
276                         slb_initialize();
277                 else
278                         stab_initialize(lpaca->stab_real);
279         }
280
281         DBG(" <- early_setup()\n");
282 }
283
284 #ifdef CONFIG_SMP
285 void early_setup_secondary(void)
286 {
287         struct paca_struct *lpaca = get_paca();
288
289         /* Mark enabled in PACA */
290         lpaca->proc_enabled = 0;
291
292         /* Initialize hash table for that CPU */
293         htab_initialize_secondary();
294
295         /* Initialize STAB/SLB. We use a virtual address as it works
296          * in real mode on pSeries and we want a virutal address on
297          * iSeries anyway
298          */
299         if (cpu_has_feature(CPU_FTR_SLB))
300                 slb_initialize();
301         else
302                 stab_initialize(lpaca->stab_addr);
303 }
304
305 #endif /* CONFIG_SMP */
306
307 #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
308 void smp_release_cpus(void)
309 {
310         extern unsigned long __secondary_hold_spinloop;
311
312         DBG(" -> smp_release_cpus()\n");
313
314         /* All secondary cpus are spinning on a common spinloop, release them
315          * all now so they can start to spin on their individual paca
316          * spinloops. For non SMP kernels, the secondary cpus never get out
317          * of the common spinloop.
318          * This is useless but harmless on iSeries, secondaries are already
319          * waiting on their paca spinloops. */
320
321         __secondary_hold_spinloop = 1;
322         mb();
323
324         DBG(" <- smp_release_cpus()\n");
325 }
326 #else
327 #define smp_release_cpus()
328 #endif /* CONFIG_SMP || CONFIG_KEXEC */
329
330 /*
331  * Initialize some remaining members of the ppc64_caches and systemcfg
332  * structures
333  * (at least until we get rid of them completely). This is mostly some
334  * cache informations about the CPU that will be used by cache flush
335  * routines and/or provided to userland
336  */
337 static void __init initialize_cache_info(void)
338 {
339         struct device_node *np;
340         unsigned long num_cpus = 0;
341
342         DBG(" -> initialize_cache_info()\n");
343
344         for (np = NULL; (np = of_find_node_by_type(np, "cpu"));) {
345                 num_cpus += 1;
346
347                 /* We're assuming *all* of the CPUs have the same
348                  * d-cache and i-cache sizes... -Peter
349                  */
350
351                 if ( num_cpus == 1 ) {
352                         u32 *sizep, *lsizep;
353                         u32 size, lsize;
354                         const char *dc, *ic;
355
356                         /* Then read cache informations */
357                         if (_machine == PLATFORM_POWERMAC) {
358                                 dc = "d-cache-block-size";
359                                 ic = "i-cache-block-size";
360                         } else {
361                                 dc = "d-cache-line-size";
362                                 ic = "i-cache-line-size";
363                         }
364
365                         size = 0;
366                         lsize = cur_cpu_spec->dcache_bsize;
367                         sizep = (u32 *)get_property(np, "d-cache-size", NULL);
368                         if (sizep != NULL)
369                                 size = *sizep;
370                         lsizep = (u32 *) get_property(np, dc, NULL);
371                         if (lsizep != NULL)
372                                 lsize = *lsizep;
373                         if (sizep == 0 || lsizep == 0)
374                                 DBG("Argh, can't find dcache properties ! "
375                                     "sizep: %p, lsizep: %p\n", sizep, lsizep);
376
377                         ppc64_caches.dsize = size;
378                         ppc64_caches.dline_size = lsize;
379                         ppc64_caches.log_dline_size = __ilog2(lsize);
380                         ppc64_caches.dlines_per_page = PAGE_SIZE / lsize;
381
382                         size = 0;
383                         lsize = cur_cpu_spec->icache_bsize;
384                         sizep = (u32 *)get_property(np, "i-cache-size", NULL);
385                         if (sizep != NULL)
386                                 size = *sizep;
387                         lsizep = (u32 *)get_property(np, ic, NULL);
388                         if (lsizep != NULL)
389                                 lsize = *lsizep;
390                         if (sizep == 0 || lsizep == 0)
391                                 DBG("Argh, can't find icache properties ! "
392                                     "sizep: %p, lsizep: %p\n", sizep, lsizep);
393
394                         ppc64_caches.isize = size;
395                         ppc64_caches.iline_size = lsize;
396                         ppc64_caches.log_iline_size = __ilog2(lsize);
397                         ppc64_caches.ilines_per_page = PAGE_SIZE / lsize;
398                 }
399         }
400
401         DBG(" <- initialize_cache_info()\n");
402 }
403
404
405 /*
406  * Do some initial setup of the system.  The parameters are those which 
407  * were passed in from the bootloader.
408  */
409 void __init setup_system(void)
410 {
411         DBG(" -> setup_system()\n");
412
413         /*
414          * Unflatten the device-tree passed by prom_init or kexec
415          */
416         unflatten_device_tree();
417
418         /*
419          * Fill the ppc64_caches & systemcfg structures with informations
420          * retreived from the device-tree. Need to be called before
421          * finish_device_tree() since the later requires some of the
422          * informations filled up here to properly parse the interrupt
423          * tree.
424          * It also sets up the cache line sizes which allows to call
425          * routines like flush_icache_range (used by the hash init
426          * later on).
427          */
428         initialize_cache_info();
429
430 #ifdef CONFIG_PPC_RTAS
431         /*
432          * Initialize RTAS if available
433          */
434         rtas_initialize();
435 #endif /* CONFIG_PPC_RTAS */
436
437         /*
438          * Check if we have an initrd provided via the device-tree
439          */
440         check_for_initrd();
441
442         /*
443          * Do some platform specific early initializations, that includes
444          * setting up the hash table pointers. It also sets up some interrupt-mapping
445          * related options that will be used by finish_device_tree()
446          */
447         ppc_md.init_early();
448
449         /*
450          * "Finish" the device-tree, that is do the actual parsing of
451          * some of the properties like the interrupt map
452          */
453         finish_device_tree();
454
455 #ifdef CONFIG_BOOTX_TEXT
456         init_boot_display();
457 #endif
458
459         /*
460          * Initialize xmon
461          */
462 #ifdef CONFIG_XMON_DEFAULT
463         xmon_init(1);
464 #endif
465         /*
466          * Register early console
467          */
468         register_early_udbg_console();
469
470         /* Save unparsed command line copy for /proc/cmdline */
471         strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
472
473         parse_early_param();
474
475         check_smt_enabled();
476         smp_setup_cpu_maps();
477
478         /* Release secondary cpus out of their spinloops at 0x60 now that
479          * we can map physical -> logical CPU ids
480          */
481         smp_release_cpus();
482
483         printk("Starting Linux PPC64 %s\n", system_utsname.version);
484
485         printk("-----------------------------------------------------\n");
486         printk("ppc64_pft_size                = 0x%lx\n", ppc64_pft_size);
487         printk("ppc64_interrupt_controller    = 0x%ld\n",
488                ppc64_interrupt_controller);
489         printk("platform                      = 0x%x\n", _machine);
490         printk("physicalMemorySize            = 0x%lx\n", lmb_phys_mem_size());
491         printk("ppc64_caches.dcache_line_size = 0x%x\n",
492                ppc64_caches.dline_size);
493         printk("ppc64_caches.icache_line_size = 0x%x\n",
494                ppc64_caches.iline_size);
495         printk("htab_address                  = 0x%p\n", htab_address);
496         printk("htab_hash_mask                = 0x%lx\n", htab_hash_mask);
497         printk("-----------------------------------------------------\n");
498
499         mm_init_ppc64();
500
501         DBG(" <- setup_system()\n");
502 }
503
504 static int ppc64_panic_event(struct notifier_block *this,
505                              unsigned long event, void *ptr)
506 {
507         ppc_md.panic((char *)ptr);  /* May not return */
508         return NOTIFY_DONE;
509 }
510
511 #ifdef CONFIG_IRQSTACKS
512 static void __init irqstack_early_init(void)
513 {
514         unsigned int i;
515
516         /*
517          * interrupt stacks must be under 256MB, we cannot afford to take
518          * SLB misses on them.
519          */
520         for_each_cpu(i) {
521                 softirq_ctx[i] = (struct thread_info *)
522                         __va(lmb_alloc_base(THREAD_SIZE,
523                                             THREAD_SIZE, 0x10000000));
524                 hardirq_ctx[i] = (struct thread_info *)
525                         __va(lmb_alloc_base(THREAD_SIZE,
526                                             THREAD_SIZE, 0x10000000));
527         }
528 }
529 #else
530 #define irqstack_early_init()
531 #endif
532
533 /*
534  * Stack space used when we detect a bad kernel stack pointer, and
535  * early in SMP boots before relocation is enabled.
536  */
537 static void __init emergency_stack_init(void)
538 {
539         unsigned long limit;
540         unsigned int i;
541
542         /*
543          * Emergency stacks must be under 256MB, we cannot afford to take
544          * SLB misses on them. The ABI also requires them to be 128-byte
545          * aligned.
546          *
547          * Since we use these as temporary stacks during secondary CPU
548          * bringup, we need to get at them in real mode. This means they
549          * must also be within the RMO region.
550          */
551         limit = min(0x10000000UL, lmb.rmo_size);
552
553         for_each_cpu(i)
554                 paca[i].emergency_sp =
555                 __va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE;
556 }
557
558 /*
559  * Called into from start_kernel, after lock_kernel has been called.
560  * Initializes bootmem, which is unsed to manage page allocation until
561  * mem_init is called.
562  */
563 void __init setup_arch(char **cmdline_p)
564 {
565         extern void do_init_bootmem(void);
566
567         ppc64_boot_msg(0x12, "Setup Arch");
568
569         *cmdline_p = cmd_line;
570
571         /*
572          * Set cache line size based on type of cpu as a default.
573          * Systems with OF can look in the properties on the cpu node(s)
574          * for a possibly more accurate value.
575          */
576         dcache_bsize = ppc64_caches.dline_size;
577         icache_bsize = ppc64_caches.iline_size;
578
579         /* reboot on panic */
580         panic_timeout = 180;
581
582         if (ppc_md.panic)
583                 notifier_chain_register(&panic_notifier_list, &ppc64_panic_block);
584
585         init_mm.start_code = PAGE_OFFSET;
586         init_mm.end_code = (unsigned long) _etext;
587         init_mm.end_data = (unsigned long) _edata;
588         init_mm.brk = klimit;
589         
590         irqstack_early_init();
591         emergency_stack_init();
592
593         stabs_alloc();
594
595         /* set up the bootmem stuff with available memory */
596         do_init_bootmem();
597         sparse_init();
598
599 #ifdef CONFIG_DUMMY_CONSOLE
600         conswitchp = &dummy_con;
601 #endif
602
603         ppc_md.setup_arch();
604
605         /* Use the default idle loop if the platform hasn't provided one. */
606         if (NULL == ppc_md.idle_loop) {
607                 ppc_md.idle_loop = default_idle;
608                 printk(KERN_INFO "Using default idle loop\n");
609         }
610
611         paging_init();
612         ppc64_boot_msg(0x15, "Setup Done");
613 }
614
615
616 /* ToDo: do something useful if ppc_md is not yet setup. */
617 #define PPC64_LINUX_FUNCTION 0x0f000000
618 #define PPC64_IPL_MESSAGE 0xc0000000
619 #define PPC64_TERM_MESSAGE 0xb0000000
620
621 static void ppc64_do_msg(unsigned int src, const char *msg)
622 {
623         if (ppc_md.progress) {
624                 char buf[128];
625
626                 sprintf(buf, "%08X\n", src);
627                 ppc_md.progress(buf, 0);
628                 snprintf(buf, 128, "%s", msg);
629                 ppc_md.progress(buf, 0);
630         }
631 }
632
633 /* Print a boot progress message. */
634 void ppc64_boot_msg(unsigned int src, const char *msg)
635 {
636         ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_IPL_MESSAGE|src, msg);
637         printk("[boot]%04x %s\n", src, msg);
638 }
639
640 /* Print a termination message (print only -- does not stop the kernel) */
641 void ppc64_terminate_msg(unsigned int src, const char *msg)
642 {
643         ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_TERM_MESSAGE|src, msg);
644         printk("[terminate]%04x %s\n", src, msg);
645 }
646
647 #ifndef CONFIG_PPC_ISERIES
648 /*
649  * This function can be used by platforms to "find" legacy serial ports.
650  * It works for "serial" nodes under an "isa" node, and will try to
651  * respect the "ibm,aix-loc" property if any. It works with up to 8
652  * ports.
653  */
654
655 #define MAX_LEGACY_SERIAL_PORTS 8
656 static struct plat_serial8250_port serial_ports[MAX_LEGACY_SERIAL_PORTS+1];
657 static unsigned int old_serial_count;
658
659 void __init generic_find_legacy_serial_ports(u64 *physport,
660                 unsigned int *default_speed)
661 {
662         struct device_node *np;
663         u32 *sizeprop;
664
665         struct isa_reg_property {
666                 u32 space;
667                 u32 address;
668                 u32 size;
669         };
670         struct pci_reg_property {
671                 struct pci_address addr;
672                 u32 size_hi;
673                 u32 size_lo;
674         };                                                                        
675
676         DBG(" -> generic_find_legacy_serial_port()\n");
677
678         *physport = 0;
679         if (default_speed)
680                 *default_speed = 0;
681
682         np = of_find_node_by_path("/");
683         if (!np)
684                 return;
685
686         /* First fill our array */
687         for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
688                 struct device_node *isa, *pci;
689                 struct isa_reg_property *reg;
690                 unsigned long phys_size, addr_size, io_base;
691                 u32 *rangesp;
692                 u32 *interrupts, *clk, *spd;
693                 char *typep;
694                 int index, rlen, rentsize;
695
696                 /* Ok, first check if it's under an "isa" parent */
697                 isa = of_get_parent(np);
698                 if (!isa || strcmp(isa->name, "isa")) {
699                         DBG("%s: no isa parent found\n", np->full_name);
700                         continue;
701                 }
702                 
703                 /* Now look for an "ibm,aix-loc" property that gives us ordering
704                  * if any...
705                  */
706                 typep = (char *)get_property(np, "ibm,aix-loc", NULL);
707
708                 /* Get the ISA port number */
709                 reg = (struct isa_reg_property *)get_property(np, "reg", NULL); 
710                 if (reg == NULL)
711                         goto next_port;
712                 /* We assume the interrupt number isn't translated ... */
713                 interrupts = (u32 *)get_property(np, "interrupts", NULL);
714                 /* get clock freq. if present */
715                 clk = (u32 *)get_property(np, "clock-frequency", NULL);
716                 /* get default speed if present */
717                 spd = (u32 *)get_property(np, "current-speed", NULL);
718                 /* Default to locate at end of array */
719                 index = old_serial_count; /* end of the array by default */
720
721                 /* If we have a location index, then use it */
722                 if (typep && *typep == 'S') {
723                         index = simple_strtol(typep+1, NULL, 0) - 1;
724                         /* if index is out of range, use end of array instead */
725                         if (index >= MAX_LEGACY_SERIAL_PORTS)
726                                 index = old_serial_count;
727                         /* if our index is still out of range, that mean that
728                          * array is full, we could scan for a free slot but that
729                          * make little sense to bother, just skip the port
730                          */
731                         if (index >= MAX_LEGACY_SERIAL_PORTS)
732                                 goto next_port;
733                         if (index >= old_serial_count)
734                                 old_serial_count = index + 1;
735                         /* Check if there is a port who already claimed our slot */
736                         if (serial_ports[index].iobase != 0) {
737                                 /* if we still have some room, move it, else override */
738                                 if (old_serial_count < MAX_LEGACY_SERIAL_PORTS) {
739                                         DBG("Moved legacy port %d -> %d\n", index,
740                                             old_serial_count);
741                                         serial_ports[old_serial_count++] =
742                                                 serial_ports[index];
743                                 } else {
744                                         DBG("Replacing legacy port %d\n", index);
745                                 }
746                         }
747                 }
748                 if (index >= MAX_LEGACY_SERIAL_PORTS)
749                         goto next_port;
750                 if (index >= old_serial_count)
751                         old_serial_count = index + 1;
752
753                 /* Now fill the entry */
754                 memset(&serial_ports[index], 0, sizeof(struct plat_serial8250_port));
755                 serial_ports[index].uartclk = clk ? *clk : BASE_BAUD * 16;
756                 serial_ports[index].iobase = reg->address;
757                 serial_ports[index].irq = interrupts ? interrupts[0] : 0;
758                 serial_ports[index].flags = ASYNC_BOOT_AUTOCONF;
759
760                 DBG("Added legacy port, index: %d, port: %x, irq: %d, clk: %d\n",
761                     index,
762                     serial_ports[index].iobase,
763                     serial_ports[index].irq,
764                     serial_ports[index].uartclk);
765
766                 /* Get phys address of IO reg for port 1 */
767                 if (index != 0)
768                         goto next_port;
769
770                 pci = of_get_parent(isa);
771                 if (!pci) {
772                         DBG("%s: no pci parent found\n", np->full_name);
773                         goto next_port;
774                 }
775
776                 rangesp = (u32 *)get_property(pci, "ranges", &rlen);
777                 if (rangesp == NULL) {
778                         of_node_put(pci);
779                         goto next_port;
780                 }
781                 rlen /= 4;
782
783                 /* we need the #size-cells of the PCI bridge node itself */
784                 phys_size = 1;
785                 sizeprop = (u32 *)get_property(pci, "#size-cells", NULL);
786                 if (sizeprop != NULL)
787                         phys_size = *sizeprop;
788                 /* we need the parent #addr-cells */
789                 addr_size = prom_n_addr_cells(pci);
790                 rentsize = 3 + addr_size + phys_size;
791                 io_base = 0;
792                 for (;rlen >= rentsize; rlen -= rentsize,rangesp += rentsize) {
793                         if (((rangesp[0] >> 24) & 0x3) != 1)
794                                 continue; /* not IO space */
795                         io_base = rangesp[3];
796                         if (addr_size == 2)
797                                 io_base = (io_base << 32) | rangesp[4];
798                 }
799                 if (io_base != 0) {
800                         *physport = io_base + reg->address;
801                         if (default_speed && spd)
802                                 *default_speed = *spd;
803                 }
804                 of_node_put(pci);
805         next_port:
806                 of_node_put(isa);
807         }
808
809         DBG(" <- generic_find_legacy_serial_port()\n");
810 }
811
812 static struct platform_device serial_device = {
813         .name   = "serial8250",
814         .id     = PLAT8250_DEV_PLATFORM,
815         .dev    = {
816                 .platform_data = serial_ports,
817         },
818 };
819
820 static int __init serial_dev_init(void)
821 {
822         return platform_device_register(&serial_device);
823 }
824 arch_initcall(serial_dev_init);
825
826 #endif /* CONFIG_PPC_ISERIES */
827
828 int check_legacy_ioport(unsigned long base_port)
829 {
830         if (ppc_md.check_legacy_ioport == NULL)
831                 return 0;
832         return ppc_md.check_legacy_ioport(base_port);
833 }
834 EXPORT_SYMBOL(check_legacy_ioport);
835
836 void cpu_die(void)
837 {
838         if (ppc_md.cpu_die)
839                 ppc_md.cpu_die();
840 }