diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-14 00:24:55 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-14 00:24:55 -0500 |
commit | 87530db5ec7d519c7ba334e414307c5130ae2da8 (patch) | |
tree | a1720bb29998d8d658e91ed106263561a8101bf0 | |
parent | a148058c5cf72ad23fb6c4cf9828f7276e13151c (diff) | |
parent | d5f079000b20887bfbc84d772a27709c5665e652 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge
80 files changed, 3452 insertions, 937 deletions
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index d3654a264ef7..44dd82b791d1 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -139,17 +139,14 @@ drivers-$(CONFIG_CPM2) += arch/ppc/8260_io/ | |||
139 | 139 | ||
140 | drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ | 140 | drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ |
141 | 141 | ||
142 | defaultimage-$(CONFIG_PPC32) := zImage | 142 | # Default to zImage, override when needed |
143 | defaultimage-y := zImage | ||
143 | defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux | 144 | defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux |
144 | defaultimage-$(CONFIG_PPC_PSERIES) := zImage | ||
145 | KBUILD_IMAGE := $(defaultimage-y) | 145 | KBUILD_IMAGE := $(defaultimage-y) |
146 | all: $(KBUILD_IMAGE) | 146 | all: $(KBUILD_IMAGE) |
147 | 147 | ||
148 | CPPFLAGS_vmlinux.lds := -Upowerpc | 148 | CPPFLAGS_vmlinux.lds := -Upowerpc |
149 | 149 | ||
150 | # All the instructions talk about "make bzImage". | ||
151 | bzImage: zImage | ||
152 | |||
153 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage | 150 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage |
154 | 151 | ||
155 | .PHONY: $(BOOT_TARGETS) | 152 | .PHONY: $(BOOT_TARGETS) |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index b53d677f6742..788dec4c7ef3 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -25,8 +25,8 @@ HOSTCC := gcc | |||
25 | BOOTCFLAGS := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \ | 25 | BOOTCFLAGS := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \ |
26 | $(shell $(CROSS32CC) -print-file-name=include) -fPIC | 26 | $(shell $(CROSS32CC) -print-file-name=include) -fPIC |
27 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc | 27 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc |
28 | BOOTLFLAGS := -T $(srctree)/$(src)/zImage.lds | ||
29 | OBJCOPYFLAGS := contents,alloc,load,readonly,data | 28 | OBJCOPYFLAGS := contents,alloc,load,readonly,data |
29 | OBJCOPY_COFF_ARGS := -O aixcoff-rs6000 --set-start 0x500000 | ||
30 | 30 | ||
31 | zlib := infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c | 31 | zlib := infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c |
32 | zlibheader := infblock.h infcodes.h inffast.h inftrees.h infutil.h | 32 | zlibheader := infblock.h infcodes.h inffast.h inftrees.h infutil.h |
@@ -35,7 +35,7 @@ zliblinuxheader := zlib.h zconf.h zutil.h | |||
35 | $(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) | 35 | $(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) |
36 | #$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h) | 36 | #$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h) |
37 | 37 | ||
38 | src-boot := string.S prom.c main.c div64.S crt0.S | 38 | src-boot := crt0.S string.S prom.c stdio.c main.c div64.S |
39 | src-boot += $(zlib) | 39 | src-boot += $(zlib) |
40 | src-boot := $(addprefix $(obj)/, $(src-boot)) | 40 | src-boot := $(addprefix $(obj)/, $(src-boot)) |
41 | obj-boot := $(addsuffix .o, $(basename $(src-boot))) | 41 | obj-boot := $(addsuffix .o, $(basename $(src-boot))) |
@@ -70,7 +70,7 @@ quiet_cmd_bootas = BOOTAS $@ | |||
70 | cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $< | 70 | cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $< |
71 | 71 | ||
72 | quiet_cmd_bootld = BOOTLD $@ | 72 | quiet_cmd_bootld = BOOTLD $@ |
73 | cmd_bootld = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(2) | 73 | cmd_bootld = $(CROSS32LD) -T $(srctree)/$(src)/$(3) -o $@ $(2) |
74 | 74 | ||
75 | $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c | 75 | $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c |
76 | $(call if_changed_dep,bootcc) | 76 | $(call if_changed_dep,bootcc) |
@@ -87,12 +87,14 @@ obj-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.o, $(section))) | |||
87 | src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section))) | 87 | src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section))) |
88 | gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section))) | 88 | gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section))) |
89 | 89 | ||
90 | hostprogs-y := addnote addRamDisk | 90 | hostprogs-y := addnote addRamDisk hack-coff |
91 | targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd \ | 91 | |
92 | $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \ | 92 | targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd \ |
93 | $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \ | 93 | zImage.coff zImage.initrd.coff \ |
94 | $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \ | 94 | $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \ |
95 | vmlinux.initrd | 95 | $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \ |
96 | $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \ | ||
97 | vmlinux.initrd | ||
96 | extra-y := initrd.o | 98 | extra-y := initrd.o |
97 | 99 | ||
98 | quiet_cmd_ramdisk = RAMDISK $@ | 100 | quiet_cmd_ramdisk = RAMDISK $@ |
@@ -114,6 +116,10 @@ quiet_cmd_addsection = ADDSEC $@ | |||
114 | quiet_cmd_addnote = ADDNOTE $@ | 116 | quiet_cmd_addnote = ADDNOTE $@ |
115 | cmd_addnote = $(obj)/addnote $@ | 117 | cmd_addnote = $(obj)/addnote $@ |
116 | 118 | ||
119 | quiet_cmd_gencoff = COFF $@ | ||
120 | cmd_gencoff = $(OBJCOPY) $(OBJCOPY_COFF_ARGS) $@ && \ | ||
121 | $(obj)/hack-coff $@ | ||
122 | |||
117 | $(call gz-sec, $(required)): $(obj)/kernel-%.gz: % | 123 | $(call gz-sec, $(required)): $(obj)/kernel-%.gz: % |
118 | $(call if_changed,gzip) | 124 | $(call if_changed,gzip) |
119 | 125 | ||
@@ -127,22 +133,35 @@ $(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c | |||
127 | $(call if_changed_dep,bootcc) | 133 | $(call if_changed_dep,bootcc) |
128 | $(call cmd,addsection) | 134 | $(call cmd,addsection) |
129 | 135 | ||
130 | $(obj)/zImage.vmode: obj-boot += $(call obj-sec, $(required)) | 136 | $(obj)/zImage.vmode $(obj)/zImage.coff: obj-boot += $(call obj-sec, $(required)) |
131 | $(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) $(srctree)/$(src)/zImage.lds | 137 | $(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) $(srctree)/$(src)/zImage.lds |
132 | $(call cmd,bootld,$(obj-boot)) | 138 | $(call cmd,bootld,$(obj-boot),zImage.lds) |
133 | 139 | ||
134 | $(obj)/zImage.initrd.vmode: obj-boot += $(call obj-sec, $(required) $(initrd)) | 140 | $(obj)/zImage.initrd.vmode $(obj)/zImage.initrd.coff: obj-boot += $(call obj-sec, $(required) $(initrd)) |
135 | $(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(srctree)/$(src)/zImage.lds | 141 | $(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(srctree)/$(src)/zImage.lds |
136 | $(call cmd,bootld,$(obj-boot)) | 142 | $(call cmd,bootld,$(obj-boot),zImage.lds) |
143 | |||
144 | # For 32-bit powermacs, build the COFF images as well as the ELF images. | ||
145 | coffimage-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/zImage.coff | ||
146 | coffrdimg-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/zImage.initrd.coff | ||
137 | 147 | ||
138 | $(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote | 148 | $(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote $(coffimage-y-y) |
139 | @cp -f $< $@ | 149 | @cp -f $< $@ |
140 | $(call if_changed,addnote) | 150 | $(call if_changed,addnote) |
141 | 151 | ||
142 | $(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote | 152 | $(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote $(coffrdimg-y-y) |
143 | @cp -f $< $@ | 153 | @cp -f $< $@ |
144 | $(call if_changed,addnote) | 154 | $(call if_changed,addnote) |
145 | 155 | ||
156 | $(obj)/zImage.coff: $(call obj-sec, $(required)) $(obj-boot) $(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff | ||
157 | $(call cmd,bootld,$(obj-boot),zImage.coff.lds) | ||
158 | $(call cmd,gencoff) | ||
159 | |||
160 | $(obj)/zImage.initrd.coff: $(call obj-sec, $(required) $(initrd)) $(obj-boot) \ | ||
161 | $(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff | ||
162 | $(call cmd,bootld,$(obj-boot),zImage.coff.lds) | ||
163 | $(call cmd,gencoff) | ||
164 | |||
146 | #----------------------------------------------------------- | 165 | #----------------------------------------------------------- |
147 | # build u-boot images | 166 | # build u-boot images |
148 | #----------------------------------------------------------- | 167 | #----------------------------------------------------------- |
diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S index d2f2ace56cd3..e0192c26037b 100644 --- a/arch/powerpc/boot/crt0.S +++ b/arch/powerpc/boot/crt0.S | |||
@@ -12,17 +12,23 @@ | |||
12 | #include "ppc_asm.h" | 12 | #include "ppc_asm.h" |
13 | 13 | ||
14 | .text | 14 | .text |
15 | /* a procedure descriptor used when booting this as a COFF file */ | ||
16 | _zimage_start_opd: | ||
17 | .long _zimage_start, 0, 0, 0 | ||
18 | |||
15 | .globl _zimage_start | 19 | .globl _zimage_start |
16 | _zimage_start: | 20 | _zimage_start: |
21 | /* Work out the offset between the address we were linked at | ||
22 | and the address where we're running. */ | ||
17 | bl 1f | 23 | bl 1f |
18 | 24 | 1: mflr r0 | |
19 | 1: | ||
20 | mflr r0 | ||
21 | lis r9,1b@ha | 25 | lis r9,1b@ha |
22 | addi r9,r9,1b@l | 26 | addi r9,r9,1b@l |
23 | subf. r0,r9,r0 | 27 | subf. r0,r9,r0 |
24 | beq 3f | 28 | beq 3f /* if running at same address as linked */ |
25 | 29 | ||
30 | /* The .got2 section contains a list of addresses, so add | ||
31 | the address offset onto each entry. */ | ||
26 | lis r9,__got2_start@ha | 32 | lis r9,__got2_start@ha |
27 | addi r9,r9,__got2_start@l | 33 | addi r9,r9,__got2_start@l |
28 | lis r8,__got2_end@ha | 34 | lis r8,__got2_end@ha |
@@ -32,15 +38,14 @@ _zimage_start: | |||
32 | srwi. r8,r8,2 | 38 | srwi. r8,r8,2 |
33 | mtctr r8 | 39 | mtctr r8 |
34 | add r9,r0,r9 | 40 | add r9,r0,r9 |
35 | 2: | 41 | 2: lwz r8,0(r9) |
36 | lwz r8,0(r9) | ||
37 | add r8,r8,r0 | 42 | add r8,r8,r0 |
38 | stw r8,0(r9) | 43 | stw r8,0(r9) |
39 | addi r9,r9,4 | 44 | addi r9,r9,4 |
40 | bdnz 2b | 45 | bdnz 2b |
41 | 46 | ||
42 | 3: | 47 | /* Do a cache flush for our text, in case OF didn't */ |
43 | lis r9,_start@h | 48 | 3: lis r9,_start@h |
44 | add r9,r0,r9 | 49 | add r9,r0,r9 |
45 | lis r8,_etext@ha | 50 | lis r8,_etext@ha |
46 | addi r8,r8,_etext@l | 51 | addi r8,r8,_etext@l |
diff --git a/arch/powerpc/boot/hack-coff.c b/arch/powerpc/boot/hack-coff.c new file mode 100644 index 000000000000..5e5a6573a1ef --- /dev/null +++ b/arch/powerpc/boot/hack-coff.c | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * hack-coff.c - hack the header of an xcoff file to fill in | ||
3 | * a few fields needed by the Open Firmware xcoff loader on | ||
4 | * Power Macs but not initialized by objcopy. | ||
5 | * | ||
6 | * Copyright (C) Paul Mackerras 1997. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | #include <stdio.h> | ||
14 | #include <stdlib.h> | ||
15 | #include <unistd.h> | ||
16 | #include <fcntl.h> | ||
17 | #include <string.h> | ||
18 | #include "rs6000.h" | ||
19 | |||
20 | #define AOUT_MAGIC 0x010b | ||
21 | |||
22 | #define get_16be(x) ((((unsigned char *)(x))[0] << 8) \ | ||
23 | + ((unsigned char *)(x))[1]) | ||
24 | #define put_16be(x, v) (((unsigned char *)(x))[0] = (v) >> 8, \ | ||
25 | ((unsigned char *)(x))[1] = (v) & 0xff) | ||
26 | #define get_32be(x) ((((unsigned char *)(x))[0] << 24) \ | ||
27 | + (((unsigned char *)(x))[1] << 16) \ | ||
28 | + (((unsigned char *)(x))[2] << 8) \ | ||
29 | + ((unsigned char *)(x))[3]) | ||
30 | |||
31 | int | ||
32 | main(int ac, char **av) | ||
33 | { | ||
34 | int fd; | ||
35 | int i, nsect; | ||
36 | int aoutsz; | ||
37 | struct external_filehdr fhdr; | ||
38 | AOUTHDR aout; | ||
39 | struct external_scnhdr shdr; | ||
40 | |||
41 | if (ac != 2) { | ||
42 | fprintf(stderr, "Usage: hack-coff coff-file\n"); | ||
43 | exit(1); | ||
44 | } | ||
45 | if ((fd = open(av[1], 2)) == -1) { | ||
46 | perror(av[2]); | ||
47 | exit(1); | ||
48 | } | ||
49 | if (read(fd, &fhdr, sizeof(fhdr)) != sizeof(fhdr)) | ||
50 | goto readerr; | ||
51 | i = get_16be(fhdr.f_magic); | ||
52 | if (i != U802TOCMAGIC && i != U802WRMAGIC && i != U802ROMAGIC) { | ||
53 | fprintf(stderr, "%s: not an xcoff file\n", av[1]); | ||
54 | exit(1); | ||
55 | } | ||
56 | aoutsz = get_16be(fhdr.f_opthdr); | ||
57 | if (read(fd, &aout, aoutsz) != aoutsz) | ||
58 | goto readerr; | ||
59 | nsect = get_16be(fhdr.f_nscns); | ||
60 | for (i = 0; i < nsect; ++i) { | ||
61 | if (read(fd, &shdr, sizeof(shdr)) != sizeof(shdr)) | ||
62 | goto readerr; | ||
63 | if (strcmp(shdr.s_name, ".text") == 0) { | ||
64 | put_16be(aout.o_snentry, i+1); | ||
65 | put_16be(aout.o_sntext, i+1); | ||
66 | } else if (strcmp(shdr.s_name, ".data") == 0) { | ||
67 | put_16be(aout.o_sndata, i+1); | ||
68 | } else if (strcmp(shdr.s_name, ".bss") == 0) { | ||
69 | put_16be(aout.o_snbss, i+1); | ||
70 | } | ||
71 | } | ||
72 | put_16be(aout.magic, AOUT_MAGIC); | ||
73 | if (lseek(fd, (long) sizeof(struct external_filehdr), 0) == -1 | ||
74 | || write(fd, &aout, aoutsz) != aoutsz) { | ||
75 | fprintf(stderr, "%s: write error\n", av[1]); | ||
76 | exit(1); | ||
77 | } | ||
78 | close(fd); | ||
79 | exit(0); | ||
80 | |||
81 | readerr: | ||
82 | fprintf(stderr, "%s: read error or file too short\n", av[1]); | ||
83 | exit(1); | ||
84 | } | ||
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c index 64ec93116fa6..55ec59867250 100644 --- a/arch/powerpc/boot/main.c +++ b/arch/powerpc/boot/main.c | |||
@@ -21,8 +21,8 @@ extern void flush_cache(void *, unsigned long); | |||
21 | 21 | ||
22 | 22 | ||
23 | /* Value picked to match that used by yaboot */ | 23 | /* Value picked to match that used by yaboot */ |
24 | #define PROG_START 0x01400000 | 24 | #define PROG_START 0x01400000 /* only used on 64-bit systems */ |
25 | #define RAM_END (512<<20) // Fixme: use OF */ | 25 | #define RAM_END (512<<20) /* Fixme: use OF */ |
26 | #define ONE_MB 0x100000 | 26 | #define ONE_MB 0x100000 |
27 | 27 | ||
28 | extern char _start[]; | 28 | extern char _start[]; |
@@ -160,6 +160,17 @@ static int is_elf64(void *hdr) | |||
160 | elfoffset = (unsigned long)elf64ph->p_offset; | 160 | elfoffset = (unsigned long)elf64ph->p_offset; |
161 | vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset; | 161 | vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset; |
162 | vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset; | 162 | vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset; |
163 | |||
164 | #if defined(PROG_START) | ||
165 | /* | ||
166 | * Maintain a "magic" minimum address. This keeps some older | ||
167 | * firmware platforms running. | ||
168 | */ | ||
169 | |||
170 | if (claim_base < PROG_START) | ||
171 | claim_base = PROG_START; | ||
172 | #endif | ||
173 | |||
163 | return 1; | 174 | return 1; |
164 | } | 175 | } |
165 | 176 | ||
@@ -206,12 +217,18 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | |||
206 | exit(); | 217 | exit(); |
207 | if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4) | 218 | if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4) |
208 | exit(); | 219 | exit(); |
209 | stderr = stdout; | ||
210 | if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4) | ||
211 | exit(); | ||
212 | 220 | ||
213 | printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", _start, sp); | 221 | printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", _start, sp); |
214 | 222 | ||
223 | /* | ||
224 | * The first available claim_base must be above the end of the | ||
225 | * the loaded kernel wrapper file (_start to _end includes the | ||
226 | * initrd image if it is present) and rounded up to a nice | ||
227 | * 1 MB boundary for good measure. | ||
228 | */ | ||
229 | |||
230 | claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); | ||
231 | |||
215 | vmlinuz.addr = (unsigned long)_vmlinux_start; | 232 | vmlinuz.addr = (unsigned long)_vmlinux_start; |
216 | vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start); | 233 | vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start); |
217 | 234 | ||
@@ -228,25 +245,6 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | |||
228 | exit(); | 245 | exit(); |
229 | } | 246 | } |
230 | 247 | ||
231 | /* | ||
232 | * The first available claim_base must be above the end of the | ||
233 | * the loaded kernel wrapper file (_start to _end includes the | ||
234 | * initrd image if it is present) and rounded up to a nice | ||
235 | * 1 MB boundary for good measure. | ||
236 | */ | ||
237 | |||
238 | claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); | ||
239 | |||
240 | #if defined(PROG_START) | ||
241 | /* | ||
242 | * Maintain a "magic" minimum address. This keeps some older | ||
243 | * firmware platforms running. | ||
244 | */ | ||
245 | |||
246 | if (claim_base < PROG_START) | ||
247 | claim_base = PROG_START; | ||
248 | #endif | ||
249 | |||
250 | /* We need to claim the memsize plus the file offset since gzip | 248 | /* We need to claim the memsize plus the file offset since gzip |
251 | * will expand the header (file offset), then the kernel, then | 249 | * will expand the header (file offset), then the kernel, then |
252 | * possible rubbish we don't care about. But the kernel bss must | 250 | * possible rubbish we don't care about. But the kernel bss must |
diff --git a/arch/powerpc/boot/prom.c b/arch/powerpc/boot/prom.c index 4bea2f4dcb06..fa0057736f6b 100644 --- a/arch/powerpc/boot/prom.c +++ b/arch/powerpc/boot/prom.c | |||
@@ -13,487 +13,153 @@ | |||
13 | #include "prom.h" | 13 | #include "prom.h" |
14 | 14 | ||
15 | int (*prom)(void *); | 15 | int (*prom)(void *); |
16 | phandle chosen_handle; | ||
17 | ihandle stdout; | ||
16 | 18 | ||
17 | void *chosen_handle; | 19 | int call_prom(const char *service, int nargs, int nret, ...) |
18 | |||
19 | void *stdin; | ||
20 | void *stdout; | ||
21 | void *stderr; | ||
22 | |||
23 | |||
24 | int | ||
25 | write(void *handle, void *ptr, int nb) | ||
26 | { | ||
27 | struct prom_args { | ||
28 | char *service; | ||
29 | int nargs; | ||
30 | int nret; | ||
31 | void *ihandle; | ||
32 | void *addr; | ||
33 | int len; | ||
34 | int actual; | ||
35 | } args; | ||
36 | |||
37 | args.service = "write"; | ||
38 | args.nargs = 3; | ||
39 | args.nret = 1; | ||
40 | args.ihandle = handle; | ||
41 | args.addr = ptr; | ||
42 | args.len = nb; | ||
43 | args.actual = -1; | ||
44 | (*prom)(&args); | ||
45 | return args.actual; | ||
46 | } | ||
47 | |||
48 | int | ||
49 | read(void *handle, void *ptr, int nb) | ||
50 | { | 20 | { |
21 | int i; | ||
51 | struct prom_args { | 22 | struct prom_args { |
52 | char *service; | 23 | const char *service; |
53 | int nargs; | 24 | int nargs; |
54 | int nret; | 25 | int nret; |
55 | void *ihandle; | 26 | unsigned int args[12]; |
56 | void *addr; | ||
57 | int len; | ||
58 | int actual; | ||
59 | } args; | ||
60 | |||
61 | args.service = "read"; | ||
62 | args.nargs = 3; | ||
63 | args.nret = 1; | ||
64 | args.ihandle = handle; | ||
65 | args.addr = ptr; | ||
66 | args.len = nb; | ||
67 | args.actual = -1; | ||
68 | (*prom)(&args); | ||
69 | return args.actual; | ||
70 | } | ||
71 | |||
72 | void | ||
73 | exit() | ||
74 | { | ||
75 | struct prom_args { | ||
76 | char *service; | ||
77 | } args; | ||
78 | |||
79 | for (;;) { | ||
80 | args.service = "exit"; | ||
81 | (*prom)(&args); | ||
82 | } | ||
83 | } | ||
84 | |||
85 | void | ||
86 | pause(void) | ||
87 | { | ||
88 | struct prom_args { | ||
89 | char *service; | ||
90 | } args; | 27 | } args; |
28 | va_list list; | ||
91 | 29 | ||
92 | args.service = "enter"; | 30 | args.service = service; |
93 | (*prom)(&args); | 31 | args.nargs = nargs; |
94 | } | 32 | args.nret = nret; |
95 | 33 | ||
96 | void * | 34 | va_start(list, nret); |
97 | finddevice(const char *name) | 35 | for (i = 0; i < nargs; i++) |
98 | { | 36 | args.args[i] = va_arg(list, unsigned int); |
99 | struct prom_args { | 37 | va_end(list); |
100 | char *service; | ||
101 | int nargs; | ||
102 | int nret; | ||
103 | const char *devspec; | ||
104 | void *phandle; | ||
105 | } args; | ||
106 | 38 | ||
107 | args.service = "finddevice"; | 39 | for (i = 0; i < nret; i++) |
108 | args.nargs = 1; | 40 | args.args[nargs+i] = 0; |
109 | args.nret = 1; | ||
110 | args.devspec = name; | ||
111 | args.phandle = (void *) -1; | ||
112 | (*prom)(&args); | ||
113 | return args.phandle; | ||
114 | } | ||
115 | 41 | ||
116 | void * | 42 | if (prom(&args) < 0) |
117 | claim(unsigned long virt, unsigned long size, unsigned long align) | 43 | return -1; |
118 | { | ||
119 | struct prom_args { | ||
120 | char *service; | ||
121 | int nargs; | ||
122 | int nret; | ||
123 | unsigned int virt; | ||
124 | unsigned int size; | ||
125 | unsigned int align; | ||
126 | void *ret; | ||
127 | } args; | ||
128 | 44 | ||
129 | args.service = "claim"; | 45 | return (nret > 0)? args.args[nargs]: 0; |
130 | args.nargs = 3; | ||
131 | args.nret = 1; | ||
132 | args.virt = virt; | ||
133 | args.size = size; | ||
134 | args.align = align; | ||
135 | (*prom)(&args); | ||
136 | return args.ret; | ||
137 | } | 46 | } |
138 | 47 | ||
139 | int | 48 | int call_prom_ret(const char *service, int nargs, int nret, |
140 | getprop(void *phandle, const char *name, void *buf, int buflen) | 49 | unsigned int *rets, ...) |
141 | { | 50 | { |
51 | int i; | ||
142 | struct prom_args { | 52 | struct prom_args { |
143 | char *service; | 53 | const char *service; |
144 | int nargs; | 54 | int nargs; |
145 | int nret; | 55 | int nret; |
146 | void *phandle; | 56 | unsigned int args[12]; |
147 | const char *name; | ||
148 | void *buf; | ||
149 | int buflen; | ||
150 | int size; | ||
151 | } args; | 57 | } args; |
58 | va_list list; | ||
152 | 59 | ||
153 | args.service = "getprop"; | 60 | args.service = service; |
154 | args.nargs = 4; | 61 | args.nargs = nargs; |
155 | args.nret = 1; | 62 | args.nret = nret; |
156 | args.phandle = phandle; | ||
157 | args.name = name; | ||
158 | args.buf = buf; | ||
159 | args.buflen = buflen; | ||
160 | args.size = -1; | ||
161 | (*prom)(&args); | ||
162 | return args.size; | ||
163 | } | ||
164 | 63 | ||
165 | int | 64 | va_start(list, rets); |
166 | putc(int c, void *f) | 65 | for (i = 0; i < nargs; i++) |
167 | { | 66 | args.args[i] = va_arg(list, unsigned int); |
168 | char ch = c; | 67 | va_end(list); |
169 | 68 | ||
170 | if (c == '\n') | 69 | for (i = 0; i < nret; i++) |
171 | putc('\r', f); | 70 | args.args[nargs+i] = 0; |
172 | return write(f, &ch, 1) == 1? c: -1; | ||
173 | } | ||
174 | 71 | ||
175 | int | 72 | if (prom(&args) < 0) |
176 | putchar(int c) | 73 | return -1; |
177 | { | ||
178 | return putc(c, stdout); | ||
179 | } | ||
180 | 74 | ||
181 | int | 75 | if (rets != (void *) 0) |
182 | fputs(char *str, void *f) | 76 | for (i = 1; i < nret; ++i) |
183 | { | 77 | rets[i-1] = args.args[nargs+i]; |
184 | int n = strlen(str); | ||
185 | 78 | ||
186 | return write(f, str, n) == n? 0: -1; | 79 | return (nret > 0)? args.args[nargs]: 0; |
187 | } | 80 | } |
188 | 81 | ||
189 | size_t strnlen(const char * s, size_t count) | 82 | int write(void *handle, void *ptr, int nb) |
190 | { | 83 | { |
191 | const char *sc; | 84 | return call_prom("write", 3, 1, handle, ptr, nb); |
192 | |||
193 | for (sc = s; count-- && *sc != '\0'; ++sc) | ||
194 | /* nothing */; | ||
195 | return sc - s; | ||
196 | } | 85 | } |
197 | 86 | ||
198 | extern unsigned int __div64_32(unsigned long long *dividend, | 87 | /* |
199 | unsigned int divisor); | 88 | * Older OF's require that when claiming a specific range of addresses, |
200 | 89 | * we claim the physical space in the /memory node and the virtual | |
201 | /* The unnecessary pointer compare is there | 90 | * space in the chosen mmu node, and then do a map operation to |
202 | * to check for type safety (n must be 64bit) | 91 | * map virtual to physical. |
203 | */ | 92 | */ |
204 | # define do_div(n,base) ({ \ | 93 | static int need_map = -1; |
205 | unsigned int __base = (base); \ | 94 | static ihandle chosen_mmu; |
206 | unsigned int __rem; \ | 95 | static phandle memory; |
207 | (void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \ | ||
208 | if (((n) >> 32) == 0) { \ | ||
209 | __rem = (unsigned int)(n) % __base; \ | ||
210 | (n) = (unsigned int)(n) / __base; \ | ||
211 | } else \ | ||
212 | __rem = __div64_32(&(n), __base); \ | ||
213 | __rem; \ | ||
214 | }) | ||
215 | 96 | ||
216 | static int skip_atoi(const char **s) | 97 | /* returns true if s2 is a prefix of s1 */ |
98 | static int string_match(const char *s1, const char *s2) | ||
217 | { | 99 | { |
218 | int i, c; | 100 | for (; *s2; ++s2) |
219 | 101 | if (*s1++ != *s2) | |
220 | for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) | 102 | return 0; |
221 | i = i*10 + c - '0'; | 103 | return 1; |
222 | return i; | ||
223 | } | 104 | } |
224 | 105 | ||
225 | #define ZEROPAD 1 /* pad with zero */ | 106 | static int check_of_version(void) |
226 | #define SIGN 2 /* unsigned/signed long */ | ||
227 | #define PLUS 4 /* show plus */ | ||
228 | #define SPACE 8 /* space if plus */ | ||
229 | #define LEFT 16 /* left justified */ | ||
230 | #define SPECIAL 32 /* 0x */ | ||
231 | #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ | ||
232 | |||
233 | static char * number(char * str, unsigned long long num, int base, int size, int precision, int type) | ||
234 | { | 107 | { |
235 | char c,sign,tmp[66]; | 108 | phandle oprom, chosen; |
236 | const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; | 109 | char version[64]; |
237 | int i; | ||
238 | 110 | ||
239 | if (type & LARGE) | 111 | oprom = finddevice("/openprom"); |
240 | digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | 112 | if (oprom == (phandle) -1) |
241 | if (type & LEFT) | ||
242 | type &= ~ZEROPAD; | ||
243 | if (base < 2 || base > 36) | ||
244 | return 0; | 113 | return 0; |
245 | c = (type & ZEROPAD) ? '0' : ' '; | 114 | if (getprop(oprom, "model", version, sizeof(version)) <= 0) |
246 | sign = 0; | 115 | return 0; |
247 | if (type & SIGN) { | 116 | version[sizeof(version)-1] = 0; |
248 | if ((signed long long)num < 0) { | 117 | printf("OF version = '%s'\r\n", version); |
249 | sign = '-'; | 118 | if (!string_match(version, "Open Firmware, 1.") |
250 | num = - (signed long long)num; | 119 | && !string_match(version, "FirmWorks,3.")) |
251 | size--; | 120 | return 0; |
252 | } else if (type & PLUS) { | 121 | chosen = finddevice("/chosen"); |
253 | sign = '+'; | 122 | if (chosen == (phandle) -1) { |
254 | size--; | 123 | chosen = finddevice("/chosen@0"); |
255 | } else if (type & SPACE) { | 124 | if (chosen == (phandle) -1) { |
256 | sign = ' '; | 125 | printf("no chosen\n"); |
257 | size--; | 126 | return 0; |
258 | } | 127 | } |
259 | } | 128 | } |
260 | if (type & SPECIAL) { | 129 | if (getprop(chosen, "mmu", &chosen_mmu, sizeof(chosen_mmu)) <= 0) { |
261 | if (base == 16) | 130 | printf("no mmu\n"); |
262 | size -= 2; | 131 | return 0; |
263 | else if (base == 8) | ||
264 | size--; | ||
265 | } | ||
266 | i = 0; | ||
267 | if (num == 0) | ||
268 | tmp[i++]='0'; | ||
269 | else while (num != 0) { | ||
270 | tmp[i++] = digits[do_div(num, base)]; | ||
271 | } | 132 | } |
272 | if (i > precision) | 133 | memory = (ihandle) call_prom("open", 1, 1, "/memory"); |
273 | precision = i; | 134 | if (memory == (ihandle) -1) { |
274 | size -= precision; | 135 | memory = (ihandle) call_prom("open", 1, 1, "/memory@0"); |
275 | if (!(type&(ZEROPAD+LEFT))) | 136 | if (memory == (ihandle) -1) { |
276 | while(size-->0) | 137 | printf("no memory node\n"); |
277 | *str++ = ' '; | 138 | return 0; |
278 | if (sign) | ||
279 | *str++ = sign; | ||
280 | if (type & SPECIAL) { | ||
281 | if (base==8) | ||
282 | *str++ = '0'; | ||
283 | else if (base==16) { | ||
284 | *str++ = '0'; | ||
285 | *str++ = digits[33]; | ||
286 | } | 139 | } |
287 | } | 140 | } |
288 | if (!(type & LEFT)) | 141 | printf("old OF detected\r\n"); |
289 | while (size-- > 0) | 142 | return 1; |
290 | *str++ = c; | ||
291 | while (i < precision--) | ||
292 | *str++ = '0'; | ||
293 | while (i-- > 0) | ||
294 | *str++ = tmp[i]; | ||
295 | while (size-- > 0) | ||
296 | *str++ = ' '; | ||
297 | return str; | ||
298 | } | 143 | } |
299 | 144 | ||
300 | int vsprintf(char *buf, const char *fmt, va_list args) | 145 | void *claim(unsigned long virt, unsigned long size, unsigned long align) |
301 | { | 146 | { |
302 | int len; | 147 | int ret; |
303 | unsigned long long num; | 148 | unsigned int result; |
304 | int i, base; | ||
305 | char * str; | ||
306 | const char *s; | ||
307 | |||
308 | int flags; /* flags to number() */ | ||
309 | |||
310 | int field_width; /* width of output field */ | ||
311 | int precision; /* min. # of digits for integers; max | ||
312 | number of chars for from string */ | ||
313 | int qualifier; /* 'h', 'l', or 'L' for integer fields */ | ||
314 | /* 'z' support added 23/7/1999 S.H. */ | ||
315 | /* 'z' changed to 'Z' --davidm 1/25/99 */ | ||
316 | 149 | ||
150 | if (need_map < 0) | ||
151 | need_map = check_of_version(); | ||
152 | if (align || !need_map) | ||
153 | return (void *) call_prom("claim", 3, 1, virt, size, align); | ||
317 | 154 | ||
318 | for (str=buf ; *fmt ; ++fmt) { | 155 | ret = call_prom_ret("call-method", 5, 2, &result, "claim", memory, |
319 | if (*fmt != '%') { | 156 | align, size, virt); |
320 | *str++ = *fmt; | 157 | if (ret != 0 || result == -1) |
321 | continue; | 158 | return (void *) -1; |
322 | } | 159 | ret = call_prom_ret("call-method", 5, 2, &result, "claim", chosen_mmu, |
323 | 160 | align, size, virt); | |
324 | /* process flags */ | 161 | /* 0x12 == coherent + read/write */ |
325 | flags = 0; | 162 | ret = call_prom("call-method", 6, 1, "map", chosen_mmu, |
326 | repeat: | 163 | 0x12, size, virt, virt); |
327 | ++fmt; /* this also skips first '%' */ | 164 | return (void *) virt; |
328 | switch (*fmt) { | ||
329 | case '-': flags |= LEFT; goto repeat; | ||
330 | case '+': flags |= PLUS; goto repeat; | ||
331 | case ' ': flags |= SPACE; goto repeat; | ||
332 | case '#': flags |= SPECIAL; goto repeat; | ||
333 | case '0': flags |= ZEROPAD; goto repeat; | ||
334 | } | ||
335 | |||
336 | /* get field width */ | ||
337 | field_width = -1; | ||
338 | if ('0' <= *fmt && *fmt <= '9') | ||
339 | field_width = skip_atoi(&fmt); | ||
340 | else if (*fmt == '*') { | ||
341 | ++fmt; | ||
342 | /* it's the next argument */ | ||
343 | field_width = va_arg(args, int); | ||
344 | if (field_width < 0) { | ||
345 | field_width = -field_width; | ||
346 | flags |= LEFT; | ||
347 | } | ||
348 | } | ||
349 | |||
350 | /* get the precision */ | ||
351 | precision = -1; | ||
352 | if (*fmt == '.') { | ||
353 | ++fmt; | ||
354 | if ('0' <= *fmt && *fmt <= '9') | ||
355 | precision = skip_atoi(&fmt); | ||
356 | else if (*fmt == '*') { | ||
357 | ++fmt; | ||
358 | /* it's the next argument */ | ||
359 | precision = va_arg(args, int); | ||
360 | } | ||
361 | if (precision < 0) | ||
362 | precision = 0; | ||
363 | } | ||
364 | |||
365 | /* get the conversion qualifier */ | ||
366 | qualifier = -1; | ||
367 | if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z') { | ||
368 | qualifier = *fmt; | ||
369 | ++fmt; | ||
370 | } | ||
371 | |||
372 | /* default base */ | ||
373 | base = 10; | ||
374 | |||
375 | switch (*fmt) { | ||
376 | case 'c': | ||
377 | if (!(flags & LEFT)) | ||
378 | while (--field_width > 0) | ||
379 | *str++ = ' '; | ||
380 | *str++ = (unsigned char) va_arg(args, int); | ||
381 | while (--field_width > 0) | ||
382 | *str++ = ' '; | ||
383 | continue; | ||
384 | |||
385 | case 's': | ||
386 | s = va_arg(args, char *); | ||
387 | if (!s) | ||
388 | s = "<NULL>"; | ||
389 | |||
390 | len = strnlen(s, precision); | ||
391 | |||
392 | if (!(flags & LEFT)) | ||
393 | while (len < field_width--) | ||
394 | *str++ = ' '; | ||
395 | for (i = 0; i < len; ++i) | ||
396 | *str++ = *s++; | ||
397 | while (len < field_width--) | ||
398 | *str++ = ' '; | ||
399 | continue; | ||
400 | |||
401 | case 'p': | ||
402 | if (field_width == -1) { | ||
403 | field_width = 2*sizeof(void *); | ||
404 | flags |= ZEROPAD; | ||
405 | } | ||
406 | str = number(str, | ||
407 | (unsigned long) va_arg(args, void *), 16, | ||
408 | field_width, precision, flags); | ||
409 | continue; | ||
410 | |||
411 | |||
412 | case 'n': | ||
413 | if (qualifier == 'l') { | ||
414 | long * ip = va_arg(args, long *); | ||
415 | *ip = (str - buf); | ||
416 | } else if (qualifier == 'Z') { | ||
417 | size_t * ip = va_arg(args, size_t *); | ||
418 | *ip = (str - buf); | ||
419 | } else { | ||
420 | int * ip = va_arg(args, int *); | ||
421 | *ip = (str - buf); | ||
422 | } | ||
423 | continue; | ||
424 | |||
425 | case '%': | ||
426 | *str++ = '%'; | ||
427 | continue; | ||
428 | |||
429 | /* integer number formats - set up the flags and "break" */ | ||
430 | case 'o': | ||
431 | base = 8; | ||
432 | break; | ||
433 | |||
434 | case 'X': | ||
435 | flags |= LARGE; | ||
436 | case 'x': | ||
437 | base = 16; | ||
438 | break; | ||
439 | |||
440 | case 'd': | ||
441 | case 'i': | ||
442 | flags |= SIGN; | ||
443 | case 'u': | ||
444 | break; | ||
445 | |||
446 | default: | ||
447 | *str++ = '%'; | ||
448 | if (*fmt) | ||
449 | *str++ = *fmt; | ||
450 | else | ||
451 | --fmt; | ||
452 | continue; | ||
453 | } | ||
454 | if (qualifier == 'l') { | ||
455 | num = va_arg(args, unsigned long); | ||
456 | if (flags & SIGN) | ||
457 | num = (signed long) num; | ||
458 | } else if (qualifier == 'Z') { | ||
459 | num = va_arg(args, size_t); | ||
460 | } else if (qualifier == 'h') { | ||
461 | num = (unsigned short) va_arg(args, int); | ||
462 | if (flags & SIGN) | ||
463 | num = (signed short) num; | ||
464 | } else { | ||
465 | num = va_arg(args, unsigned int); | ||
466 | if (flags & SIGN) | ||
467 | num = (signed int) num; | ||
468 | } | ||
469 | str = number(str, num, base, field_width, precision, flags); | ||
470 | } | ||
471 | *str = '\0'; | ||
472 | return str-buf; | ||
473 | } | ||
474 | |||
475 | int sprintf(char * buf, const char *fmt, ...) | ||
476 | { | ||
477 | va_list args; | ||
478 | int i; | ||
479 | |||
480 | va_start(args, fmt); | ||
481 | i=vsprintf(buf,fmt,args); | ||
482 | va_end(args); | ||
483 | return i; | ||
484 | } | ||
485 | |||
486 | static char sprint_buf[1024]; | ||
487 | |||
488 | int | ||
489 | printf(const char *fmt, ...) | ||
490 | { | ||
491 | va_list args; | ||
492 | int n; | ||
493 | |||
494 | va_start(args, fmt); | ||
495 | n = vsprintf(sprint_buf, fmt, args); | ||
496 | va_end(args); | ||
497 | write(stdout, sprint_buf, n); | ||
498 | return n; | ||
499 | } | 165 | } |
diff --git a/arch/powerpc/boot/prom.h b/arch/powerpc/boot/prom.h index 96ab5aec740c..3e2ddd4a5a81 100644 --- a/arch/powerpc/boot/prom.h +++ b/arch/powerpc/boot/prom.h | |||
@@ -1,18 +1,34 @@ | |||
1 | #ifndef _PPC_BOOT_PROM_H_ | 1 | #ifndef _PPC_BOOT_PROM_H_ |
2 | #define _PPC_BOOT_PROM_H_ | 2 | #define _PPC_BOOT_PROM_H_ |
3 | 3 | ||
4 | typedef void *phandle; | ||
5 | typedef void *ihandle; | ||
6 | |||
4 | extern int (*prom) (void *); | 7 | extern int (*prom) (void *); |
5 | extern void *chosen_handle; | 8 | extern phandle chosen_handle; |
9 | extern ihandle stdout; | ||
6 | 10 | ||
7 | extern void *stdin; | 11 | int call_prom(const char *service, int nargs, int nret, ...); |
8 | extern void *stdout; | 12 | int call_prom_ret(const char *service, int nargs, int nret, |
9 | extern void *stderr; | 13 | unsigned int *rets, ...); |
10 | 14 | ||
11 | extern int write(void *handle, void *ptr, int nb); | 15 | extern int write(void *handle, void *ptr, int nb); |
12 | extern int read(void *handle, void *ptr, int nb); | 16 | extern void *claim(unsigned long virt, unsigned long size, unsigned long aln); |
13 | extern void exit(void); | 17 | |
14 | extern void pause(void); | 18 | static inline void exit(void) |
15 | extern void *finddevice(const char *); | 19 | { |
16 | extern void *claim(unsigned long virt, unsigned long size, unsigned long align); | 20 | call_prom("exit", 0, 0); |
17 | extern int getprop(void *phandle, const char *name, void *buf, int buflen); | 21 | } |
22 | |||
23 | static inline phandle finddevice(const char *name) | ||
24 | { | ||
25 | return (phandle) call_prom("finddevice", 1, 1, name); | ||
26 | } | ||
27 | |||
28 | static inline int getprop(void *phandle, const char *name, | ||
29 | void *buf, int buflen) | ||
30 | { | ||
31 | return call_prom("getprop", 4, 1, phandle, name, buf, buflen); | ||
32 | } | ||
33 | |||
18 | #endif /* _PPC_BOOT_PROM_H_ */ | 34 | #endif /* _PPC_BOOT_PROM_H_ */ |
diff --git a/arch/powerpc/boot/rs6000.h b/arch/powerpc/boot/rs6000.h new file mode 100644 index 000000000000..433f45084e41 --- /dev/null +++ b/arch/powerpc/boot/rs6000.h | |||
@@ -0,0 +1,243 @@ | |||
1 | /* IBM RS/6000 "XCOFF" file definitions for BFD. | ||
2 | Copyright (C) 1990, 1991 Free Software Foundation, Inc. | ||
3 | FIXME: Can someone provide a transliteration of this name into ASCII? | ||
4 | Using the following chars caused a compiler warning on HIUX (so I replaced | ||
5 | them with octal escapes), and isn't useful without an understanding of what | ||
6 | character set it is. | ||
7 | Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM | ||
8 | and John Gilmore of Cygnus Support. */ | ||
9 | |||
10 | /********************** FILE HEADER **********************/ | ||
11 | |||
12 | struct external_filehdr { | ||
13 | char f_magic[2]; /* magic number */ | ||
14 | char f_nscns[2]; /* number of sections */ | ||
15 | char f_timdat[4]; /* time & date stamp */ | ||
16 | char f_symptr[4]; /* file pointer to symtab */ | ||
17 | char f_nsyms[4]; /* number of symtab entries */ | ||
18 | char f_opthdr[2]; /* sizeof(optional hdr) */ | ||
19 | char f_flags[2]; /* flags */ | ||
20 | }; | ||
21 | |||
22 | /* IBM RS/6000 */ | ||
23 | #define U802WRMAGIC 0730 /* writeable text segments **chh** */ | ||
24 | #define U802ROMAGIC 0735 /* readonly sharable text segments */ | ||
25 | #define U802TOCMAGIC 0737 /* readonly text segments and TOC */ | ||
26 | |||
27 | #define BADMAG(x) \ | ||
28 | ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \ | ||
29 | (x).f_magic != U802TOCMAGIC) | ||
30 | |||
31 | #define FILHDR struct external_filehdr | ||
32 | #define FILHSZ 20 | ||
33 | |||
34 | |||
35 | /********************** AOUT "OPTIONAL HEADER" **********************/ | ||
36 | |||
37 | |||
38 | typedef struct | ||
39 | { | ||
40 | unsigned char magic[2]; /* type of file */ | ||
41 | unsigned char vstamp[2]; /* version stamp */ | ||
42 | unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */ | ||
43 | unsigned char dsize[4]; /* initialized data " " */ | ||
44 | unsigned char bsize[4]; /* uninitialized data " " */ | ||
45 | unsigned char entry[4]; /* entry pt. */ | ||
46 | unsigned char text_start[4]; /* base of text used for this file */ | ||
47 | unsigned char data_start[4]; /* base of data used for this file */ | ||
48 | unsigned char o_toc[4]; /* address of TOC */ | ||
49 | unsigned char o_snentry[2]; /* section number of entry point */ | ||
50 | unsigned char o_sntext[2]; /* section number of .text section */ | ||
51 | unsigned char o_sndata[2]; /* section number of .data section */ | ||
52 | unsigned char o_sntoc[2]; /* section number of TOC */ | ||
53 | unsigned char o_snloader[2]; /* section number of .loader section */ | ||
54 | unsigned char o_snbss[2]; /* section number of .bss section */ | ||
55 | unsigned char o_algntext[2]; /* .text alignment */ | ||
56 | unsigned char o_algndata[2]; /* .data alignment */ | ||
57 | unsigned char o_modtype[2]; /* module type (??) */ | ||
58 | unsigned char o_cputype[2]; /* cpu type */ | ||
59 | unsigned char o_maxstack[4]; /* max stack size (??) */ | ||
60 | unsigned char o_maxdata[4]; /* max data size (??) */ | ||
61 | unsigned char o_resv2[12]; /* reserved */ | ||
62 | } | ||
63 | AOUTHDR; | ||
64 | |||
65 | #define AOUTSZ 72 | ||
66 | #define SMALL_AOUTSZ (28) | ||
67 | #define AOUTHDRSZ 72 | ||
68 | |||
69 | #define RS6K_AOUTHDR_OMAGIC 0x0107 /* old: text & data writeable */ | ||
70 | #define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */ | ||
71 | #define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */ | ||
72 | |||
73 | |||
74 | /********************** SECTION HEADER **********************/ | ||
75 | |||
76 | |||
77 | struct external_scnhdr { | ||
78 | char s_name[8]; /* section name */ | ||
79 | char s_paddr[4]; /* physical address, aliased s_nlib */ | ||
80 | char s_vaddr[4]; /* virtual address */ | ||
81 | char s_size[4]; /* section size */ | ||
82 | char s_scnptr[4]; /* file ptr to raw data for section */ | ||
83 | char s_relptr[4]; /* file ptr to relocation */ | ||
84 | char s_lnnoptr[4]; /* file ptr to line numbers */ | ||
85 | char s_nreloc[2]; /* number of relocation entries */ | ||
86 | char s_nlnno[2]; /* number of line number entries*/ | ||
87 | char s_flags[4]; /* flags */ | ||
88 | }; | ||
89 | |||
90 | /* | ||
91 | * names of "special" sections | ||
92 | */ | ||
93 | #define _TEXT ".text" | ||
94 | #define _DATA ".data" | ||
95 | #define _BSS ".bss" | ||
96 | #define _PAD ".pad" | ||
97 | #define _LOADER ".loader" | ||
98 | |||
99 | #define SCNHDR struct external_scnhdr | ||
100 | #define SCNHSZ 40 | ||
101 | |||
102 | /* XCOFF uses a special .loader section with type STYP_LOADER. */ | ||
103 | #define STYP_LOADER 0x1000 | ||
104 | |||
105 | /* XCOFF uses a special .debug section with type STYP_DEBUG. */ | ||
106 | #define STYP_DEBUG 0x2000 | ||
107 | |||
108 | /* XCOFF handles line number or relocation overflow by creating | ||
109 | another section header with STYP_OVRFLO set. */ | ||
110 | #define STYP_OVRFLO 0x8000 | ||
111 | |||
112 | /********************** LINE NUMBERS **********************/ | ||
113 | |||
114 | /* 1 line number entry for every "breakpointable" source line in a section. | ||
115 | * Line numbers are grouped on a per function basis; first entry in a function | ||
116 | * grouping will have l_lnno = 0 and in place of physical address will be the | ||
117 | * symbol table index of the function name. | ||
118 | */ | ||
119 | struct external_lineno { | ||
120 | union { | ||
121 | char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ | ||
122 | char l_paddr[4]; /* (physical) address of line number */ | ||
123 | } l_addr; | ||
124 | char l_lnno[2]; /* line number */ | ||
125 | }; | ||
126 | |||
127 | |||
128 | #define LINENO struct external_lineno | ||
129 | #define LINESZ 6 | ||
130 | |||
131 | |||
132 | /********************** SYMBOLS **********************/ | ||
133 | |||
134 | #define E_SYMNMLEN 8 /* # characters in a symbol name */ | ||
135 | #define E_FILNMLEN 14 /* # characters in a file name */ | ||
136 | #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ | ||
137 | |||
138 | struct external_syment | ||
139 | { | ||
140 | union { | ||
141 | char e_name[E_SYMNMLEN]; | ||
142 | struct { | ||
143 | char e_zeroes[4]; | ||
144 | char e_offset[4]; | ||
145 | } e; | ||
146 | } e; | ||
147 | char e_value[4]; | ||
148 | char e_scnum[2]; | ||
149 | char e_type[2]; | ||
150 | char e_sclass[1]; | ||
151 | char e_numaux[1]; | ||
152 | }; | ||
153 | |||
154 | |||
155 | |||
156 | #define N_BTMASK (017) | ||
157 | #define N_TMASK (060) | ||
158 | #define N_BTSHFT (4) | ||
159 | #define N_TSHIFT (2) | ||
160 | |||
161 | |||
162 | union external_auxent { | ||
163 | struct { | ||
164 | char x_tagndx[4]; /* str, un, or enum tag indx */ | ||
165 | union { | ||
166 | struct { | ||
167 | char x_lnno[2]; /* declaration line number */ | ||
168 | char x_size[2]; /* str/union/array size */ | ||
169 | } x_lnsz; | ||
170 | char x_fsize[4]; /* size of function */ | ||
171 | } x_misc; | ||
172 | union { | ||
173 | struct { /* if ISFCN, tag, or .bb */ | ||
174 | char x_lnnoptr[4]; /* ptr to fcn line # */ | ||
175 | char x_endndx[4]; /* entry ndx past block end */ | ||
176 | } x_fcn; | ||
177 | struct { /* if ISARY, up to 4 dimen. */ | ||
178 | char x_dimen[E_DIMNUM][2]; | ||
179 | } x_ary; | ||
180 | } x_fcnary; | ||
181 | char x_tvndx[2]; /* tv index */ | ||
182 | } x_sym; | ||
183 | |||
184 | union { | ||
185 | char x_fname[E_FILNMLEN]; | ||
186 | struct { | ||
187 | char x_zeroes[4]; | ||
188 | char x_offset[4]; | ||
189 | } x_n; | ||
190 | } x_file; | ||
191 | |||
192 | struct { | ||
193 | char x_scnlen[4]; /* section length */ | ||
194 | char x_nreloc[2]; /* # relocation entries */ | ||
195 | char x_nlinno[2]; /* # line numbers */ | ||
196 | } x_scn; | ||
197 | |||
198 | struct { | ||
199 | char x_tvfill[4]; /* tv fill value */ | ||
200 | char x_tvlen[2]; /* length of .tv */ | ||
201 | char x_tvran[2][2]; /* tv range */ | ||
202 | } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ | ||
203 | |||
204 | struct { | ||
205 | unsigned char x_scnlen[4]; | ||
206 | unsigned char x_parmhash[4]; | ||
207 | unsigned char x_snhash[2]; | ||
208 | unsigned char x_smtyp[1]; | ||
209 | unsigned char x_smclas[1]; | ||
210 | unsigned char x_stab[4]; | ||
211 | unsigned char x_snstab[2]; | ||
212 | } x_csect; | ||
213 | |||
214 | }; | ||
215 | |||
216 | #define SYMENT struct external_syment | ||
217 | #define SYMESZ 18 | ||
218 | #define AUXENT union external_auxent | ||
219 | #define AUXESZ 18 | ||
220 | #define DBXMASK 0x80 /* for dbx storage mask */ | ||
221 | #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) | ||
222 | |||
223 | |||
224 | |||
225 | /********************** RELOCATION DIRECTIVES **********************/ | ||
226 | |||
227 | |||
228 | struct external_reloc { | ||
229 | char r_vaddr[4]; | ||
230 | char r_symndx[4]; | ||
231 | char r_size[1]; | ||
232 | char r_type[1]; | ||
233 | }; | ||
234 | |||
235 | |||
236 | #define RELOC struct external_reloc | ||
237 | #define RELSZ 10 | ||
238 | |||
239 | #define DEFAULT_DATA_SECTION_ALIGNMENT 4 | ||
240 | #define DEFAULT_BSS_SECTION_ALIGNMENT 4 | ||
241 | #define DEFAULT_TEXT_SECTION_ALIGNMENT 4 | ||
242 | /* For new sections we havn't heard of before */ | ||
243 | #define DEFAULT_SECTION_ALIGNMENT 4 | ||
diff --git a/arch/powerpc/boot/stdio.c b/arch/powerpc/boot/stdio.c new file mode 100644 index 000000000000..b5aa522f8b77 --- /dev/null +++ b/arch/powerpc/boot/stdio.c | |||
@@ -0,0 +1,325 @@ | |||
1 | /* | ||
2 | * Copyright (C) Paul Mackerras 1997. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version | ||
7 | * 2 of the License, or (at your option) any later version. | ||
8 | */ | ||
9 | #include <stdarg.h> | ||
10 | #include <stddef.h> | ||
11 | #include "string.h" | ||
12 | #include "stdio.h" | ||
13 | #include "prom.h" | ||
14 | |||
15 | size_t strnlen(const char * s, size_t count) | ||
16 | { | ||
17 | const char *sc; | ||
18 | |||
19 | for (sc = s; count-- && *sc != '\0'; ++sc) | ||
20 | /* nothing */; | ||
21 | return sc - s; | ||
22 | } | ||
23 | |||
24 | extern unsigned int __div64_32(unsigned long long *dividend, | ||
25 | unsigned int divisor); | ||
26 | |||
27 | /* The unnecessary pointer compare is there | ||
28 | * to check for type safety (n must be 64bit) | ||
29 | */ | ||
30 | # define do_div(n,base) ({ \ | ||
31 | unsigned int __base = (base); \ | ||
32 | unsigned int __rem; \ | ||
33 | (void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \ | ||
34 | if (((n) >> 32) == 0) { \ | ||
35 | __rem = (unsigned int)(n) % __base; \ | ||
36 | (n) = (unsigned int)(n) / __base; \ | ||
37 | } else \ | ||
38 | __rem = __div64_32(&(n), __base); \ | ||
39 | __rem; \ | ||
40 | }) | ||
41 | |||
42 | static int skip_atoi(const char **s) | ||
43 | { | ||
44 | int i, c; | ||
45 | |||
46 | for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) | ||
47 | i = i*10 + c - '0'; | ||
48 | return i; | ||
49 | } | ||
50 | |||
51 | #define ZEROPAD 1 /* pad with zero */ | ||
52 | #define SIGN 2 /* unsigned/signed long */ | ||
53 | #define PLUS 4 /* show plus */ | ||
54 | #define SPACE 8 /* space if plus */ | ||
55 | #define LEFT 16 /* left justified */ | ||
56 | #define SPECIAL 32 /* 0x */ | ||
57 | #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ | ||
58 | |||
59 | static char * number(char * str, unsigned long long num, int base, int size, int precision, int type) | ||
60 | { | ||
61 | char c,sign,tmp[66]; | ||
62 | const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; | ||
63 | int i; | ||
64 | |||
65 | if (type & LARGE) | ||
66 | digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | ||
67 | if (type & LEFT) | ||
68 | type &= ~ZEROPAD; | ||
69 | if (base < 2 || base > 36) | ||
70 | return 0; | ||
71 | c = (type & ZEROPAD) ? '0' : ' '; | ||
72 | sign = 0; | ||
73 | if (type & SIGN) { | ||
74 | if ((signed long long)num < 0) { | ||
75 | sign = '-'; | ||
76 | num = - (signed long long)num; | ||
77 | size--; | ||
78 | } else if (type & PLUS) { | ||
79 | sign = '+'; | ||
80 | size--; | ||
81 | } else if (type & SPACE) { | ||
82 | sign = ' '; | ||
83 | size--; | ||
84 | } | ||
85 | } | ||
86 | if (type & SPECIAL) { | ||
87 | if (base == 16) | ||
88 | size -= 2; | ||
89 | else if (base == 8) | ||
90 | size--; | ||
91 | } | ||
92 | i = 0; | ||
93 | if (num == 0) | ||
94 | tmp[i++]='0'; | ||
95 | else while (num != 0) { | ||
96 | tmp[i++] = digits[do_div(num, base)]; | ||
97 | } | ||
98 | if (i > precision) | ||
99 | precision = i; | ||
100 | size -= precision; | ||
101 | if (!(type&(ZEROPAD+LEFT))) | ||
102 | while(size-->0) | ||
103 | *str++ = ' '; | ||
104 | if (sign) | ||
105 | *str++ = sign; | ||
106 | if (type & SPECIAL) { | ||
107 | if (base==8) | ||
108 | *str++ = '0'; | ||
109 | else if (base==16) { | ||
110 | *str++ = '0'; | ||
111 | *str++ = digits[33]; | ||
112 | } | ||
113 | } | ||
114 | if (!(type & LEFT)) | ||
115 | while (size-- > 0) | ||
116 | *str++ = c; | ||
117 | while (i < precision--) | ||
118 | *str++ = '0'; | ||
119 | while (i-- > 0) | ||
120 | *str++ = tmp[i]; | ||
121 | while (size-- > 0) | ||
122 | *str++ = ' '; | ||
123 | return str; | ||
124 | } | ||
125 | |||
126 | int vsprintf(char *buf, const char *fmt, va_list args) | ||
127 | { | ||
128 | int len; | ||
129 | unsigned long long num; | ||
130 | int i, base; | ||
131 | char * str; | ||
132 | const char *s; | ||
133 | |||
134 | int flags; /* flags to number() */ | ||
135 | |||
136 | int field_width; /* width of output field */ | ||
137 | int precision; /* min. # of digits for integers; max | ||
138 | number of chars for from string */ | ||
139 | int qualifier; /* 'h', 'l', or 'L' for integer fields */ | ||
140 | /* 'z' support added 23/7/1999 S.H. */ | ||
141 | /* 'z' changed to 'Z' --davidm 1/25/99 */ | ||
142 | |||
143 | |||
144 | for (str=buf ; *fmt ; ++fmt) { | ||
145 | if (*fmt != '%') { | ||
146 | *str++ = *fmt; | ||
147 | continue; | ||
148 | } | ||
149 | |||
150 | /* process flags */ | ||
151 | flags = 0; | ||
152 | repeat: | ||
153 | ++fmt; /* this also skips first '%' */ | ||
154 | switch (*fmt) { | ||
155 | case '-': flags |= LEFT; goto repeat; | ||
156 | case '+': flags |= PLUS; goto repeat; | ||
157 | case ' ': flags |= SPACE; goto repeat; | ||
158 | case '#': flags |= SPECIAL; goto repeat; | ||
159 | case '0': flags |= ZEROPAD; goto repeat; | ||
160 | } | ||
161 | |||
162 | /* get field width */ | ||
163 | field_width = -1; | ||
164 | if ('0' <= *fmt && *fmt <= '9') | ||
165 | field_width = skip_atoi(&fmt); | ||
166 | else if (*fmt == '*') { | ||
167 | ++fmt; | ||
168 | /* it's the next argument */ | ||
169 | field_width = va_arg(args, int); | ||
170 | if (field_width < 0) { | ||
171 | field_width = -field_width; | ||
172 | flags |= LEFT; | ||
173 | } | ||
174 | } | ||
175 | |||
176 | /* get the precision */ | ||
177 | precision = -1; | ||
178 | if (*fmt == '.') { | ||
179 | ++fmt; | ||
180 | if ('0' <= *fmt && *fmt <= '9') | ||
181 | precision = skip_atoi(&fmt); | ||
182 | else if (*fmt == '*') { | ||
183 | ++fmt; | ||
184 | /* it's the next argument */ | ||
185 | precision = va_arg(args, int); | ||
186 | } | ||
187 | if (precision < 0) | ||
188 | precision = 0; | ||
189 | } | ||
190 | |||
191 | /* get the conversion qualifier */ | ||
192 | qualifier = -1; | ||
193 | if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z') { | ||
194 | qualifier = *fmt; | ||
195 | ++fmt; | ||
196 | } | ||
197 | |||
198 | /* default base */ | ||
199 | base = 10; | ||
200 | |||
201 | switch (*fmt) { | ||
202 | case 'c': | ||
203 | if (!(flags & LEFT)) | ||
204 | while (--field_width > 0) | ||
205 | *str++ = ' '; | ||
206 | *str++ = (unsigned char) va_arg(args, int); | ||
207 | while (--field_width > 0) | ||
208 | *str++ = ' '; | ||
209 | continue; | ||
210 | |||
211 | case 's': | ||
212 | s = va_arg(args, char *); | ||
213 | if (!s) | ||
214 | s = "<NULL>"; | ||
215 | |||
216 | len = strnlen(s, precision); | ||
217 | |||
218 | if (!(flags & LEFT)) | ||
219 | while (len < field_width--) | ||
220 | *str++ = ' '; | ||
221 | for (i = 0; i < len; ++i) | ||
222 | *str++ = *s++; | ||
223 | while (len < field_width--) | ||
224 | *str++ = ' '; | ||
225 | continue; | ||
226 | |||
227 | case 'p': | ||
228 | if (field_width == -1) { | ||
229 | field_width = 2*sizeof(void *); | ||
230 | flags |= ZEROPAD; | ||
231 | } | ||
232 | str = number(str, | ||
233 | (unsigned long) va_arg(args, void *), 16, | ||
234 | field_width, precision, flags); | ||
235 | continue; | ||
236 | |||
237 | |||
238 | case 'n': | ||
239 | if (qualifier == 'l') { | ||
240 | long * ip = va_arg(args, long *); | ||
241 | *ip = (str - buf); | ||
242 | } else if (qualifier == 'Z') { | ||
243 | size_t * ip = va_arg(args, size_t *); | ||
244 | *ip = (str - buf); | ||
245 | } else { | ||
246 | int * ip = va_arg(args, int *); | ||
247 | *ip = (str - buf); | ||
248 | } | ||
249 | continue; | ||
250 | |||
251 | case '%': | ||
252 | *str++ = '%'; | ||
253 | continue; | ||
254 | |||
255 | /* integer number formats - set up the flags and "break" */ | ||
256 | case 'o': | ||
257 | base = 8; | ||
258 | break; | ||
259 | |||
260 | case 'X': | ||
261 | flags |= LARGE; | ||
262 | case 'x': | ||
263 | base = 16; | ||
264 | break; | ||
265 | |||
266 | case 'd': | ||
267 | case 'i': | ||
268 | flags |= SIGN; | ||
269 | case 'u': | ||
270 | break; | ||
271 | |||
272 | default: | ||
273 | *str++ = '%'; | ||
274 | if (*fmt) | ||
275 | *str++ = *fmt; | ||
276 | else | ||
277 | --fmt; | ||
278 | continue; | ||
279 | } | ||
280 | if (qualifier == 'l') { | ||
281 | num = va_arg(args, unsigned long); | ||
282 | if (flags & SIGN) | ||
283 | num = (signed long) num; | ||
284 | } else if (qualifier == 'Z') { | ||
285 | num = va_arg(args, size_t); | ||
286 | } else if (qualifier == 'h') { | ||
287 | num = (unsigned short) va_arg(args, int); | ||
288 | if (flags & SIGN) | ||
289 | num = (signed short) num; | ||
290 | } else { | ||
291 | num = va_arg(args, unsigned int); | ||
292 | if (flags & SIGN) | ||
293 | num = (signed int) num; | ||
294 | } | ||
295 | str = number(str, num, base, field_width, precision, flags); | ||
296 | } | ||
297 | *str = '\0'; | ||
298 | return str-buf; | ||
299 | } | ||
300 | |||
301 | int sprintf(char * buf, const char *fmt, ...) | ||
302 | { | ||
303 | va_list args; | ||
304 | int i; | ||
305 | |||
306 | va_start(args, fmt); | ||
307 | i=vsprintf(buf,fmt,args); | ||
308 | va_end(args); | ||
309 | return i; | ||
310 | } | ||
311 | |||
312 | static char sprint_buf[1024]; | ||
313 | |||
314 | int | ||
315 | printf(const char *fmt, ...) | ||
316 | { | ||
317 | va_list args; | ||
318 | int n; | ||
319 | |||
320 | va_start(args, fmt); | ||
321 | n = vsprintf(sprint_buf, fmt, args); | ||
322 | va_end(args); | ||
323 | write(stdout, sprint_buf, n); | ||
324 | return n; | ||
325 | } | ||
diff --git a/arch/powerpc/boot/stdio.h b/arch/powerpc/boot/stdio.h index 24bd3a8dee94..eb9e16c87aef 100644 --- a/arch/powerpc/boot/stdio.h +++ b/arch/powerpc/boot/stdio.h | |||
@@ -7,10 +7,4 @@ extern int sprintf(char *buf, const char *fmt, ...); | |||
7 | 7 | ||
8 | extern int vsprintf(char *buf, const char *fmt, va_list args); | 8 | extern int vsprintf(char *buf, const char *fmt, va_list args); |
9 | 9 | ||
10 | extern int putc(int c, void *f); | ||
11 | extern int putchar(int c); | ||
12 | extern int getchar(void); | ||
13 | |||
14 | extern int fputs(char *str, void *f); | ||
15 | |||
16 | #endif /* _PPC_BOOT_STDIO_H_ */ | 10 | #endif /* _PPC_BOOT_STDIO_H_ */ |
diff --git a/arch/powerpc/boot/string.S b/arch/powerpc/boot/string.S index b1eeaed7db17..ac3d43b6a324 100644 --- a/arch/powerpc/boot/string.S +++ b/arch/powerpc/boot/string.S | |||
@@ -107,10 +107,12 @@ memcpy: | |||
107 | rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ | 107 | rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ |
108 | addi r6,r3,-4 | 108 | addi r6,r3,-4 |
109 | addi r4,r4,-4 | 109 | addi r4,r4,-4 |
110 | beq 2f /* if less than 8 bytes to do */ | 110 | beq 3f /* if less than 8 bytes to do */ |
111 | andi. r0,r6,3 /* get dest word aligned */ | 111 | andi. r0,r6,3 /* get dest word aligned */ |
112 | mtctr r7 | 112 | mtctr r7 |
113 | bne 5f | 113 | bne 5f |
114 | andi. r0,r4,3 /* check src word aligned too */ | ||
115 | bne 3f | ||
114 | 1: lwz r7,4(r4) | 116 | 1: lwz r7,4(r4) |
115 | lwzu r8,8(r4) | 117 | lwzu r8,8(r4) |
116 | stw r7,4(r6) | 118 | stw r7,4(r6) |
@@ -132,6 +134,11 @@ memcpy: | |||
132 | bdnz 4b | 134 | bdnz 4b |
133 | blr | 135 | blr |
134 | 5: subfic r0,r0,4 | 136 | 5: subfic r0,r0,4 |
137 | cmpw cr1,r0,r5 | ||
138 | add r7,r0,r4 | ||
139 | andi. r7,r7,3 /* will source be word-aligned too? */ | ||
140 | ble cr1,3b | ||
141 | bne 3b /* do byte-by-byte if not */ | ||
135 | mtctr r0 | 142 | mtctr r0 |
136 | 6: lbz r7,4(r4) | 143 | 6: lbz r7,4(r4) |
137 | addi r4,r4,1 | 144 | addi r4,r4,1 |
@@ -149,10 +156,12 @@ backwards_memcpy: | |||
149 | rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ | 156 | rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ |
150 | add r6,r3,r5 | 157 | add r6,r3,r5 |
151 | add r4,r4,r5 | 158 | add r4,r4,r5 |
152 | beq 2f | 159 | beq 3f |
153 | andi. r0,r6,3 | 160 | andi. r0,r6,3 |
154 | mtctr r7 | 161 | mtctr r7 |
155 | bne 5f | 162 | bne 5f |
163 | andi. r0,r4,3 | ||
164 | bne 3f | ||
156 | 1: lwz r7,-4(r4) | 165 | 1: lwz r7,-4(r4) |
157 | lwzu r8,-8(r4) | 166 | lwzu r8,-8(r4) |
158 | stw r7,-4(r6) | 167 | stw r7,-4(r6) |
@@ -171,7 +180,12 @@ backwards_memcpy: | |||
171 | stbu r0,-1(r6) | 180 | stbu r0,-1(r6) |
172 | bdnz 4b | 181 | bdnz 4b |
173 | blr | 182 | blr |
174 | 5: mtctr r0 | 183 | 5: cmpw cr1,r0,r5 |
184 | subf r7,r0,r4 | ||
185 | andi. r7,r7,3 | ||
186 | ble cr1,3b | ||
187 | bne 3b | ||
188 | mtctr r0 | ||
175 | 6: lbzu r7,-1(r4) | 189 | 6: lbzu r7,-1(r4) |
176 | stbu r7,-1(r6) | 190 | stbu r7,-1(r6) |
177 | bdnz 6b | 191 | bdnz 6b |
diff --git a/arch/powerpc/boot/zImage.coff.lds b/arch/powerpc/boot/zImage.coff.lds new file mode 100644 index 000000000000..6016251a1a2c --- /dev/null +++ b/arch/powerpc/boot/zImage.coff.lds | |||
@@ -0,0 +1,46 @@ | |||
1 | OUTPUT_ARCH(powerpc:common) | ||
2 | ENTRY(_start) | ||
3 | SECTIONS | ||
4 | { | ||
5 | . = (5*1024*1024); | ||
6 | _start = .; | ||
7 | .text : | ||
8 | { | ||
9 | *(.text) | ||
10 | *(.fixup) | ||
11 | } | ||
12 | _etext = .; | ||
13 | . = ALIGN(4096); | ||
14 | .data : | ||
15 | { | ||
16 | *(.rodata*) | ||
17 | *(.data*) | ||
18 | *(.sdata*) | ||
19 | __got2_start = .; | ||
20 | *(.got2) | ||
21 | __got2_end = .; | ||
22 | |||
23 | _vmlinux_start = .; | ||
24 | *(.kernel:vmlinux.strip) | ||
25 | _vmlinux_end = .; | ||
26 | |||
27 | _initrd_start = .; | ||
28 | *(.kernel:initrd) | ||
29 | _initrd_end = .; | ||
30 | } | ||
31 | |||
32 | . = ALIGN(4096); | ||
33 | _edata = .; | ||
34 | __bss_start = .; | ||
35 | .bss : | ||
36 | { | ||
37 | *(.sbss) | ||
38 | *(.bss) | ||
39 | } | ||
40 | _end = . ; | ||
41 | |||
42 | /DISCARD/ : | ||
43 | { | ||
44 | *(.comment) | ||
45 | } | ||
46 | } | ||
diff --git a/arch/powerpc/configs/mpc834x_sys_defconfig b/arch/powerpc/configs/mpc834x_sys_defconfig new file mode 100644 index 000000000000..3bff761965c2 --- /dev/null +++ b/arch/powerpc/configs/mpc834x_sys_defconfig | |||
@@ -0,0 +1,911 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.15-g461d4edf-dirty | ||
4 | # Fri Jan 13 11:01:47 2006 | ||
5 | # | ||
6 | # CONFIG_PPC64 is not set | ||
7 | CONFIG_PPC32=y | ||
8 | CONFIG_PPC_MERGE=y | ||
9 | CONFIG_MMU=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
13 | CONFIG_PPC=y | ||
14 | CONFIG_EARLY_PRINTK=y | ||
15 | CONFIG_GENERIC_NVRAM=y | ||
16 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
17 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
18 | CONFIG_PPC_OF=y | ||
19 | CONFIG_PPC_UDBG_16550=y | ||
20 | # CONFIG_GENERIC_TBSYNC is not set | ||
21 | CONFIG_DEFAULT_UIMAGE=y | ||
22 | |||
23 | # | ||
24 | # Processor support | ||
25 | # | ||
26 | # CONFIG_CLASSIC32 is not set | ||
27 | # CONFIG_PPC_52xx is not set | ||
28 | # CONFIG_PPC_82xx is not set | ||
29 | CONFIG_PPC_83xx=y | ||
30 | # CONFIG_40x is not set | ||
31 | # CONFIG_44x is not set | ||
32 | # CONFIG_8xx is not set | ||
33 | # CONFIG_E200 is not set | ||
34 | # CONFIG_E500 is not set | ||
35 | CONFIG_6xx=y | ||
36 | CONFIG_83xx=y | ||
37 | CONFIG_PPC_FPU=y | ||
38 | CONFIG_PPC_STD_MMU=y | ||
39 | CONFIG_PPC_STD_MMU_32=y | ||
40 | # CONFIG_SMP is not set | ||
41 | |||
42 | # | ||
43 | # Code maturity level options | ||
44 | # | ||
45 | CONFIG_EXPERIMENTAL=y | ||
46 | CONFIG_CLEAN_COMPILE=y | ||
47 | CONFIG_BROKEN_ON_SMP=y | ||
48 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
49 | |||
50 | # | ||
51 | # General setup | ||
52 | # | ||
53 | CONFIG_LOCALVERSION="" | ||
54 | CONFIG_LOCALVERSION_AUTO=y | ||
55 | CONFIG_SWAP=y | ||
56 | CONFIG_SYSVIPC=y | ||
57 | # CONFIG_POSIX_MQUEUE is not set | ||
58 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
59 | CONFIG_SYSCTL=y | ||
60 | # CONFIG_AUDIT is not set | ||
61 | # CONFIG_IKCONFIG is not set | ||
62 | CONFIG_INITRAMFS_SOURCE="" | ||
63 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
64 | CONFIG_EMBEDDED=y | ||
65 | # CONFIG_KALLSYMS is not set | ||
66 | CONFIG_HOTPLUG=y | ||
67 | CONFIG_PRINTK=y | ||
68 | CONFIG_BUG=y | ||
69 | CONFIG_ELF_CORE=y | ||
70 | CONFIG_BASE_FULL=y | ||
71 | CONFIG_FUTEX=y | ||
72 | # CONFIG_EPOLL is not set | ||
73 | CONFIG_SHMEM=y | ||
74 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
75 | CONFIG_CC_ALIGN_LABELS=0 | ||
76 | CONFIG_CC_ALIGN_LOOPS=0 | ||
77 | CONFIG_CC_ALIGN_JUMPS=0 | ||
78 | CONFIG_SLAB=y | ||
79 | # CONFIG_TINY_SHMEM is not set | ||
80 | CONFIG_BASE_SMALL=0 | ||
81 | # CONFIG_SLOB is not set | ||
82 | |||
83 | # | ||
84 | # Loadable module support | ||
85 | # | ||
86 | CONFIG_MODULES=y | ||
87 | CONFIG_MODULE_UNLOAD=y | ||
88 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
89 | CONFIG_OBSOLETE_MODPARM=y | ||
90 | # CONFIG_MODVERSIONS is not set | ||
91 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
92 | # CONFIG_KMOD is not set | ||
93 | |||
94 | # | ||
95 | # Block layer | ||
96 | # | ||
97 | # CONFIG_LBD is not set | ||
98 | |||
99 | # | ||
100 | # IO Schedulers | ||
101 | # | ||
102 | CONFIG_IOSCHED_NOOP=y | ||
103 | CONFIG_IOSCHED_AS=y | ||
104 | CONFIG_IOSCHED_DEADLINE=y | ||
105 | CONFIG_IOSCHED_CFQ=y | ||
106 | CONFIG_DEFAULT_AS=y | ||
107 | # CONFIG_DEFAULT_DEADLINE is not set | ||
108 | # CONFIG_DEFAULT_CFQ is not set | ||
109 | # CONFIG_DEFAULT_NOOP is not set | ||
110 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
111 | CONFIG_PPC_GEN550=y | ||
112 | # CONFIG_WANT_EARLY_SERIAL is not set | ||
113 | |||
114 | # | ||
115 | # Platform support | ||
116 | # | ||
117 | CONFIG_MPC834x_SYS=y | ||
118 | CONFIG_MPC834x=y | ||
119 | |||
120 | # | ||
121 | # Kernel options | ||
122 | # | ||
123 | # CONFIG_HIGHMEM is not set | ||
124 | # CONFIG_HZ_100 is not set | ||
125 | CONFIG_HZ_250=y | ||
126 | # CONFIG_HZ_1000 is not set | ||
127 | CONFIG_HZ=250 | ||
128 | CONFIG_PREEMPT_NONE=y | ||
129 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
130 | # CONFIG_PREEMPT is not set | ||
131 | CONFIG_BINFMT_ELF=y | ||
132 | # CONFIG_BINFMT_MISC is not set | ||
133 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
134 | CONFIG_SELECT_MEMORY_MODEL=y | ||
135 | CONFIG_FLATMEM_MANUAL=y | ||
136 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
137 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
138 | CONFIG_FLATMEM=y | ||
139 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
140 | # CONFIG_SPARSEMEM_STATIC is not set | ||
141 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
142 | CONFIG_PROC_DEVICETREE=y | ||
143 | # CONFIG_CMDLINE_BOOL is not set | ||
144 | # CONFIG_PM is not set | ||
145 | # CONFIG_SOFTWARE_SUSPEND is not set | ||
146 | CONFIG_SECCOMP=y | ||
147 | CONFIG_ISA_DMA_API=y | ||
148 | |||
149 | # | ||
150 | # Bus options | ||
151 | # | ||
152 | CONFIG_GENERIC_ISA_DMA=y | ||
153 | # CONFIG_PPC_I8259 is not set | ||
154 | CONFIG_PPC_INDIRECT_PCI=y | ||
155 | CONFIG_FSL_SOC=y | ||
156 | CONFIG_PCI=y | ||
157 | CONFIG_PCI_DOMAINS=y | ||
158 | # CONFIG_PCI_LEGACY_PROC is not set | ||
159 | |||
160 | # | ||
161 | # PCCARD (PCMCIA/CardBus) support | ||
162 | # | ||
163 | # CONFIG_PCCARD is not set | ||
164 | |||
165 | # | ||
166 | # PCI Hotplug Support | ||
167 | # | ||
168 | # CONFIG_HOTPLUG_PCI is not set | ||
169 | |||
170 | # | ||
171 | # Advanced setup | ||
172 | # | ||
173 | # CONFIG_ADVANCED_OPTIONS is not set | ||
174 | |||
175 | # | ||
176 | # Default settings for advanced configuration options are used | ||
177 | # | ||
178 | CONFIG_HIGHMEM_START=0xfe000000 | ||
179 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
180 | CONFIG_KERNEL_START=0xc0000000 | ||
181 | CONFIG_TASK_SIZE=0x80000000 | ||
182 | CONFIG_BOOT_LOAD=0x00800000 | ||
183 | |||
184 | # | ||
185 | # Networking | ||
186 | # | ||
187 | CONFIG_NET=y | ||
188 | |||
189 | # | ||
190 | # Networking options | ||
191 | # | ||
192 | CONFIG_PACKET=y | ||
193 | # CONFIG_PACKET_MMAP is not set | ||
194 | CONFIG_UNIX=y | ||
195 | # CONFIG_NET_KEY is not set | ||
196 | CONFIG_INET=y | ||
197 | CONFIG_IP_MULTICAST=y | ||
198 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
199 | CONFIG_IP_FIB_HASH=y | ||
200 | CONFIG_IP_PNP=y | ||
201 | CONFIG_IP_PNP_DHCP=y | ||
202 | CONFIG_IP_PNP_BOOTP=y | ||
203 | # CONFIG_IP_PNP_RARP is not set | ||
204 | # CONFIG_NET_IPIP is not set | ||
205 | # CONFIG_NET_IPGRE is not set | ||
206 | # CONFIG_IP_MROUTE is not set | ||
207 | # CONFIG_ARPD is not set | ||
208 | CONFIG_SYN_COOKIES=y | ||
209 | # CONFIG_INET_AH is not set | ||
210 | # CONFIG_INET_ESP is not set | ||
211 | # CONFIG_INET_IPCOMP is not set | ||
212 | # CONFIG_INET_TUNNEL is not set | ||
213 | CONFIG_INET_DIAG=y | ||
214 | CONFIG_INET_TCP_DIAG=y | ||
215 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
216 | CONFIG_TCP_CONG_BIC=y | ||
217 | # CONFIG_IPV6 is not set | ||
218 | # CONFIG_NETFILTER is not set | ||
219 | |||
220 | # | ||
221 | # DCCP Configuration (EXPERIMENTAL) | ||
222 | # | ||
223 | # CONFIG_IP_DCCP is not set | ||
224 | |||
225 | # | ||
226 | # SCTP Configuration (EXPERIMENTAL) | ||
227 | # | ||
228 | # CONFIG_IP_SCTP is not set | ||
229 | # CONFIG_ATM is not set | ||
230 | # CONFIG_BRIDGE is not set | ||
231 | # CONFIG_VLAN_8021Q is not set | ||
232 | # CONFIG_DECNET is not set | ||
233 | # CONFIG_LLC2 is not set | ||
234 | # CONFIG_IPX is not set | ||
235 | # CONFIG_ATALK is not set | ||
236 | # CONFIG_X25 is not set | ||
237 | # CONFIG_LAPB is not set | ||
238 | # CONFIG_NET_DIVERT is not set | ||
239 | # CONFIG_ECONET is not set | ||
240 | # CONFIG_WAN_ROUTER is not set | ||
241 | |||
242 | # | ||
243 | # QoS and/or fair queueing | ||
244 | # | ||
245 | # CONFIG_NET_SCHED is not set | ||
246 | |||
247 | # | ||
248 | # Network testing | ||
249 | # | ||
250 | # CONFIG_NET_PKTGEN is not set | ||
251 | # CONFIG_HAMRADIO is not set | ||
252 | # CONFIG_IRDA is not set | ||
253 | # CONFIG_BT is not set | ||
254 | # CONFIG_IEEE80211 is not set | ||
255 | |||
256 | # | ||
257 | # Device Drivers | ||
258 | # | ||
259 | |||
260 | # | ||
261 | # Generic Driver Options | ||
262 | # | ||
263 | CONFIG_STANDALONE=y | ||
264 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
265 | # CONFIG_FW_LOADER is not set | ||
266 | |||
267 | # | ||
268 | # Connector - unified userspace <-> kernelspace linker | ||
269 | # | ||
270 | # CONFIG_CONNECTOR is not set | ||
271 | |||
272 | # | ||
273 | # Memory Technology Devices (MTD) | ||
274 | # | ||
275 | # CONFIG_MTD is not set | ||
276 | |||
277 | # | ||
278 | # Parallel port support | ||
279 | # | ||
280 | # CONFIG_PARPORT is not set | ||
281 | |||
282 | # | ||
283 | # Plug and Play support | ||
284 | # | ||
285 | |||
286 | # | ||
287 | # Block devices | ||
288 | # | ||
289 | # CONFIG_BLK_DEV_FD is not set | ||
290 | # CONFIG_BLK_CPQ_DA is not set | ||
291 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
292 | # CONFIG_BLK_DEV_DAC960 is not set | ||
293 | # CONFIG_BLK_DEV_UMEM is not set | ||
294 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
295 | CONFIG_BLK_DEV_LOOP=y | ||
296 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
297 | # CONFIG_BLK_DEV_NBD is not set | ||
298 | # CONFIG_BLK_DEV_SX8 is not set | ||
299 | CONFIG_BLK_DEV_RAM=y | ||
300 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
301 | CONFIG_BLK_DEV_RAM_SIZE=32768 | ||
302 | CONFIG_BLK_DEV_INITRD=y | ||
303 | # CONFIG_CDROM_PKTCDVD is not set | ||
304 | # CONFIG_ATA_OVER_ETH is not set | ||
305 | |||
306 | # | ||
307 | # ATA/ATAPI/MFM/RLL support | ||
308 | # | ||
309 | # CONFIG_IDE is not set | ||
310 | |||
311 | # | ||
312 | # SCSI device support | ||
313 | # | ||
314 | # CONFIG_RAID_ATTRS is not set | ||
315 | # CONFIG_SCSI is not set | ||
316 | |||
317 | # | ||
318 | # Multi-device support (RAID and LVM) | ||
319 | # | ||
320 | # CONFIG_MD is not set | ||
321 | |||
322 | # | ||
323 | # Fusion MPT device support | ||
324 | # | ||
325 | # CONFIG_FUSION is not set | ||
326 | |||
327 | # | ||
328 | # IEEE 1394 (FireWire) support | ||
329 | # | ||
330 | # CONFIG_IEEE1394 is not set | ||
331 | |||
332 | # | ||
333 | # I2O device support | ||
334 | # | ||
335 | # CONFIG_I2O is not set | ||
336 | |||
337 | # | ||
338 | # Macintosh device drivers | ||
339 | # | ||
340 | # CONFIG_WINDFARM is not set | ||
341 | |||
342 | # | ||
343 | # Network device support | ||
344 | # | ||
345 | CONFIG_NETDEVICES=y | ||
346 | # CONFIG_DUMMY is not set | ||
347 | # CONFIG_BONDING is not set | ||
348 | # CONFIG_EQUALIZER is not set | ||
349 | # CONFIG_TUN is not set | ||
350 | |||
351 | # | ||
352 | # ARCnet devices | ||
353 | # | ||
354 | # CONFIG_ARCNET is not set | ||
355 | |||
356 | # | ||
357 | # PHY device support | ||
358 | # | ||
359 | CONFIG_PHYLIB=y | ||
360 | |||
361 | # | ||
362 | # MII PHY device drivers | ||
363 | # | ||
364 | CONFIG_MARVELL_PHY=y | ||
365 | # CONFIG_DAVICOM_PHY is not set | ||
366 | # CONFIG_QSEMI_PHY is not set | ||
367 | # CONFIG_LXT_PHY is not set | ||
368 | # CONFIG_CICADA_PHY is not set | ||
369 | |||
370 | # | ||
371 | # Ethernet (10 or 100Mbit) | ||
372 | # | ||
373 | CONFIG_NET_ETHERNET=y | ||
374 | CONFIG_MII=y | ||
375 | # CONFIG_HAPPYMEAL is not set | ||
376 | # CONFIG_SUNGEM is not set | ||
377 | # CONFIG_CASSINI is not set | ||
378 | # CONFIG_NET_VENDOR_3COM is not set | ||
379 | |||
380 | # | ||
381 | # Tulip family network device support | ||
382 | # | ||
383 | # CONFIG_NET_TULIP is not set | ||
384 | # CONFIG_HP100 is not set | ||
385 | CONFIG_NET_PCI=y | ||
386 | # CONFIG_PCNET32 is not set | ||
387 | # CONFIG_AMD8111_ETH is not set | ||
388 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
389 | # CONFIG_B44 is not set | ||
390 | # CONFIG_FORCEDETH is not set | ||
391 | # CONFIG_DGRS is not set | ||
392 | # CONFIG_EEPRO100 is not set | ||
393 | CONFIG_E100=y | ||
394 | # CONFIG_FEALNX is not set | ||
395 | # CONFIG_NATSEMI is not set | ||
396 | # CONFIG_NE2K_PCI is not set | ||
397 | # CONFIG_8139CP is not set | ||
398 | # CONFIG_8139TOO is not set | ||
399 | # CONFIG_SIS900 is not set | ||
400 | # CONFIG_EPIC100 is not set | ||
401 | # CONFIG_SUNDANCE is not set | ||
402 | # CONFIG_TLAN is not set | ||
403 | # CONFIG_VIA_RHINE is not set | ||
404 | |||
405 | # | ||
406 | # Ethernet (1000 Mbit) | ||
407 | # | ||
408 | # CONFIG_ACENIC is not set | ||
409 | # CONFIG_DL2K is not set | ||
410 | # CONFIG_E1000 is not set | ||
411 | # CONFIG_NS83820 is not set | ||
412 | # CONFIG_HAMACHI is not set | ||
413 | # CONFIG_YELLOWFIN is not set | ||
414 | # CONFIG_R8169 is not set | ||
415 | # CONFIG_SIS190 is not set | ||
416 | # CONFIG_SKGE is not set | ||
417 | # CONFIG_SKY2 is not set | ||
418 | # CONFIG_SK98LIN is not set | ||
419 | # CONFIG_VIA_VELOCITY is not set | ||
420 | # CONFIG_TIGON3 is not set | ||
421 | # CONFIG_BNX2 is not set | ||
422 | CONFIG_GIANFAR=y | ||
423 | # CONFIG_GFAR_NAPI is not set | ||
424 | |||
425 | # | ||
426 | # Ethernet (10000 Mbit) | ||
427 | # | ||
428 | # CONFIG_CHELSIO_T1 is not set | ||
429 | # CONFIG_IXGB is not set | ||
430 | # CONFIG_S2IO is not set | ||
431 | |||
432 | # | ||
433 | # Token Ring devices | ||
434 | # | ||
435 | # CONFIG_TR is not set | ||
436 | |||
437 | # | ||
438 | # Wireless LAN (non-hamradio) | ||
439 | # | ||
440 | # CONFIG_NET_RADIO is not set | ||
441 | |||
442 | # | ||
443 | # Wan interfaces | ||
444 | # | ||
445 | # CONFIG_WAN is not set | ||
446 | # CONFIG_FDDI is not set | ||
447 | # CONFIG_HIPPI is not set | ||
448 | # CONFIG_PPP is not set | ||
449 | # CONFIG_SLIP is not set | ||
450 | # CONFIG_SHAPER is not set | ||
451 | # CONFIG_NETCONSOLE is not set | ||
452 | # CONFIG_NETPOLL is not set | ||
453 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
454 | |||
455 | # | ||
456 | # ISDN subsystem | ||
457 | # | ||
458 | # CONFIG_ISDN is not set | ||
459 | |||
460 | # | ||
461 | # Telephony Support | ||
462 | # | ||
463 | # CONFIG_PHONE is not set | ||
464 | |||
465 | # | ||
466 | # Input device support | ||
467 | # | ||
468 | CONFIG_INPUT=y | ||
469 | |||
470 | # | ||
471 | # Userland interfaces | ||
472 | # | ||
473 | # CONFIG_INPUT_MOUSEDEV is not set | ||
474 | # CONFIG_INPUT_JOYDEV is not set | ||
475 | # CONFIG_INPUT_TSDEV is not set | ||
476 | # CONFIG_INPUT_EVDEV is not set | ||
477 | # CONFIG_INPUT_EVBUG is not set | ||
478 | |||
479 | # | ||
480 | # Input Device Drivers | ||
481 | # | ||
482 | # CONFIG_INPUT_KEYBOARD is not set | ||
483 | # CONFIG_INPUT_MOUSE is not set | ||
484 | # CONFIG_INPUT_JOYSTICK is not set | ||
485 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
486 | # CONFIG_INPUT_MISC is not set | ||
487 | |||
488 | # | ||
489 | # Hardware I/O ports | ||
490 | # | ||
491 | # CONFIG_SERIO is not set | ||
492 | # CONFIG_GAMEPORT is not set | ||
493 | |||
494 | # | ||
495 | # Character devices | ||
496 | # | ||
497 | # CONFIG_VT is not set | ||
498 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
499 | |||
500 | # | ||
501 | # Serial drivers | ||
502 | # | ||
503 | CONFIG_SERIAL_8250=y | ||
504 | CONFIG_SERIAL_8250_CONSOLE=y | ||
505 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
506 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
507 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
508 | |||
509 | # | ||
510 | # Non-8250 serial port support | ||
511 | # | ||
512 | CONFIG_SERIAL_CORE=y | ||
513 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
514 | CONFIG_UNIX98_PTYS=y | ||
515 | CONFIG_LEGACY_PTYS=y | ||
516 | CONFIG_LEGACY_PTY_COUNT=256 | ||
517 | |||
518 | # | ||
519 | # IPMI | ||
520 | # | ||
521 | # CONFIG_IPMI_HANDLER is not set | ||
522 | |||
523 | # | ||
524 | # Watchdog Cards | ||
525 | # | ||
526 | CONFIG_WATCHDOG=y | ||
527 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
528 | |||
529 | # | ||
530 | # Watchdog Device Drivers | ||
531 | # | ||
532 | # CONFIG_SOFT_WATCHDOG is not set | ||
533 | CONFIG_83xx_WDT=y | ||
534 | |||
535 | # | ||
536 | # PCI-based Watchdog Cards | ||
537 | # | ||
538 | # CONFIG_PCIPCWATCHDOG is not set | ||
539 | # CONFIG_WDTPCI is not set | ||
540 | # CONFIG_NVRAM is not set | ||
541 | CONFIG_GEN_RTC=y | ||
542 | # CONFIG_GEN_RTC_X is not set | ||
543 | # CONFIG_DTLK is not set | ||
544 | # CONFIG_R3964 is not set | ||
545 | # CONFIG_APPLICOM is not set | ||
546 | |||
547 | # | ||
548 | # Ftape, the floppy tape device driver | ||
549 | # | ||
550 | # CONFIG_AGP is not set | ||
551 | # CONFIG_DRM is not set | ||
552 | # CONFIG_RAW_DRIVER is not set | ||
553 | |||
554 | # | ||
555 | # TPM devices | ||
556 | # | ||
557 | # CONFIG_TCG_TPM is not set | ||
558 | # CONFIG_TELCLOCK is not set | ||
559 | |||
560 | # | ||
561 | # I2C support | ||
562 | # | ||
563 | CONFIG_I2C=y | ||
564 | CONFIG_I2C_CHARDEV=y | ||
565 | |||
566 | # | ||
567 | # I2C Algorithms | ||
568 | # | ||
569 | # CONFIG_I2C_ALGOBIT is not set | ||
570 | # CONFIG_I2C_ALGOPCF is not set | ||
571 | # CONFIG_I2C_ALGOPCA is not set | ||
572 | |||
573 | # | ||
574 | # I2C Hardware Bus support | ||
575 | # | ||
576 | # CONFIG_I2C_ALI1535 is not set | ||
577 | # CONFIG_I2C_ALI1563 is not set | ||
578 | # CONFIG_I2C_ALI15X3 is not set | ||
579 | # CONFIG_I2C_AMD756 is not set | ||
580 | # CONFIG_I2C_AMD8111 is not set | ||
581 | # CONFIG_I2C_I801 is not set | ||
582 | # CONFIG_I2C_I810 is not set | ||
583 | # CONFIG_I2C_PIIX4 is not set | ||
584 | CONFIG_I2C_MPC=y | ||
585 | # CONFIG_I2C_NFORCE2 is not set | ||
586 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
587 | # CONFIG_I2C_PROSAVAGE is not set | ||
588 | # CONFIG_I2C_SAVAGE4 is not set | ||
589 | # CONFIG_SCx200_ACB is not set | ||
590 | # CONFIG_I2C_SIS5595 is not set | ||
591 | # CONFIG_I2C_SIS630 is not set | ||
592 | # CONFIG_I2C_SIS96X is not set | ||
593 | # CONFIG_I2C_STUB is not set | ||
594 | # CONFIG_I2C_VIA is not set | ||
595 | # CONFIG_I2C_VIAPRO is not set | ||
596 | # CONFIG_I2C_VOODOO3 is not set | ||
597 | # CONFIG_I2C_PCA_ISA is not set | ||
598 | |||
599 | # | ||
600 | # Miscellaneous I2C Chip support | ||
601 | # | ||
602 | # CONFIG_SENSORS_DS1337 is not set | ||
603 | # CONFIG_SENSORS_DS1374 is not set | ||
604 | # CONFIG_SENSORS_EEPROM is not set | ||
605 | # CONFIG_SENSORS_PCF8574 is not set | ||
606 | # CONFIG_SENSORS_PCA9539 is not set | ||
607 | # CONFIG_SENSORS_PCF8591 is not set | ||
608 | # CONFIG_SENSORS_RTC8564 is not set | ||
609 | # CONFIG_SENSORS_M41T00 is not set | ||
610 | # CONFIG_SENSORS_MAX6875 is not set | ||
611 | # CONFIG_RTC_X1205_I2C is not set | ||
612 | # CONFIG_I2C_DEBUG_CORE is not set | ||
613 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
614 | # CONFIG_I2C_DEBUG_BUS is not set | ||
615 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
616 | |||
617 | # | ||
618 | # Dallas's 1-wire bus | ||
619 | # | ||
620 | # CONFIG_W1 is not set | ||
621 | |||
622 | # | ||
623 | # Hardware Monitoring support | ||
624 | # | ||
625 | CONFIG_HWMON=y | ||
626 | # CONFIG_HWMON_VID is not set | ||
627 | # CONFIG_SENSORS_ADM1021 is not set | ||
628 | # CONFIG_SENSORS_ADM1025 is not set | ||
629 | # CONFIG_SENSORS_ADM1026 is not set | ||
630 | # CONFIG_SENSORS_ADM1031 is not set | ||
631 | # CONFIG_SENSORS_ADM9240 is not set | ||
632 | # CONFIG_SENSORS_ASB100 is not set | ||
633 | # CONFIG_SENSORS_ATXP1 is not set | ||
634 | # CONFIG_SENSORS_DS1621 is not set | ||
635 | # CONFIG_SENSORS_FSCHER is not set | ||
636 | # CONFIG_SENSORS_FSCPOS is not set | ||
637 | # CONFIG_SENSORS_GL518SM is not set | ||
638 | # CONFIG_SENSORS_GL520SM is not set | ||
639 | # CONFIG_SENSORS_IT87 is not set | ||
640 | # CONFIG_SENSORS_LM63 is not set | ||
641 | # CONFIG_SENSORS_LM75 is not set | ||
642 | # CONFIG_SENSORS_LM77 is not set | ||
643 | # CONFIG_SENSORS_LM78 is not set | ||
644 | # CONFIG_SENSORS_LM80 is not set | ||
645 | # CONFIG_SENSORS_LM83 is not set | ||
646 | # CONFIG_SENSORS_LM85 is not set | ||
647 | # CONFIG_SENSORS_LM87 is not set | ||
648 | # CONFIG_SENSORS_LM90 is not set | ||
649 | # CONFIG_SENSORS_LM92 is not set | ||
650 | # CONFIG_SENSORS_MAX1619 is not set | ||
651 | # CONFIG_SENSORS_PC87360 is not set | ||
652 | # CONFIG_SENSORS_SIS5595 is not set | ||
653 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
654 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
655 | # CONFIG_SENSORS_VIA686A is not set | ||
656 | # CONFIG_SENSORS_VT8231 is not set | ||
657 | # CONFIG_SENSORS_W83781D is not set | ||
658 | # CONFIG_SENSORS_W83792D is not set | ||
659 | # CONFIG_SENSORS_W83L785TS is not set | ||
660 | # CONFIG_SENSORS_W83627HF is not set | ||
661 | # CONFIG_SENSORS_W83627EHF is not set | ||
662 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
663 | |||
664 | # | ||
665 | # Misc devices | ||
666 | # | ||
667 | |||
668 | # | ||
669 | # Multimedia Capabilities Port drivers | ||
670 | # | ||
671 | |||
672 | # | ||
673 | # Multimedia devices | ||
674 | # | ||
675 | # CONFIG_VIDEO_DEV is not set | ||
676 | |||
677 | # | ||
678 | # Digital Video Broadcasting Devices | ||
679 | # | ||
680 | # CONFIG_DVB is not set | ||
681 | |||
682 | # | ||
683 | # Graphics support | ||
684 | # | ||
685 | # CONFIG_FB is not set | ||
686 | |||
687 | # | ||
688 | # Sound | ||
689 | # | ||
690 | # CONFIG_SOUND is not set | ||
691 | |||
692 | # | ||
693 | # USB support | ||
694 | # | ||
695 | CONFIG_USB_ARCH_HAS_HCD=y | ||
696 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
697 | # CONFIG_USB is not set | ||
698 | |||
699 | # | ||
700 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
701 | # | ||
702 | |||
703 | # | ||
704 | # USB Gadget Support | ||
705 | # | ||
706 | # CONFIG_USB_GADGET is not set | ||
707 | |||
708 | # | ||
709 | # MMC/SD Card support | ||
710 | # | ||
711 | # CONFIG_MMC is not set | ||
712 | |||
713 | # | ||
714 | # InfiniBand support | ||
715 | # | ||
716 | # CONFIG_INFINIBAND is not set | ||
717 | |||
718 | # | ||
719 | # SN Devices | ||
720 | # | ||
721 | |||
722 | # | ||
723 | # File systems | ||
724 | # | ||
725 | CONFIG_EXT2_FS=y | ||
726 | # CONFIG_EXT2_FS_XATTR is not set | ||
727 | # CONFIG_EXT2_FS_XIP is not set | ||
728 | CONFIG_EXT3_FS=y | ||
729 | CONFIG_EXT3_FS_XATTR=y | ||
730 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
731 | # CONFIG_EXT3_FS_SECURITY is not set | ||
732 | CONFIG_JBD=y | ||
733 | # CONFIG_JBD_DEBUG is not set | ||
734 | CONFIG_FS_MBCACHE=y | ||
735 | # CONFIG_REISERFS_FS is not set | ||
736 | # CONFIG_JFS_FS is not set | ||
737 | # CONFIG_FS_POSIX_ACL is not set | ||
738 | # CONFIG_XFS_FS is not set | ||
739 | # CONFIG_OCFS2_FS is not set | ||
740 | # CONFIG_MINIX_FS is not set | ||
741 | # CONFIG_ROMFS_FS is not set | ||
742 | CONFIG_INOTIFY=y | ||
743 | # CONFIG_QUOTA is not set | ||
744 | CONFIG_DNOTIFY=y | ||
745 | # CONFIG_AUTOFS_FS is not set | ||
746 | # CONFIG_AUTOFS4_FS is not set | ||
747 | # CONFIG_FUSE_FS is not set | ||
748 | |||
749 | # | ||
750 | # CD-ROM/DVD Filesystems | ||
751 | # | ||
752 | # CONFIG_ISO9660_FS is not set | ||
753 | # CONFIG_UDF_FS is not set | ||
754 | |||
755 | # | ||
756 | # DOS/FAT/NT Filesystems | ||
757 | # | ||
758 | # CONFIG_MSDOS_FS is not set | ||
759 | # CONFIG_VFAT_FS is not set | ||
760 | # CONFIG_NTFS_FS is not set | ||
761 | |||
762 | # | ||
763 | # Pseudo filesystems | ||
764 | # | ||
765 | CONFIG_PROC_FS=y | ||
766 | CONFIG_PROC_KCORE=y | ||
767 | CONFIG_SYSFS=y | ||
768 | CONFIG_TMPFS=y | ||
769 | # CONFIG_HUGETLB_PAGE is not set | ||
770 | CONFIG_RAMFS=y | ||
771 | # CONFIG_RELAYFS_FS is not set | ||
772 | # CONFIG_CONFIGFS_FS is not set | ||
773 | |||
774 | # | ||
775 | # Miscellaneous filesystems | ||
776 | # | ||
777 | # CONFIG_ADFS_FS is not set | ||
778 | # CONFIG_AFFS_FS is not set | ||
779 | # CONFIG_HFS_FS is not set | ||
780 | # CONFIG_HFSPLUS_FS is not set | ||
781 | # CONFIG_BEFS_FS is not set | ||
782 | # CONFIG_BFS_FS is not set | ||
783 | # CONFIG_EFS_FS is not set | ||
784 | # CONFIG_CRAMFS is not set | ||
785 | # CONFIG_VXFS_FS is not set | ||
786 | # CONFIG_HPFS_FS is not set | ||
787 | # CONFIG_QNX4FS_FS is not set | ||
788 | # CONFIG_SYSV_FS is not set | ||
789 | # CONFIG_UFS_FS is not set | ||
790 | |||
791 | # | ||
792 | # Network File Systems | ||
793 | # | ||
794 | CONFIG_NFS_FS=y | ||
795 | CONFIG_NFS_V3=y | ||
796 | # CONFIG_NFS_V3_ACL is not set | ||
797 | CONFIG_NFS_V4=y | ||
798 | # CONFIG_NFS_DIRECTIO is not set | ||
799 | # CONFIG_NFSD is not set | ||
800 | CONFIG_ROOT_NFS=y | ||
801 | CONFIG_LOCKD=y | ||
802 | CONFIG_LOCKD_V4=y | ||
803 | CONFIG_NFS_COMMON=y | ||
804 | CONFIG_SUNRPC=y | ||
805 | CONFIG_SUNRPC_GSS=y | ||
806 | CONFIG_RPCSEC_GSS_KRB5=y | ||
807 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
808 | # CONFIG_SMB_FS is not set | ||
809 | # CONFIG_CIFS is not set | ||
810 | # CONFIG_NCP_FS is not set | ||
811 | # CONFIG_CODA_FS is not set | ||
812 | # CONFIG_AFS_FS is not set | ||
813 | # CONFIG_9P_FS is not set | ||
814 | |||
815 | # | ||
816 | # Partition Types | ||
817 | # | ||
818 | CONFIG_PARTITION_ADVANCED=y | ||
819 | # CONFIG_ACORN_PARTITION is not set | ||
820 | # CONFIG_OSF_PARTITION is not set | ||
821 | # CONFIG_AMIGA_PARTITION is not set | ||
822 | # CONFIG_ATARI_PARTITION is not set | ||
823 | # CONFIG_MAC_PARTITION is not set | ||
824 | # CONFIG_MSDOS_PARTITION is not set | ||
825 | # CONFIG_LDM_PARTITION is not set | ||
826 | # CONFIG_SGI_PARTITION is not set | ||
827 | # CONFIG_ULTRIX_PARTITION is not set | ||
828 | # CONFIG_SUN_PARTITION is not set | ||
829 | # CONFIG_EFI_PARTITION is not set | ||
830 | |||
831 | # | ||
832 | # Native Language Support | ||
833 | # | ||
834 | # CONFIG_NLS is not set | ||
835 | |||
836 | # | ||
837 | # Library routines | ||
838 | # | ||
839 | # CONFIG_CRC_CCITT is not set | ||
840 | # CONFIG_CRC16 is not set | ||
841 | CONFIG_CRC32=y | ||
842 | # CONFIG_LIBCRC32C is not set | ||
843 | |||
844 | # | ||
845 | # Instrumentation Support | ||
846 | # | ||
847 | # CONFIG_PROFILING is not set | ||
848 | |||
849 | # | ||
850 | # Kernel hacking | ||
851 | # | ||
852 | # CONFIG_PRINTK_TIME is not set | ||
853 | # CONFIG_MAGIC_SYSRQ is not set | ||
854 | # CONFIG_DEBUG_KERNEL is not set | ||
855 | CONFIG_LOG_BUF_SHIFT=14 | ||
856 | # CONFIG_BOOTX_TEXT is not set | ||
857 | # CONFIG_SERIAL_TEXT_DEBUG is not set | ||
858 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | ||
859 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
860 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
861 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
862 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
863 | |||
864 | # | ||
865 | # Security options | ||
866 | # | ||
867 | # CONFIG_KEYS is not set | ||
868 | # CONFIG_SECURITY is not set | ||
869 | |||
870 | # | ||
871 | # Cryptographic options | ||
872 | # | ||
873 | CONFIG_CRYPTO=y | ||
874 | # CONFIG_CRYPTO_HMAC is not set | ||
875 | # CONFIG_CRYPTO_NULL is not set | ||
876 | # CONFIG_CRYPTO_MD4 is not set | ||
877 | CONFIG_CRYPTO_MD5=y | ||
878 | # CONFIG_CRYPTO_SHA1 is not set | ||
879 | # CONFIG_CRYPTO_SHA256 is not set | ||
880 | # CONFIG_CRYPTO_SHA512 is not set | ||
881 | # CONFIG_CRYPTO_WP512 is not set | ||
882 | # CONFIG_CRYPTO_TGR192 is not set | ||
883 | CONFIG_CRYPTO_DES=y | ||
884 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
885 | # CONFIG_CRYPTO_TWOFISH is not set | ||
886 | # CONFIG_CRYPTO_SERPENT is not set | ||
887 | # CONFIG_CRYPTO_AES is not set | ||
888 | # CONFIG_CRYPTO_CAST5 is not set | ||
889 | # CONFIG_CRYPTO_CAST6 is not set | ||
890 | # CONFIG_CRYPTO_TEA is not set | ||
891 | # CONFIG_CRYPTO_ARC4 is not set | ||
892 | # CONFIG_CRYPTO_KHAZAD is not set | ||
893 | # CONFIG_CRYPTO_ANUBIS is not set | ||
894 | # CONFIG_CRYPTO_DEFLATE is not set | ||
895 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
896 | # CONFIG_CRYPTO_CRC32C is not set | ||
897 | # CONFIG_CRYPTO_TEST is not set | ||
898 | |||
899 | # | ||
900 | # Hardware crypto devices | ||
901 | # | ||
902 | |||
903 | # | ||
904 | # SEC2.x Options | ||
905 | # | ||
906 | CONFIG_MPC8349E_SEC2x=y | ||
907 | |||
908 | # | ||
909 | # SEC2.x Test Options | ||
910 | # | ||
911 | CONFIG_MPC8349E_SEC2xTEST=y | ||
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 56399c5c931a..840aad43a98b 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -135,7 +135,7 @@ int main(void) | |||
135 | DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc)); | 135 | DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc)); |
136 | DEFINE(PACA_EXSLB, offsetof(struct paca_struct, exslb)); | 136 | DEFINE(PACA_EXSLB, offsetof(struct paca_struct, exslb)); |
137 | DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp)); | 137 | DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp)); |
138 | DEFINE(PACALPPACA, offsetof(struct paca_struct, lppaca)); | 138 | DEFINE(PACALPPACAPTR, offsetof(struct paca_struct, lppaca_ptr)); |
139 | DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id)); | 139 | DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id)); |
140 | 140 | ||
141 | DEFINE(LPPACASRR0, offsetof(struct lppaca, saved_srr0)); | 141 | DEFINE(LPPACASRR0, offsetof(struct lppaca, saved_srr0)); |
diff --git a/arch/powerpc/kernel/cpu_setup_power4.S b/arch/powerpc/kernel/cpu_setup_power4.S index cca942fe6115..b61d86e7ceb6 100644 --- a/arch/powerpc/kernel/cpu_setup_power4.S +++ b/arch/powerpc/kernel/cpu_setup_power4.S | |||
@@ -130,7 +130,7 @@ _GLOBAL(__save_cpu_setup) | |||
130 | mfcr r7 | 130 | mfcr r7 |
131 | 131 | ||
132 | /* Get storage ptr */ | 132 | /* Get storage ptr */ |
133 | LOADADDR(r5,cpu_state_storage) | 133 | LOAD_REG_IMMEDIATE(r5,cpu_state_storage) |
134 | 134 | ||
135 | /* We only deal with 970 for now */ | 135 | /* We only deal with 970 for now */ |
136 | mfspr r0,SPRN_PVR | 136 | mfspr r0,SPRN_PVR |
@@ -164,7 +164,7 @@ _GLOBAL(__restore_cpu_setup) | |||
164 | /* Get storage ptr (FIXME when using anton reloc as we | 164 | /* Get storage ptr (FIXME when using anton reloc as we |
165 | * are running with translation disabled here | 165 | * are running with translation disabled here |
166 | */ | 166 | */ |
167 | LOADADDR(r5,cpu_state_storage) | 167 | LOAD_REG_IMMEDIATE(r5,cpu_state_storage) |
168 | 168 | ||
169 | /* We only deal with 970 for now */ | 169 | /* We only deal with 970 for now */ |
170 | mfspr r0,SPRN_PVR | 170 | mfspr r0,SPRN_PVR |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 43c74a6b07b1..10696456a4c6 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -55,7 +55,8 @@ extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); | |||
55 | #define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4) | 55 | #define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4) |
56 | #define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5) | 56 | #define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5) |
57 | #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS) | 57 | #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS) |
58 | 58 | #define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \ | |
59 | PPC_FEATURE_BOOKE) | ||
59 | 60 | ||
60 | /* We only set the spe features if the kernel was compiled with | 61 | /* We only set the spe features if the kernel was compiled with |
61 | * spe support | 62 | * spe support |
@@ -79,7 +80,8 @@ struct cpu_spec cpu_specs[] = { | |||
79 | .num_pmcs = 8, | 80 | .num_pmcs = 8, |
80 | .cpu_setup = __setup_cpu_power3, | 81 | .cpu_setup = __setup_cpu_power3, |
81 | .oprofile_cpu_type = "ppc64/power3", | 82 | .oprofile_cpu_type = "ppc64/power3", |
82 | .oprofile_type = RS64, | 83 | .oprofile_type = PPC_OPROFILE_RS64, |
84 | .platform = "power3", | ||
83 | }, | 85 | }, |
84 | { /* Power3+ */ | 86 | { /* Power3+ */ |
85 | .pvr_mask = 0xffff0000, | 87 | .pvr_mask = 0xffff0000, |
@@ -92,7 +94,8 @@ struct cpu_spec cpu_specs[] = { | |||
92 | .num_pmcs = 8, | 94 | .num_pmcs = 8, |
93 | .cpu_setup = __setup_cpu_power3, | 95 | .cpu_setup = __setup_cpu_power3, |
94 | .oprofile_cpu_type = "ppc64/power3", | 96 | .oprofile_cpu_type = "ppc64/power3", |
95 | .oprofile_type = RS64, | 97 | .oprofile_type = PPC_OPROFILE_RS64, |
98 | .platform = "power3", | ||
96 | }, | 99 | }, |
97 | { /* Northstar */ | 100 | { /* Northstar */ |
98 | .pvr_mask = 0xffff0000, | 101 | .pvr_mask = 0xffff0000, |
@@ -105,7 +108,8 @@ struct cpu_spec cpu_specs[] = { | |||
105 | .num_pmcs = 8, | 108 | .num_pmcs = 8, |
106 | .cpu_setup = __setup_cpu_power3, | 109 | .cpu_setup = __setup_cpu_power3, |
107 | .oprofile_cpu_type = "ppc64/rs64", | 110 | .oprofile_cpu_type = "ppc64/rs64", |
108 | .oprofile_type = RS64, | 111 | .oprofile_type = PPC_OPROFILE_RS64, |
112 | .platform = "rs64", | ||
109 | }, | 113 | }, |
110 | { /* Pulsar */ | 114 | { /* Pulsar */ |
111 | .pvr_mask = 0xffff0000, | 115 | .pvr_mask = 0xffff0000, |
@@ -118,7 +122,8 @@ struct cpu_spec cpu_specs[] = { | |||
118 | .num_pmcs = 8, | 122 | .num_pmcs = 8, |
119 | .cpu_setup = __setup_cpu_power3, | 123 | .cpu_setup = __setup_cpu_power3, |
120 | .oprofile_cpu_type = "ppc64/rs64", | 124 | .oprofile_cpu_type = "ppc64/rs64", |
121 | .oprofile_type = RS64, | 125 | .oprofile_type = PPC_OPROFILE_RS64, |
126 | .platform = "rs64", | ||
122 | }, | 127 | }, |
123 | { /* I-star */ | 128 | { /* I-star */ |
124 | .pvr_mask = 0xffff0000, | 129 | .pvr_mask = 0xffff0000, |
@@ -131,7 +136,8 @@ struct cpu_spec cpu_specs[] = { | |||
131 | .num_pmcs = 8, | 136 | .num_pmcs = 8, |
132 | .cpu_setup = __setup_cpu_power3, | 137 | .cpu_setup = __setup_cpu_power3, |
133 | .oprofile_cpu_type = "ppc64/rs64", | 138 | .oprofile_cpu_type = "ppc64/rs64", |
134 | .oprofile_type = RS64, | 139 | .oprofile_type = PPC_OPROFILE_RS64, |
140 | .platform = "rs64", | ||
135 | }, | 141 | }, |
136 | { /* S-star */ | 142 | { /* S-star */ |
137 | .pvr_mask = 0xffff0000, | 143 | .pvr_mask = 0xffff0000, |
@@ -144,7 +150,8 @@ struct cpu_spec cpu_specs[] = { | |||
144 | .num_pmcs = 8, | 150 | .num_pmcs = 8, |
145 | .cpu_setup = __setup_cpu_power3, | 151 | .cpu_setup = __setup_cpu_power3, |
146 | .oprofile_cpu_type = "ppc64/rs64", | 152 | .oprofile_cpu_type = "ppc64/rs64", |
147 | .oprofile_type = RS64, | 153 | .oprofile_type = PPC_OPROFILE_RS64, |
154 | .platform = "rs64", | ||
148 | }, | 155 | }, |
149 | { /* Power4 */ | 156 | { /* Power4 */ |
150 | .pvr_mask = 0xffff0000, | 157 | .pvr_mask = 0xffff0000, |
@@ -157,7 +164,8 @@ struct cpu_spec cpu_specs[] = { | |||
157 | .num_pmcs = 8, | 164 | .num_pmcs = 8, |
158 | .cpu_setup = __setup_cpu_power4, | 165 | .cpu_setup = __setup_cpu_power4, |
159 | .oprofile_cpu_type = "ppc64/power4", | 166 | .oprofile_cpu_type = "ppc64/power4", |
160 | .oprofile_type = POWER4, | 167 | .oprofile_type = PPC_OPROFILE_POWER4, |
168 | .platform = "power4", | ||
161 | }, | 169 | }, |
162 | { /* Power4+ */ | 170 | { /* Power4+ */ |
163 | .pvr_mask = 0xffff0000, | 171 | .pvr_mask = 0xffff0000, |
@@ -170,7 +178,8 @@ struct cpu_spec cpu_specs[] = { | |||
170 | .num_pmcs = 8, | 178 | .num_pmcs = 8, |
171 | .cpu_setup = __setup_cpu_power4, | 179 | .cpu_setup = __setup_cpu_power4, |
172 | .oprofile_cpu_type = "ppc64/power4", | 180 | .oprofile_cpu_type = "ppc64/power4", |
173 | .oprofile_type = POWER4, | 181 | .oprofile_type = PPC_OPROFILE_POWER4, |
182 | .platform = "power4", | ||
174 | }, | 183 | }, |
175 | { /* PPC970 */ | 184 | { /* PPC970 */ |
176 | .pvr_mask = 0xffff0000, | 185 | .pvr_mask = 0xffff0000, |
@@ -184,7 +193,8 @@ struct cpu_spec cpu_specs[] = { | |||
184 | .num_pmcs = 8, | 193 | .num_pmcs = 8, |
185 | .cpu_setup = __setup_cpu_ppc970, | 194 | .cpu_setup = __setup_cpu_ppc970, |
186 | .oprofile_cpu_type = "ppc64/970", | 195 | .oprofile_cpu_type = "ppc64/970", |
187 | .oprofile_type = POWER4, | 196 | .oprofile_type = PPC_OPROFILE_POWER4, |
197 | .platform = "ppc970", | ||
188 | }, | 198 | }, |
189 | #endif /* CONFIG_PPC64 */ | 199 | #endif /* CONFIG_PPC64 */ |
190 | #if defined(CONFIG_PPC64) || defined(CONFIG_POWER4) | 200 | #if defined(CONFIG_PPC64) || defined(CONFIG_POWER4) |
@@ -204,7 +214,8 @@ struct cpu_spec cpu_specs[] = { | |||
204 | .num_pmcs = 8, | 214 | .num_pmcs = 8, |
205 | .cpu_setup = __setup_cpu_ppc970, | 215 | .cpu_setup = __setup_cpu_ppc970, |
206 | .oprofile_cpu_type = "ppc64/970", | 216 | .oprofile_cpu_type = "ppc64/970", |
207 | .oprofile_type = POWER4, | 217 | .oprofile_type = PPC_OPROFILE_POWER4, |
218 | .platform = "ppc970", | ||
208 | }, | 219 | }, |
209 | #endif /* defined(CONFIG_PPC64) || defined(CONFIG_POWER4) */ | 220 | #endif /* defined(CONFIG_PPC64) || defined(CONFIG_POWER4) */ |
210 | #ifdef CONFIG_PPC64 | 221 | #ifdef CONFIG_PPC64 |
@@ -219,7 +230,8 @@ struct cpu_spec cpu_specs[] = { | |||
219 | .dcache_bsize = 128, | 230 | .dcache_bsize = 128, |
220 | .cpu_setup = __setup_cpu_ppc970, | 231 | .cpu_setup = __setup_cpu_ppc970, |
221 | .oprofile_cpu_type = "ppc64/970", | 232 | .oprofile_cpu_type = "ppc64/970", |
222 | .oprofile_type = POWER4, | 233 | .oprofile_type = PPC_OPROFILE_POWER4, |
234 | .platform = "ppc970", | ||
223 | }, | 235 | }, |
224 | { /* Power5 GR */ | 236 | { /* Power5 GR */ |
225 | .pvr_mask = 0xffff0000, | 237 | .pvr_mask = 0xffff0000, |
@@ -232,7 +244,8 @@ struct cpu_spec cpu_specs[] = { | |||
232 | .num_pmcs = 6, | 244 | .num_pmcs = 6, |
233 | .cpu_setup = __setup_cpu_power4, | 245 | .cpu_setup = __setup_cpu_power4, |
234 | .oprofile_cpu_type = "ppc64/power5", | 246 | .oprofile_cpu_type = "ppc64/power5", |
235 | .oprofile_type = POWER4, | 247 | .oprofile_type = PPC_OPROFILE_POWER4, |
248 | .platform = "power5", | ||
236 | }, | 249 | }, |
237 | { /* Power5 GS */ | 250 | { /* Power5 GS */ |
238 | .pvr_mask = 0xffff0000, | 251 | .pvr_mask = 0xffff0000, |
@@ -245,7 +258,8 @@ struct cpu_spec cpu_specs[] = { | |||
245 | .num_pmcs = 6, | 258 | .num_pmcs = 6, |
246 | .cpu_setup = __setup_cpu_power4, | 259 | .cpu_setup = __setup_cpu_power4, |
247 | .oprofile_cpu_type = "ppc64/power5+", | 260 | .oprofile_cpu_type = "ppc64/power5+", |
248 | .oprofile_type = POWER4, | 261 | .oprofile_type = PPC_OPROFILE_POWER4, |
262 | .platform = "power5+", | ||
249 | }, | 263 | }, |
250 | { /* Cell Broadband Engine */ | 264 | { /* Cell Broadband Engine */ |
251 | .pvr_mask = 0xffff0000, | 265 | .pvr_mask = 0xffff0000, |
@@ -257,6 +271,7 @@ struct cpu_spec cpu_specs[] = { | |||
257 | .icache_bsize = 128, | 271 | .icache_bsize = 128, |
258 | .dcache_bsize = 128, | 272 | .dcache_bsize = 128, |
259 | .cpu_setup = __setup_cpu_be, | 273 | .cpu_setup = __setup_cpu_be, |
274 | .platform = "ppc-cell-be", | ||
260 | }, | 275 | }, |
261 | { /* default match */ | 276 | { /* default match */ |
262 | .pvr_mask = 0x00000000, | 277 | .pvr_mask = 0x00000000, |
@@ -268,6 +283,7 @@ struct cpu_spec cpu_specs[] = { | |||
268 | .dcache_bsize = 128, | 283 | .dcache_bsize = 128, |
269 | .num_pmcs = 6, | 284 | .num_pmcs = 6, |
270 | .cpu_setup = __setup_cpu_power4, | 285 | .cpu_setup = __setup_cpu_power4, |
286 | .platform = "power4", | ||
271 | } | 287 | } |
272 | #endif /* CONFIG_PPC64 */ | 288 | #endif /* CONFIG_PPC64 */ |
273 | #ifdef CONFIG_PPC32 | 289 | #ifdef CONFIG_PPC32 |
@@ -281,6 +297,7 @@ struct cpu_spec cpu_specs[] = { | |||
281 | PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB, | 297 | PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB, |
282 | .icache_bsize = 32, | 298 | .icache_bsize = 32, |
283 | .dcache_bsize = 32, | 299 | .dcache_bsize = 32, |
300 | .platform = "ppc601", | ||
284 | }, | 301 | }, |
285 | { /* 603 */ | 302 | { /* 603 */ |
286 | .pvr_mask = 0xffff0000, | 303 | .pvr_mask = 0xffff0000, |
@@ -290,7 +307,8 @@ struct cpu_spec cpu_specs[] = { | |||
290 | .cpu_user_features = COMMON_USER, | 307 | .cpu_user_features = COMMON_USER, |
291 | .icache_bsize = 32, | 308 | .icache_bsize = 32, |
292 | .dcache_bsize = 32, | 309 | .dcache_bsize = 32, |
293 | .cpu_setup = __setup_cpu_603 | 310 | .cpu_setup = __setup_cpu_603, |
311 | .platform = "ppc603", | ||
294 | }, | 312 | }, |
295 | { /* 603e */ | 313 | { /* 603e */ |
296 | .pvr_mask = 0xffff0000, | 314 | .pvr_mask = 0xffff0000, |
@@ -300,7 +318,8 @@ struct cpu_spec cpu_specs[] = { | |||
300 | .cpu_user_features = COMMON_USER, | 318 | .cpu_user_features = COMMON_USER, |
301 | .icache_bsize = 32, | 319 | .icache_bsize = 32, |
302 | .dcache_bsize = 32, | 320 | .dcache_bsize = 32, |
303 | .cpu_setup = __setup_cpu_603 | 321 | .cpu_setup = __setup_cpu_603, |
322 | .platform = "ppc603", | ||
304 | }, | 323 | }, |
305 | { /* 603ev */ | 324 | { /* 603ev */ |
306 | .pvr_mask = 0xffff0000, | 325 | .pvr_mask = 0xffff0000, |
@@ -310,7 +329,8 @@ struct cpu_spec cpu_specs[] = { | |||
310 | .cpu_user_features = COMMON_USER, | 329 | .cpu_user_features = COMMON_USER, |
311 | .icache_bsize = 32, | 330 | .icache_bsize = 32, |
312 | .dcache_bsize = 32, | 331 | .dcache_bsize = 32, |
313 | .cpu_setup = __setup_cpu_603 | 332 | .cpu_setup = __setup_cpu_603, |
333 | .platform = "ppc603", | ||
314 | }, | 334 | }, |
315 | { /* 604 */ | 335 | { /* 604 */ |
316 | .pvr_mask = 0xffff0000, | 336 | .pvr_mask = 0xffff0000, |
@@ -321,7 +341,8 @@ struct cpu_spec cpu_specs[] = { | |||
321 | .icache_bsize = 32, | 341 | .icache_bsize = 32, |
322 | .dcache_bsize = 32, | 342 | .dcache_bsize = 32, |
323 | .num_pmcs = 2, | 343 | .num_pmcs = 2, |
324 | .cpu_setup = __setup_cpu_604 | 344 | .cpu_setup = __setup_cpu_604, |
345 | .platform = "ppc604", | ||
325 | }, | 346 | }, |
326 | { /* 604e */ | 347 | { /* 604e */ |
327 | .pvr_mask = 0xfffff000, | 348 | .pvr_mask = 0xfffff000, |
@@ -332,7 +353,8 @@ struct cpu_spec cpu_specs[] = { | |||
332 | .icache_bsize = 32, | 353 | .icache_bsize = 32, |
333 | .dcache_bsize = 32, | 354 | .dcache_bsize = 32, |
334 | .num_pmcs = 4, | 355 | .num_pmcs = 4, |
335 | .cpu_setup = __setup_cpu_604 | 356 | .cpu_setup = __setup_cpu_604, |
357 | .platform = "ppc604", | ||
336 | }, | 358 | }, |
337 | { /* 604r */ | 359 | { /* 604r */ |
338 | .pvr_mask = 0xffff0000, | 360 | .pvr_mask = 0xffff0000, |
@@ -343,7 +365,8 @@ struct cpu_spec cpu_specs[] = { | |||
343 | .icache_bsize = 32, | 365 | .icache_bsize = 32, |
344 | .dcache_bsize = 32, | 366 | .dcache_bsize = 32, |
345 | .num_pmcs = 4, | 367 | .num_pmcs = 4, |
346 | .cpu_setup = __setup_cpu_604 | 368 | .cpu_setup = __setup_cpu_604, |
369 | .platform = "ppc604", | ||
347 | }, | 370 | }, |
348 | { /* 604ev */ | 371 | { /* 604ev */ |
349 | .pvr_mask = 0xffff0000, | 372 | .pvr_mask = 0xffff0000, |
@@ -354,7 +377,8 @@ struct cpu_spec cpu_specs[] = { | |||
354 | .icache_bsize = 32, | 377 | .icache_bsize = 32, |
355 | .dcache_bsize = 32, | 378 | .dcache_bsize = 32, |
356 | .num_pmcs = 4, | 379 | .num_pmcs = 4, |
357 | .cpu_setup = __setup_cpu_604 | 380 | .cpu_setup = __setup_cpu_604, |
381 | .platform = "ppc604", | ||
358 | }, | 382 | }, |
359 | { /* 740/750 (0x4202, don't support TAU ?) */ | 383 | { /* 740/750 (0x4202, don't support TAU ?) */ |
360 | .pvr_mask = 0xffffffff, | 384 | .pvr_mask = 0xffffffff, |
@@ -365,7 +389,8 @@ struct cpu_spec cpu_specs[] = { | |||
365 | .icache_bsize = 32, | 389 | .icache_bsize = 32, |
366 | .dcache_bsize = 32, | 390 | .dcache_bsize = 32, |
367 | .num_pmcs = 4, | 391 | .num_pmcs = 4, |
368 | .cpu_setup = __setup_cpu_750 | 392 | .cpu_setup = __setup_cpu_750, |
393 | .platform = "ppc750", | ||
369 | }, | 394 | }, |
370 | { /* 750CX (80100 and 8010x?) */ | 395 | { /* 750CX (80100 and 8010x?) */ |
371 | .pvr_mask = 0xfffffff0, | 396 | .pvr_mask = 0xfffffff0, |
@@ -376,7 +401,8 @@ struct cpu_spec cpu_specs[] = { | |||
376 | .icache_bsize = 32, | 401 | .icache_bsize = 32, |
377 | .dcache_bsize = 32, | 402 | .dcache_bsize = 32, |
378 | .num_pmcs = 4, | 403 | .num_pmcs = 4, |
379 | .cpu_setup = __setup_cpu_750cx | 404 | .cpu_setup = __setup_cpu_750cx, |
405 | .platform = "ppc750", | ||
380 | }, | 406 | }, |
381 | { /* 750CX (82201 and 82202) */ | 407 | { /* 750CX (82201 and 82202) */ |
382 | .pvr_mask = 0xfffffff0, | 408 | .pvr_mask = 0xfffffff0, |
@@ -387,7 +413,8 @@ struct cpu_spec cpu_specs[] = { | |||
387 | .icache_bsize = 32, | 413 | .icache_bsize = 32, |
388 | .dcache_bsize = 32, | 414 | .dcache_bsize = 32, |
389 | .num_pmcs = 4, | 415 | .num_pmcs = 4, |
390 | .cpu_setup = __setup_cpu_750cx | 416 | .cpu_setup = __setup_cpu_750cx, |
417 | .platform = "ppc750", | ||
391 | }, | 418 | }, |
392 | { /* 750CXe (82214) */ | 419 | { /* 750CXe (82214) */ |
393 | .pvr_mask = 0xfffffff0, | 420 | .pvr_mask = 0xfffffff0, |
@@ -398,7 +425,8 @@ struct cpu_spec cpu_specs[] = { | |||
398 | .icache_bsize = 32, | 425 | .icache_bsize = 32, |
399 | .dcache_bsize = 32, | 426 | .dcache_bsize = 32, |
400 | .num_pmcs = 4, | 427 | .num_pmcs = 4, |
401 | .cpu_setup = __setup_cpu_750cx | 428 | .cpu_setup = __setup_cpu_750cx, |
429 | .platform = "ppc750", | ||
402 | }, | 430 | }, |
403 | { /* 750CXe "Gekko" (83214) */ | 431 | { /* 750CXe "Gekko" (83214) */ |
404 | .pvr_mask = 0xffffffff, | 432 | .pvr_mask = 0xffffffff, |
@@ -409,7 +437,8 @@ struct cpu_spec cpu_specs[] = { | |||
409 | .icache_bsize = 32, | 437 | .icache_bsize = 32, |
410 | .dcache_bsize = 32, | 438 | .dcache_bsize = 32, |
411 | .num_pmcs = 4, | 439 | .num_pmcs = 4, |
412 | .cpu_setup = __setup_cpu_750cx | 440 | .cpu_setup = __setup_cpu_750cx, |
441 | .platform = "ppc750", | ||
413 | }, | 442 | }, |
414 | { /* 745/755 */ | 443 | { /* 745/755 */ |
415 | .pvr_mask = 0xfffff000, | 444 | .pvr_mask = 0xfffff000, |
@@ -420,7 +449,8 @@ struct cpu_spec cpu_specs[] = { | |||
420 | .icache_bsize = 32, | 449 | .icache_bsize = 32, |
421 | .dcache_bsize = 32, | 450 | .dcache_bsize = 32, |
422 | .num_pmcs = 4, | 451 | .num_pmcs = 4, |
423 | .cpu_setup = __setup_cpu_750 | 452 | .cpu_setup = __setup_cpu_750, |
453 | .platform = "ppc750", | ||
424 | }, | 454 | }, |
425 | { /* 750FX rev 1.x */ | 455 | { /* 750FX rev 1.x */ |
426 | .pvr_mask = 0xffffff00, | 456 | .pvr_mask = 0xffffff00, |
@@ -431,7 +461,8 @@ struct cpu_spec cpu_specs[] = { | |||
431 | .icache_bsize = 32, | 461 | .icache_bsize = 32, |
432 | .dcache_bsize = 32, | 462 | .dcache_bsize = 32, |
433 | .num_pmcs = 4, | 463 | .num_pmcs = 4, |
434 | .cpu_setup = __setup_cpu_750 | 464 | .cpu_setup = __setup_cpu_750, |
465 | .platform = "ppc750", | ||
435 | }, | 466 | }, |
436 | { /* 750FX rev 2.0 must disable HID0[DPM] */ | 467 | { /* 750FX rev 2.0 must disable HID0[DPM] */ |
437 | .pvr_mask = 0xffffffff, | 468 | .pvr_mask = 0xffffffff, |
@@ -442,7 +473,8 @@ struct cpu_spec cpu_specs[] = { | |||
442 | .icache_bsize = 32, | 473 | .icache_bsize = 32, |
443 | .dcache_bsize = 32, | 474 | .dcache_bsize = 32, |
444 | .num_pmcs = 4, | 475 | .num_pmcs = 4, |
445 | .cpu_setup = __setup_cpu_750 | 476 | .cpu_setup = __setup_cpu_750, |
477 | .platform = "ppc750", | ||
446 | }, | 478 | }, |
447 | { /* 750FX (All revs except 2.0) */ | 479 | { /* 750FX (All revs except 2.0) */ |
448 | .pvr_mask = 0xffff0000, | 480 | .pvr_mask = 0xffff0000, |
@@ -453,7 +485,8 @@ struct cpu_spec cpu_specs[] = { | |||
453 | .icache_bsize = 32, | 485 | .icache_bsize = 32, |
454 | .dcache_bsize = 32, | 486 | .dcache_bsize = 32, |
455 | .num_pmcs = 4, | 487 | .num_pmcs = 4, |
456 | .cpu_setup = __setup_cpu_750fx | 488 | .cpu_setup = __setup_cpu_750fx, |
489 | .platform = "ppc750", | ||
457 | }, | 490 | }, |
458 | { /* 750GX */ | 491 | { /* 750GX */ |
459 | .pvr_mask = 0xffff0000, | 492 | .pvr_mask = 0xffff0000, |
@@ -464,7 +497,8 @@ struct cpu_spec cpu_specs[] = { | |||
464 | .icache_bsize = 32, | 497 | .icache_bsize = 32, |
465 | .dcache_bsize = 32, | 498 | .dcache_bsize = 32, |
466 | .num_pmcs = 4, | 499 | .num_pmcs = 4, |
467 | .cpu_setup = __setup_cpu_750fx | 500 | .cpu_setup = __setup_cpu_750fx, |
501 | .platform = "ppc750", | ||
468 | }, | 502 | }, |
469 | { /* 740/750 (L2CR bit need fixup for 740) */ | 503 | { /* 740/750 (L2CR bit need fixup for 740) */ |
470 | .pvr_mask = 0xffff0000, | 504 | .pvr_mask = 0xffff0000, |
@@ -475,7 +509,8 @@ struct cpu_spec cpu_specs[] = { | |||
475 | .icache_bsize = 32, | 509 | .icache_bsize = 32, |
476 | .dcache_bsize = 32, | 510 | .dcache_bsize = 32, |
477 | .num_pmcs = 4, | 511 | .num_pmcs = 4, |
478 | .cpu_setup = __setup_cpu_750 | 512 | .cpu_setup = __setup_cpu_750, |
513 | .platform = "ppc750", | ||
479 | }, | 514 | }, |
480 | { /* 7400 rev 1.1 ? (no TAU) */ | 515 | { /* 7400 rev 1.1 ? (no TAU) */ |
481 | .pvr_mask = 0xffffffff, | 516 | .pvr_mask = 0xffffffff, |
@@ -486,7 +521,8 @@ struct cpu_spec cpu_specs[] = { | |||
486 | .icache_bsize = 32, | 521 | .icache_bsize = 32, |
487 | .dcache_bsize = 32, | 522 | .dcache_bsize = 32, |
488 | .num_pmcs = 4, | 523 | .num_pmcs = 4, |
489 | .cpu_setup = __setup_cpu_7400 | 524 | .cpu_setup = __setup_cpu_7400, |
525 | .platform = "ppc7400", | ||
490 | }, | 526 | }, |
491 | { /* 7400 */ | 527 | { /* 7400 */ |
492 | .pvr_mask = 0xffff0000, | 528 | .pvr_mask = 0xffff0000, |
@@ -497,7 +533,8 @@ struct cpu_spec cpu_specs[] = { | |||
497 | .icache_bsize = 32, | 533 | .icache_bsize = 32, |
498 | .dcache_bsize = 32, | 534 | .dcache_bsize = 32, |
499 | .num_pmcs = 4, | 535 | .num_pmcs = 4, |
500 | .cpu_setup = __setup_cpu_7400 | 536 | .cpu_setup = __setup_cpu_7400, |
537 | .platform = "ppc7400", | ||
501 | }, | 538 | }, |
502 | { /* 7410 */ | 539 | { /* 7410 */ |
503 | .pvr_mask = 0xffff0000, | 540 | .pvr_mask = 0xffff0000, |
@@ -508,7 +545,8 @@ struct cpu_spec cpu_specs[] = { | |||
508 | .icache_bsize = 32, | 545 | .icache_bsize = 32, |
509 | .dcache_bsize = 32, | 546 | .dcache_bsize = 32, |
510 | .num_pmcs = 4, | 547 | .num_pmcs = 4, |
511 | .cpu_setup = __setup_cpu_7410 | 548 | .cpu_setup = __setup_cpu_7410, |
549 | .platform = "ppc7400", | ||
512 | }, | 550 | }, |
513 | { /* 7450 2.0 - no doze/nap */ | 551 | { /* 7450 2.0 - no doze/nap */ |
514 | .pvr_mask = 0xffffffff, | 552 | .pvr_mask = 0xffffffff, |
@@ -521,7 +559,8 @@ struct cpu_spec cpu_specs[] = { | |||
521 | .num_pmcs = 6, | 559 | .num_pmcs = 6, |
522 | .cpu_setup = __setup_cpu_745x, | 560 | .cpu_setup = __setup_cpu_745x, |
523 | .oprofile_cpu_type = "ppc/7450", | 561 | .oprofile_cpu_type = "ppc/7450", |
524 | .oprofile_type = G4, | 562 | .oprofile_type = PPC_OPROFILE_G4, |
563 | .platform = "ppc7450", | ||
525 | }, | 564 | }, |
526 | { /* 7450 2.1 */ | 565 | { /* 7450 2.1 */ |
527 | .pvr_mask = 0xffffffff, | 566 | .pvr_mask = 0xffffffff, |
@@ -534,7 +573,8 @@ struct cpu_spec cpu_specs[] = { | |||
534 | .num_pmcs = 6, | 573 | .num_pmcs = 6, |
535 | .cpu_setup = __setup_cpu_745x, | 574 | .cpu_setup = __setup_cpu_745x, |
536 | .oprofile_cpu_type = "ppc/7450", | 575 | .oprofile_cpu_type = "ppc/7450", |
537 | .oprofile_type = G4, | 576 | .oprofile_type = PPC_OPROFILE_G4, |
577 | .platform = "ppc7450", | ||
538 | }, | 578 | }, |
539 | { /* 7450 2.3 and newer */ | 579 | { /* 7450 2.3 and newer */ |
540 | .pvr_mask = 0xffff0000, | 580 | .pvr_mask = 0xffff0000, |
@@ -547,7 +587,8 @@ struct cpu_spec cpu_specs[] = { | |||
547 | .num_pmcs = 6, | 587 | .num_pmcs = 6, |
548 | .cpu_setup = __setup_cpu_745x, | 588 | .cpu_setup = __setup_cpu_745x, |
549 | .oprofile_cpu_type = "ppc/7450", | 589 | .oprofile_cpu_type = "ppc/7450", |
550 | .oprofile_type = G4, | 590 | .oprofile_type = PPC_OPROFILE_G4, |
591 | .platform = "ppc7450", | ||
551 | }, | 592 | }, |
552 | { /* 7455 rev 1.x */ | 593 | { /* 7455 rev 1.x */ |
553 | .pvr_mask = 0xffffff00, | 594 | .pvr_mask = 0xffffff00, |
@@ -560,7 +601,8 @@ struct cpu_spec cpu_specs[] = { | |||
560 | .num_pmcs = 6, | 601 | .num_pmcs = 6, |
561 | .cpu_setup = __setup_cpu_745x, | 602 | .cpu_setup = __setup_cpu_745x, |
562 | .oprofile_cpu_type = "ppc/7450", | 603 | .oprofile_cpu_type = "ppc/7450", |
563 | .oprofile_type = G4, | 604 | .oprofile_type = PPC_OPROFILE_G4, |
605 | .platform = "ppc7450", | ||
564 | }, | 606 | }, |
565 | { /* 7455 rev 2.0 */ | 607 | { /* 7455 rev 2.0 */ |
566 | .pvr_mask = 0xffffffff, | 608 | .pvr_mask = 0xffffffff, |
@@ -573,7 +615,8 @@ struct cpu_spec cpu_specs[] = { | |||
573 | .num_pmcs = 6, | 615 | .num_pmcs = 6, |
574 | .cpu_setup = __setup_cpu_745x, | 616 | .cpu_setup = __setup_cpu_745x, |
575 | .oprofile_cpu_type = "ppc/7450", | 617 | .oprofile_cpu_type = "ppc/7450", |
576 | .oprofile_type = G4, | 618 | .oprofile_type = PPC_OPROFILE_G4, |
619 | .platform = "ppc7450", | ||
577 | }, | 620 | }, |
578 | { /* 7455 others */ | 621 | { /* 7455 others */ |
579 | .pvr_mask = 0xffff0000, | 622 | .pvr_mask = 0xffff0000, |
@@ -586,7 +629,8 @@ struct cpu_spec cpu_specs[] = { | |||
586 | .num_pmcs = 6, | 629 | .num_pmcs = 6, |
587 | .cpu_setup = __setup_cpu_745x, | 630 | .cpu_setup = __setup_cpu_745x, |
588 | .oprofile_cpu_type = "ppc/7450", | 631 | .oprofile_cpu_type = "ppc/7450", |
589 | .oprofile_type = G4, | 632 | .oprofile_type = PPC_OPROFILE_G4, |
633 | .platform = "ppc7450", | ||
590 | }, | 634 | }, |
591 | { /* 7447/7457 Rev 1.0 */ | 635 | { /* 7447/7457 Rev 1.0 */ |
592 | .pvr_mask = 0xffffffff, | 636 | .pvr_mask = 0xffffffff, |
@@ -599,7 +643,8 @@ struct cpu_spec cpu_specs[] = { | |||
599 | .num_pmcs = 6, | 643 | .num_pmcs = 6, |
600 | .cpu_setup = __setup_cpu_745x, | 644 | .cpu_setup = __setup_cpu_745x, |
601 | .oprofile_cpu_type = "ppc/7450", | 645 | .oprofile_cpu_type = "ppc/7450", |
602 | .oprofile_type = G4, | 646 | .oprofile_type = PPC_OPROFILE_G4, |
647 | .platform = "ppc7450", | ||
603 | }, | 648 | }, |
604 | { /* 7447/7457 Rev 1.1 */ | 649 | { /* 7447/7457 Rev 1.1 */ |
605 | .pvr_mask = 0xffffffff, | 650 | .pvr_mask = 0xffffffff, |
@@ -612,7 +657,8 @@ struct cpu_spec cpu_specs[] = { | |||
612 | .num_pmcs = 6, | 657 | .num_pmcs = 6, |
613 | .cpu_setup = __setup_cpu_745x, | 658 | .cpu_setup = __setup_cpu_745x, |
614 | .oprofile_cpu_type = "ppc/7450", | 659 | .oprofile_cpu_type = "ppc/7450", |
615 | .oprofile_type = G4, | 660 | .oprofile_type = PPC_OPROFILE_G4, |
661 | .platform = "ppc7450", | ||
616 | }, | 662 | }, |
617 | { /* 7447/7457 Rev 1.2 and later */ | 663 | { /* 7447/7457 Rev 1.2 and later */ |
618 | .pvr_mask = 0xffff0000, | 664 | .pvr_mask = 0xffff0000, |
@@ -625,7 +671,8 @@ struct cpu_spec cpu_specs[] = { | |||
625 | .num_pmcs = 6, | 671 | .num_pmcs = 6, |
626 | .cpu_setup = __setup_cpu_745x, | 672 | .cpu_setup = __setup_cpu_745x, |
627 | .oprofile_cpu_type = "ppc/7450", | 673 | .oprofile_cpu_type = "ppc/7450", |
628 | .oprofile_type = G4, | 674 | .oprofile_type = PPC_OPROFILE_G4, |
675 | .platform = "ppc7450", | ||
629 | }, | 676 | }, |
630 | { /* 7447A */ | 677 | { /* 7447A */ |
631 | .pvr_mask = 0xffff0000, | 678 | .pvr_mask = 0xffff0000, |
@@ -638,7 +685,8 @@ struct cpu_spec cpu_specs[] = { | |||
638 | .num_pmcs = 6, | 685 | .num_pmcs = 6, |
639 | .cpu_setup = __setup_cpu_745x, | 686 | .cpu_setup = __setup_cpu_745x, |
640 | .oprofile_cpu_type = "ppc/7450", | 687 | .oprofile_cpu_type = "ppc/7450", |
641 | .oprofile_type = G4, | 688 | .oprofile_type = PPC_OPROFILE_G4, |
689 | .platform = "ppc7450", | ||
642 | }, | 690 | }, |
643 | { /* 7448 */ | 691 | { /* 7448 */ |
644 | .pvr_mask = 0xffff0000, | 692 | .pvr_mask = 0xffff0000, |
@@ -651,7 +699,8 @@ struct cpu_spec cpu_specs[] = { | |||
651 | .num_pmcs = 6, | 699 | .num_pmcs = 6, |
652 | .cpu_setup = __setup_cpu_745x, | 700 | .cpu_setup = __setup_cpu_745x, |
653 | .oprofile_cpu_type = "ppc/7450", | 701 | .oprofile_cpu_type = "ppc/7450", |
654 | .oprofile_type = G4, | 702 | .oprofile_type = PPC_OPROFILE_G4, |
703 | .platform = "ppc7450", | ||
655 | }, | 704 | }, |
656 | { /* 82xx (8240, 8245, 8260 are all 603e cores) */ | 705 | { /* 82xx (8240, 8245, 8260 are all 603e cores) */ |
657 | .pvr_mask = 0x7fff0000, | 706 | .pvr_mask = 0x7fff0000, |
@@ -661,7 +710,8 @@ struct cpu_spec cpu_specs[] = { | |||
661 | .cpu_user_features = COMMON_USER, | 710 | .cpu_user_features = COMMON_USER, |
662 | .icache_bsize = 32, | 711 | .icache_bsize = 32, |
663 | .dcache_bsize = 32, | 712 | .dcache_bsize = 32, |
664 | .cpu_setup = __setup_cpu_603 | 713 | .cpu_setup = __setup_cpu_603, |
714 | .platform = "ppc603", | ||
665 | }, | 715 | }, |
666 | { /* All G2_LE (603e core, plus some) have the same pvr */ | 716 | { /* All G2_LE (603e core, plus some) have the same pvr */ |
667 | .pvr_mask = 0x7fff0000, | 717 | .pvr_mask = 0x7fff0000, |
@@ -671,7 +721,8 @@ struct cpu_spec cpu_specs[] = { | |||
671 | .cpu_user_features = COMMON_USER, | 721 | .cpu_user_features = COMMON_USER, |
672 | .icache_bsize = 32, | 722 | .icache_bsize = 32, |
673 | .dcache_bsize = 32, | 723 | .dcache_bsize = 32, |
674 | .cpu_setup = __setup_cpu_603 | 724 | .cpu_setup = __setup_cpu_603, |
725 | .platform = "ppc603", | ||
675 | }, | 726 | }, |
676 | { /* e300 (a 603e core, plus some) on 83xx */ | 727 | { /* e300 (a 603e core, plus some) on 83xx */ |
677 | .pvr_mask = 0x7fff0000, | 728 | .pvr_mask = 0x7fff0000, |
@@ -681,7 +732,8 @@ struct cpu_spec cpu_specs[] = { | |||
681 | .cpu_user_features = COMMON_USER, | 732 | .cpu_user_features = COMMON_USER, |
682 | .icache_bsize = 32, | 733 | .icache_bsize = 32, |
683 | .dcache_bsize = 32, | 734 | .dcache_bsize = 32, |
684 | .cpu_setup = __setup_cpu_603 | 735 | .cpu_setup = __setup_cpu_603, |
736 | .platform = "ppc603", | ||
685 | }, | 737 | }, |
686 | { /* default match, we assume split I/D cache & TB (non-601)... */ | 738 | { /* default match, we assume split I/D cache & TB (non-601)... */ |
687 | .pvr_mask = 0x00000000, | 739 | .pvr_mask = 0x00000000, |
@@ -691,6 +743,7 @@ struct cpu_spec cpu_specs[] = { | |||
691 | .cpu_user_features = COMMON_USER, | 743 | .cpu_user_features = COMMON_USER, |
692 | .icache_bsize = 32, | 744 | .icache_bsize = 32, |
693 | .dcache_bsize = 32, | 745 | .dcache_bsize = 32, |
746 | .platform = "ppc603", | ||
694 | }, | 747 | }, |
695 | #endif /* CLASSIC_PPC */ | 748 | #endif /* CLASSIC_PPC */ |
696 | #ifdef CONFIG_8xx | 749 | #ifdef CONFIG_8xx |
@@ -704,6 +757,7 @@ struct cpu_spec cpu_specs[] = { | |||
704 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 757 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, |
705 | .icache_bsize = 16, | 758 | .icache_bsize = 16, |
706 | .dcache_bsize = 16, | 759 | .dcache_bsize = 16, |
760 | .platform = "ppc823", | ||
707 | }, | 761 | }, |
708 | #endif /* CONFIG_8xx */ | 762 | #endif /* CONFIG_8xx */ |
709 | #ifdef CONFIG_40x | 763 | #ifdef CONFIG_40x |
@@ -715,6 +769,7 @@ struct cpu_spec cpu_specs[] = { | |||
715 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 769 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, |
716 | .icache_bsize = 16, | 770 | .icache_bsize = 16, |
717 | .dcache_bsize = 16, | 771 | .dcache_bsize = 16, |
772 | .platform = "ppc403", | ||
718 | }, | 773 | }, |
719 | { /* 403GCX */ | 774 | { /* 403GCX */ |
720 | .pvr_mask = 0xffffff00, | 775 | .pvr_mask = 0xffffff00, |
@@ -725,6 +780,7 @@ struct cpu_spec cpu_specs[] = { | |||
725 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB, | 780 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB, |
726 | .icache_bsize = 16, | 781 | .icache_bsize = 16, |
727 | .dcache_bsize = 16, | 782 | .dcache_bsize = 16, |
783 | .platform = "ppc403", | ||
728 | }, | 784 | }, |
729 | { /* 403G ?? */ | 785 | { /* 403G ?? */ |
730 | .pvr_mask = 0xffff0000, | 786 | .pvr_mask = 0xffff0000, |
@@ -734,6 +790,7 @@ struct cpu_spec cpu_specs[] = { | |||
734 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 790 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, |
735 | .icache_bsize = 16, | 791 | .icache_bsize = 16, |
736 | .dcache_bsize = 16, | 792 | .dcache_bsize = 16, |
793 | .platform = "ppc403", | ||
737 | }, | 794 | }, |
738 | { /* 405GP */ | 795 | { /* 405GP */ |
739 | .pvr_mask = 0xffff0000, | 796 | .pvr_mask = 0xffff0000, |
@@ -744,6 +801,7 @@ struct cpu_spec cpu_specs[] = { | |||
744 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 801 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
745 | .icache_bsize = 32, | 802 | .icache_bsize = 32, |
746 | .dcache_bsize = 32, | 803 | .dcache_bsize = 32, |
804 | .platform = "ppc405", | ||
747 | }, | 805 | }, |
748 | { /* STB 03xxx */ | 806 | { /* STB 03xxx */ |
749 | .pvr_mask = 0xffff0000, | 807 | .pvr_mask = 0xffff0000, |
@@ -754,6 +812,7 @@ struct cpu_spec cpu_specs[] = { | |||
754 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 812 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
755 | .icache_bsize = 32, | 813 | .icache_bsize = 32, |
756 | .dcache_bsize = 32, | 814 | .dcache_bsize = 32, |
815 | .platform = "ppc405", | ||
757 | }, | 816 | }, |
758 | { /* STB 04xxx */ | 817 | { /* STB 04xxx */ |
759 | .pvr_mask = 0xffff0000, | 818 | .pvr_mask = 0xffff0000, |
@@ -764,6 +823,7 @@ struct cpu_spec cpu_specs[] = { | |||
764 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 823 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
765 | .icache_bsize = 32, | 824 | .icache_bsize = 32, |
766 | .dcache_bsize = 32, | 825 | .dcache_bsize = 32, |
826 | .platform = "ppc405", | ||
767 | }, | 827 | }, |
768 | { /* NP405L */ | 828 | { /* NP405L */ |
769 | .pvr_mask = 0xffff0000, | 829 | .pvr_mask = 0xffff0000, |
@@ -774,6 +834,7 @@ struct cpu_spec cpu_specs[] = { | |||
774 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 834 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
775 | .icache_bsize = 32, | 835 | .icache_bsize = 32, |
776 | .dcache_bsize = 32, | 836 | .dcache_bsize = 32, |
837 | .platform = "ppc405", | ||
777 | }, | 838 | }, |
778 | { /* NP4GS3 */ | 839 | { /* NP4GS3 */ |
779 | .pvr_mask = 0xffff0000, | 840 | .pvr_mask = 0xffff0000, |
@@ -784,6 +845,7 @@ struct cpu_spec cpu_specs[] = { | |||
784 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 845 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
785 | .icache_bsize = 32, | 846 | .icache_bsize = 32, |
786 | .dcache_bsize = 32, | 847 | .dcache_bsize = 32, |
848 | .platform = "ppc405", | ||
787 | }, | 849 | }, |
788 | { /* NP405H */ | 850 | { /* NP405H */ |
789 | .pvr_mask = 0xffff0000, | 851 | .pvr_mask = 0xffff0000, |
@@ -794,6 +856,7 @@ struct cpu_spec cpu_specs[] = { | |||
794 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 856 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
795 | .icache_bsize = 32, | 857 | .icache_bsize = 32, |
796 | .dcache_bsize = 32, | 858 | .dcache_bsize = 32, |
859 | .platform = "ppc405", | ||
797 | }, | 860 | }, |
798 | { /* 405GPr */ | 861 | { /* 405GPr */ |
799 | .pvr_mask = 0xffff0000, | 862 | .pvr_mask = 0xffff0000, |
@@ -804,6 +867,7 @@ struct cpu_spec cpu_specs[] = { | |||
804 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 867 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
805 | .icache_bsize = 32, | 868 | .icache_bsize = 32, |
806 | .dcache_bsize = 32, | 869 | .dcache_bsize = 32, |
870 | .platform = "ppc405", | ||
807 | }, | 871 | }, |
808 | { /* STBx25xx */ | 872 | { /* STBx25xx */ |
809 | .pvr_mask = 0xffff0000, | 873 | .pvr_mask = 0xffff0000, |
@@ -814,6 +878,7 @@ struct cpu_spec cpu_specs[] = { | |||
814 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 878 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
815 | .icache_bsize = 32, | 879 | .icache_bsize = 32, |
816 | .dcache_bsize = 32, | 880 | .dcache_bsize = 32, |
881 | .platform = "ppc405", | ||
817 | }, | 882 | }, |
818 | { /* 405LP */ | 883 | { /* 405LP */ |
819 | .pvr_mask = 0xffff0000, | 884 | .pvr_mask = 0xffff0000, |
@@ -823,6 +888,7 @@ struct cpu_spec cpu_specs[] = { | |||
823 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 888 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, |
824 | .icache_bsize = 32, | 889 | .icache_bsize = 32, |
825 | .dcache_bsize = 32, | 890 | .dcache_bsize = 32, |
891 | .platform = "ppc405", | ||
826 | }, | 892 | }, |
827 | { /* Xilinx Virtex-II Pro */ | 893 | { /* Xilinx Virtex-II Pro */ |
828 | .pvr_mask = 0xffff0000, | 894 | .pvr_mask = 0xffff0000, |
@@ -833,6 +899,7 @@ struct cpu_spec cpu_specs[] = { | |||
833 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 899 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
834 | .icache_bsize = 32, | 900 | .icache_bsize = 32, |
835 | .dcache_bsize = 32, | 901 | .dcache_bsize = 32, |
902 | .platform = "ppc405", | ||
836 | }, | 903 | }, |
837 | { /* 405EP */ | 904 | { /* 405EP */ |
838 | .pvr_mask = 0xffff0000, | 905 | .pvr_mask = 0xffff0000, |
@@ -843,6 +910,7 @@ struct cpu_spec cpu_specs[] = { | |||
843 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 910 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
844 | .icache_bsize = 32, | 911 | .icache_bsize = 32, |
845 | .dcache_bsize = 32, | 912 | .dcache_bsize = 32, |
913 | .platform = "ppc405", | ||
846 | }, | 914 | }, |
847 | 915 | ||
848 | #endif /* CONFIG_40x */ | 916 | #endif /* CONFIG_40x */ |
@@ -852,81 +920,90 @@ struct cpu_spec cpu_specs[] = { | |||
852 | .pvr_value = 0x40000850, | 920 | .pvr_value = 0x40000850, |
853 | .cpu_name = "440EP Rev. A", | 921 | .cpu_name = "440EP Rev. A", |
854 | .cpu_features = CPU_FTRS_44X, | 922 | .cpu_features = CPU_FTRS_44X, |
855 | .cpu_user_features = COMMON_USER, /* 440EP has an FPU */ | 923 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, |
856 | .icache_bsize = 32, | 924 | .icache_bsize = 32, |
857 | .dcache_bsize = 32, | 925 | .dcache_bsize = 32, |
926 | .platform = "ppc440", | ||
858 | }, | 927 | }, |
859 | { | 928 | { |
860 | .pvr_mask = 0xf0000fff, | 929 | .pvr_mask = 0xf0000fff, |
861 | .pvr_value = 0x400008d3, | 930 | .pvr_value = 0x400008d3, |
862 | .cpu_name = "440EP Rev. B", | 931 | .cpu_name = "440EP Rev. B", |
863 | .cpu_features = CPU_FTRS_44X, | 932 | .cpu_features = CPU_FTRS_44X, |
864 | .cpu_user_features = COMMON_USER, /* 440EP has an FPU */ | 933 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, |
865 | .icache_bsize = 32, | 934 | .icache_bsize = 32, |
866 | .dcache_bsize = 32, | 935 | .dcache_bsize = 32, |
936 | .platform = "ppc440", | ||
867 | }, | 937 | }, |
868 | { /* 440GP Rev. B */ | 938 | { /* 440GP Rev. B */ |
869 | .pvr_mask = 0xf0000fff, | 939 | .pvr_mask = 0xf0000fff, |
870 | .pvr_value = 0x40000440, | 940 | .pvr_value = 0x40000440, |
871 | .cpu_name = "440GP Rev. B", | 941 | .cpu_name = "440GP Rev. B", |
872 | .cpu_features = CPU_FTRS_44X, | 942 | .cpu_features = CPU_FTRS_44X, |
873 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 943 | .cpu_user_features = COMMON_USER_BOOKE, |
874 | .icache_bsize = 32, | 944 | .icache_bsize = 32, |
875 | .dcache_bsize = 32, | 945 | .dcache_bsize = 32, |
946 | .platform = "ppc440gp", | ||
876 | }, | 947 | }, |
877 | { /* 440GP Rev. C */ | 948 | { /* 440GP Rev. C */ |
878 | .pvr_mask = 0xf0000fff, | 949 | .pvr_mask = 0xf0000fff, |
879 | .pvr_value = 0x40000481, | 950 | .pvr_value = 0x40000481, |
880 | .cpu_name = "440GP Rev. C", | 951 | .cpu_name = "440GP Rev. C", |
881 | .cpu_features = CPU_FTRS_44X, | 952 | .cpu_features = CPU_FTRS_44X, |
882 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 953 | .cpu_user_features = COMMON_USER_BOOKE, |
883 | .icache_bsize = 32, | 954 | .icache_bsize = 32, |
884 | .dcache_bsize = 32, | 955 | .dcache_bsize = 32, |
956 | .platform = "ppc440gp", | ||
885 | }, | 957 | }, |
886 | { /* 440GX Rev. A */ | 958 | { /* 440GX Rev. A */ |
887 | .pvr_mask = 0xf0000fff, | 959 | .pvr_mask = 0xf0000fff, |
888 | .pvr_value = 0x50000850, | 960 | .pvr_value = 0x50000850, |
889 | .cpu_name = "440GX Rev. A", | 961 | .cpu_name = "440GX Rev. A", |
890 | .cpu_features = CPU_FTRS_44X, | 962 | .cpu_features = CPU_FTRS_44X, |
891 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 963 | .cpu_user_features = COMMON_USER_BOOKE, |
892 | .icache_bsize = 32, | 964 | .icache_bsize = 32, |
893 | .dcache_bsize = 32, | 965 | .dcache_bsize = 32, |
966 | .platform = "ppc440", | ||
894 | }, | 967 | }, |
895 | { /* 440GX Rev. B */ | 968 | { /* 440GX Rev. B */ |
896 | .pvr_mask = 0xf0000fff, | 969 | .pvr_mask = 0xf0000fff, |
897 | .pvr_value = 0x50000851, | 970 | .pvr_value = 0x50000851, |
898 | .cpu_name = "440GX Rev. B", | 971 | .cpu_name = "440GX Rev. B", |
899 | .cpu_features = CPU_FTRS_44X, | 972 | .cpu_features = CPU_FTRS_44X, |
900 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 973 | .cpu_user_features = COMMON_USER_BOOKE, |
901 | .icache_bsize = 32, | 974 | .icache_bsize = 32, |
902 | .dcache_bsize = 32, | 975 | .dcache_bsize = 32, |
976 | .platform = "ppc440", | ||
903 | }, | 977 | }, |
904 | { /* 440GX Rev. C */ | 978 | { /* 440GX Rev. C */ |
905 | .pvr_mask = 0xf0000fff, | 979 | .pvr_mask = 0xf0000fff, |
906 | .pvr_value = 0x50000892, | 980 | .pvr_value = 0x50000892, |
907 | .cpu_name = "440GX Rev. C", | 981 | .cpu_name = "440GX Rev. C", |
908 | .cpu_features = CPU_FTRS_44X, | 982 | .cpu_features = CPU_FTRS_44X, |
909 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 983 | .cpu_user_features = COMMON_USER_BOOKE, |
910 | .icache_bsize = 32, | 984 | .icache_bsize = 32, |
911 | .dcache_bsize = 32, | 985 | .dcache_bsize = 32, |
986 | .platform = "ppc440", | ||
912 | }, | 987 | }, |
913 | { /* 440GX Rev. F */ | 988 | { /* 440GX Rev. F */ |
914 | .pvr_mask = 0xf0000fff, | 989 | .pvr_mask = 0xf0000fff, |
915 | .pvr_value = 0x50000894, | 990 | .pvr_value = 0x50000894, |
916 | .cpu_name = "440GX Rev. F", | 991 | .cpu_name = "440GX Rev. F", |
917 | .cpu_features = CPU_FTRS_44X, | 992 | .cpu_features = CPU_FTRS_44X, |
918 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 993 | .cpu_user_features = COMMON_USER_BOOKE, |
919 | .icache_bsize = 32, | 994 | .icache_bsize = 32, |
920 | .dcache_bsize = 32, | 995 | .dcache_bsize = 32, |
996 | .platform = "ppc440", | ||
921 | }, | 997 | }, |
922 | { /* 440SP Rev. A */ | 998 | { /* 440SP Rev. A */ |
923 | .pvr_mask = 0xff000fff, | 999 | .pvr_mask = 0xff000fff, |
924 | .pvr_value = 0x53000891, | 1000 | .pvr_value = 0x53000891, |
925 | .cpu_name = "440SP Rev. A", | 1001 | .cpu_name = "440SP Rev. A", |
926 | .cpu_features = CPU_FTRS_44X, | 1002 | .cpu_features = CPU_FTRS_44X, |
927 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 1003 | .cpu_user_features = COMMON_USER_BOOKE, |
928 | .icache_bsize = 32, | 1004 | .icache_bsize = 32, |
929 | .dcache_bsize = 32, | 1005 | .dcache_bsize = 32, |
1006 | .platform = "ppc440", | ||
930 | }, | 1007 | }, |
931 | { /* 440SPe Rev. A */ | 1008 | { /* 440SPe Rev. A */ |
932 | .pvr_mask = 0xff000fff, | 1009 | .pvr_mask = 0xff000fff, |
@@ -934,9 +1011,10 @@ struct cpu_spec cpu_specs[] = { | |||
934 | .cpu_name = "440SPe Rev. A", | 1011 | .cpu_name = "440SPe Rev. A", |
935 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | | 1012 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
936 | CPU_FTR_USE_TB, | 1013 | CPU_FTR_USE_TB, |
937 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 1014 | .cpu_user_features = COMMON_USER_BOOKE, |
938 | .icache_bsize = 32, | 1015 | .icache_bsize = 32, |
939 | .dcache_bsize = 32, | 1016 | .dcache_bsize = 32, |
1017 | .platform = "ppc440", | ||
940 | }, | 1018 | }, |
941 | #endif /* CONFIG_44x */ | 1019 | #endif /* CONFIG_44x */ |
942 | #ifdef CONFIG_FSL_BOOKE | 1020 | #ifdef CONFIG_FSL_BOOKE |
@@ -946,10 +1024,11 @@ struct cpu_spec cpu_specs[] = { | |||
946 | .cpu_name = "e200z5", | 1024 | .cpu_name = "e200z5", |
947 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ | 1025 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ |
948 | .cpu_features = CPU_FTRS_E200, | 1026 | .cpu_features = CPU_FTRS_E200, |
949 | .cpu_user_features = PPC_FEATURE_32 | | 1027 | .cpu_user_features = COMMON_USER_BOOKE | |
950 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_EFP_SINGLE | | 1028 | PPC_FEATURE_HAS_EFP_SINGLE | |
951 | PPC_FEATURE_UNIFIED_CACHE, | 1029 | PPC_FEATURE_UNIFIED_CACHE, |
952 | .dcache_bsize = 32, | 1030 | .dcache_bsize = 32, |
1031 | .platform = "ppc5554", | ||
953 | }, | 1032 | }, |
954 | { /* e200z6 */ | 1033 | { /* e200z6 */ |
955 | .pvr_mask = 0xfff00000, | 1034 | .pvr_mask = 0xfff00000, |
@@ -957,11 +1036,12 @@ struct cpu_spec cpu_specs[] = { | |||
957 | .cpu_name = "e200z6", | 1036 | .cpu_name = "e200z6", |
958 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ | 1037 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ |
959 | .cpu_features = CPU_FTRS_E200, | 1038 | .cpu_features = CPU_FTRS_E200, |
960 | .cpu_user_features = PPC_FEATURE_32 | | 1039 | .cpu_user_features = COMMON_USER_BOOKE | |
961 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP | | 1040 | PPC_FEATURE_SPE_COMP | |
962 | PPC_FEATURE_HAS_EFP_SINGLE | | 1041 | PPC_FEATURE_HAS_EFP_SINGLE | |
963 | PPC_FEATURE_UNIFIED_CACHE, | 1042 | PPC_FEATURE_UNIFIED_CACHE, |
964 | .dcache_bsize = 32, | 1043 | .dcache_bsize = 32, |
1044 | .platform = "ppc5554", | ||
965 | }, | 1045 | }, |
966 | { /* e500 */ | 1046 | { /* e500 */ |
967 | .pvr_mask = 0xffff0000, | 1047 | .pvr_mask = 0xffff0000, |
@@ -969,14 +1049,15 @@ struct cpu_spec cpu_specs[] = { | |||
969 | .cpu_name = "e500", | 1049 | .cpu_name = "e500", |
970 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ | 1050 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ |
971 | .cpu_features = CPU_FTRS_E500, | 1051 | .cpu_features = CPU_FTRS_E500, |
972 | .cpu_user_features = PPC_FEATURE_32 | | 1052 | .cpu_user_features = COMMON_USER_BOOKE | |
973 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP | | 1053 | PPC_FEATURE_SPE_COMP | |
974 | PPC_FEATURE_HAS_EFP_SINGLE, | 1054 | PPC_FEATURE_HAS_EFP_SINGLE, |
975 | .icache_bsize = 32, | 1055 | .icache_bsize = 32, |
976 | .dcache_bsize = 32, | 1056 | .dcache_bsize = 32, |
977 | .num_pmcs = 4, | 1057 | .num_pmcs = 4, |
978 | .oprofile_cpu_type = "ppc/e500", | 1058 | .oprofile_cpu_type = "ppc/e500", |
979 | .oprofile_type = BOOKE, | 1059 | .oprofile_type = PPC_OPROFILE_BOOKE, |
1060 | .platform = "ppc8540", | ||
980 | }, | 1061 | }, |
981 | { /* e500v2 */ | 1062 | { /* e500v2 */ |
982 | .pvr_mask = 0xffff0000, | 1063 | .pvr_mask = 0xffff0000, |
@@ -984,14 +1065,16 @@ struct cpu_spec cpu_specs[] = { | |||
984 | .cpu_name = "e500v2", | 1065 | .cpu_name = "e500v2", |
985 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ | 1066 | /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ |
986 | .cpu_features = CPU_FTRS_E500_2, | 1067 | .cpu_features = CPU_FTRS_E500_2, |
987 | .cpu_user_features = PPC_FEATURE_32 | | 1068 | .cpu_user_features = COMMON_USER_BOOKE | |
988 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_SPE_COMP | | 1069 | PPC_FEATURE_SPE_COMP | |
989 | PPC_FEATURE_HAS_EFP_SINGLE | PPC_FEATURE_HAS_EFP_DOUBLE, | 1070 | PPC_FEATURE_HAS_EFP_SINGLE | |
1071 | PPC_FEATURE_HAS_EFP_DOUBLE, | ||
990 | .icache_bsize = 32, | 1072 | .icache_bsize = 32, |
991 | .dcache_bsize = 32, | 1073 | .dcache_bsize = 32, |
992 | .num_pmcs = 4, | 1074 | .num_pmcs = 4, |
993 | .oprofile_cpu_type = "ppc/e500", | 1075 | .oprofile_cpu_type = "ppc/e500", |
994 | .oprofile_type = BOOKE, | 1076 | .oprofile_type = PPC_OPROFILE_BOOKE, |
1077 | .platform = "ppc8548", | ||
995 | }, | 1078 | }, |
996 | #endif | 1079 | #endif |
997 | #if !CLASSIC_PPC | 1080 | #if !CLASSIC_PPC |
@@ -1003,6 +1086,7 @@ struct cpu_spec cpu_specs[] = { | |||
1003 | .cpu_user_features = PPC_FEATURE_32, | 1086 | .cpu_user_features = PPC_FEATURE_32, |
1004 | .icache_bsize = 32, | 1087 | .icache_bsize = 32, |
1005 | .dcache_bsize = 32, | 1088 | .dcache_bsize = 32, |
1089 | .platform = "powerpc", | ||
1006 | } | 1090 | } |
1007 | #endif /* !CLASSIC_PPC */ | 1091 | #endif /* !CLASSIC_PPC */ |
1008 | #endif /* CONFIG_PPC32 */ | 1092 | #endif /* CONFIG_PPC32 */ |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 036b71d2adfc..d8da2a35c0a4 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
@@ -988,7 +988,7 @@ _GLOBAL(enter_rtas) | |||
988 | stwu r1,-INT_FRAME_SIZE(r1) | 988 | stwu r1,-INT_FRAME_SIZE(r1) |
989 | mflr r0 | 989 | mflr r0 |
990 | stw r0,INT_FRAME_SIZE+4(r1) | 990 | stw r0,INT_FRAME_SIZE+4(r1) |
991 | LOADADDR(r4, rtas) | 991 | LOAD_REG_ADDR(r4, rtas) |
992 | lis r6,1f@ha /* physical return address for rtas */ | 992 | lis r6,1f@ha /* physical return address for rtas */ |
993 | addi r6,r6,1f@l | 993 | addi r6,r6,1f@l |
994 | tophys(r6,r6) | 994 | tophys(r6,r6) |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index aacebb33e98a..542036318866 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -511,7 +511,8 @@ restore: | |||
511 | cmpdi 0,r5,0 | 511 | cmpdi 0,r5,0 |
512 | beq 4f | 512 | beq 4f |
513 | /* Check for pending interrupts (iSeries) */ | 513 | /* Check for pending interrupts (iSeries) */ |
514 | ld r3,PACALPPACA+LPPACAANYINT(r13) | 514 | ld r3,PACALPPACAPTR(r13) |
515 | ld r3,LPPACAANYINT(r3) | ||
515 | cmpdi r3,0 | 516 | cmpdi r3,0 |
516 | beq+ 4f /* skip do_IRQ if no interrupts */ | 517 | beq+ 4f /* skip do_IRQ if no interrupts */ |
517 | 518 | ||
@@ -689,9 +690,8 @@ _GLOBAL(enter_rtas) | |||
689 | std r6,PACASAVEDMSR(r13) | 690 | std r6,PACASAVEDMSR(r13) |
690 | 691 | ||
691 | /* Setup our real return addr */ | 692 | /* Setup our real return addr */ |
692 | SET_REG_TO_LABEL(r4,.rtas_return_loc) | 693 | LOAD_REG_ADDR(r4,.rtas_return_loc) |
693 | SET_REG_TO_CONST(r9,PAGE_OFFSET) | 694 | clrldi r4,r4,2 /* convert to realmode address */ |
694 | sub r4,r4,r9 | ||
695 | mtlr r4 | 695 | mtlr r4 |
696 | 696 | ||
697 | li r0,0 | 697 | li r0,0 |
@@ -706,7 +706,7 @@ _GLOBAL(enter_rtas) | |||
706 | sync /* disable interrupts so SRR0/1 */ | 706 | sync /* disable interrupts so SRR0/1 */ |
707 | mtmsrd r0 /* don't get trashed */ | 707 | mtmsrd r0 /* don't get trashed */ |
708 | 708 | ||
709 | SET_REG_TO_LABEL(r4,rtas) | 709 | LOAD_REG_ADDR(r4, rtas) |
710 | ld r5,RTASENTRY(r4) /* get the rtas->entry value */ | 710 | ld r5,RTASENTRY(r4) /* get the rtas->entry value */ |
711 | ld r4,RTASBASE(r4) /* get the rtas->base value */ | 711 | ld r4,RTASBASE(r4) /* get the rtas->base value */ |
712 | 712 | ||
@@ -718,8 +718,7 @@ _GLOBAL(enter_rtas) | |||
718 | _STATIC(rtas_return_loc) | 718 | _STATIC(rtas_return_loc) |
719 | /* relocation is off at this point */ | 719 | /* relocation is off at this point */ |
720 | mfspr r4,SPRN_SPRG3 /* Get PACA */ | 720 | mfspr r4,SPRN_SPRG3 /* Get PACA */ |
721 | SET_REG_TO_CONST(r5, PAGE_OFFSET) | 721 | clrldi r4,r4,2 /* convert to realmode address */ |
722 | sub r4,r4,r5 /* RELOC the PACA base pointer */ | ||
723 | 722 | ||
724 | mfmsr r6 | 723 | mfmsr r6 |
725 | li r0,MSR_RI | 724 | li r0,MSR_RI |
@@ -728,7 +727,7 @@ _STATIC(rtas_return_loc) | |||
728 | mtmsrd r6 | 727 | mtmsrd r6 |
729 | 728 | ||
730 | ld r1,PACAR1(r4) /* Restore our SP */ | 729 | ld r1,PACAR1(r4) /* Restore our SP */ |
731 | LOADADDR(r3,.rtas_restore_regs) | 730 | LOAD_REG_IMMEDIATE(r3,.rtas_restore_regs) |
732 | ld r4,PACASAVEDMSR(r4) /* Restore our MSR */ | 731 | ld r4,PACASAVEDMSR(r4) /* Restore our MSR */ |
733 | 732 | ||
734 | mtspr SPRN_SRR0,r3 | 733 | mtspr SPRN_SRR0,r3 |
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index b780b42c95fc..e4362dfa37fb 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S | |||
@@ -39,9 +39,9 @@ _GLOBAL(load_up_fpu) | |||
39 | * to another. Instead we call giveup_fpu in switch_to. | 39 | * to another. Instead we call giveup_fpu in switch_to. |
40 | */ | 40 | */ |
41 | #ifndef CONFIG_SMP | 41 | #ifndef CONFIG_SMP |
42 | LOADBASE(r3, last_task_used_math) | 42 | LOAD_REG_ADDRBASE(r3, last_task_used_math) |
43 | toreal(r3) | 43 | toreal(r3) |
44 | PPC_LL r4,OFF(last_task_used_math)(r3) | 44 | PPC_LL r4,ADDROFF(last_task_used_math)(r3) |
45 | PPC_LCMPI 0,r4,0 | 45 | PPC_LCMPI 0,r4,0 |
46 | beq 1f | 46 | beq 1f |
47 | toreal(r4) | 47 | toreal(r4) |
@@ -77,7 +77,7 @@ _GLOBAL(load_up_fpu) | |||
77 | #ifndef CONFIG_SMP | 77 | #ifndef CONFIG_SMP |
78 | subi r4,r5,THREAD | 78 | subi r4,r5,THREAD |
79 | fromreal(r4) | 79 | fromreal(r4) |
80 | PPC_STL r4,OFF(last_task_used_math)(r3) | 80 | PPC_STL r4,ADDROFF(last_task_used_math)(r3) |
81 | #endif /* CONFIG_SMP */ | 81 | #endif /* CONFIG_SMP */ |
82 | /* restore registers and return */ | 82 | /* restore registers and return */ |
83 | /* we haven't used ctr or xer or lr */ | 83 | /* we haven't used ctr or xer or lr */ |
@@ -113,8 +113,8 @@ _GLOBAL(giveup_fpu) | |||
113 | 1: | 113 | 1: |
114 | #ifndef CONFIG_SMP | 114 | #ifndef CONFIG_SMP |
115 | li r5,0 | 115 | li r5,0 |
116 | LOADBASE(r4,last_task_used_math) | 116 | LOAD_REG_ADDRBASE(r4,last_task_used_math) |
117 | PPC_STL r5,OFF(last_task_used_math)(r4) | 117 | PPC_STL r5,ADDROFF(last_task_used_math)(r4) |
118 | #endif /* CONFIG_SMP */ | 118 | #endif /* CONFIG_SMP */ |
119 | blr | 119 | blr |
120 | 120 | ||
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 1c066d125375..308268466342 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -154,12 +154,12 @@ _GLOBAL(__secondary_hold) | |||
154 | bne 100b | 154 | bne 100b |
155 | 155 | ||
156 | #ifdef CONFIG_HMT | 156 | #ifdef CONFIG_HMT |
157 | LOADADDR(r4, .hmt_init) | 157 | SET_REG_IMMEDIATE(r4, .hmt_init) |
158 | mtctr r4 | 158 | mtctr r4 |
159 | bctr | 159 | bctr |
160 | #else | 160 | #else |
161 | #ifdef CONFIG_SMP | 161 | #ifdef CONFIG_SMP |
162 | LOADADDR(r4, .pSeries_secondary_smp_init) | 162 | LOAD_REG_IMMEDIATE(r4, .pSeries_secondary_smp_init) |
163 | mtctr r4 | 163 | mtctr r4 |
164 | mr r3,r24 | 164 | mr r3,r24 |
165 | bctr | 165 | bctr |
@@ -205,9 +205,10 @@ exception_marker: | |||
205 | #define EX_LR 72 | 205 | #define EX_LR 72 |
206 | 206 | ||
207 | /* | 207 | /* |
208 | * We're short on space and time in the exception prolog, so we can't use | 208 | * We're short on space and time in the exception prolog, so we can't |
209 | * the normal LOADADDR macro. Normally we just need the low halfword of the | 209 | * use the normal SET_REG_IMMEDIATE macro. Normally we just need the |
210 | * address, but for Kdump we need the whole low word. | 210 | * low halfword of the address, but for Kdump we need the whole low |
211 | * word. | ||
211 | */ | 212 | */ |
212 | #ifdef CONFIG_CRASH_DUMP | 213 | #ifdef CONFIG_CRASH_DUMP |
213 | #define LOAD_HANDLER(reg, label) \ | 214 | #define LOAD_HANDLER(reg, label) \ |
@@ -254,8 +255,9 @@ exception_marker: | |||
254 | 255 | ||
255 | #define EXCEPTION_PROLOG_ISERIES_2 \ | 256 | #define EXCEPTION_PROLOG_ISERIES_2 \ |
256 | mfmsr r10; \ | 257 | mfmsr r10; \ |
257 | ld r11,PACALPPACA+LPPACASRR0(r13); \ | 258 | ld r12,PACALPPACAPTR(r13); \ |
258 | ld r12,PACALPPACA+LPPACASRR1(r13); \ | 259 | ld r11,LPPACASRR0(r12); \ |
260 | ld r12,LPPACASRR1(r12); \ | ||
259 | ori r10,r10,MSR_RI; \ | 261 | ori r10,r10,MSR_RI; \ |
260 | mtmsrd r10,1 | 262 | mtmsrd r10,1 |
261 | 263 | ||
@@ -634,7 +636,8 @@ data_access_slb_iSeries: | |||
634 | std r12,PACA_EXSLB+EX_R12(r13) | 636 | std r12,PACA_EXSLB+EX_R12(r13) |
635 | mfspr r10,SPRN_SPRG1 | 637 | mfspr r10,SPRN_SPRG1 |
636 | std r10,PACA_EXSLB+EX_R13(r13) | 638 | std r10,PACA_EXSLB+EX_R13(r13) |
637 | ld r12,PACALPPACA+LPPACASRR1(r13); | 639 | ld r12,PACALPPACAPTR(r13) |
640 | ld r12,LPPACASRR1(r12) | ||
638 | b .slb_miss_realmode | 641 | b .slb_miss_realmode |
639 | 642 | ||
640 | STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN) | 643 | STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN) |
@@ -644,7 +647,8 @@ instruction_access_slb_iSeries: | |||
644 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 647 | mtspr SPRN_SPRG1,r13 /* save r13 */ |
645 | mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ | 648 | mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ |
646 | std r3,PACA_EXSLB+EX_R3(r13) | 649 | std r3,PACA_EXSLB+EX_R3(r13) |
647 | ld r3,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */ | 650 | ld r3,PACALPPACAPTR(r13) |
651 | ld r3,LPPACASRR0(r3) /* get SRR0 value */ | ||
648 | std r9,PACA_EXSLB+EX_R9(r13) | 652 | std r9,PACA_EXSLB+EX_R9(r13) |
649 | mfcr r9 | 653 | mfcr r9 |
650 | #ifdef __DISABLED__ | 654 | #ifdef __DISABLED__ |
@@ -656,7 +660,8 @@ instruction_access_slb_iSeries: | |||
656 | std r12,PACA_EXSLB+EX_R12(r13) | 660 | std r12,PACA_EXSLB+EX_R12(r13) |
657 | mfspr r10,SPRN_SPRG1 | 661 | mfspr r10,SPRN_SPRG1 |
658 | std r10,PACA_EXSLB+EX_R13(r13) | 662 | std r10,PACA_EXSLB+EX_R13(r13) |
659 | ld r12,PACALPPACA+LPPACASRR1(r13); | 663 | ld r12,PACALPPACAPTR(r13) |
664 | ld r12,LPPACASRR1(r12) | ||
660 | b .slb_miss_realmode | 665 | b .slb_miss_realmode |
661 | 666 | ||
662 | #ifdef __DISABLED__ | 667 | #ifdef __DISABLED__ |
@@ -713,7 +718,7 @@ system_reset_iSeries: | |||
713 | lbz r23,PACAPROCSTART(r13) /* Test if this processor | 718 | lbz r23,PACAPROCSTART(r13) /* Test if this processor |
714 | * should start */ | 719 | * should start */ |
715 | sync | 720 | sync |
716 | LOADADDR(r3,current_set) | 721 | LOAD_REG_IMMEDIATE(r3,current_set) |
717 | sldi r28,r24,3 /* get current_set[cpu#] */ | 722 | sldi r28,r24,3 /* get current_set[cpu#] */ |
718 | ldx r3,r3,r28 | 723 | ldx r3,r3,r28 |
719 | addi r1,r3,THREAD_SIZE | 724 | addi r1,r3,THREAD_SIZE |
@@ -745,17 +750,19 @@ iSeries_secondary_smp_loop: | |||
745 | .globl decrementer_iSeries_masked | 750 | .globl decrementer_iSeries_masked |
746 | decrementer_iSeries_masked: | 751 | decrementer_iSeries_masked: |
747 | li r11,1 | 752 | li r11,1 |
748 | stb r11,PACALPPACA+LPPACADECRINT(r13) | 753 | ld r12,PACALPPACAPTR(r13) |
749 | LOADBASE(r12,tb_ticks_per_jiffy) | 754 | stb r11,LPPACADECRINT(r12) |
750 | lwz r12,OFF(tb_ticks_per_jiffy)(r12) | 755 | LOAD_REG_ADDRBASE(r12,tb_ticks_per_jiffy) |
756 | lwz r12,ADDROFF(tb_ticks_per_jiffy)(r12) | ||
751 | mtspr SPRN_DEC,r12 | 757 | mtspr SPRN_DEC,r12 |
752 | /* fall through */ | 758 | /* fall through */ |
753 | 759 | ||
754 | .globl hardware_interrupt_iSeries_masked | 760 | .globl hardware_interrupt_iSeries_masked |
755 | hardware_interrupt_iSeries_masked: | 761 | hardware_interrupt_iSeries_masked: |
756 | mtcrf 0x80,r9 /* Restore regs */ | 762 | mtcrf 0x80,r9 /* Restore regs */ |
757 | ld r11,PACALPPACA+LPPACASRR0(r13) | 763 | ld r12,PACALPPACAPTR(r13) |
758 | ld r12,PACALPPACA+LPPACASRR1(r13) | 764 | ld r11,LPPACASRR0(r12) |
765 | ld r12,LPPACASRR1(r12) | ||
759 | mtspr SPRN_SRR0,r11 | 766 | mtspr SPRN_SRR0,r11 |
760 | mtspr SPRN_SRR1,r12 | 767 | mtspr SPRN_SRR1,r12 |
761 | ld r9,PACA_EXGEN+EX_R9(r13) | 768 | ld r9,PACA_EXGEN+EX_R9(r13) |
@@ -994,7 +1001,8 @@ _GLOBAL(slb_miss_realmode) | |||
994 | ld r3,PACA_EXSLB+EX_R3(r13) | 1001 | ld r3,PACA_EXSLB+EX_R3(r13) |
995 | lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */ | 1002 | lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */ |
996 | #ifdef CONFIG_PPC_ISERIES | 1003 | #ifdef CONFIG_PPC_ISERIES |
997 | ld r11,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */ | 1004 | ld r11,PACALPPACAPTR(r13) |
1005 | ld r11,LPPACASRR0(r11) /* get SRR0 value */ | ||
998 | #endif /* CONFIG_PPC_ISERIES */ | 1006 | #endif /* CONFIG_PPC_ISERIES */ |
999 | 1007 | ||
1000 | mtlr r10 | 1008 | mtlr r10 |
@@ -1412,7 +1420,7 @@ _GLOBAL(pSeries_secondary_smp_init) | |||
1412 | * physical cpu id in r24, we need to search the pacas to find | 1420 | * physical cpu id in r24, we need to search the pacas to find |
1413 | * which logical id maps to our physical one. | 1421 | * which logical id maps to our physical one. |
1414 | */ | 1422 | */ |
1415 | LOADADDR(r13, paca) /* Get base vaddr of paca array */ | 1423 | LOAD_REG_IMMEDIATE(r13, paca) /* Get base vaddr of paca array */ |
1416 | li r5,0 /* logical cpu id */ | 1424 | li r5,0 /* logical cpu id */ |
1417 | 1: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */ | 1425 | 1: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */ |
1418 | cmpw r6,r24 /* Compare to our id */ | 1426 | cmpw r6,r24 /* Compare to our id */ |
@@ -1446,8 +1454,8 @@ _GLOBAL(pSeries_secondary_smp_init) | |||
1446 | #ifdef CONFIG_PPC_ISERIES | 1454 | #ifdef CONFIG_PPC_ISERIES |
1447 | _STATIC(__start_initialization_iSeries) | 1455 | _STATIC(__start_initialization_iSeries) |
1448 | /* Clear out the BSS */ | 1456 | /* Clear out the BSS */ |
1449 | LOADADDR(r11,__bss_stop) | 1457 | LOAD_REG_IMMEDIATE(r11,__bss_stop) |
1450 | LOADADDR(r8,__bss_start) | 1458 | LOAD_REG_IMMEDIATE(r8,__bss_start) |
1451 | sub r11,r11,r8 /* bss size */ | 1459 | sub r11,r11,r8 /* bss size */ |
1452 | addi r11,r11,7 /* round up to an even double word */ | 1460 | addi r11,r11,7 /* round up to an even double word */ |
1453 | rldicl. r11,r11,61,3 /* shift right by 3 */ | 1461 | rldicl. r11,r11,61,3 /* shift right by 3 */ |
@@ -1458,17 +1466,17 @@ _STATIC(__start_initialization_iSeries) | |||
1458 | 3: stdu r0,8(r8) | 1466 | 3: stdu r0,8(r8) |
1459 | bdnz 3b | 1467 | bdnz 3b |
1460 | 4: | 1468 | 4: |
1461 | LOADADDR(r1,init_thread_union) | 1469 | LOAD_REG_IMMEDIATE(r1,init_thread_union) |
1462 | addi r1,r1,THREAD_SIZE | 1470 | addi r1,r1,THREAD_SIZE |
1463 | li r0,0 | 1471 | li r0,0 |
1464 | stdu r0,-STACK_FRAME_OVERHEAD(r1) | 1472 | stdu r0,-STACK_FRAME_OVERHEAD(r1) |
1465 | 1473 | ||
1466 | LOADADDR(r3,cpu_specs) | 1474 | LOAD_REG_IMMEDIATE(r3,cpu_specs) |
1467 | LOADADDR(r4,cur_cpu_spec) | 1475 | LOAD_REG_IMMEDIATE(r4,cur_cpu_spec) |
1468 | li r5,0 | 1476 | li r5,0 |
1469 | bl .identify_cpu | 1477 | bl .identify_cpu |
1470 | 1478 | ||
1471 | LOADADDR(r2,__toc_start) | 1479 | LOAD_REG_IMMEDIATE(r2,__toc_start) |
1472 | addi r2,r2,0x4000 | 1480 | addi r2,r2,0x4000 |
1473 | addi r2,r2,0x4000 | 1481 | addi r2,r2,0x4000 |
1474 | 1482 | ||
@@ -1528,7 +1536,7 @@ _GLOBAL(__start_initialization_multiplatform) | |||
1528 | li r24,0 | 1536 | li r24,0 |
1529 | 1537 | ||
1530 | /* Switch off MMU if not already */ | 1538 | /* Switch off MMU if not already */ |
1531 | LOADADDR(r4, .__after_prom_start - KERNELBASE) | 1539 | LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE) |
1532 | add r4,r4,r30 | 1540 | add r4,r4,r30 |
1533 | bl .__mmu_off | 1541 | bl .__mmu_off |
1534 | b .__after_prom_start | 1542 | b .__after_prom_start |
@@ -1548,7 +1556,7 @@ _STATIC(__boot_from_prom) | |||
1548 | /* put a relocation offset into r3 */ | 1556 | /* put a relocation offset into r3 */ |
1549 | bl .reloc_offset | 1557 | bl .reloc_offset |
1550 | 1558 | ||
1551 | LOADADDR(r2,__toc_start) | 1559 | LOAD_REG_IMMEDIATE(r2,__toc_start) |
1552 | addi r2,r2,0x4000 | 1560 | addi r2,r2,0x4000 |
1553 | addi r2,r2,0x4000 | 1561 | addi r2,r2,0x4000 |
1554 | 1562 | ||
@@ -1588,9 +1596,9 @@ _STATIC(__after_prom_start) | |||
1588 | */ | 1596 | */ |
1589 | bl .reloc_offset | 1597 | bl .reloc_offset |
1590 | mr r26,r3 | 1598 | mr r26,r3 |
1591 | SET_REG_TO_CONST(r27,KERNELBASE) | 1599 | LOAD_REG_IMMEDIATE(r27, KERNELBASE) |
1592 | 1600 | ||
1593 | LOADADDR(r3, PHYSICAL_START) /* target addr */ | 1601 | LOAD_REG_IMMEDIATE(r3, PHYSICAL_START) /* target addr */ |
1594 | 1602 | ||
1595 | // XXX FIXME: Use phys returned by OF (r30) | 1603 | // XXX FIXME: Use phys returned by OF (r30) |
1596 | add r4,r27,r26 /* source addr */ | 1604 | add r4,r27,r26 /* source addr */ |
@@ -1598,7 +1606,7 @@ _STATIC(__after_prom_start) | |||
1598 | /* i.e. where we are running */ | 1606 | /* i.e. where we are running */ |
1599 | /* the source addr */ | 1607 | /* the source addr */ |
1600 | 1608 | ||
1601 | LOADADDR(r5,copy_to_here) /* # bytes of memory to copy */ | 1609 | LOAD_REG_IMMEDIATE(r5,copy_to_here) /* # bytes of memory to copy */ |
1602 | sub r5,r5,r27 | 1610 | sub r5,r5,r27 |
1603 | 1611 | ||
1604 | li r6,0x100 /* Start offset, the first 0x100 */ | 1612 | li r6,0x100 /* Start offset, the first 0x100 */ |
@@ -1608,11 +1616,11 @@ _STATIC(__after_prom_start) | |||
1608 | /* this includes the code being */ | 1616 | /* this includes the code being */ |
1609 | /* executed here. */ | 1617 | /* executed here. */ |
1610 | 1618 | ||
1611 | LOADADDR(r0, 4f) /* Jump to the copy of this code */ | 1619 | LOAD_REG_IMMEDIATE(r0, 4f) /* Jump to the copy of this code */ |
1612 | mtctr r0 /* that we just made/relocated */ | 1620 | mtctr r0 /* that we just made/relocated */ |
1613 | bctr | 1621 | bctr |
1614 | 1622 | ||
1615 | 4: LOADADDR(r5,klimit) | 1623 | 4: LOAD_REG_IMMEDIATE(r5,klimit) |
1616 | add r5,r5,r26 | 1624 | add r5,r5,r26 |
1617 | ld r5,0(r5) /* get the value of klimit */ | 1625 | ld r5,0(r5) /* get the value of klimit */ |
1618 | sub r5,r5,r27 | 1626 | sub r5,r5,r27 |
@@ -1694,7 +1702,7 @@ _GLOBAL(pmac_secondary_start) | |||
1694 | mtmsrd r3 /* RI on */ | 1702 | mtmsrd r3 /* RI on */ |
1695 | 1703 | ||
1696 | /* Set up a paca value for this processor. */ | 1704 | /* Set up a paca value for this processor. */ |
1697 | LOADADDR(r4, paca) /* Get base vaddr of paca array */ | 1705 | LOAD_REG_IMMEDIATE(r4, paca) /* Get base vaddr of paca array */ |
1698 | mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ | 1706 | mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ |
1699 | add r13,r13,r4 /* for this processor. */ | 1707 | add r13,r13,r4 /* for this processor. */ |
1700 | mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */ | 1708 | mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */ |
@@ -1731,7 +1739,7 @@ _GLOBAL(__secondary_start) | |||
1731 | bl .early_setup_secondary | 1739 | bl .early_setup_secondary |
1732 | 1740 | ||
1733 | /* Initialize the kernel stack. Just a repeat for iSeries. */ | 1741 | /* Initialize the kernel stack. Just a repeat for iSeries. */ |
1734 | LOADADDR(r3,current_set) | 1742 | LOAD_REG_ADDR(r3, current_set) |
1735 | sldi r28,r24,3 /* get current_set[cpu#] */ | 1743 | sldi r28,r24,3 /* get current_set[cpu#] */ |
1736 | ldx r1,r3,r28 | 1744 | ldx r1,r3,r28 |
1737 | addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD | 1745 | addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD |
@@ -1742,8 +1750,8 @@ _GLOBAL(__secondary_start) | |||
1742 | mtlr r7 | 1750 | mtlr r7 |
1743 | 1751 | ||
1744 | /* enable MMU and jump to start_secondary */ | 1752 | /* enable MMU and jump to start_secondary */ |
1745 | LOADADDR(r3,.start_secondary_prolog) | 1753 | LOAD_REG_ADDR(r3, .start_secondary_prolog) |
1746 | SET_REG_TO_CONST(r4, MSR_KERNEL) | 1754 | LOAD_REG_IMMEDIATE(r4, MSR_KERNEL) |
1747 | #ifdef DO_SOFT_DISABLE | 1755 | #ifdef DO_SOFT_DISABLE |
1748 | ori r4,r4,MSR_EE | 1756 | ori r4,r4,MSR_EE |
1749 | #endif | 1757 | #endif |
@@ -1792,8 +1800,8 @@ _STATIC(start_here_multiplatform) | |||
1792 | * be detached from the kernel completely. Besides, we need | 1800 | * be detached from the kernel completely. Besides, we need |
1793 | * to clear it now for kexec-style entry. | 1801 | * to clear it now for kexec-style entry. |
1794 | */ | 1802 | */ |
1795 | LOADADDR(r11,__bss_stop) | 1803 | LOAD_REG_IMMEDIATE(r11,__bss_stop) |
1796 | LOADADDR(r8,__bss_start) | 1804 | LOAD_REG_IMMEDIATE(r8,__bss_start) |
1797 | sub r11,r11,r8 /* bss size */ | 1805 | sub r11,r11,r8 /* bss size */ |
1798 | addi r11,r11,7 /* round up to an even double word */ | 1806 | addi r11,r11,7 /* round up to an even double word */ |
1799 | rldicl. r11,r11,61,3 /* shift right by 3 */ | 1807 | rldicl. r11,r11,61,3 /* shift right by 3 */ |
@@ -1831,7 +1839,7 @@ _STATIC(start_here_multiplatform) | |||
1831 | /* up the htab. This is done because we have relocated the */ | 1839 | /* up the htab. This is done because we have relocated the */ |
1832 | /* kernel but are still running in real mode. */ | 1840 | /* kernel but are still running in real mode. */ |
1833 | 1841 | ||
1834 | LOADADDR(r3,init_thread_union) | 1842 | LOAD_REG_IMMEDIATE(r3,init_thread_union) |
1835 | add r3,r3,r26 | 1843 | add r3,r3,r26 |
1836 | 1844 | ||
1837 | /* set up a stack pointer (physical address) */ | 1845 | /* set up a stack pointer (physical address) */ |
@@ -1840,14 +1848,14 @@ _STATIC(start_here_multiplatform) | |||
1840 | stdu r0,-STACK_FRAME_OVERHEAD(r1) | 1848 | stdu r0,-STACK_FRAME_OVERHEAD(r1) |
1841 | 1849 | ||
1842 | /* set up the TOC (physical address) */ | 1850 | /* set up the TOC (physical address) */ |
1843 | LOADADDR(r2,__toc_start) | 1851 | LOAD_REG_IMMEDIATE(r2,__toc_start) |
1844 | addi r2,r2,0x4000 | 1852 | addi r2,r2,0x4000 |
1845 | addi r2,r2,0x4000 | 1853 | addi r2,r2,0x4000 |
1846 | add r2,r2,r26 | 1854 | add r2,r2,r26 |
1847 | 1855 | ||
1848 | LOADADDR(r3,cpu_specs) | 1856 | LOAD_REG_IMMEDIATE(r3, cpu_specs) |
1849 | add r3,r3,r26 | 1857 | add r3,r3,r26 |
1850 | LOADADDR(r4,cur_cpu_spec) | 1858 | LOAD_REG_IMMEDIATE(r4,cur_cpu_spec) |
1851 | add r4,r4,r26 | 1859 | add r4,r4,r26 |
1852 | mr r5,r26 | 1860 | mr r5,r26 |
1853 | bl .identify_cpu | 1861 | bl .identify_cpu |
@@ -1863,11 +1871,11 @@ _STATIC(start_here_multiplatform) | |||
1863 | * nowhere it can be initialized differently before we reach this | 1871 | * nowhere it can be initialized differently before we reach this |
1864 | * code | 1872 | * code |
1865 | */ | 1873 | */ |
1866 | LOADADDR(r27, boot_cpuid) | 1874 | LOAD_REG_IMMEDIATE(r27, boot_cpuid) |
1867 | add r27,r27,r26 | 1875 | add r27,r27,r26 |
1868 | lwz r27,0(r27) | 1876 | lwz r27,0(r27) |
1869 | 1877 | ||
1870 | LOADADDR(r24, paca) /* Get base vaddr of paca array */ | 1878 | LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */ |
1871 | mulli r13,r27,PACA_SIZE /* Calculate vaddr of right paca */ | 1879 | mulli r13,r27,PACA_SIZE /* Calculate vaddr of right paca */ |
1872 | add r13,r13,r24 /* for this processor. */ | 1880 | add r13,r13,r24 /* for this processor. */ |
1873 | add r13,r13,r26 /* convert to physical addr */ | 1881 | add r13,r13,r26 /* convert to physical addr */ |
@@ -1880,8 +1888,8 @@ _STATIC(start_here_multiplatform) | |||
1880 | mr r3,r31 | 1888 | mr r3,r31 |
1881 | bl .early_setup | 1889 | bl .early_setup |
1882 | 1890 | ||
1883 | LOADADDR(r3,.start_here_common) | 1891 | LOAD_REG_IMMEDIATE(r3, .start_here_common) |
1884 | SET_REG_TO_CONST(r4, MSR_KERNEL) | 1892 | LOAD_REG_IMMEDIATE(r4, MSR_KERNEL) |
1885 | mtspr SPRN_SRR0,r3 | 1893 | mtspr SPRN_SRR0,r3 |
1886 | mtspr SPRN_SRR1,r4 | 1894 | mtspr SPRN_SRR1,r4 |
1887 | rfid | 1895 | rfid |
@@ -1895,7 +1903,7 @@ _STATIC(start_here_common) | |||
1895 | /* The following code sets up the SP and TOC now that we are */ | 1903 | /* The following code sets up the SP and TOC now that we are */ |
1896 | /* running with translation enabled. */ | 1904 | /* running with translation enabled. */ |
1897 | 1905 | ||
1898 | LOADADDR(r3,init_thread_union) | 1906 | LOAD_REG_IMMEDIATE(r3,init_thread_union) |
1899 | 1907 | ||
1900 | /* set up the stack */ | 1908 | /* set up the stack */ |
1901 | addi r1,r3,THREAD_SIZE | 1909 | addi r1,r3,THREAD_SIZE |
@@ -1908,16 +1916,16 @@ _STATIC(start_here_common) | |||
1908 | li r3,0 | 1916 | li r3,0 |
1909 | bl .do_cpu_ftr_fixups | 1917 | bl .do_cpu_ftr_fixups |
1910 | 1918 | ||
1911 | LOADADDR(r26, boot_cpuid) | 1919 | LOAD_REG_IMMEDIATE(r26, boot_cpuid) |
1912 | lwz r26,0(r26) | 1920 | lwz r26,0(r26) |
1913 | 1921 | ||
1914 | LOADADDR(r24, paca) /* Get base vaddr of paca array */ | 1922 | LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */ |
1915 | mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */ | 1923 | mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */ |
1916 | add r13,r13,r24 /* for this processor. */ | 1924 | add r13,r13,r24 /* for this processor. */ |
1917 | mtspr SPRN_SPRG3,r13 | 1925 | mtspr SPRN_SPRG3,r13 |
1918 | 1926 | ||
1919 | /* ptr to current */ | 1927 | /* ptr to current */ |
1920 | LOADADDR(r4,init_task) | 1928 | LOAD_REG_IMMEDIATE(r4, init_task) |
1921 | std r4,PACACURRENT(r13) | 1929 | std r4,PACACURRENT(r13) |
1922 | 1930 | ||
1923 | /* Load the TOC */ | 1931 | /* Load the TOC */ |
@@ -1940,7 +1948,7 @@ _STATIC(start_here_common) | |||
1940 | 1948 | ||
1941 | _GLOBAL(hmt_init) | 1949 | _GLOBAL(hmt_init) |
1942 | #ifdef CONFIG_HMT | 1950 | #ifdef CONFIG_HMT |
1943 | LOADADDR(r5, hmt_thread_data) | 1951 | LOAD_REG_IMMEDIATE(r5, hmt_thread_data) |
1944 | mfspr r7,SPRN_PVR | 1952 | mfspr r7,SPRN_PVR |
1945 | srwi r7,r7,16 | 1953 | srwi r7,r7,16 |
1946 | cmpwi r7,0x34 /* Pulsar */ | 1954 | cmpwi r7,0x34 /* Pulsar */ |
@@ -1961,7 +1969,7 @@ _GLOBAL(hmt_init) | |||
1961 | b 101f | 1969 | b 101f |
1962 | 1970 | ||
1963 | __hmt_secondary_hold: | 1971 | __hmt_secondary_hold: |
1964 | LOADADDR(r5, hmt_thread_data) | 1972 | LOAD_REG_IMMEDIATE(r5, hmt_thread_data) |
1965 | clrldi r5,r5,4 | 1973 | clrldi r5,r5,4 |
1966 | li r7,0 | 1974 | li r7,0 |
1967 | mfspr r6,SPRN_PIR | 1975 | mfspr r6,SPRN_PIR |
@@ -1989,7 +1997,7 @@ __hmt_secondary_hold: | |||
1989 | 1997 | ||
1990 | #ifdef CONFIG_HMT | 1998 | #ifdef CONFIG_HMT |
1991 | _GLOBAL(hmt_start_secondary) | 1999 | _GLOBAL(hmt_start_secondary) |
1992 | LOADADDR(r4,__hmt_secondary_hold) | 2000 | LOAD_REG_IMMEDIATE(r4,__hmt_secondary_hold) |
1993 | clrldi r4,r4,4 | 2001 | clrldi r4,r4,4 |
1994 | mtspr SPRN_NIADORM, r4 | 2002 | mtspr SPRN_NIADORM, r4 |
1995 | mfspr r4, SPRN_MSRDORM | 2003 | mfspr r4, SPRN_MSRDORM |
diff --git a/arch/powerpc/kernel/idle_power4.S b/arch/powerpc/kernel/idle_power4.S index 1494e2f177f7..c16b4afab582 100644 --- a/arch/powerpc/kernel/idle_power4.S +++ b/arch/powerpc/kernel/idle_power4.S | |||
@@ -38,14 +38,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP) | |||
38 | /* We must dynamically check for the NAP feature as it | 38 | /* We must dynamically check for the NAP feature as it |
39 | * can be cleared by CPU init after the fixups are done | 39 | * can be cleared by CPU init after the fixups are done |
40 | */ | 40 | */ |
41 | LOADBASE(r3,cur_cpu_spec) | 41 | LOAD_REG_ADDRBASE(r3,cur_cpu_spec) |
42 | ld r4,OFF(cur_cpu_spec)(r3) | 42 | ld r4,ADDROFF(cur_cpu_spec)(r3) |
43 | ld r4,CPU_SPEC_FEATURES(r4) | 43 | ld r4,CPU_SPEC_FEATURES(r4) |
44 | andi. r0,r4,CPU_FTR_CAN_NAP | 44 | andi. r0,r4,CPU_FTR_CAN_NAP |
45 | beqlr | 45 | beqlr |
46 | /* Now check if user or arch enabled NAP mode */ | 46 | /* Now check if user or arch enabled NAP mode */ |
47 | LOADBASE(r3,powersave_nap) | 47 | LOAD_REG_ADDRBASE(r3,powersave_nap) |
48 | lwz r4,OFF(powersave_nap)(r3) | 48 | lwz r4,ADDROFF(powersave_nap)(r3) |
49 | cmpwi 0,r4,0 | 49 | cmpwi 0,r4,0 |
50 | beqlr | 50 | beqlr |
51 | 51 | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 5651032d8706..d1fffce86df9 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -238,14 +238,10 @@ void do_IRQ(struct pt_regs *regs) | |||
238 | irq_exit(); | 238 | irq_exit(); |
239 | 239 | ||
240 | #ifdef CONFIG_PPC_ISERIES | 240 | #ifdef CONFIG_PPC_ISERIES |
241 | { | 241 | if (get_lppaca()->int_dword.fields.decr_int) { |
242 | struct paca_struct *lpaca = get_paca(); | 242 | get_lppaca()->int_dword.fields.decr_int = 0; |
243 | 243 | /* Signal a fake decrementer interrupt */ | |
244 | if (lpaca->lppaca.int_dword.fields.decr_int) { | 244 | timer_interrupt(regs); |
245 | lpaca->lppaca.int_dword.fields.decr_int = 0; | ||
246 | /* Signal a fake decrementer interrupt */ | ||
247 | timer_interrupt(regs); | ||
248 | } | ||
249 | } | 245 | } |
250 | #endif | 246 | #endif |
251 | } | 247 | } |
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 9dda16ccde78..1ae96a8ed7e2 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
@@ -55,15 +55,13 @@ static unsigned long get_purr(void) | |||
55 | { | 55 | { |
56 | unsigned long sum_purr = 0; | 56 | unsigned long sum_purr = 0; |
57 | int cpu; | 57 | int cpu; |
58 | struct paca_struct *lpaca; | ||
59 | 58 | ||
60 | for_each_cpu(cpu) { | 59 | for_each_cpu(cpu) { |
61 | lpaca = paca + cpu; | 60 | sum_purr += lppaca[cpu].emulated_time_base; |
62 | sum_purr += lpaca->lppaca.emulated_time_base; | ||
63 | 61 | ||
64 | #ifdef PURR_DEBUG | 62 | #ifdef PURR_DEBUG |
65 | printk(KERN_INFO "get_purr for cpu (%d) has value (%ld) \n", | 63 | printk(KERN_INFO "get_purr for cpu (%d) has value (%ld) \n", |
66 | cpu, lpaca->lppaca.emulated_time_base); | 64 | cpu, lppaca[cpu].emulated_time_base); |
67 | #endif | 65 | #endif |
68 | } | 66 | } |
69 | return sum_purr; | 67 | return sum_purr; |
@@ -79,12 +77,11 @@ static int lparcfg_data(struct seq_file *m, void *v) | |||
79 | unsigned long pool_id, lp_index; | 77 | unsigned long pool_id, lp_index; |
80 | int shared, entitled_capacity, max_entitled_capacity; | 78 | int shared, entitled_capacity, max_entitled_capacity; |
81 | int processors, max_processors; | 79 | int processors, max_processors; |
82 | struct paca_struct *lpaca = get_paca(); | ||
83 | unsigned long purr = get_purr(); | 80 | unsigned long purr = get_purr(); |
84 | 81 | ||
85 | seq_printf(m, "%s %s \n", MODULE_NAME, MODULE_VERS); | 82 | seq_printf(m, "%s %s \n", MODULE_NAME, MODULE_VERS); |
86 | 83 | ||
87 | shared = (int)(lpaca->lppaca_ptr->shared_proc); | 84 | shared = (int)(get_lppaca()->shared_proc); |
88 | seq_printf(m, "serial_number=%c%c%c%c%c%c%c\n", | 85 | seq_printf(m, "serial_number=%c%c%c%c%c%c%c\n", |
89 | e2a(xItExtVpdPanel.mfgID[2]), | 86 | e2a(xItExtVpdPanel.mfgID[2]), |
90 | e2a(xItExtVpdPanel.mfgID[3]), | 87 | e2a(xItExtVpdPanel.mfgID[3]), |
@@ -402,7 +399,7 @@ static int lparcfg_data(struct seq_file *m, void *v) | |||
402 | (h_resource >> 0 * 8) & 0xffff); | 399 | (h_resource >> 0 * 8) & 0xffff); |
403 | 400 | ||
404 | /* pool related entries are apropriate for shared configs */ | 401 | /* pool related entries are apropriate for shared configs */ |
405 | if (paca[0].lppaca.shared_proc) { | 402 | if (lppaca[0].shared_proc) { |
406 | 403 | ||
407 | h_pic(&pool_idle_time, &pool_procs); | 404 | h_pic(&pool_idle_time, &pool_procs); |
408 | 405 | ||
@@ -451,7 +448,7 @@ static int lparcfg_data(struct seq_file *m, void *v) | |||
451 | seq_printf(m, "partition_potential_processors=%d\n", | 448 | seq_printf(m, "partition_potential_processors=%d\n", |
452 | partition_potential_processors); | 449 | partition_potential_processors); |
453 | 450 | ||
454 | seq_printf(m, "shared_processor_mode=%d\n", paca[0].lppaca.shared_proc); | 451 | seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc); |
455 | 452 | ||
456 | return 0; | 453 | return 0; |
457 | } | 454 | } |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 01d0d97a16e1..be982023409e 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -68,7 +68,7 @@ _GLOBAL(reloc_offset) | |||
68 | mflr r0 | 68 | mflr r0 |
69 | bl 1f | 69 | bl 1f |
70 | 1: mflr r3 | 70 | 1: mflr r3 |
71 | LOADADDR(r4,1b) | 71 | LOAD_REG_IMMEDIATE(r4,1b) |
72 | subf r3,r4,r3 | 72 | subf r3,r4,r3 |
73 | mtlr r0 | 73 | mtlr r0 |
74 | blr | 74 | blr |
@@ -80,7 +80,7 @@ _GLOBAL(add_reloc_offset) | |||
80 | mflr r0 | 80 | mflr r0 |
81 | bl 1f | 81 | bl 1f |
82 | 1: mflr r5 | 82 | 1: mflr r5 |
83 | LOADADDR(r4,1b) | 83 | LOAD_REG_IMMEDIATE(r4,1b) |
84 | subf r5,r4,r5 | 84 | subf r5,r4,r5 |
85 | add r3,r3,r5 | 85 | add r3,r3,r5 |
86 | mtlr r0 | 86 | mtlr r0 |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index ae48a002f81a..2778cce058e2 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -39,7 +39,7 @@ _GLOBAL(reloc_offset) | |||
39 | mflr r0 | 39 | mflr r0 |
40 | bl 1f | 40 | bl 1f |
41 | 1: mflr r3 | 41 | 1: mflr r3 |
42 | LOADADDR(r4,1b) | 42 | LOAD_REG_IMMEDIATE(r4,1b) |
43 | subf r3,r4,r3 | 43 | subf r3,r4,r3 |
44 | mtlr r0 | 44 | mtlr r0 |
45 | blr | 45 | blr |
@@ -51,7 +51,7 @@ _GLOBAL(add_reloc_offset) | |||
51 | mflr r0 | 51 | mflr r0 |
52 | bl 1f | 52 | bl 1f |
53 | 1: mflr r5 | 53 | 1: mflr r5 |
54 | LOADADDR(r4,1b) | 54 | LOAD_REG_IMMEDIATE(r4,1b) |
55 | subf r5,r4,r5 | 55 | subf r5,r4,r5 |
56 | add r3,r3,r5 | 56 | add r3,r3,r5 |
57 | mtlr r0 | 57 | mtlr r0 |
@@ -498,15 +498,15 @@ _GLOBAL(identify_cpu) | |||
498 | */ | 498 | */ |
499 | _GLOBAL(do_cpu_ftr_fixups) | 499 | _GLOBAL(do_cpu_ftr_fixups) |
500 | /* Get CPU 0 features */ | 500 | /* Get CPU 0 features */ |
501 | LOADADDR(r6,cur_cpu_spec) | 501 | LOAD_REG_IMMEDIATE(r6,cur_cpu_spec) |
502 | sub r6,r6,r3 | 502 | sub r6,r6,r3 |
503 | ld r4,0(r6) | 503 | ld r4,0(r6) |
504 | sub r4,r4,r3 | 504 | sub r4,r4,r3 |
505 | ld r4,CPU_SPEC_FEATURES(r4) | 505 | ld r4,CPU_SPEC_FEATURES(r4) |
506 | /* Get the fixup table */ | 506 | /* Get the fixup table */ |
507 | LOADADDR(r6,__start___ftr_fixup) | 507 | LOAD_REG_IMMEDIATE(r6,__start___ftr_fixup) |
508 | sub r6,r6,r3 | 508 | sub r6,r6,r3 |
509 | LOADADDR(r7,__stop___ftr_fixup) | 509 | LOAD_REG_IMMEDIATE(r7,__stop___ftr_fixup) |
510 | sub r7,r7,r3 | 510 | sub r7,r7,r3 |
511 | /* Do the fixup */ | 511 | /* Do the fixup */ |
512 | 1: cmpld r6,r7 | 512 | 1: cmpld r6,r7 |
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index 999bdd816769..5d1b708086bd 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c | |||
@@ -25,6 +25,28 @@ | |||
25 | * field correctly */ | 25 | * field correctly */ |
26 | extern unsigned long __toc_start; | 26 | extern unsigned long __toc_start; |
27 | 27 | ||
28 | /* | ||
29 | * iSeries structure which the hypervisor knows about - this structure | ||
30 | * should not cross a page boundary. The vpa_init/register_vpa call | ||
31 | * is now known to fail if the lppaca structure crosses a page | ||
32 | * boundary. The lppaca is also used on POWER5 pSeries boxes. The | ||
33 | * lppaca is 640 bytes long, and cannot readily change since the | ||
34 | * hypervisor knows its layout, so a 1kB alignment will suffice to | ||
35 | * ensure that it doesn't cross a page boundary. | ||
36 | */ | ||
37 | struct lppaca lppaca[] = { | ||
38 | [0 ... (NR_CPUS-1)] = { | ||
39 | .desc = 0xd397d781, /* "LpPa" */ | ||
40 | .size = sizeof(struct lppaca), | ||
41 | .dyn_proc_status = 2, | ||
42 | .decr_val = 0x00ff0000, | ||
43 | .fpregs_in_use = 1, | ||
44 | .end_of_quantum = 0xfffffffffffffffful, | ||
45 | .slb_count = 64, | ||
46 | .vmxregs_in_use = 0, | ||
47 | }, | ||
48 | }; | ||
49 | |||
28 | /* The Paca is an array with one entry per processor. Each contains an | 50 | /* The Paca is an array with one entry per processor. Each contains an |
29 | * lppaca, which contains the information shared between the | 51 | * lppaca, which contains the information shared between the |
30 | * hypervisor and Linux. | 52 | * hypervisor and Linux. |
@@ -35,27 +57,17 @@ extern unsigned long __toc_start; | |||
35 | * processor (not thread). | 57 | * processor (not thread). |
36 | */ | 58 | */ |
37 | #define PACA_INIT_COMMON(number, start, asrr, asrv) \ | 59 | #define PACA_INIT_COMMON(number, start, asrr, asrv) \ |
60 | .lppaca_ptr = &lppaca[number], \ | ||
38 | .lock_token = 0x8000, \ | 61 | .lock_token = 0x8000, \ |
39 | .paca_index = (number), /* Paca Index */ \ | 62 | .paca_index = (number), /* Paca Index */ \ |
40 | .kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL, \ | 63 | .kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL, \ |
41 | .stab_real = (asrr), /* Real pointer to segment table */ \ | 64 | .stab_real = (asrr), /* Real pointer to segment table */ \ |
42 | .stab_addr = (asrv), /* Virt pointer to segment table */ \ | 65 | .stab_addr = (asrv), /* Virt pointer to segment table */ \ |
43 | .cpu_start = (start), /* Processor start */ \ | 66 | .cpu_start = (start), /* Processor start */ \ |
44 | .hw_cpu_id = 0xffff, \ | 67 | .hw_cpu_id = 0xffff, |
45 | .lppaca = { \ | ||
46 | .desc = 0xd397d781, /* "LpPa" */ \ | ||
47 | .size = sizeof(struct lppaca), \ | ||
48 | .dyn_proc_status = 2, \ | ||
49 | .decr_val = 0x00ff0000, \ | ||
50 | .fpregs_in_use = 1, \ | ||
51 | .end_of_quantum = 0xfffffffffffffffful, \ | ||
52 | .slb_count = 64, \ | ||
53 | .vmxregs_in_use = 0, \ | ||
54 | }, \ | ||
55 | 68 | ||
56 | #ifdef CONFIG_PPC_ISERIES | 69 | #ifdef CONFIG_PPC_ISERIES |
57 | #define PACA_INIT_ISERIES(number) \ | 70 | #define PACA_INIT_ISERIES(number) \ |
58 | .lppaca_ptr = &paca[number].lppaca, \ | ||
59 | .reg_save_ptr = &iseries_reg_save[number], | 71 | .reg_save_ptr = &iseries_reg_save[number], |
60 | 72 | ||
61 | #define PACA_INIT(number) \ | 73 | #define PACA_INIT(number) \ |
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index 16d9a904f3cb..d9a459c144d8 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -230,8 +230,7 @@ EXPORT_SYMBOL(__down_interruptible); | |||
230 | EXPORT_SYMBOL(cpm_install_handler); | 230 | EXPORT_SYMBOL(cpm_install_handler); |
231 | EXPORT_SYMBOL(cpm_free_handler); | 231 | EXPORT_SYMBOL(cpm_free_handler); |
232 | #endif /* CONFIG_8xx */ | 232 | #endif /* CONFIG_8xx */ |
233 | #if defined(CONFIG_8xx) || defined(CONFIG_40x) || defined(CONFIG_85xx) ||\ | 233 | #if defined(CONFIG_8xx) || defined(CONFIG_40x) |
234 | defined(CONFIG_83xx) | ||
235 | EXPORT_SYMBOL(__res); | 234 | EXPORT_SYMBOL(__res); |
236 | #endif | 235 | #endif |
237 | 236 | ||
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 02e2115323e4..d50c8df0183e 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -1627,6 +1627,11 @@ static void of_node_release(struct kref *kref) | |||
1627 | kfree(prop->value); | 1627 | kfree(prop->value); |
1628 | kfree(prop); | 1628 | kfree(prop); |
1629 | prop = next; | 1629 | prop = next; |
1630 | |||
1631 | if (!prop) { | ||
1632 | prop = node->deadprops; | ||
1633 | node->deadprops = NULL; | ||
1634 | } | ||
1630 | } | 1635 | } |
1631 | kfree(node->intrs); | 1636 | kfree(node->intrs); |
1632 | kfree(node->full_name); | 1637 | kfree(node->full_name); |
@@ -1774,22 +1779,32 @@ static int __init prom_reconfig_setup(void) | |||
1774 | __initcall(prom_reconfig_setup); | 1779 | __initcall(prom_reconfig_setup); |
1775 | #endif | 1780 | #endif |
1776 | 1781 | ||
1777 | /* | 1782 | struct property *of_find_property(struct device_node *np, const char *name, |
1778 | * Find a property with a given name for a given node | 1783 | int *lenp) |
1779 | * and return the value. | ||
1780 | */ | ||
1781 | unsigned char *get_property(struct device_node *np, const char *name, | ||
1782 | int *lenp) | ||
1783 | { | 1784 | { |
1784 | struct property *pp; | 1785 | struct property *pp; |
1785 | 1786 | ||
1787 | read_lock(&devtree_lock); | ||
1786 | for (pp = np->properties; pp != 0; pp = pp->next) | 1788 | for (pp = np->properties; pp != 0; pp = pp->next) |
1787 | if (strcmp(pp->name, name) == 0) { | 1789 | if (strcmp(pp->name, name) == 0) { |
1788 | if (lenp != 0) | 1790 | if (lenp != 0) |
1789 | *lenp = pp->length; | 1791 | *lenp = pp->length; |
1790 | return pp->value; | 1792 | break; |
1791 | } | 1793 | } |
1792 | return NULL; | 1794 | read_unlock(&devtree_lock); |
1795 | |||
1796 | return pp; | ||
1797 | } | ||
1798 | |||
1799 | /* | ||
1800 | * Find a property with a given name for a given node | ||
1801 | * and return the value. | ||
1802 | */ | ||
1803 | unsigned char *get_property(struct device_node *np, const char *name, | ||
1804 | int *lenp) | ||
1805 | { | ||
1806 | struct property *pp = of_find_property(np,name,lenp); | ||
1807 | return pp ? pp->value : NULL; | ||
1793 | } | 1808 | } |
1794 | EXPORT_SYMBOL(get_property); | 1809 | EXPORT_SYMBOL(get_property); |
1795 | 1810 | ||
@@ -1823,4 +1838,82 @@ int prom_add_property(struct device_node* np, struct property* prop) | |||
1823 | return 0; | 1838 | return 0; |
1824 | } | 1839 | } |
1825 | 1840 | ||
1841 | /* | ||
1842 | * Remove a property from a node. Note that we don't actually | ||
1843 | * remove it, since we have given out who-knows-how-many pointers | ||
1844 | * to the data using get-property. Instead we just move the property | ||
1845 | * to the "dead properties" list, so it won't be found any more. | ||
1846 | */ | ||
1847 | int prom_remove_property(struct device_node *np, struct property *prop) | ||
1848 | { | ||
1849 | struct property **next; | ||
1850 | int found = 0; | ||
1826 | 1851 | ||
1852 | write_lock(&devtree_lock); | ||
1853 | next = &np->properties; | ||
1854 | while (*next) { | ||
1855 | if (*next == prop) { | ||
1856 | /* found the node */ | ||
1857 | *next = prop->next; | ||
1858 | prop->next = np->deadprops; | ||
1859 | np->deadprops = prop; | ||
1860 | found = 1; | ||
1861 | break; | ||
1862 | } | ||
1863 | next = &(*next)->next; | ||
1864 | } | ||
1865 | write_unlock(&devtree_lock); | ||
1866 | |||
1867 | if (!found) | ||
1868 | return -ENODEV; | ||
1869 | |||
1870 | #ifdef CONFIG_PROC_DEVICETREE | ||
1871 | /* try to remove the proc node as well */ | ||
1872 | if (np->pde) | ||
1873 | proc_device_tree_remove_prop(np->pde, prop); | ||
1874 | #endif /* CONFIG_PROC_DEVICETREE */ | ||
1875 | |||
1876 | return 0; | ||
1877 | } | ||
1878 | |||
1879 | /* | ||
1880 | * Update a property in a node. Note that we don't actually | ||
1881 | * remove it, since we have given out who-knows-how-many pointers | ||
1882 | * to the data using get-property. Instead we just move the property | ||
1883 | * to the "dead properties" list, and add the new property to the | ||
1884 | * property list | ||
1885 | */ | ||
1886 | int prom_update_property(struct device_node *np, | ||
1887 | struct property *newprop, | ||
1888 | struct property *oldprop) | ||
1889 | { | ||
1890 | struct property **next; | ||
1891 | int found = 0; | ||
1892 | |||
1893 | write_lock(&devtree_lock); | ||
1894 | next = &np->properties; | ||
1895 | while (*next) { | ||
1896 | if (*next == oldprop) { | ||
1897 | /* found the node */ | ||
1898 | newprop->next = oldprop->next; | ||
1899 | *next = newprop; | ||
1900 | oldprop->next = np->deadprops; | ||
1901 | np->deadprops = oldprop; | ||
1902 | found = 1; | ||
1903 | break; | ||
1904 | } | ||
1905 | next = &(*next)->next; | ||
1906 | } | ||
1907 | write_unlock(&devtree_lock); | ||
1908 | |||
1909 | if (!found) | ||
1910 | return -ENODEV; | ||
1911 | |||
1912 | #ifdef CONFIG_PROC_DEVICETREE | ||
1913 | /* try to add to proc as well if it was initialized */ | ||
1914 | if (np->pde) | ||
1915 | proc_device_tree_update_prop(np->pde, newprop, oldprop); | ||
1916 | #endif /* CONFIG_PROC_DEVICETREE */ | ||
1917 | |||
1918 | return 0; | ||
1919 | } | ||
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 309ae1d5fa77..a8099c806150 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c | |||
@@ -113,7 +113,8 @@ static unsigned int of_bus_default_get_flags(u32 *addr) | |||
113 | 113 | ||
114 | static int of_bus_pci_match(struct device_node *np) | 114 | static int of_bus_pci_match(struct device_node *np) |
115 | { | 115 | { |
116 | return !strcmp(np->type, "pci"); | 116 | /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */ |
117 | return !strcmp(np->type, "pci") || !strcmp(np->type, "vci"); | ||
117 | } | 118 | } |
118 | 119 | ||
119 | static void of_bus_pci_count_cells(struct device_node *np, | 120 | static void of_bus_pci_count_cells(struct device_node *np, |
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 4b9cfe4637b1..7fe4a5c944c9 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
@@ -36,6 +36,11 @@ struct rtas_t rtas = { | |||
36 | .lock = SPIN_LOCK_UNLOCKED | 36 | .lock = SPIN_LOCK_UNLOCKED |
37 | }; | 37 | }; |
38 | 38 | ||
39 | struct rtas_suspend_me_data { | ||
40 | long waiting; | ||
41 | struct rtas_args *args; | ||
42 | }; | ||
43 | |||
39 | EXPORT_SYMBOL(rtas); | 44 | EXPORT_SYMBOL(rtas); |
40 | 45 | ||
41 | DEFINE_SPINLOCK(rtas_data_buf_lock); | 46 | DEFINE_SPINLOCK(rtas_data_buf_lock); |
@@ -556,6 +561,80 @@ void rtas_os_term(char *str) | |||
556 | } while (status == RTAS_BUSY); | 561 | } while (status == RTAS_BUSY); |
557 | } | 562 | } |
558 | 563 | ||
564 | static int ibm_suspend_me_token = RTAS_UNKNOWN_SERVICE; | ||
565 | #ifdef CONFIG_PPC_PSERIES | ||
566 | static void rtas_percpu_suspend_me(void *info) | ||
567 | { | ||
568 | long rc; | ||
569 | long flags; | ||
570 | struct rtas_suspend_me_data *data = | ||
571 | (struct rtas_suspend_me_data *)info; | ||
572 | |||
573 | /* | ||
574 | * We use "waiting" to indicate our state. As long | ||
575 | * as it is >0, we are still trying to all join up. | ||
576 | * If it goes to 0, we have successfully joined up and | ||
577 | * one thread got H_Continue. If any error happens, | ||
578 | * we set it to <0. | ||
579 | */ | ||
580 | local_irq_save(flags); | ||
581 | do { | ||
582 | rc = plpar_hcall_norets(H_JOIN); | ||
583 | smp_rmb(); | ||
584 | } while (rc == H_Success && data->waiting > 0); | ||
585 | if (rc == H_Success) | ||
586 | goto out; | ||
587 | |||
588 | if (rc == H_Continue) { | ||
589 | data->waiting = 0; | ||
590 | rtas_call(ibm_suspend_me_token, 0, 1, | ||
591 | data->args->args); | ||
592 | } else { | ||
593 | data->waiting = -EBUSY; | ||
594 | printk(KERN_ERR "Error on H_Join hypervisor call\n"); | ||
595 | } | ||
596 | |||
597 | out: | ||
598 | /* before we restore interrupts, make sure we don't | ||
599 | * generate a spurious soft lockup errors | ||
600 | */ | ||
601 | touch_softlockup_watchdog(); | ||
602 | local_irq_restore(flags); | ||
603 | return; | ||
604 | } | ||
605 | |||
606 | static int rtas_ibm_suspend_me(struct rtas_args *args) | ||
607 | { | ||
608 | int i; | ||
609 | |||
610 | struct rtas_suspend_me_data data; | ||
611 | |||
612 | data.waiting = 1; | ||
613 | data.args = args; | ||
614 | |||
615 | /* Call function on all CPUs. One of us will make the | ||
616 | * rtas call | ||
617 | */ | ||
618 | if (on_each_cpu(rtas_percpu_suspend_me, &data, 1, 0)) | ||
619 | data.waiting = -EINVAL; | ||
620 | |||
621 | if (data.waiting != 0) | ||
622 | printk(KERN_ERR "Error doing global join\n"); | ||
623 | |||
624 | /* Prod each CPU. This won't hurt, and will wake | ||
625 | * anyone we successfully put to sleep with H_Join | ||
626 | */ | ||
627 | for_each_cpu(i) | ||
628 | plpar_hcall_norets(H_PROD, i); | ||
629 | |||
630 | return data.waiting; | ||
631 | } | ||
632 | #else /* CONFIG_PPC_PSERIES */ | ||
633 | static int rtas_ibm_suspend_me(struct rtas_args *args) | ||
634 | { | ||
635 | return -ENOSYS; | ||
636 | } | ||
637 | #endif | ||
559 | 638 | ||
560 | asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | 639 | asmlinkage int ppc_rtas(struct rtas_args __user *uargs) |
561 | { | 640 | { |
@@ -563,6 +642,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | |||
563 | unsigned long flags; | 642 | unsigned long flags; |
564 | char *buff_copy, *errbuf = NULL; | 643 | char *buff_copy, *errbuf = NULL; |
565 | int nargs; | 644 | int nargs; |
645 | int rc; | ||
566 | 646 | ||
567 | if (!capable(CAP_SYS_ADMIN)) | 647 | if (!capable(CAP_SYS_ADMIN)) |
568 | return -EPERM; | 648 | return -EPERM; |
@@ -581,6 +661,17 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | |||
581 | nargs * sizeof(rtas_arg_t)) != 0) | 661 | nargs * sizeof(rtas_arg_t)) != 0) |
582 | return -EFAULT; | 662 | return -EFAULT; |
583 | 663 | ||
664 | if (args.token == RTAS_UNKNOWN_SERVICE) | ||
665 | return -EINVAL; | ||
666 | |||
667 | /* Need to handle ibm,suspend_me call specially */ | ||
668 | if (args.token == ibm_suspend_me_token) { | ||
669 | rc = rtas_ibm_suspend_me(&args); | ||
670 | if (rc) | ||
671 | return rc; | ||
672 | goto copy_return; | ||
673 | } | ||
674 | |||
584 | buff_copy = get_errorlog_buffer(); | 675 | buff_copy = get_errorlog_buffer(); |
585 | 676 | ||
586 | spin_lock_irqsave(&rtas.lock, flags); | 677 | spin_lock_irqsave(&rtas.lock, flags); |
@@ -604,6 +695,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | |||
604 | kfree(buff_copy); | 695 | kfree(buff_copy); |
605 | } | 696 | } |
606 | 697 | ||
698 | copy_return: | ||
607 | /* Copy out args. */ | 699 | /* Copy out args. */ |
608 | if (copy_to_user(uargs->args + nargs, | 700 | if (copy_to_user(uargs->args + nargs, |
609 | args.args + nargs, | 701 | args.args + nargs, |
@@ -675,8 +767,10 @@ void __init rtas_initialize(void) | |||
675 | * the stop-self token if any | 767 | * the stop-self token if any |
676 | */ | 768 | */ |
677 | #ifdef CONFIG_PPC64 | 769 | #ifdef CONFIG_PPC64 |
678 | if (_machine == PLATFORM_PSERIES_LPAR) | 770 | if (_machine == PLATFORM_PSERIES_LPAR) { |
679 | rtas_region = min(lmb.rmo_size, RTAS_INSTANTIATE_MAX); | 771 | rtas_region = min(lmb.rmo_size, RTAS_INSTANTIATE_MAX); |
772 | ibm_suspend_me_token = rtas_token("ibm,suspend-me"); | ||
773 | } | ||
680 | #endif | 774 | #endif |
681 | rtas_rmo_buf = lmb_alloc_base(RTAS_RMOBUF_MAX, PAGE_SIZE, rtas_region); | 775 | rtas_rmo_buf = lmb_alloc_base(RTAS_RMOBUF_MAX, PAGE_SIZE, rtas_region); |
682 | 776 | ||
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index d5c52fae023a..be12041c0fc5 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -100,7 +100,8 @@ void machine_shutdown(void) | |||
100 | void machine_restart(char *cmd) | 100 | void machine_restart(char *cmd) |
101 | { | 101 | { |
102 | machine_shutdown(); | 102 | machine_shutdown(); |
103 | ppc_md.restart(cmd); | 103 | if (ppc_md.restart) |
104 | ppc_md.restart(cmd); | ||
104 | #ifdef CONFIG_SMP | 105 | #ifdef CONFIG_SMP |
105 | smp_send_stop(); | 106 | smp_send_stop(); |
106 | #endif | 107 | #endif |
@@ -112,7 +113,8 @@ void machine_restart(char *cmd) | |||
112 | void machine_power_off(void) | 113 | void machine_power_off(void) |
113 | { | 114 | { |
114 | machine_shutdown(); | 115 | machine_shutdown(); |
115 | ppc_md.power_off(); | 116 | if (ppc_md.power_off) |
117 | ppc_md.power_off(); | ||
116 | #ifdef CONFIG_SMP | 118 | #ifdef CONFIG_SMP |
117 | smp_send_stop(); | 119 | smp_send_stop(); |
118 | #endif | 120 | #endif |
@@ -129,7 +131,8 @@ EXPORT_SYMBOL_GPL(pm_power_off); | |||
129 | void machine_halt(void) | 131 | void machine_halt(void) |
130 | { | 132 | { |
131 | machine_shutdown(); | 133 | machine_shutdown(); |
132 | ppc_md.halt(); | 134 | if (ppc_md.halt) |
135 | ppc_md.halt(); | ||
133 | #ifdef CONFIG_SMP | 136 | #ifdef CONFIG_SMP |
134 | smp_send_stop(); | 137 | smp_send_stop(); |
135 | #endif | 138 | #endif |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 56f50e91bddb..c4a294d657b9 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -431,7 +431,7 @@ void timer_interrupt(struct pt_regs * regs) | |||
431 | profile_tick(CPU_PROFILING, regs); | 431 | profile_tick(CPU_PROFILING, regs); |
432 | 432 | ||
433 | #ifdef CONFIG_PPC_ISERIES | 433 | #ifdef CONFIG_PPC_ISERIES |
434 | get_paca()->lppaca.int_dword.fields.decr_int = 0; | 434 | get_lppaca()->int_dword.fields.decr_int = 0; |
435 | #endif | 435 | #endif |
436 | 436 | ||
437 | while ((ticks = tb_ticks_since(per_cpu(last_jiffy, cpu))) | 437 | while ((ticks = tb_ticks_since(per_cpu(last_jiffy, cpu))) |
diff --git a/arch/powerpc/lib/locks.c b/arch/powerpc/lib/locks.c index 35bd03c41dd1..8362fa272ca5 100644 --- a/arch/powerpc/lib/locks.c +++ b/arch/powerpc/lib/locks.c | |||
@@ -28,15 +28,13 @@ | |||
28 | void __spin_yield(raw_spinlock_t *lock) | 28 | void __spin_yield(raw_spinlock_t *lock) |
29 | { | 29 | { |
30 | unsigned int lock_value, holder_cpu, yield_count; | 30 | unsigned int lock_value, holder_cpu, yield_count; |
31 | struct paca_struct *holder_paca; | ||
32 | 31 | ||
33 | lock_value = lock->slock; | 32 | lock_value = lock->slock; |
34 | if (lock_value == 0) | 33 | if (lock_value == 0) |
35 | return; | 34 | return; |
36 | holder_cpu = lock_value & 0xffff; | 35 | holder_cpu = lock_value & 0xffff; |
37 | BUG_ON(holder_cpu >= NR_CPUS); | 36 | BUG_ON(holder_cpu >= NR_CPUS); |
38 | holder_paca = &paca[holder_cpu]; | 37 | yield_count = lppaca[holder_cpu].yield_count; |
39 | yield_count = holder_paca->lppaca.yield_count; | ||
40 | if ((yield_count & 1) == 0) | 38 | if ((yield_count & 1) == 0) |
41 | return; /* virtual cpu is currently running */ | 39 | return; /* virtual cpu is currently running */ |
42 | rmb(); | 40 | rmb(); |
@@ -60,15 +58,13 @@ void __rw_yield(raw_rwlock_t *rw) | |||
60 | { | 58 | { |
61 | int lock_value; | 59 | int lock_value; |
62 | unsigned int holder_cpu, yield_count; | 60 | unsigned int holder_cpu, yield_count; |
63 | struct paca_struct *holder_paca; | ||
64 | 61 | ||
65 | lock_value = rw->lock; | 62 | lock_value = rw->lock; |
66 | if (lock_value >= 0) | 63 | if (lock_value >= 0) |
67 | return; /* no write lock at present */ | 64 | return; /* no write lock at present */ |
68 | holder_cpu = lock_value & 0xffff; | 65 | holder_cpu = lock_value & 0xffff; |
69 | BUG_ON(holder_cpu >= NR_CPUS); | 66 | BUG_ON(holder_cpu >= NR_CPUS); |
70 | holder_paca = &paca[holder_cpu]; | 67 | yield_count = lppaca[holder_cpu].yield_count; |
71 | yield_count = holder_paca->lppaca.yield_count; | ||
72 | if ((yield_count & 1) == 0) | 68 | if ((yield_count & 1) == 0) |
73 | return; /* virtual cpu is currently running */ | 69 | return; /* virtual cpu is currently running */ |
74 | rmb(); | 70 | rmb(); |
diff --git a/arch/powerpc/oprofile/common.c b/arch/powerpc/oprofile/common.c index 71615eb70b2b..cc2535be3a73 100644 --- a/arch/powerpc/oprofile/common.c +++ b/arch/powerpc/oprofile/common.c | |||
@@ -140,19 +140,19 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
140 | 140 | ||
141 | switch (cur_cpu_spec->oprofile_type) { | 141 | switch (cur_cpu_spec->oprofile_type) { |
142 | #ifdef CONFIG_PPC64 | 142 | #ifdef CONFIG_PPC64 |
143 | case RS64: | 143 | case PPC_OPROFILE_RS64: |
144 | model = &op_model_rs64; | 144 | model = &op_model_rs64; |
145 | break; | 145 | break; |
146 | case POWER4: | 146 | case PPC_OPROFILE_POWER4: |
147 | model = &op_model_power4; | 147 | model = &op_model_power4; |
148 | break; | 148 | break; |
149 | #else | 149 | #else |
150 | case G4: | 150 | case PPC_OPROFILE_G4: |
151 | model = &op_model_7450; | 151 | model = &op_model_7450; |
152 | break; | 152 | break; |
153 | #endif | 153 | #endif |
154 | #ifdef CONFIG_FSL_BOOKE | 154 | #ifdef CONFIG_FSL_BOOKE |
155 | case BOOKE: | 155 | case PPC_OPROFILE_BOOKE: |
156 | model = &op_model_fsl_booke; | 156 | model = &op_model_fsl_booke; |
157 | break; | 157 | break; |
158 | #endif | 158 | #endif |
diff --git a/arch/powerpc/platforms/83xx/Kconfig b/arch/powerpc/platforms/83xx/Kconfig index b20812d460e6..7675e675dce1 100644 --- a/arch/powerpc/platforms/83xx/Kconfig +++ b/arch/powerpc/platforms/83xx/Kconfig | |||
@@ -7,6 +7,7 @@ choice | |||
7 | 7 | ||
8 | config MPC834x_SYS | 8 | config MPC834x_SYS |
9 | bool "Freescale MPC834x SYS" | 9 | bool "Freescale MPC834x SYS" |
10 | select DEFAULT_UIMAGE | ||
10 | help | 11 | help |
11 | This option enables support for the MPC 834x SYS evaluation board. | 12 | This option enables support for the MPC 834x SYS evaluation board. |
12 | 13 | ||
diff --git a/arch/powerpc/platforms/83xx/mpc834x_sys.c b/arch/powerpc/platforms/83xx/mpc834x_sys.c new file mode 100644 index 000000000000..2098dd05a773 --- /dev/null +++ b/arch/powerpc/platforms/83xx/mpc834x_sys.c | |||
@@ -0,0 +1,243 @@ | |||
1 | /* | ||
2 | * arch/powerpc/platforms/83xx/mpc834x_sys.c | ||
3 | * | ||
4 | * MPC834x SYS board specific routines | ||
5 | * | ||
6 | * Maintainer: Kumar Gala <galak@kernel.crashing.org> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <linux/stddef.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/reboot.h> | ||
20 | #include <linux/pci.h> | ||
21 | #include <linux/kdev_t.h> | ||
22 | #include <linux/major.h> | ||
23 | #include <linux/console.h> | ||
24 | #include <linux/delay.h> | ||
25 | #include <linux/seq_file.h> | ||
26 | #include <linux/root_dev.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/fsl_devices.h> | ||
29 | |||
30 | #include <asm/system.h> | ||
31 | #include <asm/pgtable.h> | ||
32 | #include <asm/page.h> | ||
33 | #include <asm/atomic.h> | ||
34 | #include <asm/time.h> | ||
35 | #include <asm/io.h> | ||
36 | #include <asm/machdep.h> | ||
37 | #include <asm/ipic.h> | ||
38 | #include <asm/bootinfo.h> | ||
39 | #include <asm/pci-bridge.h> | ||
40 | #include <asm/mpc83xx.h> | ||
41 | #include <asm/irq.h> | ||
42 | #include <mm/mmu_decl.h> | ||
43 | #include <asm/prom.h> | ||
44 | #include <asm/udbg.h> | ||
45 | #include <sysdev/fsl_soc.h> | ||
46 | |||
47 | #include "mpc83xx.h" | ||
48 | |||
49 | #ifndef CONFIG_PCI | ||
50 | unsigned long isa_io_base = 0; | ||
51 | unsigned long isa_mem_base = 0; | ||
52 | #endif | ||
53 | |||
54 | #ifdef CONFIG_PCI | ||
55 | extern int mpc83xx_pci2_busno; | ||
56 | |||
57 | static int | ||
58 | mpc83xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) | ||
59 | { | ||
60 | static char pci_irq_table[][4] = | ||
61 | /* | ||
62 | * PCI IDSEL/INTPIN->INTLINE | ||
63 | * A B C D | ||
64 | */ | ||
65 | { | ||
66 | {PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x11 */ | ||
67 | {PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x12 */ | ||
68 | {PIRQD, PIRQA, PIRQB, PIRQC}, /* idsel 0x13 */ | ||
69 | {0, 0, 0, 0}, | ||
70 | {PIRQA, PIRQB, PIRQC, PIRQD}, /* idsel 0x15 */ | ||
71 | {PIRQD, PIRQA, PIRQB, PIRQC}, /* idsel 0x16 */ | ||
72 | {PIRQC, PIRQD, PIRQA, PIRQB}, /* idsel 0x17 */ | ||
73 | {PIRQB, PIRQC, PIRQD, PIRQA}, /* idsel 0x18 */ | ||
74 | {0, 0, 0, 0}, /* idsel 0x19 */ | ||
75 | {0, 0, 0, 0}, /* idsel 0x20 */ | ||
76 | }; | ||
77 | |||
78 | const long min_idsel = 0x11, max_idsel = 0x20, irqs_per_slot = 4; | ||
79 | return PCI_IRQ_TABLE_LOOKUP; | ||
80 | } | ||
81 | |||
82 | static int | ||
83 | mpc83xx_exclude_device(u_char bus, u_char devfn) | ||
84 | { | ||
85 | if (bus == 0 && PCI_SLOT(devfn) == 0) | ||
86 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
87 | if (mpc83xx_pci2_busno) | ||
88 | if (bus == (mpc83xx_pci2_busno) && PCI_SLOT(devfn) == 0) | ||
89 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
90 | return PCIBIOS_SUCCESSFUL; | ||
91 | } | ||
92 | #endif /* CONFIG_PCI */ | ||
93 | |||
94 | /* ************************************************************************ | ||
95 | * | ||
96 | * Setup the architecture | ||
97 | * | ||
98 | */ | ||
99 | static void __init | ||
100 | mpc834x_sys_setup_arch(void) | ||
101 | { | ||
102 | struct device_node *np; | ||
103 | |||
104 | if (ppc_md.progress) | ||
105 | ppc_md.progress("mpc834x_sys_setup_arch()", 0); | ||
106 | |||
107 | np = of_find_node_by_type(NULL, "cpu"); | ||
108 | if (np != 0) { | ||
109 | unsigned int *fp = (int *) get_property(np, "clock-frequency", NULL); | ||
110 | if (fp != 0) | ||
111 | loops_per_jiffy = *fp / HZ; | ||
112 | else | ||
113 | loops_per_jiffy = 50000000 / HZ; | ||
114 | of_node_put(np); | ||
115 | } | ||
116 | |||
117 | #ifdef CONFIG_PCI | ||
118 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | ||
119 | add_bridge(np); | ||
120 | |||
121 | ppc_md.pci_swizzle = common_swizzle; | ||
122 | ppc_md.pci_map_irq = mpc83xx_map_irq; | ||
123 | ppc_md.pci_exclude_device = mpc83xx_exclude_device; | ||
124 | #endif | ||
125 | |||
126 | #ifdef CONFIG_ROOT_NFS | ||
127 | ROOT_DEV = Root_NFS; | ||
128 | #else | ||
129 | ROOT_DEV = Root_HDA1; | ||
130 | #endif | ||
131 | } | ||
132 | |||
133 | void __init | ||
134 | mpc834x_sys_init_IRQ(void) | ||
135 | { | ||
136 | u8 senses[8] = { | ||
137 | 0, /* EXT 0 */ | ||
138 | IRQ_SENSE_LEVEL, /* EXT 1 */ | ||
139 | IRQ_SENSE_LEVEL, /* EXT 2 */ | ||
140 | 0, /* EXT 3 */ | ||
141 | #ifdef CONFIG_PCI | ||
142 | IRQ_SENSE_LEVEL, /* EXT 4 */ | ||
143 | IRQ_SENSE_LEVEL, /* EXT 5 */ | ||
144 | IRQ_SENSE_LEVEL, /* EXT 6 */ | ||
145 | IRQ_SENSE_LEVEL, /* EXT 7 */ | ||
146 | #else | ||
147 | 0, /* EXT 4 */ | ||
148 | 0, /* EXT 5 */ | ||
149 | 0, /* EXT 6 */ | ||
150 | 0, /* EXT 7 */ | ||
151 | #endif | ||
152 | }; | ||
153 | |||
154 | ipic_init(get_immrbase() + 0x00700, 0, 0, senses, 8); | ||
155 | |||
156 | /* Initialize the default interrupt mapping priorities, | ||
157 | * in case the boot rom changed something on us. | ||
158 | */ | ||
159 | ipic_set_default_priority(); | ||
160 | } | ||
161 | |||
162 | #if defined(CONFIG_I2C_MPC) && defined(CONFIG_SENSORS_DS1374) | ||
163 | extern ulong ds1374_get_rtc_time(void); | ||
164 | extern int ds1374_set_rtc_time(ulong); | ||
165 | |||
166 | static int __init | ||
167 | mpc834x_rtc_hookup(void) | ||
168 | { | ||
169 | struct timespec tv; | ||
170 | |||
171 | ppc_md.get_rtc_time = ds1374_get_rtc_time; | ||
172 | ppc_md.set_rtc_time = ds1374_set_rtc_time; | ||
173 | |||
174 | tv.tv_nsec = 0; | ||
175 | tv.tv_sec = (ppc_md.get_rtc_time)(); | ||
176 | do_settimeofday(&tv); | ||
177 | |||
178 | return 0; | ||
179 | } | ||
180 | late_initcall(mpc834x_rtc_hookup); | ||
181 | #endif | ||
182 | |||
183 | static void | ||
184 | mpc83xx_restart(char *cmd) | ||
185 | { | ||
186 | #define RST_OFFSET 0x00000900 | ||
187 | #define RST_PROT_REG 0x00000018 | ||
188 | #define RST_CTRL_REG 0x0000001c | ||
189 | __be32 __iomem *reg; | ||
190 | |||
191 | // map reset register space | ||
192 | reg = ioremap(get_immrbase() + 0x900, 0xff); | ||
193 | |||
194 | local_irq_disable(); | ||
195 | |||
196 | /* enable software reset "RSTE" */ | ||
197 | out_be32(reg + (RST_PROT_REG >> 2), 0x52535445); | ||
198 | |||
199 | /* set software hard reset */ | ||
200 | out_be32(reg + (RST_CTRL_REG >> 2), 0x52535445); | ||
201 | for(;;); | ||
202 | } | ||
203 | |||
204 | static long __init | ||
205 | mpc83xx_time_init(void) | ||
206 | { | ||
207 | #define SPCR_OFFSET 0x00000110 | ||
208 | #define SPCR_TBEN 0x00400000 | ||
209 | __be32 __iomem *spcr = ioremap(get_immrbase() + SPCR_OFFSET, 4); | ||
210 | __be32 tmp; | ||
211 | |||
212 | tmp = in_be32(spcr); | ||
213 | out_be32(spcr, tmp|SPCR_TBEN); | ||
214 | |||
215 | iounmap(spcr); | ||
216 | |||
217 | return 0; | ||
218 | } | ||
219 | void __init | ||
220 | platform_init(void) | ||
221 | { | ||
222 | /* setup the PowerPC module struct */ | ||
223 | ppc_md.setup_arch = mpc834x_sys_setup_arch; | ||
224 | |||
225 | ppc_md.init_IRQ = mpc834x_sys_init_IRQ; | ||
226 | ppc_md.get_irq = ipic_get_irq; | ||
227 | |||
228 | ppc_md.restart = mpc83xx_restart; | ||
229 | |||
230 | ppc_md.time_init = mpc83xx_time_init; | ||
231 | ppc_md.set_rtc_time = NULL; | ||
232 | ppc_md.get_rtc_time = NULL; | ||
233 | ppc_md.calibrate_decr = generic_calibrate_decr; | ||
234 | |||
235 | ppc_md.progress = udbg_progress; | ||
236 | |||
237 | if (ppc_md.progress) | ||
238 | ppc_md.progress("mpc834x_sys_init(): exit", 0); | ||
239 | |||
240 | return; | ||
241 | } | ||
242 | |||
243 | |||
diff --git a/arch/powerpc/platforms/83xx/mpc834x_sys.h b/arch/powerpc/platforms/83xx/mpc834x_sys.h new file mode 100644 index 000000000000..e4ca39f6a862 --- /dev/null +++ b/arch/powerpc/platforms/83xx/mpc834x_sys.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * arch/powerppc/platforms/83xx/mpc834x_sys.h | ||
3 | * | ||
4 | * MPC834X SYS common board definitions | ||
5 | * | ||
6 | * Maintainer: Kumar Gala <galak@kernel.crashing.org> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #ifndef __MACH_MPC83XX_SYS_H__ | ||
16 | #define __MACH_MPC83XX_SYS_H__ | ||
17 | |||
18 | #define PIRQA MPC83xx_IRQ_EXT4 | ||
19 | #define PIRQB MPC83xx_IRQ_EXT5 | ||
20 | #define PIRQC MPC83xx_IRQ_EXT6 | ||
21 | #define PIRQD MPC83xx_IRQ_EXT7 | ||
22 | |||
23 | #endif /* __MACH_MPC83XX_SYS_H__ */ | ||
diff --git a/arch/powerpc/platforms/83xx/mpc83xx.h b/arch/powerpc/platforms/83xx/mpc83xx.h new file mode 100644 index 000000000000..ce9e66abef24 --- /dev/null +++ b/arch/powerpc/platforms/83xx/mpc83xx.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef __MPC83XX_H__ | ||
2 | #define __MPC83XX_H__ | ||
3 | |||
4 | #include <linux/init.h> | ||
5 | #include <linux/device.h> | ||
6 | |||
7 | /* | ||
8 | * Declaration for the various functions exported by the | ||
9 | * mpc83xx_* files. Mostly for use by mpc83xx_setup | ||
10 | */ | ||
11 | |||
12 | extern int add_bridge(struct device_node *dev); | ||
13 | |||
14 | #endif /* __MPC83XX_H__ */ | ||
diff --git a/arch/powerpc/platforms/83xx/pci.c b/arch/powerpc/platforms/83xx/pci.c new file mode 100644 index 000000000000..469cdacc5bd4 --- /dev/null +++ b/arch/powerpc/platforms/83xx/pci.c | |||
@@ -0,0 +1,99 @@ | |||
1 | /* | ||
2 | * FSL SoC setup code | ||
3 | * | ||
4 | * Maintained by Kumar Gala (see MAINTAINERS for contact information) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/stddef.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/pci.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/module.h> | ||
21 | |||
22 | #include <asm/system.h> | ||
23 | #include <asm/atomic.h> | ||
24 | #include <asm/io.h> | ||
25 | #include <asm/pci-bridge.h> | ||
26 | #include <asm/prom.h> | ||
27 | #include <sysdev/fsl_soc.h> | ||
28 | |||
29 | #undef DEBUG | ||
30 | |||
31 | #ifdef DEBUG | ||
32 | #define DBG(x...) printk(x) | ||
33 | #else | ||
34 | #define DBG(x...) | ||
35 | #endif | ||
36 | |||
37 | int mpc83xx_pci2_busno; | ||
38 | |||
39 | #ifdef CONFIG_PCI | ||
40 | int __init add_bridge(struct device_node *dev) | ||
41 | { | ||
42 | int len; | ||
43 | struct pci_controller *hose; | ||
44 | struct resource rsrc; | ||
45 | int *bus_range; | ||
46 | int primary = 1, has_address = 0; | ||
47 | phys_addr_t immr = get_immrbase(); | ||
48 | |||
49 | DBG("Adding PCI host bridge %s\n", dev->full_name); | ||
50 | |||
51 | /* Fetch host bridge registers address */ | ||
52 | has_address = (of_address_to_resource(dev, 0, &rsrc) == 0); | ||
53 | |||
54 | /* Get bus range if any */ | ||
55 | bus_range = (int *) get_property(dev, "bus-range", &len); | ||
56 | if (bus_range == NULL || len < 2 * sizeof(int)) { | ||
57 | printk(KERN_WARNING "Can't get bus-range for %s, assume" | ||
58 | " bus 0\n", dev->full_name); | ||
59 | } | ||
60 | |||
61 | hose = pcibios_alloc_controller(); | ||
62 | if (!hose) | ||
63 | return -ENOMEM; | ||
64 | hose->arch_data = dev; | ||
65 | hose->set_cfg_type = 1; | ||
66 | |||
67 | hose->first_busno = bus_range ? bus_range[0] : 0; | ||
68 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | ||
69 | |||
70 | /* MPC83xx supports up to two host controllers one at 0x8500 from immrbar | ||
71 | * the other at 0x8600, we consider the 0x8500 the primary controller | ||
72 | */ | ||
73 | /* PCI 1 */ | ||
74 | if ((rsrc.start & 0xfffff) == 0x8500) { | ||
75 | setup_indirect_pci(hose, immr + 0x8300, immr + 0x8304); | ||
76 | } | ||
77 | /* PCI 2*/ | ||
78 | if ((rsrc.start & 0xfffff) == 0x8600) { | ||
79 | setup_indirect_pci(hose, immr + 0x8380, immr + 0x8384); | ||
80 | primary = 0; | ||
81 | hose->bus_offset = hose->first_busno; | ||
82 | mpc83xx_pci2_busno = hose->first_busno; | ||
83 | } | ||
84 | |||
85 | printk(KERN_INFO "Found MPC83xx PCI host bridge at 0x%08lx. " | ||
86 | "Firmware bus number: %d->%d\n", | ||
87 | rsrc.start, hose->first_busno, hose->last_busno); | ||
88 | |||
89 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", | ||
90 | hose, hose->cfg_addr, hose->cfg_data); | ||
91 | |||
92 | /* Interpret the "ranges" property */ | ||
93 | /* This also maps the I/O region and sets isa_io/mem_base */ | ||
94 | pci_process_bridge_OF_ranges(hose, dev, primary); | ||
95 | |||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | #endif | ||
diff --git a/arch/powerpc/platforms/chrp/pci.c b/arch/powerpc/platforms/chrp/pci.c index 82c429d487f3..00c52f27ef4f 100644 --- a/arch/powerpc/platforms/chrp/pci.c +++ b/arch/powerpc/platforms/chrp/pci.c | |||
@@ -135,12 +135,13 @@ int __init | |||
135 | hydra_init(void) | 135 | hydra_init(void) |
136 | { | 136 | { |
137 | struct device_node *np; | 137 | struct device_node *np; |
138 | struct resource r; | ||
138 | 139 | ||
139 | np = find_devices("mac-io"); | 140 | np = find_devices("mac-io"); |
140 | if (np == NULL || np->n_addrs == 0) | 141 | if (np == NULL || of_address_to_resource(np, 0, &r)) |
141 | return 0; | 142 | return 0; |
142 | Hydra = ioremap(np->addrs[0].address, np->addrs[0].size); | 143 | Hydra = ioremap(r.start, r.end-r.start); |
143 | printk("Hydra Mac I/O at %lx\n", np->addrs[0].address); | 144 | printk("Hydra Mac I/O at %lx\n", r.start); |
144 | printk("Hydra Feature_Control was %x", | 145 | printk("Hydra Feature_Control was %x", |
145 | in_le32(&Hydra->Feature_Control)); | 146 | in_le32(&Hydra->Feature_Control)); |
146 | out_le32(&Hydra->Feature_Control, (HYDRA_FC_SCC_CELL_EN | | 147 | out_le32(&Hydra->Feature_Control, (HYDRA_FC_SCC_CELL_EN | |
@@ -177,18 +178,24 @@ setup_python(struct pci_controller *hose, struct device_node *dev) | |||
177 | { | 178 | { |
178 | u32 __iomem *reg; | 179 | u32 __iomem *reg; |
179 | u32 val; | 180 | u32 val; |
180 | unsigned long addr = dev->addrs[0].address; | 181 | struct resource r; |
181 | 182 | ||
182 | setup_indirect_pci(hose, addr + 0xf8000, addr + 0xf8010); | 183 | if (of_address_to_resource(dev, 0, &r)) { |
184 | printk(KERN_ERR "No address for Python PCI controller\n"); | ||
185 | return; | ||
186 | } | ||
183 | 187 | ||
184 | /* Clear the magic go-slow bit */ | 188 | /* Clear the magic go-slow bit */ |
185 | reg = ioremap(dev->addrs[0].address + 0xf6000, 0x40); | 189 | reg = ioremap(r.start + 0xf6000, 0x40); |
190 | BUG_ON(!reg); | ||
186 | val = in_be32(®[12]); | 191 | val = in_be32(®[12]); |
187 | if (val & PRG_CL_RESET_VALID) { | 192 | if (val & PRG_CL_RESET_VALID) { |
188 | out_be32(®[12], val & ~PRG_CL_RESET_VALID); | 193 | out_be32(®[12], val & ~PRG_CL_RESET_VALID); |
189 | in_be32(®[12]); | 194 | in_be32(®[12]); |
190 | } | 195 | } |
191 | iounmap(reg); | 196 | iounmap(reg); |
197 | |||
198 | setup_indirect_pci(hose, r.start + 0xf8000, r.start + 0xf8010); | ||
192 | } | 199 | } |
193 | 200 | ||
194 | /* Marvell Discovery II based Pegasos 2 */ | 201 | /* Marvell Discovery II based Pegasos 2 */ |
@@ -218,7 +225,7 @@ chrp_find_bridges(void) | |||
218 | char *model, *machine; | 225 | char *model, *machine; |
219 | int is_longtrail = 0, is_mot = 0, is_pegasos = 0; | 226 | int is_longtrail = 0, is_mot = 0, is_pegasos = 0; |
220 | struct device_node *root = find_path_device("/"); | 227 | struct device_node *root = find_path_device("/"); |
221 | 228 | struct resource r; | |
222 | /* | 229 | /* |
223 | * The PCI host bridge nodes on some machines don't have | 230 | * The PCI host bridge nodes on some machines don't have |
224 | * properties to adequately identify them, so we have to | 231 | * properties to adequately identify them, so we have to |
@@ -238,7 +245,7 @@ chrp_find_bridges(void) | |||
238 | continue; | 245 | continue; |
239 | ++index; | 246 | ++index; |
240 | /* The GG2 bridge on the LongTrail doesn't have an address */ | 247 | /* The GG2 bridge on the LongTrail doesn't have an address */ |
241 | if (dev->n_addrs < 1 && !is_longtrail) { | 248 | if (of_address_to_resource(dev, 0, &r) && !is_longtrail) { |
242 | printk(KERN_WARNING "Can't use %s: no address\n", | 249 | printk(KERN_WARNING "Can't use %s: no address\n", |
243 | dev->full_name); | 250 | dev->full_name); |
244 | continue; | 251 | continue; |
@@ -255,8 +262,8 @@ chrp_find_bridges(void) | |||
255 | printk(KERN_INFO "PCI buses %d..%d", | 262 | printk(KERN_INFO "PCI buses %d..%d", |
256 | bus_range[0], bus_range[1]); | 263 | bus_range[0], bus_range[1]); |
257 | printk(" controlled by %s", dev->type); | 264 | printk(" controlled by %s", dev->type); |
258 | if (dev->n_addrs > 0) | 265 | if (!is_longtrail) |
259 | printk(" at %lx", dev->addrs[0].address); | 266 | printk(" at %lx", r.start); |
260 | printk("\n"); | 267 | printk("\n"); |
261 | 268 | ||
262 | hose = pcibios_alloc_controller(); | 269 | hose = pcibios_alloc_controller(); |
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index 4ec8ba737e7d..2dc87aa5962f 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
@@ -352,9 +352,10 @@ static void __init chrp_find_openpic(void) | |||
352 | opaddr = opprop[na-1]; /* assume 32-bit */ | 352 | opaddr = opprop[na-1]; /* assume 32-bit */ |
353 | oplen /= na * sizeof(unsigned int); | 353 | oplen /= na * sizeof(unsigned int); |
354 | } else { | 354 | } else { |
355 | if (np->n_addrs == 0) | 355 | struct resource r; |
356 | if (of_address_to_resource(np, 0, &r)) | ||
356 | return; | 357 | return; |
357 | opaddr = np->addrs[0].address; | 358 | opaddr = r.start; |
358 | oplen = 0; | 359 | oplen = 0; |
359 | } | 360 | } |
360 | 361 | ||
@@ -377,7 +378,7 @@ static void __init chrp_find_openpic(void) | |||
377 | */ | 378 | */ |
378 | if (oplen < len) { | 379 | if (oplen < len) { |
379 | printk(KERN_ERR "Insufficient addresses for distributed" | 380 | printk(KERN_ERR "Insufficient addresses for distributed" |
380 | " OpenPIC (%d < %d)\n", np->n_addrs, len); | 381 | " OpenPIC (%d < %d)\n", oplen, len); |
381 | len = oplen; | 382 | len = oplen; |
382 | } | 383 | } |
383 | 384 | ||
diff --git a/arch/powerpc/platforms/chrp/time.c b/arch/powerpc/platforms/chrp/time.c index 737ee5d9f0aa..36a0f97bb7b1 100644 --- a/arch/powerpc/platforms/chrp/time.c +++ b/arch/powerpc/platforms/chrp/time.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/mc146818rtc.h> | 21 | #include <linux/mc146818rtc.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/bcd.h> | 23 | #include <linux/bcd.h> |
24 | #include <linux/ioport.h> | ||
24 | 25 | ||
25 | #include <asm/io.h> | 26 | #include <asm/io.h> |
26 | #include <asm/nvram.h> | 27 | #include <asm/nvram.h> |
@@ -37,14 +38,16 @@ static int nvram_data = NVRAM_DATA; | |||
37 | long __init chrp_time_init(void) | 38 | long __init chrp_time_init(void) |
38 | { | 39 | { |
39 | struct device_node *rtcs; | 40 | struct device_node *rtcs; |
41 | struct resource r; | ||
40 | int base; | 42 | int base; |
41 | 43 | ||
42 | rtcs = find_compatible_devices("rtc", "pnpPNP,b00"); | 44 | rtcs = find_compatible_devices("rtc", "pnpPNP,b00"); |
43 | if (rtcs == NULL) | 45 | if (rtcs == NULL) |
44 | rtcs = find_compatible_devices("rtc", "ds1385-rtc"); | 46 | rtcs = find_compatible_devices("rtc", "ds1385-rtc"); |
45 | if (rtcs == NULL || rtcs->addrs == NULL) | 47 | if (rtcs == NULL || of_address_to_resource(rtcs, 0, &r)) |
46 | return 0; | 48 | return 0; |
47 | base = rtcs->addrs[0].address; | 49 | |
50 | base = r.start; | ||
48 | nvram_as1 = 0; | 51 | nvram_as1 = 0; |
49 | nvram_as0 = base; | 52 | nvram_as0 = base; |
50 | nvram_data = base + 1; | 53 | nvram_data = base + 1; |
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c index 83442ea77476..be3fbfc24e6c 100644 --- a/arch/powerpc/platforms/iseries/irq.c +++ b/arch/powerpc/platforms/iseries/irq.c | |||
@@ -334,14 +334,12 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus, | |||
334 | */ | 334 | */ |
335 | int iSeries_get_irq(struct pt_regs *regs) | 335 | int iSeries_get_irq(struct pt_regs *regs) |
336 | { | 336 | { |
337 | struct paca_struct *lpaca; | ||
338 | /* -2 means ignore this interrupt */ | 337 | /* -2 means ignore this interrupt */ |
339 | int irq = -2; | 338 | int irq = -2; |
340 | 339 | ||
341 | lpaca = get_paca(); | ||
342 | #ifdef CONFIG_SMP | 340 | #ifdef CONFIG_SMP |
343 | if (lpaca->lppaca.int_dword.fields.ipi_cnt) { | 341 | if (get_lppaca()->int_dword.fields.ipi_cnt) { |
344 | lpaca->lppaca.int_dword.fields.ipi_cnt = 0; | 342 | get_lppaca()->int_dword.fields.ipi_cnt = 0; |
345 | iSeries_smp_message_recv(regs); | 343 | iSeries_smp_message_recv(regs); |
346 | } | 344 | } |
347 | #endif /* CONFIG_SMP */ | 345 | #endif /* CONFIG_SMP */ |
diff --git a/arch/powerpc/platforms/iseries/misc.S b/arch/powerpc/platforms/iseries/misc.S index dfe7aa1ba098..7641fc7e550a 100644 --- a/arch/powerpc/platforms/iseries/misc.S +++ b/arch/powerpc/platforms/iseries/misc.S | |||
@@ -44,7 +44,8 @@ _GLOBAL(local_irq_restore) | |||
44 | /* Check pending interrupts */ | 44 | /* Check pending interrupts */ |
45 | /* A decrementer, IPI or PMC interrupt may have occurred | 45 | /* A decrementer, IPI or PMC interrupt may have occurred |
46 | * while we were in the hypervisor (which enables) */ | 46 | * while we were in the hypervisor (which enables) */ |
47 | ld r4,PACALPPACA+LPPACAANYINT(r13) | 47 | ld r4,PACALPPACAPTR(r13) |
48 | ld r4,LPPACAANYINT(r4) | ||
48 | cmpdi r4,0 | 49 | cmpdi r4,0 |
49 | beqlr | 50 | beqlr |
50 | 51 | ||
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index c6bbe5c25107..3f8790146b00 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -538,7 +538,7 @@ static unsigned long __init build_iSeries_Memory_Map(void) | |||
538 | */ | 538 | */ |
539 | static void __init iSeries_setup_arch(void) | 539 | static void __init iSeries_setup_arch(void) |
540 | { | 540 | { |
541 | if (get_paca()->lppaca.shared_proc) { | 541 | if (get_lppaca()->shared_proc) { |
542 | ppc_md.idle_loop = iseries_shared_idle; | 542 | ppc_md.idle_loop = iseries_shared_idle; |
543 | printk(KERN_INFO "Using shared processor idle loop\n"); | 543 | printk(KERN_INFO "Using shared processor idle loop\n"); |
544 | } else { | 544 | } else { |
@@ -647,7 +647,7 @@ static void yield_shared_processor(void) | |||
647 | * The decrementer stops during the yield. Force a fake decrementer | 647 | * The decrementer stops during the yield. Force a fake decrementer |
648 | * here and let the timer_interrupt code sort out the actual time. | 648 | * here and let the timer_interrupt code sort out the actual time. |
649 | */ | 649 | */ |
650 | get_paca()->lppaca.int_dword.fields.decr_int = 1; | 650 | get_lppaca()->int_dword.fields.decr_int = 1; |
651 | process_iSeries_events(); | 651 | process_iSeries_events(); |
652 | } | 652 | } |
653 | 653 | ||
@@ -883,7 +883,7 @@ void dt_cpus(struct iseries_flat_dt *dt) | |||
883 | pft_size[1] = __ilog2(HvCallHpt_getHptPages() * HW_PAGE_SIZE); | 883 | pft_size[1] = __ilog2(HvCallHpt_getHptPages() * HW_PAGE_SIZE); |
884 | 884 | ||
885 | for (i = 0; i < NR_CPUS; i++) { | 885 | for (i = 0; i < NR_CPUS; i++) { |
886 | if (paca[i].lppaca.dyn_proc_status >= 2) | 886 | if (lppaca[i].dyn_proc_status >= 2) |
887 | continue; | 887 | continue; |
888 | 888 | ||
889 | snprintf(p, 32 - (p - buf), "@%d", i); | 889 | snprintf(p, 32 - (p - buf), "@%d", i); |
@@ -891,7 +891,7 @@ void dt_cpus(struct iseries_flat_dt *dt) | |||
891 | 891 | ||
892 | dt_prop_str(dt, "device_type", "cpu"); | 892 | dt_prop_str(dt, "device_type", "cpu"); |
893 | 893 | ||
894 | index = paca[i].lppaca.dyn_hv_phys_proc_index; | 894 | index = lppaca[i].dyn_hv_phys_proc_index; |
895 | d = &xIoHriProcessorVpd[index]; | 895 | d = &xIoHriProcessorVpd[index]; |
896 | 896 | ||
897 | dt_prop_u32(dt, "i-cache-size", d->xInstCacheSize * 1024); | 897 | dt_prop_u32(dt, "i-cache-size", d->xInstCacheSize * 1024); |
diff --git a/arch/powerpc/platforms/iseries/smp.c b/arch/powerpc/platforms/iseries/smp.c index fcb094ec6aec..6f9d407a709f 100644 --- a/arch/powerpc/platforms/iseries/smp.c +++ b/arch/powerpc/platforms/iseries/smp.c | |||
@@ -91,7 +91,7 @@ static void smp_iSeries_kick_cpu(int nr) | |||
91 | BUG_ON((nr < 0) || (nr >= NR_CPUS)); | 91 | BUG_ON((nr < 0) || (nr >= NR_CPUS)); |
92 | 92 | ||
93 | /* Verify that our partition has a processor nr */ | 93 | /* Verify that our partition has a processor nr */ |
94 | if (paca[nr].lppaca.dyn_proc_status >= 2) | 94 | if (lppaca[nr].dyn_proc_status >= 2) |
95 | return; | 95 | return; |
96 | 96 | ||
97 | /* The processor is currently spinning, waiting | 97 | /* The processor is currently spinning, waiting |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 1fe445ab78a6..8952528d31ac 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
@@ -254,11 +254,11 @@ out: | |||
254 | void vpa_init(int cpu) | 254 | void vpa_init(int cpu) |
255 | { | 255 | { |
256 | int hwcpu = get_hard_smp_processor_id(cpu); | 256 | int hwcpu = get_hard_smp_processor_id(cpu); |
257 | unsigned long vpa = __pa(&paca[cpu].lppaca); | 257 | unsigned long vpa = __pa(&lppaca[cpu]); |
258 | long ret; | 258 | long ret; |
259 | 259 | ||
260 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) | 260 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) |
261 | paca[cpu].lppaca.vmxregs_in_use = 1; | 261 | lppaca[cpu].vmxregs_in_use = 1; |
262 | 262 | ||
263 | ret = register_vpa(hwcpu, vpa); | 263 | ret = register_vpa(hwcpu, vpa); |
264 | 264 | ||
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index d8864164dbe8..86cfa6ecdcf3 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c | |||
@@ -350,6 +350,100 @@ static int do_remove_node(char *buf) | |||
350 | return rv; | 350 | return rv; |
351 | } | 351 | } |
352 | 352 | ||
353 | static char *parse_node(char *buf, size_t bufsize, struct device_node **npp) | ||
354 | { | ||
355 | char *handle_str; | ||
356 | phandle handle; | ||
357 | *npp = NULL; | ||
358 | |||
359 | handle_str = buf; | ||
360 | |||
361 | buf = strchr(buf, ' '); | ||
362 | if (!buf) | ||
363 | return NULL; | ||
364 | *buf = '\0'; | ||
365 | buf++; | ||
366 | |||
367 | handle = simple_strtoul(handle_str, NULL, 10); | ||
368 | |||
369 | *npp = of_find_node_by_phandle(handle); | ||
370 | return buf; | ||
371 | } | ||
372 | |||
373 | static int do_add_property(char *buf, size_t bufsize) | ||
374 | { | ||
375 | struct property *prop = NULL; | ||
376 | struct device_node *np; | ||
377 | unsigned char *value; | ||
378 | char *name, *end; | ||
379 | int length; | ||
380 | end = buf + bufsize; | ||
381 | buf = parse_node(buf, bufsize, &np); | ||
382 | |||
383 | if (!np) | ||
384 | return -ENODEV; | ||
385 | |||
386 | if (parse_next_property(buf, end, &name, &length, &value) == NULL) | ||
387 | return -EINVAL; | ||
388 | |||
389 | prop = new_property(name, length, value, NULL); | ||
390 | if (!prop) | ||
391 | return -ENOMEM; | ||
392 | |||
393 | prom_add_property(np, prop); | ||
394 | |||
395 | return 0; | ||
396 | } | ||
397 | |||
398 | static int do_remove_property(char *buf, size_t bufsize) | ||
399 | { | ||
400 | struct device_node *np; | ||
401 | char *tmp; | ||
402 | struct property *prop; | ||
403 | buf = parse_node(buf, bufsize, &np); | ||
404 | |||
405 | if (!np) | ||
406 | return -ENODEV; | ||
407 | |||
408 | tmp = strchr(buf,' '); | ||
409 | if (tmp) | ||
410 | *tmp = '\0'; | ||
411 | |||
412 | if (strlen(buf) == 0) | ||
413 | return -EINVAL; | ||
414 | |||
415 | prop = of_find_property(np, buf, NULL); | ||
416 | |||
417 | return prom_remove_property(np, prop); | ||
418 | } | ||
419 | |||
420 | static int do_update_property(char *buf, size_t bufsize) | ||
421 | { | ||
422 | struct device_node *np; | ||
423 | unsigned char *value; | ||
424 | char *name, *end; | ||
425 | int length; | ||
426 | struct property *newprop, *oldprop; | ||
427 | buf = parse_node(buf, bufsize, &np); | ||
428 | end = buf + bufsize; | ||
429 | |||
430 | if (!np) | ||
431 | return -ENODEV; | ||
432 | |||
433 | if (parse_next_property(buf, end, &name, &length, &value) == NULL) | ||
434 | return -EINVAL; | ||
435 | |||
436 | newprop = new_property(name, length, value, NULL); | ||
437 | if (!newprop) | ||
438 | return -ENOMEM; | ||
439 | |||
440 | oldprop = of_find_property(np, name,NULL); | ||
441 | if (!oldprop) | ||
442 | return -ENODEV; | ||
443 | |||
444 | return prom_update_property(np, newprop, oldprop); | ||
445 | } | ||
446 | |||
353 | /** | 447 | /** |
354 | * ofdt_write - perform operations on the Open Firmware device tree | 448 | * ofdt_write - perform operations on the Open Firmware device tree |
355 | * | 449 | * |
@@ -392,6 +486,12 @@ static ssize_t ofdt_write(struct file *file, const char __user *buf, size_t coun | |||
392 | rv = do_add_node(tmp, count - (tmp - kbuf)); | 486 | rv = do_add_node(tmp, count - (tmp - kbuf)); |
393 | else if (!strcmp(kbuf, "remove_node")) | 487 | else if (!strcmp(kbuf, "remove_node")) |
394 | rv = do_remove_node(tmp); | 488 | rv = do_remove_node(tmp); |
489 | else if (!strcmp(kbuf, "add_property")) | ||
490 | rv = do_add_property(tmp, count - (tmp - kbuf)); | ||
491 | else if (!strcmp(kbuf, "remove_property")) | ||
492 | rv = do_remove_property(tmp, count - (tmp - kbuf)); | ||
493 | else if (!strcmp(kbuf, "update_property")) | ||
494 | rv = do_update_property(tmp, count - (tmp - kbuf)); | ||
395 | else | 495 | else |
396 | rv = -EINVAL; | 496 | rv = -EINVAL; |
397 | out: | 497 | out: |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 68b7f086d63d..da6cebaf72cd 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -190,7 +190,7 @@ static void pseries_lpar_enable_pmcs(void) | |||
190 | 190 | ||
191 | /* instruct hypervisor to maintain PMCs */ | 191 | /* instruct hypervisor to maintain PMCs */ |
192 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) | 192 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) |
193 | get_paca()->lppaca.pmcregs_in_use = 1; | 193 | get_lppaca()->pmcregs_in_use = 1; |
194 | } | 194 | } |
195 | 195 | ||
196 | static void __init pSeries_setup_arch(void) | 196 | static void __init pSeries_setup_arch(void) |
@@ -234,7 +234,7 @@ static void __init pSeries_setup_arch(void) | |||
234 | /* Choose an idle loop */ | 234 | /* Choose an idle loop */ |
235 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { | 235 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { |
236 | vpa_init(boot_cpuid); | 236 | vpa_init(boot_cpuid); |
237 | if (get_paca()->lppaca.shared_proc) { | 237 | if (get_lppaca()->shared_proc) { |
238 | printk(KERN_INFO "Using shared processor idle loop\n"); | 238 | printk(KERN_INFO "Using shared processor idle loop\n"); |
239 | ppc_md.idle_loop = pseries_shared_idle; | 239 | ppc_md.idle_loop = pseries_shared_idle; |
240 | } else { | 240 | } else { |
@@ -444,10 +444,10 @@ DECLARE_PER_CPU(unsigned long, smt_snooze_delay); | |||
444 | 444 | ||
445 | static inline void dedicated_idle_sleep(unsigned int cpu) | 445 | static inline void dedicated_idle_sleep(unsigned int cpu) |
446 | { | 446 | { |
447 | struct paca_struct *ppaca = &paca[cpu ^ 1]; | 447 | struct lppaca *plppaca = &lppaca[cpu ^ 1]; |
448 | 448 | ||
449 | /* Only sleep if the other thread is not idle */ | 449 | /* Only sleep if the other thread is not idle */ |
450 | if (!(ppaca->lppaca.idle)) { | 450 | if (!(plppaca->idle)) { |
451 | local_irq_disable(); | 451 | local_irq_disable(); |
452 | 452 | ||
453 | /* | 453 | /* |
@@ -480,7 +480,6 @@ static inline void dedicated_idle_sleep(unsigned int cpu) | |||
480 | 480 | ||
481 | static void pseries_dedicated_idle(void) | 481 | static void pseries_dedicated_idle(void) |
482 | { | 482 | { |
483 | struct paca_struct *lpaca = get_paca(); | ||
484 | unsigned int cpu = smp_processor_id(); | 483 | unsigned int cpu = smp_processor_id(); |
485 | unsigned long start_snooze; | 484 | unsigned long start_snooze; |
486 | unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay); | 485 | unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay); |
@@ -491,7 +490,7 @@ static void pseries_dedicated_idle(void) | |||
491 | * Indicate to the HV that we are idle. Now would be | 490 | * Indicate to the HV that we are idle. Now would be |
492 | * a good time to find other work to dispatch. | 491 | * a good time to find other work to dispatch. |
493 | */ | 492 | */ |
494 | lpaca->lppaca.idle = 1; | 493 | get_lppaca()->idle = 1; |
495 | 494 | ||
496 | if (!need_resched()) { | 495 | if (!need_resched()) { |
497 | start_snooze = get_tb() + | 496 | start_snooze = get_tb() + |
@@ -518,7 +517,7 @@ static void pseries_dedicated_idle(void) | |||
518 | HMT_medium(); | 517 | HMT_medium(); |
519 | } | 518 | } |
520 | 519 | ||
521 | lpaca->lppaca.idle = 0; | 520 | get_lppaca()->idle = 0; |
522 | ppc64_runlatch_on(); | 521 | ppc64_runlatch_on(); |
523 | 522 | ||
524 | preempt_enable_no_resched(); | 523 | preempt_enable_no_resched(); |
@@ -532,7 +531,6 @@ static void pseries_dedicated_idle(void) | |||
532 | 531 | ||
533 | static void pseries_shared_idle(void) | 532 | static void pseries_shared_idle(void) |
534 | { | 533 | { |
535 | struct paca_struct *lpaca = get_paca(); | ||
536 | unsigned int cpu = smp_processor_id(); | 534 | unsigned int cpu = smp_processor_id(); |
537 | 535 | ||
538 | while (1) { | 536 | while (1) { |
@@ -540,7 +538,7 @@ static void pseries_shared_idle(void) | |||
540 | * Indicate to the HV that we are idle. Now would be | 538 | * Indicate to the HV that we are idle. Now would be |
541 | * a good time to find other work to dispatch. | 539 | * a good time to find other work to dispatch. |
542 | */ | 540 | */ |
543 | lpaca->lppaca.idle = 1; | 541 | get_lppaca()->idle = 1; |
544 | 542 | ||
545 | while (!need_resched() && !cpu_is_offline(cpu)) { | 543 | while (!need_resched() && !cpu_is_offline(cpu)) { |
546 | local_irq_disable(); | 544 | local_irq_disable(); |
@@ -564,7 +562,7 @@ static void pseries_shared_idle(void) | |||
564 | HMT_medium(); | 562 | HMT_medium(); |
565 | } | 563 | } |
566 | 564 | ||
567 | lpaca->lppaca.idle = 0; | 565 | get_lppaca()->idle = 0; |
568 | ppc64_runlatch_on(); | 566 | ppc64_runlatch_on(); |
569 | 567 | ||
570 | preempt_enable_no_resched(); | 568 | preempt_enable_no_resched(); |
@@ -588,7 +586,7 @@ static void pseries_kexec_cpu_down(int crash_shutdown, int secondary) | |||
588 | { | 586 | { |
589 | /* Don't risk a hypervisor call if we're crashing */ | 587 | /* Don't risk a hypervisor call if we're crashing */ |
590 | if (!crash_shutdown) { | 588 | if (!crash_shutdown) { |
591 | unsigned long vpa = __pa(&get_paca()->lppaca); | 589 | unsigned long vpa = __pa(get_lppaca()); |
592 | 590 | ||
593 | if (unregister_vpa(hard_smp_processor_id(), vpa)) { | 591 | if (unregister_vpa(hard_smp_processor_id(), vpa)) { |
594 | printk("VPA deregistration of cpu %u (hw_cpu_id %d) " | 592 | printk("VPA deregistration of cpu %u (hw_cpu_id %d) " |
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 0ae841347a09..4c2b356774ea 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -7,3 +7,4 @@ obj-$(CONFIG_40x) += dcr.o | |||
7 | obj-$(CONFIG_U3_DART) += dart_iommu.o | 7 | obj-$(CONFIG_U3_DART) += dart_iommu.o |
8 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o | 8 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o |
9 | obj-$(CONFIG_PPC_83xx) += ipic.o | 9 | obj-$(CONFIG_PPC_83xx) += ipic.o |
10 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o | ||
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c new file mode 100644 index 000000000000..064c9de47732 --- /dev/null +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
@@ -0,0 +1,317 @@ | |||
1 | /* | ||
2 | * FSL SoC setup code | ||
3 | * | ||
4 | * Maintained by Kumar Gala (see MAINTAINERS for contact information) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/stddef.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/major.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/device.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/fsl_devices.h> | ||
24 | |||
25 | #include <asm/system.h> | ||
26 | #include <asm/atomic.h> | ||
27 | #include <asm/io.h> | ||
28 | #include <asm/irq.h> | ||
29 | #include <asm/prom.h> | ||
30 | #include <sysdev/fsl_soc.h> | ||
31 | #include <mm/mmu_decl.h> | ||
32 | |||
33 | static phys_addr_t immrbase = -1; | ||
34 | |||
35 | phys_addr_t get_immrbase(void) | ||
36 | { | ||
37 | struct device_node *soc; | ||
38 | |||
39 | if (immrbase != -1) | ||
40 | return immrbase; | ||
41 | |||
42 | soc = of_find_node_by_type(NULL, "soc"); | ||
43 | if (soc != 0) { | ||
44 | unsigned int size; | ||
45 | void *prop = get_property(soc, "reg", &size); | ||
46 | immrbase = of_translate_address(soc, prop); | ||
47 | of_node_put(soc); | ||
48 | }; | ||
49 | |||
50 | return immrbase; | ||
51 | } | ||
52 | EXPORT_SYMBOL(get_immrbase); | ||
53 | |||
54 | static const char * gfar_tx_intr = "tx"; | ||
55 | static const char * gfar_rx_intr = "rx"; | ||
56 | static const char * gfar_err_intr = "error"; | ||
57 | |||
58 | static int __init gfar_of_init(void) | ||
59 | { | ||
60 | struct device_node *np; | ||
61 | unsigned int i; | ||
62 | struct platform_device *mdio_dev, *gfar_dev; | ||
63 | struct resource res; | ||
64 | int ret; | ||
65 | |||
66 | for (np = NULL, i = 0; (np = of_find_compatible_node(np, "mdio", "gianfar")) != NULL; i++) { | ||
67 | int k; | ||
68 | struct device_node *child = NULL; | ||
69 | struct gianfar_mdio_data mdio_data; | ||
70 | |||
71 | memset(&res, 0, sizeof(res)); | ||
72 | memset(&mdio_data, 0, sizeof(mdio_data)); | ||
73 | |||
74 | ret = of_address_to_resource(np, 0, &res); | ||
75 | if (ret) | ||
76 | goto mdio_err; | ||
77 | |||
78 | mdio_dev = platform_device_register_simple("fsl-gianfar_mdio", res.start, &res, 1); | ||
79 | if (IS_ERR(mdio_dev)) { | ||
80 | ret = PTR_ERR(mdio_dev); | ||
81 | goto mdio_err; | ||
82 | } | ||
83 | |||
84 | for (k = 0; k < 32; k++) | ||
85 | mdio_data.irq[k] = -1; | ||
86 | |||
87 | while ((child = of_get_next_child(np, child)) != NULL) { | ||
88 | if (child->n_intrs) { | ||
89 | u32 *id = (u32 *) get_property(child, "reg", NULL); | ||
90 | mdio_data.irq[*id] = child->intrs[0].line; | ||
91 | } | ||
92 | } | ||
93 | |||
94 | ret = platform_device_add_data(mdio_dev, &mdio_data, sizeof(struct gianfar_mdio_data)); | ||
95 | if (ret) | ||
96 | goto mdio_unreg; | ||
97 | } | ||
98 | |||
99 | for (np = NULL, i = 0; (np = of_find_compatible_node(np, "network", "gianfar")) != NULL; i++) { | ||
100 | struct resource r[4]; | ||
101 | struct device_node *phy, *mdio; | ||
102 | struct gianfar_platform_data gfar_data; | ||
103 | unsigned int *id; | ||
104 | char *model; | ||
105 | void *mac_addr; | ||
106 | phandle *ph; | ||
107 | |||
108 | memset(r, 0, sizeof(r)); | ||
109 | memset(&gfar_data, 0, sizeof(gfar_data)); | ||
110 | |||
111 | ret = of_address_to_resource(np, 0, &r[0]); | ||
112 | if (ret) | ||
113 | goto gfar_err; | ||
114 | |||
115 | r[1].start = np->intrs[0].line; | ||
116 | r[1].end = np->intrs[0].line; | ||
117 | r[1].flags = IORESOURCE_IRQ; | ||
118 | |||
119 | model = get_property(np, "model", NULL); | ||
120 | |||
121 | /* If we aren't the FEC we have multiple interrupts */ | ||
122 | if (model && strcasecmp(model, "FEC")) { | ||
123 | r[1].name = gfar_tx_intr; | ||
124 | |||
125 | r[2].name = gfar_rx_intr; | ||
126 | r[2].start = np->intrs[1].line; | ||
127 | r[2].end = np->intrs[1].line; | ||
128 | r[2].flags = IORESOURCE_IRQ; | ||
129 | |||
130 | r[3].name = gfar_err_intr; | ||
131 | r[3].start = np->intrs[2].line; | ||
132 | r[3].end = np->intrs[2].line; | ||
133 | r[3].flags = IORESOURCE_IRQ; | ||
134 | } | ||
135 | |||
136 | gfar_dev = platform_device_register_simple("fsl-gianfar", i, &r[0], np->n_intrs + 1); | ||
137 | |||
138 | if (IS_ERR(gfar_dev)) { | ||
139 | ret = PTR_ERR(gfar_dev); | ||
140 | goto gfar_err; | ||
141 | } | ||
142 | |||
143 | mac_addr = get_property(np, "address", NULL); | ||
144 | memcpy(gfar_data.mac_addr, mac_addr, 6); | ||
145 | |||
146 | if (model && !strcasecmp(model, "TSEC")) | ||
147 | gfar_data.device_flags = | ||
148 | FSL_GIANFAR_DEV_HAS_GIGABIT | | ||
149 | FSL_GIANFAR_DEV_HAS_COALESCE | | ||
150 | FSL_GIANFAR_DEV_HAS_RMON | | ||
151 | FSL_GIANFAR_DEV_HAS_MULTI_INTR; | ||
152 | if (model && !strcasecmp(model, "eTSEC")) | ||
153 | gfar_data.device_flags = | ||
154 | FSL_GIANFAR_DEV_HAS_GIGABIT | | ||
155 | FSL_GIANFAR_DEV_HAS_COALESCE | | ||
156 | FSL_GIANFAR_DEV_HAS_RMON | | ||
157 | FSL_GIANFAR_DEV_HAS_MULTI_INTR | | ||
158 | FSL_GIANFAR_DEV_HAS_CSUM | | ||
159 | FSL_GIANFAR_DEV_HAS_VLAN | | ||
160 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH; | ||
161 | |||
162 | ph = (phandle *) get_property(np, "phy-handle", NULL); | ||
163 | phy = of_find_node_by_phandle(*ph); | ||
164 | |||
165 | if (phy == NULL) { | ||
166 | ret = -ENODEV; | ||
167 | goto gfar_unreg; | ||
168 | } | ||
169 | |||
170 | mdio = of_get_parent(phy); | ||
171 | |||
172 | id = (u32 *) get_property(phy, "reg", NULL); | ||
173 | ret = of_address_to_resource(mdio, 0, &res); | ||
174 | if (ret) { | ||
175 | of_node_put(phy); | ||
176 | of_node_put(mdio); | ||
177 | goto gfar_unreg; | ||
178 | } | ||
179 | |||
180 | gfar_data.phy_id = *id; | ||
181 | gfar_data.bus_id = res.start; | ||
182 | |||
183 | of_node_put(phy); | ||
184 | of_node_put(mdio); | ||
185 | |||
186 | ret = platform_device_add_data(gfar_dev, &gfar_data, sizeof(struct gianfar_platform_data)); | ||
187 | if (ret) | ||
188 | goto gfar_unreg; | ||
189 | } | ||
190 | |||
191 | return 0; | ||
192 | |||
193 | mdio_unreg: | ||
194 | platform_device_unregister(mdio_dev); | ||
195 | mdio_err: | ||
196 | return ret; | ||
197 | |||
198 | gfar_unreg: | ||
199 | platform_device_unregister(gfar_dev); | ||
200 | gfar_err: | ||
201 | return ret; | ||
202 | } | ||
203 | arch_initcall(gfar_of_init); | ||
204 | |||
205 | static int __init fsl_i2c_of_init(void) | ||
206 | { | ||
207 | struct device_node *np; | ||
208 | unsigned int i; | ||
209 | struct platform_device *i2c_dev; | ||
210 | int ret; | ||
211 | |||
212 | for (np = NULL, i = 0; (np = of_find_compatible_node(np, "i2c", "fsl-i2c")) != NULL; i++) { | ||
213 | struct resource r[2]; | ||
214 | struct fsl_i2c_platform_data i2c_data; | ||
215 | unsigned char * flags = NULL; | ||
216 | |||
217 | memset(&r, 0, sizeof(r)); | ||
218 | memset(&i2c_data, 0, sizeof(i2c_data)); | ||
219 | |||
220 | ret = of_address_to_resource(np, 0, &r[0]); | ||
221 | if (ret) | ||
222 | goto i2c_err; | ||
223 | |||
224 | r[1].start = np->intrs[0].line; | ||
225 | r[1].end = np->intrs[0].line; | ||
226 | r[1].flags = IORESOURCE_IRQ; | ||
227 | |||
228 | i2c_dev = platform_device_register_simple("fsl-i2c", i, r, 2); | ||
229 | if (IS_ERR(i2c_dev)) { | ||
230 | ret = PTR_ERR(i2c_dev); | ||
231 | goto i2c_err; | ||
232 | } | ||
233 | |||
234 | i2c_data.device_flags = 0; | ||
235 | flags = get_property(np, "dfsrr", NULL); | ||
236 | if (flags) | ||
237 | i2c_data.device_flags |= FSL_I2C_DEV_SEPARATE_DFSRR; | ||
238 | |||
239 | flags = get_property(np, "fsl5200-clocking", NULL); | ||
240 | if (flags) | ||
241 | i2c_data.device_flags |= FSL_I2C_DEV_CLOCK_5200; | ||
242 | |||
243 | ret = platform_device_add_data(i2c_dev, &i2c_data, sizeof(struct fsl_i2c_platform_data)); | ||
244 | if (ret) | ||
245 | goto i2c_unreg; | ||
246 | } | ||
247 | |||
248 | return 0; | ||
249 | |||
250 | i2c_unreg: | ||
251 | platform_device_unregister(i2c_dev); | ||
252 | i2c_err: | ||
253 | return ret; | ||
254 | } | ||
255 | arch_initcall(fsl_i2c_of_init); | ||
256 | |||
257 | #ifdef CONFIG_PPC_83xx | ||
258 | static int __init mpc83xx_wdt_init(void) | ||
259 | { | ||
260 | struct resource r; | ||
261 | struct device_node *soc, *np; | ||
262 | struct platform_device *dev; | ||
263 | unsigned int *freq; | ||
264 | int ret; | ||
265 | |||
266 | np = of_find_compatible_node(NULL, "watchdog", "mpc83xx_wdt"); | ||
267 | |||
268 | if (!np) { | ||
269 | ret = -ENODEV; | ||
270 | goto mpc83xx_wdt_nodev; | ||
271 | } | ||
272 | |||
273 | soc = of_find_node_by_type(NULL, "soc"); | ||
274 | |||
275 | if (!soc) { | ||
276 | ret = -ENODEV; | ||
277 | goto mpc83xx_wdt_nosoc; | ||
278 | } | ||
279 | |||
280 | freq = (unsigned int *)get_property(soc, "bus-frequency", NULL); | ||
281 | if (!freq) { | ||
282 | ret = -ENODEV; | ||
283 | goto mpc83xx_wdt_err; | ||
284 | } | ||
285 | |||
286 | memset(&r, 0, sizeof(r)); | ||
287 | |||
288 | ret = of_address_to_resource(np, 0, &r); | ||
289 | if (ret) | ||
290 | goto mpc83xx_wdt_err; | ||
291 | |||
292 | dev = platform_device_register_simple("mpc83xx_wdt", 0, &r, 1); | ||
293 | if (IS_ERR(dev)) { | ||
294 | ret = PTR_ERR(dev); | ||
295 | goto mpc83xx_wdt_err; | ||
296 | } | ||
297 | |||
298 | ret = platform_device_add_data(dev, freq, sizeof(int)); | ||
299 | if (ret) | ||
300 | goto mpc83xx_wdt_unreg; | ||
301 | |||
302 | of_node_put(soc); | ||
303 | of_node_put(np); | ||
304 | |||
305 | return 0; | ||
306 | |||
307 | mpc83xx_wdt_unreg: | ||
308 | platform_device_unregister(dev); | ||
309 | mpc83xx_wdt_err: | ||
310 | of_node_put(soc); | ||
311 | mpc83xx_wdt_nosoc: | ||
312 | of_node_put(np); | ||
313 | mpc83xx_wdt_nodev: | ||
314 | return ret; | ||
315 | } | ||
316 | arch_initcall(mpc83xx_wdt_init); | ||
317 | #endif | ||
diff --git a/arch/powerpc/sysdev/fsl_soc.h b/arch/powerpc/sysdev/fsl_soc.h new file mode 100644 index 000000000000..c433d3f39edd --- /dev/null +++ b/arch/powerpc/sysdev/fsl_soc.h | |||
@@ -0,0 +1,8 @@ | |||
1 | #ifndef __PPC_FSL_SOC_H | ||
2 | #define __PPC_FSL_SOC_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | extern phys_addr_t get_immrbase(void); | ||
6 | |||
7 | #endif | ||
8 | #endif | ||
diff --git a/arch/ppc/kernel/head_8xx.S b/arch/ppc/kernel/head_8xx.S index de0978742221..3e6ca7f5843f 100644 --- a/arch/ppc/kernel/head_8xx.S +++ b/arch/ppc/kernel/head_8xx.S | |||
@@ -375,6 +375,8 @@ DataStoreTLBMiss: | |||
375 | lis r11, swapper_pg_dir@h | 375 | lis r11, swapper_pg_dir@h |
376 | ori r11, r11, swapper_pg_dir@l | 376 | ori r11, r11, swapper_pg_dir@l |
377 | rlwimi r10, r11, 0, 2, 19 | 377 | rlwimi r10, r11, 0, 2, 19 |
378 | stw r12, 16(r0) | ||
379 | b LoadLargeDTLB | ||
378 | 3: | 380 | 3: |
379 | lwz r11, 0(r10) /* Get the level 1 entry */ | 381 | lwz r11, 0(r10) /* Get the level 1 entry */ |
380 | rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ | 382 | rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ |
@@ -430,6 +432,81 @@ DataStoreTLBMiss: | |||
430 | InstructionTLBError: | 432 | InstructionTLBError: |
431 | b InstructionAccess | 433 | b InstructionAccess |
432 | 434 | ||
435 | LoadLargeDTLB: | ||
436 | li r12, 0 | ||
437 | lwz r11, 0(r10) /* Get the level 1 entry */ | ||
438 | rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ | ||
439 | beq 3f /* If zero, don't try to find a pte */ | ||
440 | |||
441 | /* We have a pte table, so load fetch the pte from the table. | ||
442 | */ | ||
443 | ori r11, r11, 1 /* Set valid bit in physical L2 page */ | ||
444 | DO_8xx_CPU6(0x3b80, r3) | ||
445 | mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ | ||
446 | mfspr r10, SPRN_MD_TWC /* ....and get the pte address */ | ||
447 | lwz r10, 0(r10) /* Get the pte */ | ||
448 | |||
449 | /* Insert the Guarded flag into the TWC from the Linux PTE. | ||
450 | * It is bit 27 of both the Linux PTE and the TWC (at least | ||
451 | * I got that right :-). It will be better when we can put | ||
452 | * this into the Linux pgd/pmd and load it in the operation | ||
453 | * above. | ||
454 | */ | ||
455 | rlwimi r11, r10, 0, 27, 27 | ||
456 | |||
457 | rlwimi r12, r10, 0, 0, 9 /* extract phys. addr */ | ||
458 | mfspr r3, SPRN_MD_EPN | ||
459 | rlwinm r3, r3, 0, 0, 9 /* extract virtual address */ | ||
460 | tophys(r3, r3) | ||
461 | cmpw r3, r12 /* only use 8M page if it is a direct | ||
462 | kernel mapping */ | ||
463 | bne 1f | ||
464 | ori r11, r11, MD_PS8MEG | ||
465 | li r12, 1 | ||
466 | b 2f | ||
467 | 1: | ||
468 | li r12, 0 /* can't use 8MB TLB, so zero r12. */ | ||
469 | 2: | ||
470 | DO_8xx_CPU6(0x3b80, r3) | ||
471 | mtspr SPRN_MD_TWC, r11 | ||
472 | |||
473 | /* The Linux PTE won't go exactly into the MMU TLB. | ||
474 | * Software indicator bits 21, 22 and 28 must be clear. | ||
475 | * Software indicator bits 24, 25, 26, and 27 must be | ||
476 | * set. All other Linux PTE bits control the behavior | ||
477 | * of the MMU. | ||
478 | */ | ||
479 | 3: li r11, 0x00f0 | ||
480 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ | ||
481 | cmpwi r12, 1 | ||
482 | bne 4f | ||
483 | ori r10, r10, 0x8 | ||
484 | |||
485 | mfspr r12, SPRN_MD_EPN | ||
486 | lis r3, 0xff80 /* 10-19 must be clear for 8MB TLB */ | ||
487 | ori r3, r3, 0x0fff | ||
488 | and r12, r3, r12 | ||
489 | DO_8xx_CPU6(0x3780, r3) | ||
490 | mtspr SPRN_MD_EPN, r12 | ||
491 | |||
492 | lis r3, 0xff80 /* 10-19 must be clear for 8MB TLB */ | ||
493 | ori r3, r3, 0x0fff | ||
494 | and r10, r3, r10 | ||
495 | 4: | ||
496 | DO_8xx_CPU6(0x3d80, r3) | ||
497 | mtspr SPRN_MD_RPN, r10 /* Update TLB entry */ | ||
498 | |||
499 | mfspr r10, SPRN_M_TW /* Restore registers */ | ||
500 | lwz r11, 0(r0) | ||
501 | mtcr r11 | ||
502 | lwz r11, 4(r0) | ||
503 | |||
504 | lwz r12, 16(r0) | ||
505 | #ifdef CONFIG_8xx_CPU6 | ||
506 | lwz r3, 8(r0) | ||
507 | #endif | ||
508 | rfi | ||
509 | |||
433 | /* This is the data TLB error on the MPC8xx. This could be due to | 510 | /* This is the data TLB error on the MPC8xx. This could be due to |
434 | * many reasons, including a dirty update to a pte. We can catch that | 511 | * many reasons, including a dirty update to a pte. We can catch that |
435 | * one here, but anything else is an error. First, we track down the | 512 | * one here, but anything else is an error. First, we track down the |
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c index 95075f99a6d4..fb0da7c209db 100644 --- a/arch/ppc/kernel/ppc_ksyms.c +++ b/arch/ppc/kernel/ppc_ksyms.c | |||
@@ -270,7 +270,6 @@ EXPORT_SYMBOL(__delay); | |||
270 | EXPORT_SYMBOL(timer_interrupt); | 270 | EXPORT_SYMBOL(timer_interrupt); |
271 | EXPORT_SYMBOL(irq_desc); | 271 | EXPORT_SYMBOL(irq_desc); |
272 | EXPORT_SYMBOL(tb_ticks_per_jiffy); | 272 | EXPORT_SYMBOL(tb_ticks_per_jiffy); |
273 | EXPORT_SYMBOL(get_wchan); | ||
274 | EXPORT_SYMBOL(console_drivers); | 273 | EXPORT_SYMBOL(console_drivers); |
275 | #ifdef CONFIG_XMON | 274 | #ifdef CONFIG_XMON |
276 | EXPORT_SYMBOL(xmon); | 275 | EXPORT_SYMBOL(xmon); |
diff --git a/arch/ppc/platforms/83xx/mpc834x_sys.c b/arch/ppc/platforms/83xx/mpc834x_sys.c index 04bdc39bf47b..012e1e652c03 100644 --- a/arch/ppc/platforms/83xx/mpc834x_sys.c +++ b/arch/ppc/platforms/83xx/mpc834x_sys.c | |||
@@ -51,9 +51,6 @@ | |||
51 | 51 | ||
52 | #include <syslib/ppc83xx_setup.h> | 52 | #include <syslib/ppc83xx_setup.h> |
53 | 53 | ||
54 | static const char *GFAR_PHY_0 = "phy0:0"; | ||
55 | static const char *GFAR_PHY_1 = "phy0:1"; | ||
56 | |||
57 | #ifndef CONFIG_PCI | 54 | #ifndef CONFIG_PCI |
58 | unsigned long isa_io_base = 0; | 55 | unsigned long isa_io_base = 0; |
59 | unsigned long isa_mem_base = 0; | 56 | unsigned long isa_mem_base = 0; |
@@ -129,20 +126,21 @@ mpc834x_sys_setup_arch(void) | |||
129 | mdata->irq[1] = MPC83xx_IRQ_EXT2; | 126 | mdata->irq[1] = MPC83xx_IRQ_EXT2; |
130 | mdata->irq[2] = -1; | 127 | mdata->irq[2] = -1; |
131 | mdata->irq[31] = -1; | 128 | mdata->irq[31] = -1; |
132 | mdata->paddr += binfo->bi_immr_base; | ||
133 | 129 | ||
134 | /* setup the board related information for the enet controllers */ | 130 | /* setup the board related information for the enet controllers */ |
135 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC83xx_TSEC1); | 131 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC83xx_TSEC1); |
136 | if (pdata) { | 132 | if (pdata) { |
137 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 133 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
138 | pdata->bus_id = GFAR_PHY_0; | 134 | pdata->bus_id = 0; |
135 | pdata->phy_id = 0; | ||
139 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 136 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
140 | } | 137 | } |
141 | 138 | ||
142 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC83xx_TSEC2); | 139 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC83xx_TSEC2); |
143 | if (pdata) { | 140 | if (pdata) { |
144 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 141 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
145 | pdata->bus_id = GFAR_PHY_1; | 142 | pdata->bus_id = 0; |
143 | pdata->phy_id = 1; | ||
146 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 144 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
147 | } | 145 | } |
148 | 146 | ||
diff --git a/arch/ppc/platforms/85xx/mpc8540_ads.c b/arch/ppc/platforms/85xx/mpc8540_ads.c index c5cde97c6ef0..2eceb1e6f4eb 100644 --- a/arch/ppc/platforms/85xx/mpc8540_ads.c +++ b/arch/ppc/platforms/85xx/mpc8540_ads.c | |||
@@ -52,10 +52,6 @@ | |||
52 | 52 | ||
53 | #include <syslib/ppc85xx_setup.h> | 53 | #include <syslib/ppc85xx_setup.h> |
54 | 54 | ||
55 | static const char *GFAR_PHY_0 = "phy0:0"; | ||
56 | static const char *GFAR_PHY_1 = "phy0:1"; | ||
57 | static const char *GFAR_PHY_3 = "phy0:3"; | ||
58 | |||
59 | /* ************************************************************************ | 55 | /* ************************************************************************ |
60 | * | 56 | * |
61 | * Setup the architecture | 57 | * Setup the architecture |
@@ -102,27 +98,29 @@ mpc8540ads_setup_arch(void) | |||
102 | mdata->irq[2] = -1; | 98 | mdata->irq[2] = -1; |
103 | mdata->irq[3] = MPC85xx_IRQ_EXT5; | 99 | mdata->irq[3] = MPC85xx_IRQ_EXT5; |
104 | mdata->irq[31] = -1; | 100 | mdata->irq[31] = -1; |
105 | mdata->paddr += binfo->bi_immr_base; | ||
106 | 101 | ||
107 | /* setup the board related information for the enet controllers */ | 102 | /* setup the board related information for the enet controllers */ |
108 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); | 103 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); |
109 | if (pdata) { | 104 | if (pdata) { |
110 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 105 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
111 | pdata->bus_id = GFAR_PHY_0; | 106 | pdata->bus_id = 0; |
107 | pdata->phy_id = 0; | ||
112 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 108 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
113 | } | 109 | } |
114 | 110 | ||
115 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); | 111 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); |
116 | if (pdata) { | 112 | if (pdata) { |
117 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 113 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
118 | pdata->bus_id = GFAR_PHY_1; | 114 | pdata->bus_id = 0; |
115 | pdata->phy_id = 1; | ||
119 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 116 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
120 | } | 117 | } |
121 | 118 | ||
122 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_FEC); | 119 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_FEC); |
123 | if (pdata) { | 120 | if (pdata) { |
124 | pdata->board_flags = 0; | 121 | pdata->board_flags = 0; |
125 | pdata->bus_id = GFAR_PHY_3; | 122 | pdata->bus_id = 0; |
123 | pdata->phy_id = 3; | ||
126 | memcpy(pdata->mac_addr, binfo->bi_enet2addr, 6); | 124 | memcpy(pdata->mac_addr, binfo->bi_enet2addr, 6); |
127 | } | 125 | } |
128 | 126 | ||
diff --git a/arch/ppc/platforms/85xx/mpc8560_ads.c b/arch/ppc/platforms/85xx/mpc8560_ads.c index 8e39a5517092..442c7ff195d3 100644 --- a/arch/ppc/platforms/85xx/mpc8560_ads.c +++ b/arch/ppc/platforms/85xx/mpc8560_ads.c | |||
@@ -56,10 +56,6 @@ | |||
56 | #include <syslib/ppc85xx_setup.h> | 56 | #include <syslib/ppc85xx_setup.h> |
57 | 57 | ||
58 | 58 | ||
59 | static const char *GFAR_PHY_0 = "phy0:0"; | ||
60 | static const char *GFAR_PHY_1 = "phy0:1"; | ||
61 | static const char *GFAR_PHY_3 = "phy0:3"; | ||
62 | |||
63 | /* ************************************************************************ | 59 | /* ************************************************************************ |
64 | * | 60 | * |
65 | * Setup the architecture | 61 | * Setup the architecture |
@@ -99,20 +95,21 @@ mpc8560ads_setup_arch(void) | |||
99 | mdata->irq[2] = -1; | 95 | mdata->irq[2] = -1; |
100 | mdata->irq[3] = MPC85xx_IRQ_EXT5; | 96 | mdata->irq[3] = MPC85xx_IRQ_EXT5; |
101 | mdata->irq[31] = -1; | 97 | mdata->irq[31] = -1; |
102 | mdata->paddr += binfo->bi_immr_base; | ||
103 | 98 | ||
104 | /* setup the board related information for the enet controllers */ | 99 | /* setup the board related information for the enet controllers */ |
105 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); | 100 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); |
106 | if (pdata) { | 101 | if (pdata) { |
107 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 102 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
108 | pdata->bus_id = GFAR_PHY_0; | 103 | pdata->bus_id = 0; |
104 | pdata->phy_id = 0; | ||
109 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 105 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
110 | } | 106 | } |
111 | 107 | ||
112 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); | 108 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); |
113 | if (pdata) { | 109 | if (pdata) { |
114 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 110 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
115 | pdata->bus_id = GFAR_PHY_1; | 111 | pdata->bus_id = 0; |
112 | pdata->phy_id = 1; | ||
116 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 113 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
117 | } | 114 | } |
118 | 115 | ||
diff --git a/arch/ppc/platforms/85xx/mpc85xx_cds_common.c b/arch/ppc/platforms/85xx/mpc85xx_cds_common.c index 2959e3c4083d..b332ebae6bd3 100644 --- a/arch/ppc/platforms/85xx/mpc85xx_cds_common.c +++ b/arch/ppc/platforms/85xx/mpc85xx_cds_common.c | |||
@@ -395,9 +395,6 @@ mpc85xx_cds_pcibios_fixup(void) | |||
395 | 395 | ||
396 | TODC_ALLOC(); | 396 | TODC_ALLOC(); |
397 | 397 | ||
398 | static const char *GFAR_PHY_0 = "phy0:0"; | ||
399 | static const char *GFAR_PHY_1 = "phy0:1"; | ||
400 | |||
401 | /* ************************************************************************ | 398 | /* ************************************************************************ |
402 | * | 399 | * |
403 | * Setup the architecture | 400 | * Setup the architecture |
@@ -461,34 +458,37 @@ mpc85xx_cds_setup_arch(void) | |||
461 | mdata->irq[2] = -1; | 458 | mdata->irq[2] = -1; |
462 | mdata->irq[3] = -1; | 459 | mdata->irq[3] = -1; |
463 | mdata->irq[31] = -1; | 460 | mdata->irq[31] = -1; |
464 | mdata->paddr += binfo->bi_immr_base; | ||
465 | 461 | ||
466 | /* setup the board related information for the enet controllers */ | 462 | /* setup the board related information for the enet controllers */ |
467 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); | 463 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); |
468 | if (pdata) { | 464 | if (pdata) { |
469 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 465 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
470 | pdata->bus_id = GFAR_PHY_0; | 466 | pdata->bus_id = 0; |
467 | pdata->phy_id = 0; | ||
471 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 468 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
472 | } | 469 | } |
473 | 470 | ||
474 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); | 471 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); |
475 | if (pdata) { | 472 | if (pdata) { |
476 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 473 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
477 | pdata->bus_id = GFAR_PHY_1; | 474 | pdata->bus_id = 0; |
475 | pdata->phy_id = 1; | ||
478 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 476 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
479 | } | 477 | } |
480 | 478 | ||
481 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_eTSEC1); | 479 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_eTSEC1); |
482 | if (pdata) { | 480 | if (pdata) { |
483 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 481 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
484 | pdata->bus_id = GFAR_PHY_0; | 482 | pdata->bus_id = 0; |
483 | pdata->phy_id = 0; | ||
485 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 484 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
486 | } | 485 | } |
487 | 486 | ||
488 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_eTSEC2); | 487 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_eTSEC2); |
489 | if (pdata) { | 488 | if (pdata) { |
490 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 489 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
491 | pdata->bus_id = GFAR_PHY_1; | 490 | pdata->bus_id = 0; |
491 | pdata->phy_id = 1; | ||
492 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 492 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
493 | } | 493 | } |
494 | 494 | ||
diff --git a/arch/ppc/platforms/85xx/sbc8560.c b/arch/ppc/platforms/85xx/sbc8560.c index 45a5b81b4ed1..e777ba824aa9 100644 --- a/arch/ppc/platforms/85xx/sbc8560.c +++ b/arch/ppc/platforms/85xx/sbc8560.c | |||
@@ -91,9 +91,6 @@ sbc8560_early_serial_map(void) | |||
91 | } | 91 | } |
92 | #endif | 92 | #endif |
93 | 93 | ||
94 | static const char *GFAR_PHY_25 = "phy0:25"; | ||
95 | static const char *GFAR_PHY_26 = "phy0:26"; | ||
96 | |||
97 | /* ************************************************************************ | 94 | /* ************************************************************************ |
98 | * | 95 | * |
99 | * Setup the architecture | 96 | * Setup the architecture |
@@ -136,20 +133,21 @@ sbc8560_setup_arch(void) | |||
136 | mdata->irq[25] = MPC85xx_IRQ_EXT6; | 133 | mdata->irq[25] = MPC85xx_IRQ_EXT6; |
137 | mdata->irq[26] = MPC85xx_IRQ_EXT7; | 134 | mdata->irq[26] = MPC85xx_IRQ_EXT7; |
138 | mdata->irq[31] = -1; | 135 | mdata->irq[31] = -1; |
139 | mdata->paddr += binfo->bi_immr_base; | ||
140 | 136 | ||
141 | /* setup the board related information for the enet controllers */ | 137 | /* setup the board related information for the enet controllers */ |
142 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); | 138 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); |
143 | if (pdata) { | 139 | if (pdata) { |
144 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 140 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
145 | pdata->bus_id = GFAR_PHY_25; | 141 | pdata->bus_id = 0; |
142 | pdata->phy_id = 25; | ||
146 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 143 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
147 | } | 144 | } |
148 | 145 | ||
149 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); | 146 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); |
150 | if (pdata) { | 147 | if (pdata) { |
151 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 148 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
152 | pdata->bus_id = GFAR_PHY_26; | 149 | pdata->bus_id = 0; |
150 | pdata->phy_id = 26; | ||
153 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 151 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
154 | } | 152 | } |
155 | 153 | ||
diff --git a/arch/ppc/platforms/85xx/stx_gp3.c b/arch/ppc/platforms/85xx/stx_gp3.c index 15ce9d070634..061bb7cf2d9a 100644 --- a/arch/ppc/platforms/85xx/stx_gp3.c +++ b/arch/ppc/platforms/85xx/stx_gp3.c | |||
@@ -93,9 +93,6 @@ static u8 gp3_openpic_initsenses[] __initdata = { | |||
93 | 0x0, /* External 11: */ | 93 | 0x0, /* External 11: */ |
94 | }; | 94 | }; |
95 | 95 | ||
96 | static const char *GFAR_PHY_2 = "phy0:2"; | ||
97 | static const char *GFAR_PHY_4 = "phy0:4"; | ||
98 | |||
99 | /* | 96 | /* |
100 | * Setup the architecture | 97 | * Setup the architecture |
101 | */ | 98 | */ |
@@ -130,20 +127,21 @@ gp3_setup_arch(void) | |||
130 | mdata->irq[2] = MPC85xx_IRQ_EXT5; | 127 | mdata->irq[2] = MPC85xx_IRQ_EXT5; |
131 | mdata->irq[4] = MPC85xx_IRQ_EXT5; | 128 | mdata->irq[4] = MPC85xx_IRQ_EXT5; |
132 | mdata->irq[31] = -1; | 129 | mdata->irq[31] = -1; |
133 | mdata->paddr += binfo->bi_immr_base; | ||
134 | 130 | ||
135 | /* setup the board related information for the enet controllers */ | 131 | /* setup the board related information for the enet controllers */ |
136 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); | 132 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); |
137 | if (pdata) { | 133 | if (pdata) { |
138 | /* pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; */ | 134 | /* pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; */ |
139 | pdata->bus_id = GFAR_PHY_2; | 135 | pdata->bus_id = 0; |
136 | pdata->phy_id = 2; | ||
140 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 137 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
141 | } | 138 | } |
142 | 139 | ||
143 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); | 140 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); |
144 | if (pdata) { | 141 | if (pdata) { |
145 | /* pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; */ | 142 | /* pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; */ |
146 | pdata->bus_id = GFAR_PHY_4; | 143 | pdata->bus_id = 0; |
144 | pdata->phy_id = 4; | ||
147 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 145 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
148 | } | 146 | } |
149 | 147 | ||
diff --git a/arch/ppc/platforms/85xx/tqm85xx.c b/arch/ppc/platforms/85xx/tqm85xx.c index c6dfd8f0f9df..b436f4d0a3fa 100644 --- a/arch/ppc/platforms/85xx/tqm85xx.c +++ b/arch/ppc/platforms/85xx/tqm85xx.c | |||
@@ -91,12 +91,6 @@ static u_char tqm85xx_openpic_initsenses[] __initdata = { | |||
91 | 0x0, /* External 11: */ | 91 | 0x0, /* External 11: */ |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static const char *GFAR_PHY_0 = "phy0:2"; | ||
95 | static const char *GFAR_PHY_1 = "phy0:1"; | ||
96 | #ifdef CONFIG_MPC8540 | ||
97 | static const char *GFAR_PHY_3 = "phy0:3"; | ||
98 | #endif | ||
99 | |||
100 | /* ************************************************************************ | 94 | /* ************************************************************************ |
101 | * | 95 | * |
102 | * Setup the architecture | 96 | * Setup the architecture |
@@ -149,20 +143,21 @@ tqm85xx_setup_arch(void) | |||
149 | mdata->irq[2] = -1; | 143 | mdata->irq[2] = -1; |
150 | mdata->irq[3] = MPC85xx_IRQ_EXT8; | 144 | mdata->irq[3] = MPC85xx_IRQ_EXT8; |
151 | mdata->irq[31] = -1; | 145 | mdata->irq[31] = -1; |
152 | mdata->paddr += binfo->bi_immr_base; | ||
153 | 146 | ||
154 | /* setup the board related information for the enet controllers */ | 147 | /* setup the board related information for the enet controllers */ |
155 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); | 148 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); |
156 | if (pdata) { | 149 | if (pdata) { |
157 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 150 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
158 | pdata->bus_id = GFAR_PHY_0; | 151 | pdata->bus_id = 0; |
152 | pdata->phy_id = 2; | ||
159 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); | 153 | memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6); |
160 | } | 154 | } |
161 | 155 | ||
162 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); | 156 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2); |
163 | if (pdata) { | 157 | if (pdata) { |
164 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; | 158 | pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; |
165 | pdata->bus_id = GFAR_PHY_1; | 159 | pdata->bus_id = 0; |
160 | pdata->phy_id = 1; | ||
166 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); | 161 | memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6); |
167 | } | 162 | } |
168 | 163 | ||
@@ -170,7 +165,8 @@ tqm85xx_setup_arch(void) | |||
170 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_FEC); | 165 | pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_FEC); |
171 | if (pdata) { | 166 | if (pdata) { |
172 | pdata->board_flags = 0; | 167 | pdata->board_flags = 0; |
173 | pdata->bus_id = GFAR_PHY_3; | 168 | pdata->bus_id = 0; |
169 | pdata->phy_id = 3; | ||
174 | memcpy(pdata->mac_addr, binfo->bi_enet2addr, 6); | 170 | memcpy(pdata->mac_addr, binfo->bi_enet2addr, 6); |
175 | } | 171 | } |
176 | #endif | 172 | #endif |
diff --git a/arch/ppc/syslib/mpc83xx_devices.c b/arch/ppc/syslib/mpc83xx_devices.c index 847df4409982..f9b95de70e23 100644 --- a/arch/ppc/syslib/mpc83xx_devices.c +++ b/arch/ppc/syslib/mpc83xx_devices.c | |||
@@ -28,7 +28,6 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | struct gianfar_mdio_data mpc83xx_mdio_pdata = { | 30 | struct gianfar_mdio_data mpc83xx_mdio_pdata = { |
31 | .paddr = 0x24520, | ||
32 | }; | 31 | }; |
33 | 32 | ||
34 | static struct gianfar_platform_data mpc83xx_tsec1_pdata = { | 33 | static struct gianfar_platform_data mpc83xx_tsec1_pdata = { |
@@ -226,7 +225,14 @@ struct platform_device ppc_sys_platform_devices[] = { | |||
226 | .name = "fsl-gianfar_mdio", | 225 | .name = "fsl-gianfar_mdio", |
227 | .id = 0, | 226 | .id = 0, |
228 | .dev.platform_data = &mpc83xx_mdio_pdata, | 227 | .dev.platform_data = &mpc83xx_mdio_pdata, |
229 | .num_resources = 0, | 228 | .num_resources = 1, |
229 | .resource = (struct resource[]) { | ||
230 | { | ||
231 | .start = 0x24520, | ||
232 | .end = 0x2453f, | ||
233 | .flags = IORESOURCE_MEM, | ||
234 | }, | ||
235 | }, | ||
230 | }, | 236 | }, |
231 | }; | 237 | }; |
232 | 238 | ||
diff --git a/arch/ppc/syslib/mpc85xx_devices.c b/arch/ppc/syslib/mpc85xx_devices.c index 69949d255658..00e9b6ff2f6e 100644 --- a/arch/ppc/syslib/mpc85xx_devices.c +++ b/arch/ppc/syslib/mpc85xx_devices.c | |||
@@ -26,7 +26,6 @@ | |||
26 | * what CCSRBAR is, will get fixed up by mach_mpc85xx_fixup | 26 | * what CCSRBAR is, will get fixed up by mach_mpc85xx_fixup |
27 | */ | 27 | */ |
28 | struct gianfar_mdio_data mpc85xx_mdio_pdata = { | 28 | struct gianfar_mdio_data mpc85xx_mdio_pdata = { |
29 | .paddr = MPC85xx_MIIM_OFFSET, | ||
30 | }; | 29 | }; |
31 | 30 | ||
32 | static struct gianfar_platform_data mpc85xx_tsec1_pdata = { | 31 | static struct gianfar_platform_data mpc85xx_tsec1_pdata = { |
@@ -720,7 +719,14 @@ struct platform_device ppc_sys_platform_devices[] = { | |||
720 | .name = "fsl-gianfar_mdio", | 719 | .name = "fsl-gianfar_mdio", |
721 | .id = 0, | 720 | .id = 0, |
722 | .dev.platform_data = &mpc85xx_mdio_pdata, | 721 | .dev.platform_data = &mpc85xx_mdio_pdata, |
723 | .num_resources = 0, | 722 | .num_resources = 1, |
723 | .resource = (struct resource[]) { | ||
724 | { | ||
725 | .start = 0x24520, | ||
726 | .end = 0x2453f, | ||
727 | .flags = IORESOURCE_MEM, | ||
728 | }, | ||
729 | }, | ||
724 | }, | 730 | }, |
725 | }; | 731 | }; |
726 | 732 | ||
diff --git a/drivers/macintosh/macio-adb.c b/drivers/macintosh/macio-adb.c index cf6a6f2248ac..314fc0830d90 100644 --- a/drivers/macintosh/macio-adb.c +++ b/drivers/macintosh/macio-adb.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/irq.h> | 17 | #include <asm/irq.h> |
18 | #include <asm/system.h> | 18 | #include <asm/system.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/ioport.h> | ||
20 | 21 | ||
21 | struct preg { | 22 | struct preg { |
22 | unsigned char r; | 23 | unsigned char r; |
@@ -88,24 +89,26 @@ int macio_probe(void) | |||
88 | int macio_init(void) | 89 | int macio_init(void) |
89 | { | 90 | { |
90 | struct device_node *adbs; | 91 | struct device_node *adbs; |
92 | struct resource r; | ||
91 | 93 | ||
92 | adbs = find_compatible_devices("adb", "chrp,adb0"); | 94 | adbs = find_compatible_devices("adb", "chrp,adb0"); |
93 | if (adbs == 0) | 95 | if (adbs == 0) |
94 | return -ENXIO; | 96 | return -ENXIO; |
95 | 97 | ||
96 | #if 0 | 98 | #if 0 |
97 | { int i; | 99 | { int i = 0; |
98 | 100 | ||
99 | printk("macio_adb_init: node = %p, addrs =", adbs->node); | 101 | printk("macio_adb_init: node = %p, addrs =", adbs->node); |
100 | for (i = 0; i < adbs->n_addrs; ++i) | 102 | while(!of_address_to_resource(adbs, i, &r)) |
101 | printk(" %x(%x)", adbs->addrs[i].address, adbs->addrs[i].size); | 103 | printk(" %x(%x)", r.start, r.end - r.start); |
102 | printk(", intrs ="); | 104 | printk(", intrs ="); |
103 | for (i = 0; i < adbs->n_intrs; ++i) | 105 | for (i = 0; i < adbs->n_intrs; ++i) |
104 | printk(" %x", adbs->intrs[i].line); | 106 | printk(" %x", adbs->intrs[i].line); |
105 | printk("\n"); } | 107 | printk("\n"); } |
106 | #endif | 108 | #endif |
107 | 109 | if (of_address_to_resource(adbs, 0, &r)) | |
108 | adb = ioremap(adbs->addrs->address, sizeof(struct adb_regs)); | 110 | return -ENXIO; |
111 | adb = ioremap(r.start, sizeof(struct adb_regs)); | ||
109 | 112 | ||
110 | out_8(&adb->ctrl.r, 0); | 113 | out_8(&adb->ctrl.r, 0); |
111 | out_8(&adb->intr.r, 0); | 114 | out_8(&adb->intr.r, 0); |
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index fb117b74809e..9bdd077d6f55 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c | |||
@@ -81,6 +81,30 @@ void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop | |||
81 | __proc_device_tree_add_prop(pde, prop); | 81 | __proc_device_tree_add_prop(pde, prop); |
82 | } | 82 | } |
83 | 83 | ||
84 | void proc_device_tree_remove_prop(struct proc_dir_entry *pde, | ||
85 | struct property *prop) | ||
86 | { | ||
87 | remove_proc_entry(prop->name, pde); | ||
88 | } | ||
89 | |||
90 | void proc_device_tree_update_prop(struct proc_dir_entry *pde, | ||
91 | struct property *newprop, | ||
92 | struct property *oldprop) | ||
93 | { | ||
94 | struct proc_dir_entry *ent; | ||
95 | |||
96 | for (ent = pde->subdir; ent != NULL; ent = ent->next) | ||
97 | if (ent->data == oldprop) | ||
98 | break; | ||
99 | if (ent == NULL) { | ||
100 | printk(KERN_WARNING "device-tree: property \"%s\" " | ||
101 | " does not exist\n", oldprop->name); | ||
102 | } else { | ||
103 | ent->data = newprop; | ||
104 | ent->size = newprop->length; | ||
105 | } | ||
106 | } | ||
107 | |||
84 | /* | 108 | /* |
85 | * Process a node, adding entries for its children and its properties. | 109 | * Process a node, adding entries for its children and its properties. |
86 | */ | 110 | */ |
diff --git a/include/asm-powerpc/atomic.h b/include/asm-powerpc/atomic.h index 248f9aec959c..147a38dcc766 100644 --- a/include/asm-powerpc/atomic.h +++ b/include/asm-powerpc/atomic.h | |||
@@ -36,7 +36,7 @@ static __inline__ int atomic_add_return(int a, atomic_t *v) | |||
36 | int t; | 36 | int t; |
37 | 37 | ||
38 | __asm__ __volatile__( | 38 | __asm__ __volatile__( |
39 | EIEIO_ON_SMP | 39 | LWSYNC_ON_SMP |
40 | "1: lwarx %0,0,%2 # atomic_add_return\n\ | 40 | "1: lwarx %0,0,%2 # atomic_add_return\n\ |
41 | add %0,%1,%0\n" | 41 | add %0,%1,%0\n" |
42 | PPC405_ERR77(0,%2) | 42 | PPC405_ERR77(0,%2) |
@@ -72,7 +72,7 @@ static __inline__ int atomic_sub_return(int a, atomic_t *v) | |||
72 | int t; | 72 | int t; |
73 | 73 | ||
74 | __asm__ __volatile__( | 74 | __asm__ __volatile__( |
75 | EIEIO_ON_SMP | 75 | LWSYNC_ON_SMP |
76 | "1: lwarx %0,0,%2 # atomic_sub_return\n\ | 76 | "1: lwarx %0,0,%2 # atomic_sub_return\n\ |
77 | subf %0,%1,%0\n" | 77 | subf %0,%1,%0\n" |
78 | PPC405_ERR77(0,%2) | 78 | PPC405_ERR77(0,%2) |
@@ -106,7 +106,7 @@ static __inline__ int atomic_inc_return(atomic_t *v) | |||
106 | int t; | 106 | int t; |
107 | 107 | ||
108 | __asm__ __volatile__( | 108 | __asm__ __volatile__( |
109 | EIEIO_ON_SMP | 109 | LWSYNC_ON_SMP |
110 | "1: lwarx %0,0,%1 # atomic_inc_return\n\ | 110 | "1: lwarx %0,0,%1 # atomic_inc_return\n\ |
111 | addic %0,%0,1\n" | 111 | addic %0,%0,1\n" |
112 | PPC405_ERR77(0,%1) | 112 | PPC405_ERR77(0,%1) |
@@ -150,7 +150,7 @@ static __inline__ int atomic_dec_return(atomic_t *v) | |||
150 | int t; | 150 | int t; |
151 | 151 | ||
152 | __asm__ __volatile__( | 152 | __asm__ __volatile__( |
153 | EIEIO_ON_SMP | 153 | LWSYNC_ON_SMP |
154 | "1: lwarx %0,0,%1 # atomic_dec_return\n\ | 154 | "1: lwarx %0,0,%1 # atomic_dec_return\n\ |
155 | addic %0,%0,-1\n" | 155 | addic %0,%0,-1\n" |
156 | PPC405_ERR77(0,%1) | 156 | PPC405_ERR77(0,%1) |
@@ -176,19 +176,19 @@ static __inline__ int atomic_dec_return(atomic_t *v) | |||
176 | * Atomically adds @a to @v, so long as it was not @u. | 176 | * Atomically adds @a to @v, so long as it was not @u. |
177 | * Returns non-zero if @v was not @u, and zero otherwise. | 177 | * Returns non-zero if @v was not @u, and zero otherwise. |
178 | */ | 178 | */ |
179 | #define atomic_add_unless(v, a, u) \ | 179 | #define atomic_add_unless(v, a, u) \ |
180 | ({ \ | 180 | ({ \ |
181 | int c, old; \ | 181 | int c, old; \ |
182 | c = atomic_read(v); \ | 182 | c = atomic_read(v); \ |
183 | for (;;) { \ | 183 | for (;;) { \ |
184 | if (unlikely(c == (u))) \ | 184 | if (unlikely(c == (u))) \ |
185 | break; \ | 185 | break; \ |
186 | old = atomic_cmpxchg((v), c, c + (a)); \ | 186 | old = atomic_cmpxchg((v), c, c + (a)); \ |
187 | if (likely(old == c)) \ | 187 | if (likely(old == c)) \ |
188 | break; \ | 188 | break; \ |
189 | c = old; \ | 189 | c = old; \ |
190 | } \ | 190 | } \ |
191 | c != (u); \ | 191 | c != (u); \ |
192 | }) | 192 | }) |
193 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 193 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
194 | 194 | ||
@@ -204,7 +204,7 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v) | |||
204 | int t; | 204 | int t; |
205 | 205 | ||
206 | __asm__ __volatile__( | 206 | __asm__ __volatile__( |
207 | EIEIO_ON_SMP | 207 | LWSYNC_ON_SMP |
208 | "1: lwarx %0,0,%1 # atomic_dec_if_positive\n\ | 208 | "1: lwarx %0,0,%1 # atomic_dec_if_positive\n\ |
209 | addic. %0,%0,-1\n\ | 209 | addic. %0,%0,-1\n\ |
210 | blt- 2f\n" | 210 | blt- 2f\n" |
@@ -253,7 +253,7 @@ static __inline__ long atomic64_add_return(long a, atomic64_t *v) | |||
253 | long t; | 253 | long t; |
254 | 254 | ||
255 | __asm__ __volatile__( | 255 | __asm__ __volatile__( |
256 | EIEIO_ON_SMP | 256 | LWSYNC_ON_SMP |
257 | "1: ldarx %0,0,%2 # atomic64_add_return\n\ | 257 | "1: ldarx %0,0,%2 # atomic64_add_return\n\ |
258 | add %0,%1,%0\n\ | 258 | add %0,%1,%0\n\ |
259 | stdcx. %0,0,%2 \n\ | 259 | stdcx. %0,0,%2 \n\ |
@@ -287,7 +287,7 @@ static __inline__ long atomic64_sub_return(long a, atomic64_t *v) | |||
287 | long t; | 287 | long t; |
288 | 288 | ||
289 | __asm__ __volatile__( | 289 | __asm__ __volatile__( |
290 | EIEIO_ON_SMP | 290 | LWSYNC_ON_SMP |
291 | "1: ldarx %0,0,%2 # atomic64_sub_return\n\ | 291 | "1: ldarx %0,0,%2 # atomic64_sub_return\n\ |
292 | subf %0,%1,%0\n\ | 292 | subf %0,%1,%0\n\ |
293 | stdcx. %0,0,%2 \n\ | 293 | stdcx. %0,0,%2 \n\ |
@@ -319,7 +319,7 @@ static __inline__ long atomic64_inc_return(atomic64_t *v) | |||
319 | long t; | 319 | long t; |
320 | 320 | ||
321 | __asm__ __volatile__( | 321 | __asm__ __volatile__( |
322 | EIEIO_ON_SMP | 322 | LWSYNC_ON_SMP |
323 | "1: ldarx %0,0,%1 # atomic64_inc_return\n\ | 323 | "1: ldarx %0,0,%1 # atomic64_inc_return\n\ |
324 | addic %0,%0,1\n\ | 324 | addic %0,%0,1\n\ |
325 | stdcx. %0,0,%1 \n\ | 325 | stdcx. %0,0,%1 \n\ |
@@ -361,7 +361,7 @@ static __inline__ long atomic64_dec_return(atomic64_t *v) | |||
361 | long t; | 361 | long t; |
362 | 362 | ||
363 | __asm__ __volatile__( | 363 | __asm__ __volatile__( |
364 | EIEIO_ON_SMP | 364 | LWSYNC_ON_SMP |
365 | "1: ldarx %0,0,%1 # atomic64_dec_return\n\ | 365 | "1: ldarx %0,0,%1 # atomic64_dec_return\n\ |
366 | addic %0,%0,-1\n\ | 366 | addic %0,%0,-1\n\ |
367 | stdcx. %0,0,%1\n\ | 367 | stdcx. %0,0,%1\n\ |
@@ -386,7 +386,7 @@ static __inline__ long atomic64_dec_if_positive(atomic64_t *v) | |||
386 | long t; | 386 | long t; |
387 | 387 | ||
388 | __asm__ __volatile__( | 388 | __asm__ __volatile__( |
389 | EIEIO_ON_SMP | 389 | LWSYNC_ON_SMP |
390 | "1: ldarx %0,0,%1 # atomic64_dec_if_positive\n\ | 390 | "1: ldarx %0,0,%1 # atomic64_dec_if_positive\n\ |
391 | addic. %0,%0,-1\n\ | 391 | addic. %0,%0,-1\n\ |
392 | blt- 2f\n\ | 392 | blt- 2f\n\ |
diff --git a/include/asm-powerpc/bitops.h b/include/asm-powerpc/bitops.h index 1996eaa8aeae..bf6941a810b8 100644 --- a/include/asm-powerpc/bitops.h +++ b/include/asm-powerpc/bitops.h | |||
@@ -112,7 +112,7 @@ static __inline__ int test_and_set_bit(unsigned long nr, | |||
112 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | 112 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); |
113 | 113 | ||
114 | __asm__ __volatile__( | 114 | __asm__ __volatile__( |
115 | EIEIO_ON_SMP | 115 | LWSYNC_ON_SMP |
116 | "1:" PPC_LLARX "%0,0,%3 # test_and_set_bit\n" | 116 | "1:" PPC_LLARX "%0,0,%3 # test_and_set_bit\n" |
117 | "or %1,%0,%2 \n" | 117 | "or %1,%0,%2 \n" |
118 | PPC405_ERR77(0,%3) | 118 | PPC405_ERR77(0,%3) |
@@ -134,7 +134,7 @@ static __inline__ int test_and_clear_bit(unsigned long nr, | |||
134 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | 134 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); |
135 | 135 | ||
136 | __asm__ __volatile__( | 136 | __asm__ __volatile__( |
137 | EIEIO_ON_SMP | 137 | LWSYNC_ON_SMP |
138 | "1:" PPC_LLARX "%0,0,%3 # test_and_clear_bit\n" | 138 | "1:" PPC_LLARX "%0,0,%3 # test_and_clear_bit\n" |
139 | "andc %1,%0,%2 \n" | 139 | "andc %1,%0,%2 \n" |
140 | PPC405_ERR77(0,%3) | 140 | PPC405_ERR77(0,%3) |
@@ -156,7 +156,7 @@ static __inline__ int test_and_change_bit(unsigned long nr, | |||
156 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | 156 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); |
157 | 157 | ||
158 | __asm__ __volatile__( | 158 | __asm__ __volatile__( |
159 | EIEIO_ON_SMP | 159 | LWSYNC_ON_SMP |
160 | "1:" PPC_LLARX "%0,0,%3 # test_and_change_bit\n" | 160 | "1:" PPC_LLARX "%0,0,%3 # test_and_change_bit\n" |
161 | "xor %1,%0,%2 \n" | 161 | "xor %1,%0,%2 \n" |
162 | PPC405_ERR77(0,%3) | 162 | PPC405_ERR77(0,%3) |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index ef6ead34a773..64210549f56b 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #define PPC_FEATURE_POWER5 0x00040000 | 19 | #define PPC_FEATURE_POWER5 0x00040000 |
20 | #define PPC_FEATURE_POWER5_PLUS 0x00020000 | 20 | #define PPC_FEATURE_POWER5_PLUS 0x00020000 |
21 | #define PPC_FEATURE_CELL 0x00010000 | 21 | #define PPC_FEATURE_CELL 0x00010000 |
22 | #define PPC_FEATURE_BOOKE 0x00008000 | ||
22 | 23 | ||
23 | #ifdef __KERNEL__ | 24 | #ifdef __KERNEL__ |
24 | #ifndef __ASSEMBLY__ | 25 | #ifndef __ASSEMBLY__ |
@@ -31,11 +32,11 @@ struct cpu_spec; | |||
31 | typedef void (*cpu_setup_t)(unsigned long offset, struct cpu_spec* spec); | 32 | typedef void (*cpu_setup_t)(unsigned long offset, struct cpu_spec* spec); |
32 | 33 | ||
33 | enum powerpc_oprofile_type { | 34 | enum powerpc_oprofile_type { |
34 | INVALID = 0, | 35 | PPC_OPROFILE_INVALID = 0, |
35 | RS64 = 1, | 36 | PPC_OPROFILE_RS64 = 1, |
36 | POWER4 = 2, | 37 | PPC_OPROFILE_POWER4 = 2, |
37 | G4 = 3, | 38 | PPC_OPROFILE_G4 = 3, |
38 | BOOKE = 4, | 39 | PPC_OPROFILE_BOOKE = 4, |
39 | }; | 40 | }; |
40 | 41 | ||
41 | struct cpu_spec { | 42 | struct cpu_spec { |
@@ -64,6 +65,9 @@ struct cpu_spec { | |||
64 | 65 | ||
65 | /* Processor specific oprofile operations */ | 66 | /* Processor specific oprofile operations */ |
66 | enum powerpc_oprofile_type oprofile_type; | 67 | enum powerpc_oprofile_type oprofile_type; |
68 | |||
69 | /* Name of processor class, for the ELF AT_PLATFORM entry */ | ||
70 | char *platform; | ||
67 | }; | 71 | }; |
68 | 72 | ||
69 | extern struct cpu_spec *cur_cpu_spec; | 73 | extern struct cpu_spec *cur_cpu_spec; |
diff --git a/include/asm-powerpc/elf.h b/include/asm-powerpc/elf.h index 45f2af6f89c4..94d228f9c6ac 100644 --- a/include/asm-powerpc/elf.h +++ b/include/asm-powerpc/elf.h | |||
@@ -221,20 +221,18 @@ extern int dump_task_fpu(struct task_struct *, elf_fpregset_t *); | |||
221 | instruction set this cpu supports. This could be done in userspace, | 221 | instruction set this cpu supports. This could be done in userspace, |
222 | but it's not easy, and we've already done it here. */ | 222 | but it's not easy, and we've already done it here. */ |
223 | # define ELF_HWCAP (cur_cpu_spec->cpu_user_features) | 223 | # define ELF_HWCAP (cur_cpu_spec->cpu_user_features) |
224 | #ifdef __powerpc64__ | ||
225 | # define ELF_PLAT_INIT(_r, load_addr) do { \ | ||
226 | _r->gpr[2] = load_addr; \ | ||
227 | } while (0) | ||
228 | #endif /* __powerpc64__ */ | ||
229 | 224 | ||
230 | /* This yields a string that ld.so will use to load implementation | 225 | /* This yields a string that ld.so will use to load implementation |
231 | specific libraries for optimization. This is more specific in | 226 | specific libraries for optimization. This is more specific in |
232 | intent than poking at uname or /proc/cpuinfo. | 227 | intent than poking at uname or /proc/cpuinfo. */ |
233 | 228 | ||
234 | For the moment, we have only optimizations for the Intel generations, | 229 | #define ELF_PLATFORM (cur_cpu_spec->platform) |
235 | but that could change... */ | ||
236 | 230 | ||
237 | #define ELF_PLATFORM (NULL) | 231 | #ifdef __powerpc64__ |
232 | # define ELF_PLAT_INIT(_r, load_addr) do { \ | ||
233 | _r->gpr[2] = load_addr; \ | ||
234 | } while (0) | ||
235 | #endif /* __powerpc64__ */ | ||
238 | 236 | ||
239 | #ifdef __KERNEL__ | 237 | #ifdef __KERNEL__ |
240 | 238 | ||
diff --git a/include/asm-powerpc/futex.h b/include/asm-powerpc/futex.h index f0319d50b129..39e85f320a76 100644 --- a/include/asm-powerpc/futex.h +++ b/include/asm-powerpc/futex.h | |||
@@ -11,7 +11,7 @@ | |||
11 | 11 | ||
12 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | 12 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ |
13 | __asm__ __volatile ( \ | 13 | __asm__ __volatile ( \ |
14 | SYNC_ON_SMP \ | 14 | LWSYNC_ON_SMP \ |
15 | "1: lwarx %0,0,%2\n" \ | 15 | "1: lwarx %0,0,%2\n" \ |
16 | insn \ | 16 | insn \ |
17 | PPC405_ERR77(0, %2) \ | 17 | PPC405_ERR77(0, %2) \ |
diff --git a/include/asm-powerpc/hvcall.h b/include/asm-powerpc/hvcall.h index da7af5a720e0..38ca9ad6110d 100644 --- a/include/asm-powerpc/hvcall.h +++ b/include/asm-powerpc/hvcall.h | |||
@@ -6,7 +6,10 @@ | |||
6 | 6 | ||
7 | #define H_Success 0 | 7 | #define H_Success 0 |
8 | #define H_Busy 1 /* Hardware busy -- retry later */ | 8 | #define H_Busy 1 /* Hardware busy -- retry later */ |
9 | #define H_Closed 2 /* Resource closed */ | ||
9 | #define H_Constrained 4 /* Resource request constrained to max allowed */ | 10 | #define H_Constrained 4 /* Resource request constrained to max allowed */ |
11 | #define H_InProgress 14 /* Kind of like busy */ | ||
12 | #define H_Continue 18 /* Returned from H_Join on success */ | ||
10 | #define H_LongBusyStartRange 9900 /* Start of long busy range */ | 13 | #define H_LongBusyStartRange 9900 /* Start of long busy range */ |
11 | #define H_LongBusyOrder1msec 9900 /* Long busy, hint that 1msec is a good time to retry */ | 14 | #define H_LongBusyOrder1msec 9900 /* Long busy, hint that 1msec is a good time to retry */ |
12 | #define H_LongBusyOrder10msec 9901 /* Long busy, hint that 10msec is a good time to retry */ | 15 | #define H_LongBusyOrder10msec 9901 /* Long busy, hint that 10msec is a good time to retry */ |
@@ -114,6 +117,8 @@ | |||
114 | #define H_REGISTER_VTERM 0x154 | 117 | #define H_REGISTER_VTERM 0x154 |
115 | #define H_FREE_VTERM 0x158 | 118 | #define H_FREE_VTERM 0x158 |
116 | #define H_POLL_PENDING 0x1D8 | 119 | #define H_POLL_PENDING 0x1D8 |
120 | #define H_JOIN 0x298 | ||
121 | #define H_ENABLE_CRQ 0x2B0 | ||
117 | 122 | ||
118 | #ifndef __ASSEMBLY__ | 123 | #ifndef __ASSEMBLY__ |
119 | 124 | ||
diff --git a/include/asm-powerpc/lppaca.h b/include/asm-powerpc/lppaca.h index ff82ea7c4829..cd9f11f1ef14 100644 --- a/include/asm-powerpc/lppaca.h +++ b/include/asm-powerpc/lppaca.h | |||
@@ -29,7 +29,9 @@ | |||
29 | //---------------------------------------------------------------------------- | 29 | //---------------------------------------------------------------------------- |
30 | #include <asm/types.h> | 30 | #include <asm/types.h> |
31 | 31 | ||
32 | struct lppaca { | 32 | /* The Hypervisor barfs if the lppaca crosses a page boundary. A 1k |
33 | * alignment is sufficient to prevent this */ | ||
34 | struct __attribute__((__aligned__(0x400))) lppaca { | ||
33 | //============================================================================= | 35 | //============================================================================= |
34 | // CACHE_LINE_1 0x0000 - 0x007F Contains read-only data | 36 | // CACHE_LINE_1 0x0000 - 0x007F Contains read-only data |
35 | // NOTE: The xDynXyz fields are fields that will be dynamically changed by | 37 | // NOTE: The xDynXyz fields are fields that will be dynamically changed by |
@@ -129,5 +131,7 @@ struct lppaca { | |||
129 | u8 pmc_save_area[256]; // PMC interrupt Area x00-xFF | 131 | u8 pmc_save_area[256]; // PMC interrupt Area x00-xFF |
130 | }; | 132 | }; |
131 | 133 | ||
134 | extern struct lppaca lppaca[]; | ||
135 | |||
132 | #endif /* __KERNEL__ */ | 136 | #endif /* __KERNEL__ */ |
133 | #endif /* _ASM_POWERPC_LPPACA_H */ | 137 | #endif /* _ASM_POWERPC_LPPACA_H */ |
diff --git a/include/asm-powerpc/paca.h b/include/asm-powerpc/paca.h index a64b4d425dab..c9add8f1ad94 100644 --- a/include/asm-powerpc/paca.h +++ b/include/asm-powerpc/paca.h | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | register struct paca_struct *local_paca asm("r13"); | 24 | register struct paca_struct *local_paca asm("r13"); |
25 | #define get_paca() local_paca | 25 | #define get_paca() local_paca |
26 | #define get_lppaca() (get_paca()->lppaca_ptr) | ||
26 | 27 | ||
27 | struct task_struct; | 28 | struct task_struct; |
28 | 29 | ||
@@ -95,19 +96,6 @@ struct paca_struct { | |||
95 | u64 saved_r1; /* r1 save for RTAS calls */ | 96 | u64 saved_r1; /* r1 save for RTAS calls */ |
96 | u64 saved_msr; /* MSR saved here by enter_rtas */ | 97 | u64 saved_msr; /* MSR saved here by enter_rtas */ |
97 | u8 proc_enabled; /* irq soft-enable flag */ | 98 | u8 proc_enabled; /* irq soft-enable flag */ |
98 | |||
99 | /* | ||
100 | * iSeries structure which the hypervisor knows about - | ||
101 | * this structure should not cross a page boundary. | ||
102 | * The vpa_init/register_vpa call is now known to fail if the | ||
103 | * lppaca structure crosses a page boundary. | ||
104 | * The lppaca is also used on POWER5 pSeries boxes. | ||
105 | * The lppaca is 640 bytes long, and cannot readily change | ||
106 | * since the hypervisor knows its layout, so a 1kB | ||
107 | * alignment will suffice to ensure that it doesn't | ||
108 | * cross a page boundary. | ||
109 | */ | ||
110 | struct lppaca lppaca __attribute__((__aligned__(0x400))); | ||
111 | }; | 99 | }; |
112 | 100 | ||
113 | extern struct paca_struct paca[]; | 101 | extern struct paca_struct paca[]; |
diff --git a/include/asm-powerpc/ppc_asm.h b/include/asm-powerpc/ppc_asm.h index 0dc798d46ea4..ab8688d39024 100644 --- a/include/asm-powerpc/ppc_asm.h +++ b/include/asm-powerpc/ppc_asm.h | |||
@@ -156,52 +156,56 @@ n: | |||
156 | #endif | 156 | #endif |
157 | 157 | ||
158 | /* | 158 | /* |
159 | * LOADADDR( rn, name ) | 159 | * LOAD_REG_IMMEDIATE(rn, expr) |
160 | * loads the address of 'name' into 'rn' | 160 | * Loads the value of the constant expression 'expr' into register 'rn' |
161 | * using immediate instructions only. Use this when it's important not | ||
162 | * to reference other data (i.e. on ppc64 when the TOC pointer is not | ||
163 | * valid). | ||
161 | * | 164 | * |
162 | * LOADBASE( rn, name ) | 165 | * LOAD_REG_ADDR(rn, name) |
163 | * loads the address (possibly without the low 16 bits) of 'name' into 'rn' | 166 | * Loads the address of label 'name' into register 'rn'. Use this when |
164 | * suitable for base+disp addressing | 167 | * you don't particularly need immediate instructions only, but you need |
168 | * the whole address in one register (e.g. it's a structure address and | ||
169 | * you want to access various offsets within it). On ppc32 this is | ||
170 | * identical to LOAD_REG_IMMEDIATE. | ||
171 | * | ||
172 | * LOAD_REG_ADDRBASE(rn, name) | ||
173 | * ADDROFF(name) | ||
174 | * LOAD_REG_ADDRBASE loads part of the address of label 'name' into | ||
175 | * register 'rn'. ADDROFF(name) returns the remainder of the address as | ||
176 | * a constant expression. ADDROFF(name) is a signed expression < 16 bits | ||
177 | * in size, so is suitable for use directly as an offset in load and store | ||
178 | * instructions. Use this when loading/storing a single word or less as: | ||
179 | * LOAD_REG_ADDRBASE(rX, name) | ||
180 | * ld rY,ADDROFF(name)(rX) | ||
165 | */ | 181 | */ |
166 | #ifdef __powerpc64__ | 182 | #ifdef __powerpc64__ |
167 | #define LOADADDR(rn,name) \ | 183 | #define LOAD_REG_IMMEDIATE(reg,expr) \ |
168 | lis rn,name##@highest; \ | 184 | lis (reg),(expr)@highest; \ |
169 | ori rn,rn,name##@higher; \ | 185 | ori (reg),(reg),(expr)@higher; \ |
170 | rldicr rn,rn,32,31; \ | 186 | rldicr (reg),(reg),32,31; \ |
171 | oris rn,rn,name##@h; \ | 187 | oris (reg),(reg),(expr)@h; \ |
172 | ori rn,rn,name##@l | 188 | ori (reg),(reg),(expr)@l; |
173 | 189 | ||
174 | #define LOADBASE(rn,name) \ | 190 | #define LOAD_REG_ADDR(reg,name) \ |
175 | ld rn,name@got(r2) | 191 | ld (reg),name@got(r2) |
176 | 192 | ||
177 | #define OFF(name) 0 | 193 | #define LOAD_REG_ADDRBASE(reg,name) LOAD_REG_ADDR(reg,name) |
178 | 194 | #define ADDROFF(name) 0 | |
179 | #define SET_REG_TO_CONST(reg, value) \ | ||
180 | lis reg,(((value)>>48)&0xFFFF); \ | ||
181 | ori reg,reg,(((value)>>32)&0xFFFF); \ | ||
182 | rldicr reg,reg,32,31; \ | ||
183 | oris reg,reg,(((value)>>16)&0xFFFF); \ | ||
184 | ori reg,reg,((value)&0xFFFF); | ||
185 | |||
186 | #define SET_REG_TO_LABEL(reg, label) \ | ||
187 | lis reg,(label)@highest; \ | ||
188 | ori reg,reg,(label)@higher; \ | ||
189 | rldicr reg,reg,32,31; \ | ||
190 | oris reg,reg,(label)@h; \ | ||
191 | ori reg,reg,(label)@l; | ||
192 | 195 | ||
193 | /* offsets for stack frame layout */ | 196 | /* offsets for stack frame layout */ |
194 | #define LRSAVE 16 | 197 | #define LRSAVE 16 |
195 | 198 | ||
196 | #else /* 32-bit */ | 199 | #else /* 32-bit */ |
197 | #define LOADADDR(rn,name) \ | ||
198 | lis rn,name@ha; \ | ||
199 | addi rn,rn,name@l | ||
200 | 200 | ||
201 | #define LOADBASE(rn,name) \ | 201 | #define LOAD_REG_IMMEDIATE(reg,expr) \ |
202 | lis rn,name@ha | 202 | lis (reg),(expr)@ha; \ |
203 | addi (reg),(reg),(expr)@l; | ||
204 | |||
205 | #define LOAD_REG_ADDR(reg,name) LOAD_REG_IMMEDIATE(reg, name) | ||
203 | 206 | ||
204 | #define OFF(name) name@l | 207 | #define LOAD_REG_ADDRBASE(reg, name) lis (reg),name@ha |
208 | #define ADDROFF(name) name@l | ||
205 | 209 | ||
206 | /* offsets for stack frame layout */ | 210 | /* offsets for stack frame layout */ |
207 | #define LRSAVE 4 | 211 | #define LRSAVE 4 |
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h index 329e9bf62260..5b2bd4eefb01 100644 --- a/include/asm-powerpc/prom.h +++ b/include/asm-powerpc/prom.h | |||
@@ -87,6 +87,7 @@ struct device_node { | |||
87 | char *full_name; | 87 | char *full_name; |
88 | 88 | ||
89 | struct property *properties; | 89 | struct property *properties; |
90 | struct property *deadprops; /* removed properties */ | ||
90 | struct device_node *parent; | 91 | struct device_node *parent; |
91 | struct device_node *child; | 92 | struct device_node *child; |
92 | struct device_node *sibling; | 93 | struct device_node *sibling; |
@@ -135,6 +136,9 @@ extern struct device_node *of_find_all_nodes(struct device_node *prev); | |||
135 | extern struct device_node *of_get_parent(const struct device_node *node); | 136 | extern struct device_node *of_get_parent(const struct device_node *node); |
136 | extern struct device_node *of_get_next_child(const struct device_node *node, | 137 | extern struct device_node *of_get_next_child(const struct device_node *node, |
137 | struct device_node *prev); | 138 | struct device_node *prev); |
139 | extern struct property *of_find_property(struct device_node *np, | ||
140 | const char *name, | ||
141 | int *lenp); | ||
138 | extern struct device_node *of_node_get(struct device_node *node); | 142 | extern struct device_node *of_node_get(struct device_node *node); |
139 | extern void of_node_put(struct device_node *node); | 143 | extern void of_node_put(struct device_node *node); |
140 | 144 | ||
@@ -164,6 +168,10 @@ extern int prom_n_size_cells(struct device_node* np); | |||
164 | extern int prom_n_intr_cells(struct device_node* np); | 168 | extern int prom_n_intr_cells(struct device_node* np); |
165 | extern void prom_get_irq_senses(unsigned char *senses, int off, int max); | 169 | extern void prom_get_irq_senses(unsigned char *senses, int off, int max); |
166 | extern int prom_add_property(struct device_node* np, struct property* prop); | 170 | extern int prom_add_property(struct device_node* np, struct property* prop); |
171 | extern int prom_remove_property(struct device_node *np, struct property *prop); | ||
172 | extern int prom_update_property(struct device_node *np, | ||
173 | struct property *newprop, | ||
174 | struct property *oldprop); | ||
167 | 175 | ||
168 | #ifdef CONFIG_PPC32 | 176 | #ifdef CONFIG_PPC32 |
169 | /* | 177 | /* |
diff --git a/include/asm-powerpc/spinlock.h b/include/asm-powerpc/spinlock.h index 754900901cd8..895cb6d3a42a 100644 --- a/include/asm-powerpc/spinlock.h +++ b/include/asm-powerpc/spinlock.h | |||
@@ -46,7 +46,7 @@ static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock) | |||
46 | 46 | ||
47 | token = LOCK_TOKEN; | 47 | token = LOCK_TOKEN; |
48 | __asm__ __volatile__( | 48 | __asm__ __volatile__( |
49 | "1: lwarx %0,0,%2 # __spin_trylock\n\ | 49 | "1: lwarx %0,0,%2\n\ |
50 | cmpwi 0,%0,0\n\ | 50 | cmpwi 0,%0,0\n\ |
51 | bne- 2f\n\ | 51 | bne- 2f\n\ |
52 | stwcx. %1,0,%2\n\ | 52 | stwcx. %1,0,%2\n\ |
@@ -80,7 +80,7 @@ static int __inline__ __raw_spin_trylock(raw_spinlock_t *lock) | |||
80 | 80 | ||
81 | #if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES) | 81 | #if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES) |
82 | /* We only yield to the hypervisor if we are in shared processor mode */ | 82 | /* We only yield to the hypervisor if we are in shared processor mode */ |
83 | #define SHARED_PROCESSOR (get_paca()->lppaca.shared_proc) | 83 | #define SHARED_PROCESSOR (get_lppaca()->shared_proc) |
84 | extern void __spin_yield(raw_spinlock_t *lock); | 84 | extern void __spin_yield(raw_spinlock_t *lock); |
85 | extern void __rw_yield(raw_rwlock_t *lock); | 85 | extern void __rw_yield(raw_rwlock_t *lock); |
86 | #else /* SPLPAR || ISERIES */ | 86 | #else /* SPLPAR || ISERIES */ |
@@ -124,8 +124,8 @@ static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long | |||
124 | 124 | ||
125 | static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) | 125 | static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) |
126 | { | 126 | { |
127 | __asm__ __volatile__(SYNC_ON_SMP" # __raw_spin_unlock" | 127 | __asm__ __volatile__("# __raw_spin_unlock\n\t" |
128 | : : :"memory"); | 128 | LWSYNC_ON_SMP: : :"memory"); |
129 | lock->slock = 0; | 129 | lock->slock = 0; |
130 | } | 130 | } |
131 | 131 | ||
@@ -167,7 +167,7 @@ static long __inline__ __read_trylock(raw_rwlock_t *rw) | |||
167 | long tmp; | 167 | long tmp; |
168 | 168 | ||
169 | __asm__ __volatile__( | 169 | __asm__ __volatile__( |
170 | "1: lwarx %0,0,%1 # read_trylock\n" | 170 | "1: lwarx %0,0,%1\n" |
171 | __DO_SIGN_EXTEND | 171 | __DO_SIGN_EXTEND |
172 | " addic. %0,%0,1\n\ | 172 | " addic. %0,%0,1\n\ |
173 | ble- 2f\n" | 173 | ble- 2f\n" |
@@ -192,7 +192,7 @@ static __inline__ long __write_trylock(raw_rwlock_t *rw) | |||
192 | 192 | ||
193 | token = WRLOCK_TOKEN; | 193 | token = WRLOCK_TOKEN; |
194 | __asm__ __volatile__( | 194 | __asm__ __volatile__( |
195 | "1: lwarx %0,0,%2 # write_trylock\n\ | 195 | "1: lwarx %0,0,%2\n\ |
196 | cmpwi 0,%0,0\n\ | 196 | cmpwi 0,%0,0\n\ |
197 | bne- 2f\n" | 197 | bne- 2f\n" |
198 | PPC405_ERR77(0,%1) | 198 | PPC405_ERR77(0,%1) |
@@ -249,8 +249,9 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw) | |||
249 | long tmp; | 249 | long tmp; |
250 | 250 | ||
251 | __asm__ __volatile__( | 251 | __asm__ __volatile__( |
252 | "eieio # read_unlock\n\ | 252 | "# read_unlock\n\t" |
253 | 1: lwarx %0,0,%1\n\ | 253 | LWSYNC_ON_SMP |
254 | "1: lwarx %0,0,%1\n\ | ||
254 | addic %0,%0,-1\n" | 255 | addic %0,%0,-1\n" |
255 | PPC405_ERR77(0,%1) | 256 | PPC405_ERR77(0,%1) |
256 | " stwcx. %0,0,%1\n\ | 257 | " stwcx. %0,0,%1\n\ |
@@ -262,8 +263,8 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw) | |||
262 | 263 | ||
263 | static __inline__ void __raw_write_unlock(raw_rwlock_t *rw) | 264 | static __inline__ void __raw_write_unlock(raw_rwlock_t *rw) |
264 | { | 265 | { |
265 | __asm__ __volatile__(SYNC_ON_SMP" # write_unlock" | 266 | __asm__ __volatile__("# write_unlock\n\t" |
266 | : : :"memory"); | 267 | LWSYNC_ON_SMP: : :"memory"); |
267 | rw->lock = 0; | 268 | rw->lock = 0; |
268 | } | 269 | } |
269 | 270 | ||
diff --git a/include/asm-powerpc/synch.h b/include/asm-powerpc/synch.h index 794870ab8fd3..c90d9d9aae72 100644 --- a/include/asm-powerpc/synch.h +++ b/include/asm-powerpc/synch.h | |||
@@ -2,6 +2,8 @@ | |||
2 | #define _ASM_POWERPC_SYNCH_H | 2 | #define _ASM_POWERPC_SYNCH_H |
3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
4 | 4 | ||
5 | #include <linux/stringify.h> | ||
6 | |||
5 | #ifdef __powerpc64__ | 7 | #ifdef __powerpc64__ |
6 | #define __SUBARCH_HAS_LWSYNC | 8 | #define __SUBARCH_HAS_LWSYNC |
7 | #endif | 9 | #endif |
@@ -12,20 +14,12 @@ | |||
12 | # define LWSYNC sync | 14 | # define LWSYNC sync |
13 | #endif | 15 | #endif |
14 | 16 | ||
15 | |||
16 | /* | ||
17 | * Arguably the bitops and *xchg operations don't imply any memory barrier | ||
18 | * or SMP ordering, but in fact a lot of drivers expect them to imply | ||
19 | * both, since they do on x86 cpus. | ||
20 | */ | ||
21 | #ifdef CONFIG_SMP | 17 | #ifdef CONFIG_SMP |
22 | #define EIEIO_ON_SMP "eieio\n" | ||
23 | #define ISYNC_ON_SMP "\n\tisync" | 18 | #define ISYNC_ON_SMP "\n\tisync" |
24 | #define SYNC_ON_SMP __stringify(LWSYNC) "\n" | 19 | #define LWSYNC_ON_SMP __stringify(LWSYNC) "\n" |
25 | #else | 20 | #else |
26 | #define EIEIO_ON_SMP | ||
27 | #define ISYNC_ON_SMP | 21 | #define ISYNC_ON_SMP |
28 | #define SYNC_ON_SMP | 22 | #define LWSYNC_ON_SMP |
29 | #endif | 23 | #endif |
30 | 24 | ||
31 | static inline void eieio(void) | 25 | static inline void eieio(void) |
@@ -38,14 +32,5 @@ static inline void isync(void) | |||
38 | __asm__ __volatile__ ("isync" : : : "memory"); | 32 | __asm__ __volatile__ ("isync" : : : "memory"); |
39 | } | 33 | } |
40 | 34 | ||
41 | #ifdef CONFIG_SMP | ||
42 | #define eieio_on_smp() eieio() | ||
43 | #define isync_on_smp() isync() | ||
44 | #else | ||
45 | #define eieio_on_smp() __asm__ __volatile__("": : :"memory") | ||
46 | #define isync_on_smp() __asm__ __volatile__("": : :"memory") | ||
47 | #endif | ||
48 | |||
49 | #endif /* __KERNEL__ */ | 35 | #endif /* __KERNEL__ */ |
50 | #endif /* _ASM_POWERPC_SYNCH_H */ | 36 | #endif /* _ASM_POWERPC_SYNCH_H */ |
51 | |||
diff --git a/include/asm-powerpc/system.h b/include/asm-powerpc/system.h index 9b822afa7d0e..d9bf53653b10 100644 --- a/include/asm-powerpc/system.h +++ b/include/asm-powerpc/system.h | |||
@@ -212,7 +212,7 @@ __xchg_u32(volatile void *p, unsigned long val) | |||
212 | unsigned long prev; | 212 | unsigned long prev; |
213 | 213 | ||
214 | __asm__ __volatile__( | 214 | __asm__ __volatile__( |
215 | EIEIO_ON_SMP | 215 | LWSYNC_ON_SMP |
216 | "1: lwarx %0,0,%2 \n" | 216 | "1: lwarx %0,0,%2 \n" |
217 | PPC405_ERR77(0,%2) | 217 | PPC405_ERR77(0,%2) |
218 | " stwcx. %3,0,%2 \n\ | 218 | " stwcx. %3,0,%2 \n\ |
@@ -232,7 +232,7 @@ __xchg_u64(volatile void *p, unsigned long val) | |||
232 | unsigned long prev; | 232 | unsigned long prev; |
233 | 233 | ||
234 | __asm__ __volatile__( | 234 | __asm__ __volatile__( |
235 | EIEIO_ON_SMP | 235 | LWSYNC_ON_SMP |
236 | "1: ldarx %0,0,%2 \n" | 236 | "1: ldarx %0,0,%2 \n" |
237 | PPC405_ERR77(0,%2) | 237 | PPC405_ERR77(0,%2) |
238 | " stdcx. %3,0,%2 \n\ | 238 | " stdcx. %3,0,%2 \n\ |
@@ -287,7 +287,7 @@ __cmpxchg_u32(volatile unsigned int *p, unsigned long old, unsigned long new) | |||
287 | unsigned int prev; | 287 | unsigned int prev; |
288 | 288 | ||
289 | __asm__ __volatile__ ( | 289 | __asm__ __volatile__ ( |
290 | EIEIO_ON_SMP | 290 | LWSYNC_ON_SMP |
291 | "1: lwarx %0,0,%2 # __cmpxchg_u32\n\ | 291 | "1: lwarx %0,0,%2 # __cmpxchg_u32\n\ |
292 | cmpw 0,%0,%3\n\ | 292 | cmpw 0,%0,%3\n\ |
293 | bne- 2f\n" | 293 | bne- 2f\n" |
@@ -311,7 +311,7 @@ __cmpxchg_u64(volatile unsigned long *p, unsigned long old, unsigned long new) | |||
311 | unsigned long prev; | 311 | unsigned long prev; |
312 | 312 | ||
313 | __asm__ __volatile__ ( | 313 | __asm__ __volatile__ ( |
314 | EIEIO_ON_SMP | 314 | LWSYNC_ON_SMP |
315 | "1: ldarx %0,0,%2 # __cmpxchg_u64\n\ | 315 | "1: ldarx %0,0,%2 # __cmpxchg_u64\n\ |
316 | cmpd 0,%0,%3\n\ | 316 | cmpd 0,%0,%3\n\ |
317 | bne- 2f\n\ | 317 | bne- 2f\n\ |
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index d9b86a17271b..baddc9ab57ad 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h | |||
@@ -175,11 +175,10 @@ static inline void set_dec(int val) | |||
175 | set_dec_cpu6(val); | 175 | set_dec_cpu6(val); |
176 | #else | 176 | #else |
177 | #ifdef CONFIG_PPC_ISERIES | 177 | #ifdef CONFIG_PPC_ISERIES |
178 | struct paca_struct *lpaca = get_paca(); | ||
179 | int cur_dec; | 178 | int cur_dec; |
180 | 179 | ||
181 | if (lpaca->lppaca.shared_proc) { | 180 | if (get_lppaca()->shared_proc) { |
182 | lpaca->lppaca.virtual_decr = val; | 181 | get_lppaca()->virtual_decr = val; |
183 | cur_dec = get_dec(); | 182 | cur_dec = get_dec(); |
184 | if (cur_dec > val) | 183 | if (cur_dec > val) |
185 | HvCall_setVirtualDecr(); | 184 | HvCall_setVirtualDecr(); |
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 74488e49166d..aa6322d45198 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h | |||
@@ -146,6 +146,11 @@ struct property; | |||
146 | extern void proc_device_tree_init(void); | 146 | extern void proc_device_tree_init(void); |
147 | extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *); | 147 | extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *); |
148 | extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop); | 148 | extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop); |
149 | extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde, | ||
150 | struct property *prop); | ||
151 | extern void proc_device_tree_update_prop(struct proc_dir_entry *pde, | ||
152 | struct property *newprop, | ||
153 | struct property *oldprop); | ||
149 | #endif /* CONFIG_PROC_DEVICETREE */ | 154 | #endif /* CONFIG_PROC_DEVICETREE */ |
150 | 155 | ||
151 | extern struct proc_dir_entry *proc_symlink(const char *, | 156 | extern struct proc_dir_entry *proc_symlink(const char *, |