diff options
author | Arnd Bergmann <arnd@arndb.de> | 2005-06-22 19:43:37 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-06-22 19:43:37 -0400 |
commit | fef1c772fa154c16e0a54577e9ecb5480f7b937e (patch) | |
tree | 7c1483966f984c822b58f761b9be873dce94999c /arch/ppc64 | |
parent | 031f7edecf46d731673a5dd19ecb0de38f1a2219 (diff) |
[PATCH] ppc64: add BPA platform type
This adds the basic support for running on BPA machines.
So far, this is only the IBM workstation, and it will
not run on others without a little more generalization.
It should be possible to configure a kernel for any
combination of CONFIG_PPC_BPA with any of the other
multiplatform targets.
Signed-off-by: Arnd Bergmann <arndb@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/ppc64')
-rw-r--r-- | arch/ppc64/Kconfig | 6 | ||||
-rw-r--r-- | arch/ppc64/Makefile | 2 | ||||
-rw-r--r-- | arch/ppc64/kernel/Makefile | 3 | ||||
-rw-r--r-- | arch/ppc64/kernel/bpa_setup.c | 135 | ||||
-rw-r--r-- | arch/ppc64/kernel/cpu_setup_power4.S | 16 | ||||
-rw-r--r-- | arch/ppc64/kernel/cputable.c | 11 | ||||
-rw-r--r-- | arch/ppc64/kernel/irq.c | 3 | ||||
-rw-r--r-- | arch/ppc64/kernel/proc_ppc64.c | 2 | ||||
-rw-r--r-- | arch/ppc64/kernel/prom_init.c | 4 | ||||
-rw-r--r-- | arch/ppc64/kernel/setup.c | 4 | ||||
-rw-r--r-- | arch/ppc64/kernel/traps.c | 4 |
11 files changed, 185 insertions, 5 deletions
diff --git a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig index 0f1fa289744e..c7f2f0a4d856 100644 --- a/arch/ppc64/Kconfig +++ b/arch/ppc64/Kconfig | |||
@@ -77,6 +77,10 @@ config PPC_PSERIES | |||
77 | bool " IBM pSeries & new iSeries" | 77 | bool " IBM pSeries & new iSeries" |
78 | default y | 78 | default y |
79 | 79 | ||
80 | config PPC_BPA | ||
81 | bool " Broadband Processor Architecture" | ||
82 | depends on PPC_MULTIPLATFORM | ||
83 | |||
80 | config PPC_PMAC | 84 | config PPC_PMAC |
81 | depends on PPC_MULTIPLATFORM | 85 | depends on PPC_MULTIPLATFORM |
82 | bool " Apple G5 based machines" | 86 | bool " Apple G5 based machines" |
@@ -256,7 +260,7 @@ config MSCHUNKS | |||
256 | 260 | ||
257 | config PPC_RTAS | 261 | config PPC_RTAS |
258 | bool | 262 | bool |
259 | depends on PPC_PSERIES | 263 | depends on PPC_PSERIES || PPC_BPA |
260 | default y | 264 | default y |
261 | 265 | ||
262 | config RTAS_PROC | 266 | config RTAS_PROC |
diff --git a/arch/ppc64/Makefile b/arch/ppc64/Makefile index 33c752ceca4b..731b84758331 100644 --- a/arch/ppc64/Makefile +++ b/arch/ppc64/Makefile | |||
@@ -90,12 +90,14 @@ boot := arch/ppc64/boot | |||
90 | boottarget-$(CONFIG_PPC_PSERIES) := zImage zImage.initrd | 90 | boottarget-$(CONFIG_PPC_PSERIES) := zImage zImage.initrd |
91 | boottarget-$(CONFIG_PPC_MAPLE) := zImage zImage.initrd | 91 | boottarget-$(CONFIG_PPC_MAPLE) := zImage zImage.initrd |
92 | boottarget-$(CONFIG_PPC_ISERIES) := vmlinux.sminitrd vmlinux.initrd vmlinux.sm | 92 | boottarget-$(CONFIG_PPC_ISERIES) := vmlinux.sminitrd vmlinux.initrd vmlinux.sm |
93 | boottarget-$(CONFIG_PPC_BPA) := zImage zImage.initrd | ||
93 | $(boottarget-y): vmlinux | 94 | $(boottarget-y): vmlinux |
94 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | 95 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ |
95 | 96 | ||
96 | bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage | 97 | bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage |
97 | bootimage-$(CONFIG_PPC_PMAC) := vmlinux | 98 | bootimage-$(CONFIG_PPC_PMAC) := vmlinux |
98 | bootimage-$(CONFIG_PPC_MAPLE) := $(boot)/zImage | 99 | bootimage-$(CONFIG_PPC_MAPLE) := $(boot)/zImage |
100 | bootimage-$(CONFIG_PPC_BPA) := zImage | ||
99 | bootimage-$(CONFIG_PPC_ISERIES) := vmlinux | 101 | bootimage-$(CONFIG_PPC_ISERIES) := vmlinux |
100 | BOOTIMAGE := $(bootimage-y) | 102 | BOOTIMAGE := $(bootimage-y) |
101 | install: vmlinux | 103 | install: vmlinux |
diff --git a/arch/ppc64/kernel/Makefile b/arch/ppc64/kernel/Makefile index f389f2453daa..c89983ab9098 100644 --- a/arch/ppc64/kernel/Makefile +++ b/arch/ppc64/kernel/Makefile | |||
@@ -33,6 +33,8 @@ obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \ | |||
33 | pSeries_nvram.o rtasd.o ras.o pSeries_reconfig.o \ | 33 | pSeries_nvram.o rtasd.o ras.o pSeries_reconfig.o \ |
34 | xics.o pSeries_setup.o pSeries_iommu.o | 34 | xics.o pSeries_setup.o pSeries_iommu.o |
35 | 35 | ||
36 | obj-$(CONFIG_PPC_BPA) += bpa_setup.o bpa_nvram.o | ||
37 | |||
36 | obj-$(CONFIG_EEH) += eeh.o | 38 | obj-$(CONFIG_EEH) += eeh.o |
37 | obj-$(CONFIG_PROC_FS) += proc_ppc64.o | 39 | obj-$(CONFIG_PROC_FS) += proc_ppc64.o |
38 | obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o | 40 | obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o |
@@ -59,6 +61,7 @@ ifdef CONFIG_SMP | |||
59 | obj-$(CONFIG_PPC_PMAC) += pmac_smp.o smp-tbsync.o | 61 | obj-$(CONFIG_PPC_PMAC) += pmac_smp.o smp-tbsync.o |
60 | obj-$(CONFIG_PPC_ISERIES) += iSeries_smp.o | 62 | obj-$(CONFIG_PPC_ISERIES) += iSeries_smp.o |
61 | obj-$(CONFIG_PPC_PSERIES) += pSeries_smp.o | 63 | obj-$(CONFIG_PPC_PSERIES) += pSeries_smp.o |
64 | obj-$(CONFIG_PPC_BPA) += pSeries_smp.o | ||
62 | obj-$(CONFIG_PPC_MAPLE) += smp-tbsync.o | 65 | obj-$(CONFIG_PPC_MAPLE) += smp-tbsync.o |
63 | endif | 66 | endif |
64 | 67 | ||
diff --git a/arch/ppc64/kernel/bpa_setup.c b/arch/ppc64/kernel/bpa_setup.c new file mode 100644 index 000000000000..d1992dd2d61b --- /dev/null +++ b/arch/ppc64/kernel/bpa_setup.c | |||
@@ -0,0 +1,135 @@ | |||
1 | /* | ||
2 | * linux/arch/ppc/kernel/bpa_setup.c | ||
3 | * | ||
4 | * Copyright (C) 1995 Linus Torvalds | ||
5 | * Adapted from 'alpha' version by Gary Thomas | ||
6 | * Modified by Cort Dougan (cort@cs.nmt.edu) | ||
7 | * Modified by PPC64 Team, IBM Corp | ||
8 | * Modified by BPA Team, IBM Deutschland Entwicklung GmbH | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | #undef DEBUG | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/sched.h> | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/stddef.h> | ||
22 | #include <linux/unistd.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <linux/user.h> | ||
25 | #include <linux/reboot.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <linux/delay.h> | ||
28 | #include <linux/irq.h> | ||
29 | #include <linux/seq_file.h> | ||
30 | #include <linux/root_dev.h> | ||
31 | #include <linux/console.h> | ||
32 | |||
33 | #include <asm/mmu.h> | ||
34 | #include <asm/processor.h> | ||
35 | #include <asm/io.h> | ||
36 | #include <asm/pgtable.h> | ||
37 | #include <asm/prom.h> | ||
38 | #include <asm/rtas.h> | ||
39 | #include <asm/pci-bridge.h> | ||
40 | #include <asm/iommu.h> | ||
41 | #include <asm/dma.h> | ||
42 | #include <asm/machdep.h> | ||
43 | #include <asm/time.h> | ||
44 | #include <asm/nvram.h> | ||
45 | #include <asm/cputable.h> | ||
46 | |||
47 | #include "pci.h" | ||
48 | |||
49 | #ifdef DEBUG | ||
50 | #define DBG(fmt...) udbg_printf(fmt) | ||
51 | #else | ||
52 | #define DBG(fmt...) | ||
53 | #endif | ||
54 | |||
55 | void bpa_get_cpuinfo(struct seq_file *m) | ||
56 | { | ||
57 | struct device_node *root; | ||
58 | const char *model = ""; | ||
59 | |||
60 | root = of_find_node_by_path("/"); | ||
61 | if (root) | ||
62 | model = get_property(root, "model", NULL); | ||
63 | seq_printf(m, "machine\t\t: BPA %s\n", model); | ||
64 | of_node_put(root); | ||
65 | } | ||
66 | |||
67 | static void bpa_progress(char *s, unsigned short hex) | ||
68 | { | ||
69 | printk("*** %04x : %s\n", hex, s ? s : ""); | ||
70 | } | ||
71 | |||
72 | static void __init bpa_setup_arch(void) | ||
73 | { | ||
74 | #ifdef CONFIG_SMP | ||
75 | smp_init_pSeries(); | ||
76 | #endif | ||
77 | |||
78 | /* init to some ~sane value until calibrate_delay() runs */ | ||
79 | loops_per_jiffy = 50000000; | ||
80 | |||
81 | if (ROOT_DEV == 0) { | ||
82 | printk("No ramdisk, default root is /dev/hda2\n"); | ||
83 | ROOT_DEV = Root_HDA2; | ||
84 | } | ||
85 | |||
86 | /* Find and initialize PCI host bridges */ | ||
87 | init_pci_config_tokens(); | ||
88 | find_and_init_phbs(); | ||
89 | |||
90 | #ifdef CONFIG_DUMMY_CONSOLE | ||
91 | conswitchp = &dummy_con; | ||
92 | #endif | ||
93 | |||
94 | bpa_nvram_init(); | ||
95 | } | ||
96 | |||
97 | /* | ||
98 | * Early initialization. Relocation is on but do not reference unbolted pages | ||
99 | */ | ||
100 | static void __init bpa_init_early(void) | ||
101 | { | ||
102 | DBG(" -> bpa_init_early()\n"); | ||
103 | |||
104 | hpte_init_native(); | ||
105 | |||
106 | pci_direct_iommu_init(); | ||
107 | |||
108 | ppc64_interrupt_controller = IC_BPA_IIC; | ||
109 | |||
110 | DBG(" <- bpa_init_early()\n"); | ||
111 | } | ||
112 | |||
113 | |||
114 | static int __init bpa_probe(int platform) | ||
115 | { | ||
116 | if (platform != PLATFORM_BPA) | ||
117 | return 0; | ||
118 | |||
119 | return 1; | ||
120 | } | ||
121 | |||
122 | struct machdep_calls __initdata bpa_md = { | ||
123 | .probe = bpa_probe, | ||
124 | .setup_arch = bpa_setup_arch, | ||
125 | .init_early = bpa_init_early, | ||
126 | .get_cpuinfo = bpa_get_cpuinfo, | ||
127 | .restart = rtas_restart, | ||
128 | .power_off = rtas_power_off, | ||
129 | .halt = rtas_halt, | ||
130 | .get_boot_time = rtas_get_boot_time, | ||
131 | .get_rtc_time = rtas_get_rtc_time, | ||
132 | .set_rtc_time = rtas_set_rtc_time, | ||
133 | .calibrate_decr = generic_calibrate_decr, | ||
134 | .progress = bpa_progress, | ||
135 | }; | ||
diff --git a/arch/ppc64/kernel/cpu_setup_power4.S b/arch/ppc64/kernel/cpu_setup_power4.S index 3bd951820850..42fc08cf87a0 100644 --- a/arch/ppc64/kernel/cpu_setup_power4.S +++ b/arch/ppc64/kernel/cpu_setup_power4.S | |||
@@ -73,7 +73,21 @@ _GLOBAL(__970_cpu_preinit) | |||
73 | 73 | ||
74 | _GLOBAL(__setup_cpu_power4) | 74 | _GLOBAL(__setup_cpu_power4) |
75 | blr | 75 | blr |
76 | 76 | ||
77 | _GLOBAL(__setup_cpu_be) | ||
78 | /* Set large page sizes LP=0: 16MB, LP=1: 64KB */ | ||
79 | addi r3, 0, 0 | ||
80 | ori r3, r3, HID6_LB | ||
81 | sldi r3, r3, 32 | ||
82 | nor r3, r3, r3 | ||
83 | mfspr r4, SPRN_HID6 | ||
84 | and r4, r4, r3 | ||
85 | addi r3, 0, 0x02000 | ||
86 | sldi r3, r3, 32 | ||
87 | or r4, r4, r3 | ||
88 | mtspr SPRN_HID6, r4 | ||
89 | blr | ||
90 | |||
77 | _GLOBAL(__setup_cpu_ppc970) | 91 | _GLOBAL(__setup_cpu_ppc970) |
78 | mfspr r0,SPRN_HID0 | 92 | mfspr r0,SPRN_HID0 |
79 | li r11,5 /* clear DOZE and SLEEP */ | 93 | li r11,5 /* clear DOZE and SLEEP */ |
diff --git a/arch/ppc64/kernel/cputable.c b/arch/ppc64/kernel/cputable.c index 8644a8648058..1d162c7c59df 100644 --- a/arch/ppc64/kernel/cputable.c +++ b/arch/ppc64/kernel/cputable.c | |||
@@ -34,6 +34,7 @@ EXPORT_SYMBOL(cur_cpu_spec); | |||
34 | extern void __setup_cpu_power3(unsigned long offset, struct cpu_spec* spec); | 34 | extern void __setup_cpu_power3(unsigned long offset, struct cpu_spec* spec); |
35 | extern void __setup_cpu_power4(unsigned long offset, struct cpu_spec* spec); | 35 | extern void __setup_cpu_power4(unsigned long offset, struct cpu_spec* spec); |
36 | extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); | 36 | extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); |
37 | extern void __setup_cpu_be(unsigned long offset, struct cpu_spec* spec); | ||
37 | 38 | ||
38 | 39 | ||
39 | /* We only set the altivec features if the kernel was compiled with altivec | 40 | /* We only set the altivec features if the kernel was compiled with altivec |
@@ -162,6 +163,16 @@ struct cpu_spec cpu_specs[] = { | |||
162 | __setup_cpu_power4, | 163 | __setup_cpu_power4, |
163 | COMMON_PPC64_FW | 164 | COMMON_PPC64_FW |
164 | }, | 165 | }, |
166 | { /* BE DD1.x */ | ||
167 | 0xffff0000, 0x00700000, "Broadband Engine", | ||
168 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | ||
169 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | | ||
170 | CPU_FTR_SMT, | ||
171 | COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP, | ||
172 | 128, 128, | ||
173 | __setup_cpu_be, | ||
174 | COMMON_PPC64_FW | ||
175 | }, | ||
165 | { /* default match */ | 176 | { /* default match */ |
166 | 0x00000000, 0x00000000, "POWER4 (compatible)", | 177 | 0x00000000, 0x00000000, "POWER4 (compatible)", |
167 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 178 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | |
diff --git a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c index d860467b8f09..3defc8c33adf 100644 --- a/arch/ppc64/kernel/irq.c +++ b/arch/ppc64/kernel/irq.c | |||
@@ -395,6 +395,9 @@ int virt_irq_create_mapping(unsigned int real_irq) | |||
395 | if (ppc64_interrupt_controller == IC_OPEN_PIC) | 395 | if (ppc64_interrupt_controller == IC_OPEN_PIC) |
396 | return real_irq; /* no mapping for openpic (for now) */ | 396 | return real_irq; /* no mapping for openpic (for now) */ |
397 | 397 | ||
398 | if (ppc64_interrupt_controller == IC_BPA_IIC) | ||
399 | return real_irq; /* no mapping for iic either */ | ||
400 | |||
398 | /* don't map interrupts < MIN_VIRT_IRQ */ | 401 | /* don't map interrupts < MIN_VIRT_IRQ */ |
399 | if (real_irq < MIN_VIRT_IRQ) { | 402 | if (real_irq < MIN_VIRT_IRQ) { |
400 | virt_irq_to_real_map[real_irq] = real_irq; | 403 | virt_irq_to_real_map[real_irq] = real_irq; |
diff --git a/arch/ppc64/kernel/proc_ppc64.c b/arch/ppc64/kernel/proc_ppc64.c index 0914b0669b05..a87c66a9652a 100644 --- a/arch/ppc64/kernel/proc_ppc64.c +++ b/arch/ppc64/kernel/proc_ppc64.c | |||
@@ -53,7 +53,7 @@ static int __init proc_ppc64_create(void) | |||
53 | if (!root) | 53 | if (!root) |
54 | return 1; | 54 | return 1; |
55 | 55 | ||
56 | if (!(systemcfg->platform & PLATFORM_PSERIES)) | 56 | if (!(systemcfg->platform & (PLATFORM_PSERIES | PLATFORM_BPA))) |
57 | return 0; | 57 | return 0; |
58 | 58 | ||
59 | if (!proc_mkdir("rtas", root)) | 59 | if (!proc_mkdir("rtas", root)) |
diff --git a/arch/ppc64/kernel/prom_init.c b/arch/ppc64/kernel/prom_init.c index b7683abfbe6a..e248a7950aeb 100644 --- a/arch/ppc64/kernel/prom_init.c +++ b/arch/ppc64/kernel/prom_init.c | |||
@@ -1915,9 +1915,9 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, unsigned long | |||
1915 | prom_send_capabilities(); | 1915 | prom_send_capabilities(); |
1916 | 1916 | ||
1917 | /* | 1917 | /* |
1918 | * On pSeries, copy the CPU hold code | 1918 | * On pSeries and BPA, copy the CPU hold code |
1919 | */ | 1919 | */ |
1920 | if (RELOC(of_platform) & PLATFORM_PSERIES) | 1920 | if (RELOC(of_platform) & (PLATFORM_PSERIES | PLATFORM_BPA)) |
1921 | copy_and_flush(0, KERNELBASE - offset, 0x100, 0); | 1921 | copy_and_flush(0, KERNELBASE - offset, 0x100, 0); |
1922 | 1922 | ||
1923 | /* | 1923 | /* |
diff --git a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c index 93b0ee88cda1..10222008fe20 100644 --- a/arch/ppc64/kernel/setup.c +++ b/arch/ppc64/kernel/setup.c | |||
@@ -344,6 +344,7 @@ static void __init setup_cpu_maps(void) | |||
344 | extern struct machdep_calls pSeries_md; | 344 | extern struct machdep_calls pSeries_md; |
345 | extern struct machdep_calls pmac_md; | 345 | extern struct machdep_calls pmac_md; |
346 | extern struct machdep_calls maple_md; | 346 | extern struct machdep_calls maple_md; |
347 | extern struct machdep_calls bpa_md; | ||
347 | 348 | ||
348 | /* Ultimately, stuff them in an elf section like initcalls... */ | 349 | /* Ultimately, stuff them in an elf section like initcalls... */ |
349 | static struct machdep_calls __initdata *machines[] = { | 350 | static struct machdep_calls __initdata *machines[] = { |
@@ -356,6 +357,9 @@ static struct machdep_calls __initdata *machines[] = { | |||
356 | #ifdef CONFIG_PPC_MAPLE | 357 | #ifdef CONFIG_PPC_MAPLE |
357 | &maple_md, | 358 | &maple_md, |
358 | #endif /* CONFIG_PPC_MAPLE */ | 359 | #endif /* CONFIG_PPC_MAPLE */ |
360 | #ifdef CONFIG_PPC_BPA | ||
361 | &bpa_md, | ||
362 | #endif | ||
359 | NULL | 363 | NULL |
360 | }; | 364 | }; |
361 | 365 | ||
diff --git a/arch/ppc64/kernel/traps.c b/arch/ppc64/kernel/traps.c index 7e52cb2605e0..a8d5e83ee89f 100644 --- a/arch/ppc64/kernel/traps.c +++ b/arch/ppc64/kernel/traps.c | |||
@@ -126,6 +126,10 @@ int die(const char *str, struct pt_regs *regs, long err) | |||
126 | printk("POWERMAC "); | 126 | printk("POWERMAC "); |
127 | nl = 1; | 127 | nl = 1; |
128 | break; | 128 | break; |
129 | case PLATFORM_BPA: | ||
130 | printk("BPA "); | ||
131 | nl = 1; | ||
132 | break; | ||
129 | } | 133 | } |
130 | if (nl) | 134 | if (nl) |
131 | printk("\n"); | 135 | printk("\n"); |